Notes on learning stage of developing my own React Native education app using Expo Framework - Part 8

Last updated on 28 Nov. 2025

Main tutorial used for learning: Simon Grimm: Build Your Own MASTERCLASS clone in React Native, https://www.youtube.com/watch?v=fO3D8lNs10c , 4 hrs. 42 mins, Mar. 2025.





Jump to Details section (an easy way to get to just after end of main notes section and then scroll up to see latest main notes in this post).
=======================================

14:11, 26 November 2025
Now I want to create a clean build of the dummylogin version of Android app and then do a separate channel release of its web app.

Done: I have to merge one minor code change of pointerEvents prop in a View, from main to dummylogin branch.
Done: I also added GuestLogin CG provided code as a text file
Done: Then I reorganized AndroidBuildConfig folder
I plan to merge all these changes in dummylogin branch.

----------
Just saw I need to update Readme of main branch (minor updates) ... done.
Done: This Readme also has to be merged with dummylogin branch.
----

Broke old APK GD share link for others (not owner) by moving it to private GD folder (renamed APK file to lms-v20251118-release-prbbly.apk). 
To test that link is broken, I had to login with alternate google id in anonymous Chrome window. After login, I was shown 'You need access' dialog. So the old APK link is broken for others (for owner it will still work I guess).
Leaving it in public folder in a separate folder and even renaming the file did not break access. I could not change share permission to restricted for it, as it was under higher-level folder which is public.
-------

Earlier I had done:
In VSCode:
  • Opened lessons index.tsx while in main branch
  • Right-Clicked file tab -> Open Changes -> Open Changes with Branch or Tag -> Selected DummyLogin branch
----
Now when I tried, I was not shown Open Changes menu entry.
I reenabled GitLens extn. Now Open Changes is shown. So GitLens extn. is adding Open Changes menu entry to file tab right-click menu. Did I get that right?

CG said yes.

To copy GuestLogin\GuestLogin-login.tsx.txt folder and file from main branch to dummylogin:
git switch dummylogin
using GitLens Inspect, Search & Compare
  • located GuestLogin-login.tsx.txt file in 'Comparing dummylogin with main'
    • Mouse Hover -> Click Open File at Revision (or even Click entry should work I think but slightly diff UI)
      • -> 'GuestLogin\GuestLogin-login.tsx.txt (main)' is the title of file tab
      • File shows contents of GuestLogin-login.tsx.txt in main branch
      • Copy file contents to clipboard
Click VSCode Explorer icon on left menu bar.
Create GuestLogin\GuestLogin-login.tsx.txt file (empty file)
Paste clipboard contents and save.
----

In dummylogin branch:
git commit -m "Manually merged selected changes from main branch"

---------------
Local test of dummylogin after changes (though very minimal)
Need to create debug APK.
So will do clean build of dummylogin debug APK

Copied .env.cloud.fs as .env.dummylogin-cloud.fs
Added following line to .env.dummylogin-cloud.fs:
EXPO_PUBLIC_DUMMY_LOGIN_ID=User_Dummy_Not_ClerkId
----

Ran:
cp .env .env.back
cp .env.dummylogin-cloud.fs .env
----
Did the above manually instead of adding script to package.json as that may create confusion for main app.
Confirmed that .env now has:
EXPO_PUBLIC_DUMMY_LOGIN_ID=User_Dummy_Not_ClerkId
----

1) Delete android folder
Used: mvm .\android\ N
2) npx expo prebuild --clean --platform android

4) Copy my-release-key-dum.keystore file to android/app/my-release-key-dum.keystore
5) Edit android/gradle.properties and add (including changing password suitably):
MYAPP_UPLOAD_STORE_FILE=my-release-key-dum.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=your_keystore_password
MYAPP_UPLOAD_KEY_PASSWORD=your_key_password
----
6)  Edit android/app/build.gradle  
     In existing signingConfigs block which should already have debug block, add release block:
signingConfigs {
debug { ... }
release {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
     In buildTypes release block delete old signingConfig line and replace it with
        signingConfig signingConfigs.release
        as shown below:
buildTypes {
        release {
      signingConfig signingConfigs.release
      ...
}
}
        ---------
7) cd android
8) .\gradlew.bat clean
9) $Env:CMAKE_VERSION = '3.31.6'
10) .\gradlew.bat assembleDebug
BUILD SUCCESSFUL in 8m 55s
1070 actionable tasks: 1055 executed, 15 up-to-date
----------------

Confirmed that Manifest has only dummylogin scheme.
=========

Web app worked for Dummy Login

Me: Testing debug app.
Android app on emulator gave Uncaught error 6000ms timeout exceeded.
But app worked OK after dismissing that message.
IFIRC, Metro did not show the uncaught error!
Searched code for 6000 but did not find anything.

Any idea what could have caused the error?

CG: This specific error:

“Uncaught error: 6000ms timeout exceeded”

almost always comes from React Native Web / Expo Router / React Query / Clerk / networking timeouts in development, not from your app logic.

Here are the most likely sources — all based on your project history:


✅ 1. React Query dev mode timeout

React Query has a default 5–6 second timeout for some dev tools and background retries.

If any request takes too long (slow emulator network), React Query DevTools can throw:

timeout exceeded (6000 ms)

These do NOT appear in Metro because React Query throws them internally before logging.

This is the number one cause.


✅ 2. Clerk dev session check timeout

Clerk sometimes triggers:

Uncaught Error: timeout exceeded

when:

  • emulator network is slow

  • you have dummylogin logic

  • app checks for Clerk session but reaches 6s timeout

Your app continues fine after dismissing because Clerk retries quietly.


✅ 3. Expo Router preloading timeout

Expo Router preloads screens in the background (default 6000ms).

If a route takes too long to load during dev:

Route preload timed out after 6000ms

This matches what you saw: only in debug, disappears in release.


✅ 4. Network fetch (API) dev timeout

Some libraries (Axios, fetch wrappers, backend SDKs) have a default timeout of 6000 ms in dev mode.

Even if your code doesn’t set a timeout, some libraries internally use this number.


🟢 Why Metro did NOT show it

Because the error is thrown:

  • in the browser-like runtime (RN Web or Hermes)

  • before Metro receives the stack trace

  • or Metro ignores dev-only JS warnings

Many tools (Clerk, React Query, Expo Router) throw these errors internally without Metro logging them.


🟣 Why the app worked normally after dismissing

Because:

  • it’s a soft timeout, not a crash

  • the app retries the operation

  • release mode removes these checks

  • dummylogin has no Clerk calls that truly depend on the timeout

So it's harmless.


🟡 What you should do?

Nothing.

This is a dev-only timeout, not a real bug.

You confirmed:

  • Release APK works

  • Functionality works after dismiss

  • Error is not repeatable in production

  • Metro shows nothing (typical for internal timeouts)


🟢 Final summary

Your error:

“6000ms timeout exceeded”

is almost certainly caused by React Query or Expo Router dev-time preloading, or a Clerk session check timeout — all harmless and expected in development.

You can safely proceed.

If you want, I can tell you how to temporarily disable these timeouts in dev for cleaner logs.

----
Restarted app on emulator. Now the timeout error did not show. As DL user Played 2 lessons. Worked OK.

===============
Also saw on Metro (as in earlier dummylogin branch app):
 WARN  source.uri should not be an empty string [Component Stack]
This time let me try to fix it. 
source.uri issue seems to be related to Clerk user entry for Dummy Login which has an emtpy string for imageUrl.
Got a fix by using app icon if imageUrl is empty string.

=================

Me: On lms app itself I faced this issue:
In Android app, playing a video using full screen and then rotating phone to landscape mode played current video using full landscape screen correctly. 
But autoplay of next video showed blank video with some audio being heard IFIRC. 
Trying to get back to lesson screen resulted in app closure, IFIRC. 
A future patch to try out would be to disable autoplay on Android. Note that on web autoplay is either not enabled or does not work. So fullscreen ends automatically on video end and and shows user the lesson screen where he can move forward to next lesson. That works as expected.

What's ur view

CG: Your understanding is correct, and your proposed solution (disable autoplay on Android) is the most stable and practical approach.

Here’s why:


Why the issue happens

On Android:

  • Full-screen video takes over a separate Activity.

  • Orientation change triggers Activity recreation.

  • The next video (autoplay) often starts before the full-screen player is fully restored or cleaned up.

  • Result:

    • blank screen

    • audio continues

    • navigation stack becomes inconsistent

    • sometimes the entire app is killed

This is a known limitation of Android’s fullscreen video implementation (ExoPlayer + RN WebView or HTML video element).

Web does not have this issue because there is no Activity switching.


Most reliable fix

✔️ Disable autoplay on Android only

This avoids:

  • video starting during orientation change

  • full-screen lifecycle mismatch

  • Activity recreation conflicts

  • app closing on exit

And it keeps the user flow simple:

  1. User watches video

  2. Video ends

  3. Fullscreen exits

  4. User is back to the lesson screen

  5. User taps “Next lesson”

This is the same experience the web version already uses.


🟢 How to disable autoplay just on Android

Short version:

const isAndroid = Platform.OS === "android";

<Video
  shouldPlay={!isAndroid && autoPlayEnabled}
  ...
/>

Or simply:

shouldPlay={Platform.OS !== 'android' && true}

🟣 What not to do

Avoid trying to:

  • override fullscreen lifecycle

  • hack orientation listeners

  • restart the player manually

These approaches all become fragile.


🟢 Conclusion

Your thinking is correct:

Autoplay should be disabled on Android.
It removes a class of known Android video fullscreen/orientation issues and gives a stable user experience.

If you want, I can help you implement a clean, platform-specific autoplay rule in your Lesson component.

Me: iOS does not have this issue?

CG: Short answer: No — iOS does NOT have this issue.

Here’s why:


Why iOS handles fullscreen video correctly

1. iOS fullscreen video does NOT create a new Activity/Window

Unlike Android, iOS does NOT:

  • launch a separate activity

  • recreate components on orientation change

  • detach the WebView

  • restart the React Native view hierarchy

iOS fullscreen video is handled by:

  • AVPlayerViewController (native)

  • or Safari/WebKit’s inline fullscreen system

These manage orientation smoothly and internally.


2. Orientation change does NOT reset the video player

iOS supports seamless rotation for video and keeps:

  • video buffer

  • playback state

  • fullscreen modal

  • JS player state

Everything remains stable.


3. Autoplay of next video works reliably

iOS video playback:

  • stays in the same fullscreen container

  • loads next video inside the same player

  • does not “blank out”

This is why your LMS app never had autoplay fullscreen issues on iOS.


🟢 Conclusion

✔️ Android → problematic with fullscreen + rotation + autoplay
✔️ iOS → stable and does NOT suffer these issues

Thus it is correct to disable autoplay only on Android, not on iOS.

If you want, I can give you a short helper function:

const autoPlay = Platform.OS === "android" ? false : true;
===============

git commit -m "Use app icon for Dummy User profile to avoid Metro warning; Ready for release build"

For release build
1) cd android
$Env:CMAKE_VERSION = '3.31.6' is not needed as it is already set.
2) .\gradlew.bat assembleRelease
BUILD SUCCESSFUL in 21m 58s
1423 actionable tasks: 1373 executed, 50 up-to-date
------
Renamed APK to lms-dum-v20251126-release.apk and moved to lms-APKs
Copied and installed on phone.
Trying out app on phone ... Worked OK for DL user and also dG user.

Uploading lms-dum-v20251126-release.apk to GD. It was slow even on Airtel. Cancelled it. Time now is 21:47, 26 November 2025

Me: Android release app worked ok on my phone.
Now I want to create a dummylogin branch deploy to Expo.dev on a different channel or alias.
Please guide me on how to do it.
...
Me: expo.dev has an assign to an alias feature. Can't I use that?

CG: Yes — you can use the “Assign to Alias” feature on Expo.dev, and for your use-case (web-only deploy + separate dummylogin environment) it’s actually the simplest and cleanest method.
...

[The alias trial did not work out.]

Me: ... Now I have slightly different app.json for main branch and dummy branch (scheme and name is different).
But is eas entry is the same:
      "eas": {
        "projectId": "---snipped---"
      }
----
Will eas deploy work with same eas entry but slightly different app.json file in dummy branch?

CG: Yes — EAS will work perfectly fine even if app.json differs between the two branches as long as the eas.projectId stays the same.
...

[CG was wrong. EAS did trip up on it.]

I plan to run:
[My .env file is set up correctly for dummylogin cloud full stack set up.]
npx expo export --platform web
eas deploy

[CG gave slightly different eas deploy command which did not work]
...
----
So ran:
lms> eas deploy
EAS Hosting is still in preview and subject to changes.
Project config: Slug for project identified by "extra.eas.projectId" (sg-eduapp-lms) does not match the "slug" field (sg-eduapp-lms-d). Learn more: https://expo.fyi/eas-project-id
    Error: deploy command failed.
lms> 

----
I think I will delete the eas entry in app.json
Then as per https://docs.expo.dev/eas/hosting/get-started/ , if I run 'eas deploy', it will "Prompt you to connect an EAS project if you haven't done so yet"

Deleted from app.json:
      "eas": {
        "projectId": "---snipped---"
      }
---------
Ran: 
eas deploy
EAS Hosting is still in preview and subject to changes.
EAS project not configured.
√ Would you like to automatically create an EAS project for @ravisiyer/sg-eduapp-lms-d? ... yes
✔ Created @ravisiyer/sg-eduapp-lms-d: https://expo.dev/accounts/ravisiyer/projects/sg-eduapp-lms-d on EAS
✔ Linked local project to EAS project ---snipped---
> Project export: server - exported 15 minutes ago
√ Choose a preview URL for your project: ... sg-eduapp-lms-d.expo.app
✔ Created deployment
|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 100% Uploading 44 assets

🎉 Your deployment is ready

Dashboard       https://expo.dev/projects/---snipped---/hosting/deployments
Deployment URL  https://sg-eduapp-lms-d--o81we1v6ok.expo.app

🚀 When you are ready to deploy to production:
  $ eas deploy --prod
-----------

It added these lines in app.json:
      "eas": {
        "projectId": "---snipped---"
      }
-----

I was able to visit the deployed website, use dummy login and view a lesson. It worked OK.
On expo.dev, I promoted this deployment to production. 
Now the app is deployed at: https://sg-eduapp-lms-d.expo.app/

Airtel is giving slow upload (1 to 2 Mbps). But managed to upload lms-dum-v20251126-release.apk to GD
Now trying to upload same to Virustotal. Failed once. Trying again. Wanted to get a feel of how Virustotal handles such speeds (now net speed meter shows speed alternating quickly between some Kbps and 2+ Mbps; in last attempt with Virustotal too, there was this quick alternating between Kbps and Mbps; I don't think Google Drive upload had this alternating upload speed issue. Then it was a steady speed in range of slightly below 1 Mbps to 1 Mbps+).
Virustotal is now at 50% upload. But speed has dropped to Kbps - got upload failed error message. I think Virustotal expects the entire upload to be done within a particular period. So it may need a 5 Mbps+ upload speed. An alternative is to upload to some other site (not Google drive as it does not give a direct downloadable link) and provide that url to Virustotal.

[I asked CG for suggestions ...]
  • transfer.sh was not accessible. https://send.now/ was accessible. Trying it out...
  • For send.now, the net speed meter shows a steady upload speed between close to 2 Mbps to 2+ Mbps (no switching between Kbps and Mbps which happened with VirusTotal). It got done.
    • https://send.now/ofaatg5vw4dg
    • You are using Send.now as a guest. Files expire after 15 days of no downloads.
    • Sign up to increase the retention period.
    • send.now shows a prompt for download - so that does not work with VirusTotal.
  • Trying Google Drive Direct Link Generator, https://sites.google.com/site/gdocs2direct/
    • Does not work due to message about file too large for Google to scan for viruses.
  • Dropbox may work but it does not seem to have free tier.
  • tmpfiles.org has 100 MB limit
  • Trying https://www.file.io/ - did not give DDL (direct download link)
  • gofile.io doesn't give Direct Download Link (DDL).
  • Pixeldrain link does not open.
I guess I have tried enough. 
[For tests for later links above, I uploaded a test file and saw if it provided direct download link. That was quick.]

CG: Understood. Given the number of hosting services that are failing or giving only intermediate “landing pages,” it makes sense to pause.

Before concluding, here are two final, highly reliable, developer-friendly methods that do not require finding a public DDL host and still let you scan your APK — and these work even on slow, unstable internet.

These are worth considering because they avoid all the direct-download limitations.


Method A — Upload to VirusTotal via CLI (vt-cli)

Instead of browser upload (which times out), VirusTotal provides an official command-line uploader which automatically resumes / retries and handles poor connections much better.

Steps:

  1. Get a free VirusTotal API key
    https://www.virustotal.com/gui/my-apikey

  2. Install vt-cli

    pip install vt-cli
    
  3. Run:

    vt submit yourfile.apk
    

This bypasses the browser timeout completely.

Important:
The free API upload limit is up to 32 MB, but vt-cli automatically converts large files to chunked uploads and is often more forgiving than the web UI.
Many developers with slow connections succeed this way where the browser fails.


Method B — Run a local malware scan (best fallback)

If VT isn’t required strictly, you can scan the APK locally using:

1. Windows Defender (good for APKs)

Right-click → Scan with Microsoft Defender
It extracts scanned content from the APK (since it’s just a ZIP).

2. Hybrid Analysis (web) — accepts APKs, easier upload

https://www.hybrid-analysis.com/

  • Max size: 100 MB, but sometimes accepts slightly higher

  • Upload speed more tolerant

  • No direct link required

3. JoeSandbox Cloud (Android)

https://www.joesandbox.com/

  • Full dynamic analysis

  • Free tier available

  • Upload limit ~150 MB

  • No direct link needed

Hybrid Analysis + JoeSandbox together provide 80–90% of the insight VirusTotal provides, often more.


🟦 Summary — Practical Conclusion

You've tried the major public file hosts, and slow upload + prompt/landing page issues make them unusable for VT.

Your real options now are:

1️⃣ Try VirusTotal CLI uploader

(best way to overcome timeout)

2️⃣ Use Hybrid Analysis or JoeSandbox instead

(accepts direct uploads even on slow speeds)

3️⃣ Local AV scanning

(quick health check)


If you'd like, I can guide you through vt-cli installation, or help choose between Hybrid Analysis and JoeSandbox based on what you're looking for (static scan, dynamic sandbox, etc.).

Me: 00:38, 27 November 2025 Now Airtel is giving 10 to 20 Mbps upload speed. Trying it directly with VirusTotal. It succeeded. So the learning is that I must have at least 5 to 10 Mbps upload speed for a 110 odd MB APK file if I am uploading to VirusTotal.

...

Me: I don't think the net connection speed dropped to Kbps. I think VirusTotal intake drops and then picks up. I did not face this Kbps and Mbps fluctation with other upload sites.

CG: Yes — your observation is correct.

It is not your internet dropping to Kbps. What you saw is a well-known behaviour specific to VirusTotal’s upload endpoint, not the network itself.

Let me explain clearly what’s happening.


VirusTotal itself causes the Kbps ↔ Mbps fluctuation

✔️ VirusTotal uses a chunked, rate-limited frontend

When uploading a large file (~100+ MB):

  • VT’s frontend sometimes slows down the intake intentionally

  • It sends small acknowledgment packets irregularly

  • To your speed meter, this appears as:

    • sudden drops to Kbps

    • quick bursts to 1–2+ Mbps

    • repeating pattern

✔️ This behaviour is very specific to VirusTotal

That’s why:

  • Google Drive upload was steady

  • Send.now was steady

  • Catbox or others are usually steady

  • Only VT showed the oscillation

Because the bottleneck is not your connection,
it’s VirusTotal’s upload servers throttling or pausing intake.


📌 Why does VirusTotal do this?

VirusTotal’s upload servers belong to Google Cloud but have:

1. Rate-limiting per IP

Especially for free accounts.

2. Backend scanning pipeline priority

Files are queued; the intake server slows you down if the backend is busy.

3. Aggressive timeout window

If the upload intake pauses longer than ~15 seconds, VT cancels.

This combination produces the exact “Kbps → Mbps → Kbps” oscillation you saw.


📌 Why didn’t this happen with other sites?

Services like:

  • Google Drive

  • Pixeldrain

  • File.io

  • Gofile

  • Send.now

…use resumable multi-part uploads, and their intake servers do NOT throttle or pause in the same way.
So your speed meter shows a smooth line.

VirusTotal, on the other hand:

  • does not support resumable uploads in browser UI

  • uses aggressive bottleneck throttling

  • has a short inactivity timeout

  • and balances load by pausing intake at times

Therefore the speed fluctuates only with VT.


📌 Your conclusion (refined)

It’s not that your connection needs 5–10 Mbps.
Rather:

The higher upload speed compensates for VT’s intake slowdowns.

At 10–20 Mbps:

  • even if VT slows down periodically,

  • the overall upload finishes quickly,

  • and you never hit their timeout window.

When your upload is slower (1 Mbps), the same pauses trigger timeouts.


✅ Final takeaway

VirusTotal upload speed fluctuations come from VirusTotal itself.
To avoid timeouts, a higher stable sustained upload speed helps.

If you’d like, I can explain how the CLI uploader handles these pauses much better than the browser version.

Me: Does GitHub accept 115 MB file? If so that could provide a DDL

CG: Short answer: Normal GitHub does not accept a 115 MB file.

But Git LFS doeshowever, it still does NOT provide a true direct-download link that VirusTotal can fetch.

Here are the details:


GitHub normal repository

GitHub’s standard file size limits:

  • 100 MB hard limit per file (git push is rejected above 100 MB)

  • Your APK is 115 MBcannot be uploaded

So normal GitHub is not an option.


⚠️ Git LFS (Large File Storage)

Git LFS allows files up to 2 GB (even more for private repos).

BUT:

Git LFS download links:

  • Require authentication tokens,

  • Are not direct binary URLs,

  • Are served through a redirect layer,

  • VirusTotal cannot fetch them.

So even if you use Git LFS, VT will not treat the LFS URL as a direct downloadable file.


GitHub Releases

People often think Releases allow larger files — but:

  • GitHub Releases also enforce the 100 MB per file limit on free accounts

  • For larger files, GitHub forces the use of Git LFS

  • And again, LFS links are not direct-binary DDLs for VT

So GitHub Releases ≠ solution.


🔍 Conclusion

GitHub cannot give you a VirusTotal-compatible DDL for a 115 MB APK.

Not through repo, not through release, not through LFS.


👉 If you want a GitHub-like host that does give a direct link

These two work:

1. GitLab (free) — GitLab Releases allow up to 250 MB

GitLab gives true static file URLs for release assets:

  • No JavaScript

  • No login

  • Direct file delivery

  • VirusTotal can fetch it

This is actually the best GitHub-style solution.

2. Codeberg (100 MB limit, so too small for your case)

So for a 115 MB file, only GitLab works reliably.


If you want, I can show you exactly how to upload your APK to GitLab Releases and get a true direct binary URL that works with VirusTotal.

[Later IFIRC, Google search said GitLab has a 100 MB file size limit. So I did not spend further time checking out that possibility. Perhaps CG is right and there may be a way to upload upto 250 MB APK file to GitLab and get a DDL, but that may suck up time to verify.]

-----------

I think the vt-cli option mentioned earlier by CG is interesting. Next time I face this upload to VirusTotal failing to complete issue, I could try that out.

==============
16:14, 27 November 2025
In dummylogin branch
git commit -m "app.json project id set by eas to new EAS web host for dummylogin - sg-eduapp-lms-d.expo.app"

As DL user purchase of premium course got stuck at Payment screen with Pay button not getting enabled.
Browser console showed: api.revenuecat.com/rcbilling/v1/checkout/start:1  Failed to load resource: the server responded with a status of 422 ()
Perhaps the Clerk Dummy id is tripping it up. I don't think it is necessary to invest time in trying to get this to work with Dummy Login.

Logged in same dummylogin web app as eG user. Now the 'Pay Now' button gets enabled on correct data for card and other fields. I could do the sandbox payment (for Elevate course) and the web app showed me the course overview page. I then could go to the first lesson - Refining Your Breath.
Browser console did not show the above revenuecat.com Failed to load resource error.
So DummyLogin user not having a valid Clerk id is tripping up RevenueCat.

I then switched to phone. In DummyLogin app, logged in as eG user. I was shown Elevate course in My Courses. I played its first lesson to end. It worked OK.

I also tried using lms app on phone. That too worked.

Done: I think DummyLogin app can now be mentioned in main app blog post and in project Readme.
Done: I will also do a clean slate by removing all my Clerk users, Strapi users, user-courses and progress entries.
Done: Then I will do a final test of both lms and lms-d apps (mobile and web). If that's OK, I will put up short update posts on LinkedIn etc.

=======================================
=======================================

Details

This section has no content, as of now.

Comments