← AI Catalyst C3All programsHomeSearch
AI Catalyst C3·Core Session - Week 18·2:47:11

Building a Mobile App with AI: React Native and Expo with Codex, One Screen at a Time, Clerk Login with Supabase Progress, and a Mascot That Makes It a Product

Rajat Sajnani Guest instructor - nine years of front-end and mobile work (startups, recently the JPMorgan Chase UK payments team), runs Jester Dev, builder of the AfterLit app, a Catalyst 2 alumnus; first time teaching a class · Shivani Outskill community manager - opens, relays chat questions and the feedback poll, closes

The short version

  1. A phone app is not a small website: it is installed, navigated by a bottom tab bar, released through the App Store and Play Store, and earns its place when people use it often (cached speed, saved preferences, device permissions). The backend - Supabase here - can be shared with a web app (0:13-0:21).
  2. Stack: React Native for one shared set of screens on iPhone and Android, Expo as the tooling, Expo Go to preview on your own phone by scanning a QR code, Codex as the coding agent with Rajat's own 'mobile app skill' that checks the machine first. A Mac is only needed for Xcode; Windows users can still test on a phone (0:21-0:55).
  3. The build: PromptQuest, a Duolingo-style prompt-practice app, from five reference screens, one bounded prompt per screen with a preview after each - Home, a placeholder Lesson, the real lesson from course.json, then Results with a Home button. When a new package breaks the build, stop the server, rerun npm start, and report exactly what fails (0:42-1:25).
  4. Accounts: progress belongs to the signed-in user, not the phone. Clerk handles login (paste its ready-made Expo prompt; development mode needs no Google or Apple keys), Supabase stores progress with Clerk registered as a third-party auth provider so one user ID spans devices (1:25-2:11).
  5. Make it a product: a named mascot, Pip (three poses made in ChatGPT Images, saved as transparent PNGs, recorded in agent.md so any agent knows how to use it), reacts to answers. Budget the unglamorous part too: $99/year Apple, $25 once for Google, and app review that now takes weeks (1:49-2:35).

Outskill's post-read

The written recap Outskill published after the session (Catalyst_Week18_Session1_Building_a_Mobile_App_with_AI_Post_Read.docx). Where it is sharper than the live session, those points are here; the full concepts below are from the recording.

  1. The core idea: a mobile app is not a website shrunk to a phone - 'The interface, navigation, device context and release model all change' - and AI speeds implementation, but quality still depends on the clarity of the journey, references and constraints.
  2. A web-vs-mobile table (access, navigation, screen constraints, data, release, device capabilities): installed, touch-first with bottom tabs, a shared backend, release through the App Store and Play Store.
  3. PromptQuest's five screens tied to one loop - start, question, answer, feedback, next question, result, return - with Duolingo and AfterLit as references. 'Give the AI something concrete to see.'
  4. Native, React Native, Flutter and web wrapper compared; React Native for a fast shared MVP, with the rule to choose 'based on the product requirement and user experience you need - not simply because one framework is popular'.
  5. The stack (Codex or another agent, React Native, Expo, Expo Go, Node and npm, Xcode, Android Studio, the Mobile App Skill) and an environment readiness check before building; Expo Go's five-step loop on the same Wi-Fi.
  6. The prompt pattern - 'Use the mobile-app skill. Attach the reference screens. Specify React Native + Expo... Then build one screen at a time.' - refined in a seven-part table (reference, screen purpose, interactions, technology, existing logic, scope, verification) and a 10-step build loop.
  7. Pip as a mascot with a purpose (wrong answers, completion, the overall journey); testing covers tap targets, small and large devices, back behaviour, hierarchy, simulator cost and a physical device.
  8. Closes with the shared backend, mobile-first vs desktop-first ('where do your users naturally want to use the product'), eight pitfalls with better alternatives, an 18-item checklist and six reflection questions. Not in the post-read but taught live: Clerk and the Supabase link, store fees and review, the restart-after-install rule.

Its headings What makes a mobile app different? · Start with the user journey, not the code · Learn from strong mobile products · Choosing the mobile technology · The AI-assisted mobile development stack · Environment readiness: check before building · Expo Go: the fastest feedback loop · Prompting AI to build the first screen · Build one screen, verify, then connect it · Mobile navigation is part of the product · Make the app feel like a product, not an AI-generated prototype · AI prompting: reference + intent + constraints · A practical build loop for AI-assisted mobile apps · Testing is part of building · The backend can remain shared · Choosing mobile-first vs desktop-first · Common pitfalls and better alternatives · A reusable checklist · Key takeaways · Reflection questions

At a glance, three clicks deep

Skim here first: the closed row is the glance, open is the study card with the key points and timestamps, and the ↓ link drops to that concept's full write-up below.

01A phone app is not a small websiteMobile differs from web in access (install), navigation (tab bar), release (stores) and device context, whi…0:13:00›

Mobile differs from web in access (install), navigation (tab bar), release (stores) and device context, while the backend can be shared.

Installed vs a link; a bottom tab bar replaces page links (0:17-0:18)

Shared backend and accounts; releases go through the stores (0:17-0:19)

Worth it for frequent use: cache, saved preferences, permissions (0:19-0:20)

Screen sizes and foldables (0:20-0:21)

Mobile-first or desktop-first depends on where your users are (2:43-2:44)

↓ Full write-up of this concept

02Native, React Native, Flutter or a wrapper - and why React Native with ExpoReact Native + Expo + Expo Go + Supabase: one shared codebase for both phones, a live preview, and a backen…0:21:00›

React Native + Expo + Expo Go + Supabase: one shared codebase for both phones, a live preview, and a backend shared with the web.

Four approaches; native wins for games and hardware-heavy work (0:21-0:22)

One codebase, same logic and screens, Fast Refresh (0:25-0:26)

React Native screens, Expo tooling, Expo Go preview, Supabase backend (0:26-0:27)

A Mac is needed only for Xcode; Windows can still test on a phone (0:38-0:39)

↓ Full write-up of this concept

03Design the journey first, then borrow proven patterns (Duolingo, AfterLit)Define the user loop and one job per screen, attach reference images, and borrow behaviour from proven apps.0:24:00›

Define the user loop and one job per screen, attach reference images, and borrow behaviour from proven apps.

Five screens, built one at a time; three first (0:28-0:29)

Home: a bold Start Quest and a journey path (0:29-0:30)

Lesson and Result roles; XP and a tip for return visits (0:30-0:31)

Duolingo and AfterLit as named sources (0:32-0:33)

Beginner route: inspiration -> Claude Design or Codex layout suggestion (0:46-0:50)

↓ Full write-up of this concept

04Check the machine before you build: the mobile app skillA shared Codex skill that audits the development machine and plans the build before code is written.0:36:00›

A shared Codex skill that audits the development machine and plans the build before code is written.

Built with Codex's skill-creator; shared as a zip; kept current (0:46, 0:40)

Checks OS, Node, npm, project, Xcode, Android Studio, JDK (0:36-0:37)

Plan before proceeding; report shown live (0:48-0:54)

↓ Full write-up of this concept

05Expo Go and simulators: the fast preview loopRun the dev server, scan the QR in Expo Go or press i/a for simulators, and iterate with Fast Refresh;0:41:00›

Run the dev server, scan the QR in Expo Go or press i/a for simulators, and iterate with Fast Refresh; restart after installs.

Same Wi-Fi; QR code; Expo Go (0:41-0:42, 0:58)

i and a open the simulators; Expo Go auto-installs there (1:00-1:01)

Fast Refresh for UI changes (1:03)

Device variety in simulators; heat cost (2:11-2:13, 2:44)

↓ Full write-up of this concept

06One bounded prompt per screen, previewed before the next (Home, Lesson, Result)Build and verify one screen per prompt against a reference, wiring navigation and completion as you go.0:42:00›

Build and verify one screen per prompt against a reference, wiring navigation and completion as you go.

Home prompt chosen by poll (0:42)

Placeholder lesson, Start Quest link, back button (1:02-1:03)

course.json drives the questions; XP from zero (1:07-1:09)

Result screen; the Home button marks completion (1:15-1:19)

↓ Full write-up of this concept

07When the build breaks: say exactly what fails, and restart after every new packageReport the failing action precisely, restart the dev server after installs, and check keys and simulators b…1:19:00›

Report the failing action precisely, restart the dev server after installs, and check keys and simulators before blaming the code.

Specific bug report beats 'something went wrong' (1:24-1:25)

Restart rule after new packages (1:32-1:33)

Version mismatch fixed by the agent; then the API key (1:33-1:35)

↓ Full write-up of this concept

08Why a lesson app needs accounts: progress belongs to the signed-in userStore progress against the signed-in account (Clerk identity, Supabase data) so it follows the user and is…1:25:00›

Store progress against the signed-in account (Clerk identity, Supabase data) so it follows the user and is visible to the developer.

Without accounts you cannot see usage (1:26)

Account-saved progress follows the user across devices (1:27-1:28)

Clerk = login, Supabase = data (1:26)

Clerk dev mode needs no Google/Apple keys; Supabase auth does (1:31, 2:08)

Set up everything first -> Supabase auth; validate first -> Clerk (2:08)

↓ Full write-up of this concept

10The costs nobody mentions: store fees, slow review, and the Apple-login ruleApple $99/year, Google $25 once, store review that now takes weeks, and platform rules such as offering App…1:49:00›

Apple $99/year, Google $25 once, store review that now takes weeks, and platform rules such as offering Apple login alongside Google.

$99/year Apple; $25 one-time Google (1:50)

Same-day approvals then; 'brutal' now - AfterLit pending over a month (1:51-1:52)

Google login requires Apple login too (1:52)

TestFlight and APK to share before approval (2:36)

↓ Full write-up of this concept

11Give the app a character: making Pip and recording it in agent.mdGenerate a consistent mascot as transparent assets, record its usage rules in agent.md, and wire it to spec…2:13:00›

Generate a consistent mascot as transparent assets, record its usage rules in agent.md, and wire it to specific journey moments.

Why a character; AfterLit's three states (0:44, 2:13-2:14)

Paid platform vs open-source character skill (2:15-2:17)

ChatGPT Images, three poses, transparent PNGs (2:17-2:19)

agent.md as memory that survives switching agents (2:21-2:23)

Iterate against the reference; reactions to answers (2:24-2:30)

↓ Full write-up of this concept

12Final checks, day two's plan, and Q&A (inspiration, Gradle, mobile vs desktop)Check tap targets and device sizes;2:34:00›

Check tap targets and device sizes; next come onboarding, splash, analytics, flags and release.

Tap targets, focus, device sizes (2:34-2:35)

Day two: onboarding, splash, PostHog metrics, feature flags, release (2:35-2:37)

TestFlight and APK test builds (2:36)

Sensors/GPS/camera not planned; ask the agent (2:37-2:38)

Q&A: inspiration, Gradle, UI/UX, mobile vs desktop (2:39-2:44)

↓ Full write-up of this concept

The concepts in full

01

A phone app is not a small website

0:13:00

The backend can stay the same; how the app is opened, navigated, updated and tied to the device all change.

A website opens from a link; a mobile app is installed. A site moves between pages; an app uses a bottom tab bar (home, settings, profile, account). If both use Supabase, accounts and data are shared, so web and mobile 'can sync and share with each other'. A website update is published at once; a mobile release goes through the App Store or Play Store and users have to update. Mobile is worth it when people use the product often: the app caches for speed, remembers preferences (Rajat's delivery-app examples - your saved address, your last restaurant) and can use device permissions. Screen sizes vary more on Android, and foldables add a new constraint. His aim is screens 'completely native to a mobile experience, rather than a web experience'; in the end-of-class Q&A, whether to go mobile or desktop first depends on where your users are.

Worked example · from the session

DoorDash, Grab or Uber Eats remember your address and last order; a website would reload and forget.

Why it matters

Every later decision - tab bar, back button, store release, shared backend - follows from this difference.

People get this wrong

Wrap the existing website and call it an app.

Build shared phone screens with React Native; the class poll picked this over a wrapper (0:34).

02

Native, React Native, Flutter or a wrapper - and why React Native with Expo

0:21:00

For an MVP you do not need two codebases.

Four ways to build: native (Swift and Xcode for Apple, Kotlin and Android Studio for Android - he would choose it for something like gaming, at the cost of two separate projects), React Native, Flutter, and web wrappers. Only React Native is taught: one codebase with the same business logic and screens produces both apps, though you still test on both. Fast Refresh shows UI changes live. In the web-to-mobile stack React Native replaces React, Expo is the development tooling ('the latest choice for building with React Native'), Expo Go previews on a real phone, and Supabase stays the backend so users and data carry over. Apple development needs a Mac for Xcode, but with Expo Go a Windows user can still test live on an iPhone, and the Android emulator runs on Mac or PC.

Why it matters

Removes stack paralysis and explains why Windows users can follow along.

03

Design the journey first, then borrow proven patterns (Duolingo, AfterLit)

0:24:00

Five screens were designed before any prompt, and each has one clear job taken from apps that already work.

PromptQuest teaches better prompting: lessons of three questions, each with an answer and feedback, for people who already use AI. Five screens - Home, Lesson, Result, Login, Profile - are built one at a time, with accounts explained later. Home gets a bold Start Quest button and a journey path of completed and locked lessons; Lesson a question, three choices and an explanation; Result the number correct, experience points and a tip designed to 'bring them back to use our application tomorrow', plus a Home button. From Duolingo he borrows the prominent start button, the green highlight on correct answers, the explanation and the ticks on completed lessons; from his own AfterLit, the idea of a character. For beginners: collect inspiration from apps you use, then ask Claude Design or Codex to suggest a layout from it - after two or three tries 'you get the hang of how a mobile app looks'.

Worked example · from the session

The bottom tab bar is the mobile version of a website's Home, About and Contact links.

Why it matters

The agent builds better when each screen has a stated purpose and a visual reference.

04

Check the machine before you build: the mobile app skill

how-to0:36:00

A reusable skill asks whether your computer can build a phone app before any code is written.

Rajat made the skill with Codex's skill-creator, shares it as a zip and keeps it current - for example by feeding it Apple's new 'liquid glass' guidelines so new apps follow them. It checks the operating system, Node, npm, whether a project exists, Xcode, Android Studio and its platforms, and a Java JDK (optional), and guides installation of anything missing. It is not tied to PromptQuest. In the demo the report came back with everything present except the actual Expo Go preview, which was pending.

Do it in this order

Gotchas["The sample first prompt carries PromptQuest's colour codes - adapt it to your app (0:53)", 'Xcode and Android Studio are only needed if you will not test on a phone with Expo Go (0:36-0:37)', 'The prompts site lagged during class and was updated live (0:51-0:56)']

Why it matters

Turns 'why won't this run' into a short list of missing items.

05

Expo Go and simulators: the fast preview loop

how-to0:41:00

Scan a QR code and the half-built app is running on your phone; change the code and it updates.

Expo Go, from the Expo team, runs the app you are building on your own iPhone or Android phone as long as both devices share a Wi-Fi network. The agent's reply gives the terminal command; a QR code appears; scanning it opens the app. In the same terminal, i opens the iOS simulator and a the Android one, with Expo Go auto-installed there. Small UI changes appear immediately (sometimes after a reload). Simulators also let you try other devices - a Pro Max, an iPad, an older iOS - at the cost of heat.

Do it in this order

Gotchas['Expo Go installs itself in a simulator; on a real phone you install it (1:00-1:01)', 'The Android emulator stayed blank or flaky until after the break; by 2:12 both simulators ran at once (0:59, 1:05, 2:12)', 'Simulators use a lot of CPU and memory and make laptops hot (2:44)']

Why it matters

The loop is what makes AI-written mobile code checkable in seconds.

06

One bounded prompt per screen, previewed before the next (Home, Lesson, Result)

how-to0:42:00

Each prompt asks for one bounded change, the screen is previewed, and only then does the next one start.

The class poll picked the more specific Home prompt: 'Build me the home with the next lesson button. Keep it inactive until we add the lesson screen and help me to run a quick preview.' Then a placeholder Lesson screen with Start Quest linked to it and a back button ('you need to have a way for the user to go back'), then the real lesson from a pre-written course.json, then the Result screen. The Home button on Results is not just navigation: it tells the app the lesson is complete so the backend can mark it done and award XP. Result shown live: 2 of 3 correct, 20 XP, a tip and the next quest unlocked.

Worked example · from the session

First question: which request gives useful context - 'make a plan' or 'plan 3 20-minute beginner photography lessons'?

Do it in this order

Gotchas["After the third question the app first offered 'review last answer and return home' - 'a very bad practice' that the Result screen replaces (1:15)", "A bug on the result screen was fixed by the agent after a restart - 'something has to break' (1:19-1:22)", 'The questions are demo content; the point is the screens (1:24)']

Why it matters

Bounded steps make errors easy to find and the visual match easy to judge.

07

When the build breaks: say exactly what fails, and restart after every new package

how-to1:19:00

Breakage is normal, especially after adding a package.

Rajat's generic fix prompt is specific: 'the start quest is not going to the next lesson screen, please have a look', never 'something went wrong, please fix it'. Adding Clerk broke the whole app - typical, he says: React Native absorbs UI changes, new text and new screens on its own, but a new service or package needs the server stopped and restarted. The next error was a React version mismatch because Clerk tried to use a web login; the agent fixed it, and then the missing API key had to be added.

Do it in this order

Gotchas['Fast Refresh covers UI and text changes, not newly installed services (1:32)', 'A missing key looks like a code bug (1:34)']

Why it matters

The first broken build is where most beginners stop.

People get this wrong

A red error screen means you did something wrong.

'You don't need to get worried or panic. This is a very typical way' - especially after adding a package (1:32).

08

Why a lesson app needs accounts: progress belongs to the signed-in user

1:25:00

If progress lives on the phone, it is lost on a new device and you never learn who uses your app.

Once the app is shared, everyone sees the same thing and the developer cannot tell who is using it. Poll: save lesson progress on this phone, or for the signed-in account? The class chose the account: saved locally, nobody else's progress is visible to you; saved to the account, the same user sees the same live progress on an iPhone and an Android phone. The jobs split: Clerk signs people in and creates accounts, Supabase saves the progress. Why Clerk: with Supabase's own auth, Google sign-in needs your Google client ID and secret and Apple its own client ID and key file; in development mode Clerk supplies those so nothing is configured until production. Firebase 'works fine' too. His rule (2:08): if you prefer to set everything up first, use Supabase login; if you want to validate the app before building out, use Clerk. Only two keys are needed - Clerk and Supabase. Clerk's free tier was given as the first 50,000 users, hedged 'I think so'.

Why it matters

Where state lives decides both the user experience and what you can learn about your users.

10

The costs nobody mentions: store fees, slow review, and the Apple-login rule

1:49:00

After AI writes the app, the real friction is $99, $25 and a review queue.

Asked about cost, Rajat contrasts his past teams of four or five engineers building screens from a designer's UI with today's cost of the AI model - then adds the costs 'where nobody talks': $99 a year to Apple for the App Store and a one-time $25 to Google for Play. Review time: in 2015-2016 his fastest approval came the same day; with the flood of AI-built apps his AfterLit has been waiting more than a month, so he can only share a TestFlight link. A rejection example from his team: an app offering Google login must also offer Sign in with Apple. Test builds can be shared before approval as TestFlight (iPhone) and an APK file (Android), both on his resources page.

Why it matters

A client or student must budget money and weeks for release, not just build time.

11

Give the app a character: making Pip and recording it in agent.md

how-to2:13:00

A named mascot that reacts to answers is what makes the app look like a product, not a generic AI build.

Rajat names his characters - AfterLit's has three states (sleepy, awake, always-on). Two routes to one: a paid platform with animated characters, or a free open-source character skill from GitHub. He made Pip in ChatGPT Images (Gemini would also work): an orange character to match the app, in three poses, saved as transparent PNGs so the agent can crop and place them. He keeps an agent.md file so that if he switches from Codex to Claude 'it shouldn't be like I need to re-explain everything', and asks Codex to read it and store the character rules there. The agent 'has its own interpretation' of the reference but gets close; after a second prompt a wrong answer shows an encouraging Pip. Small touches like this make it 'not look like some AI built the app'.

Do it in this order

Gotchas['The first pass added Pip on Home but not along the learning path (2:24)', 'The right-answer reaction was not built by the end of the demo (2:29)']

Why it matters

Personality tied to specific moments in the journey is cheap and memorable.

People get this wrong

An AI-built app is bound to look generic.

Small tweaks such as a mascot make it 'not look like some AI built the app' (2:28).

12

Final checks, day two's plan, and Q&A (inspiration, Gradle, mobile vs desktop)

2:34:00

Tap targets and device sizes are part of the job; day two adds onboarding, a splash screen, metrics and release.

'What is one thing we can improve?' - tap targets, focus, and how screens look on smaller and larger devices, the mobile version of checking a website at different widths. The app went from text and buttons to a guided experience. Day two's plan: an onboarding screen with Pip, a generated splash screen, metrics with PostHog, feature flags, testing and release; TestFlight and APK test builds are on the resources page. Cody asked about sensors, GPS and the camera - not planned, but the app is a boilerplate and an agent can add a scanner or camera feature. Q&A: inspiration comes from daily-use apps (Swiggy's top tabs switching the bottom tab bar); Kotlin and Gradle problems can now be handed to the AI, with documentation as a fallback; choose UI by borrowing (Duolingo for the path, AfterLit for character) and following good app makers on LinkedIn; mobile or desktop depends on your users.

Why it matters

Defines 'done' beyond the happy-path demo and sets up the second session.

Tools referenced

ToolCoverageMomentContext
Codexdemonstrated0:12Coding agent for every build step; skill-creator used to make the mobile app skill
Expodemonstrated0:23Development tooling; npm start, QR code
Expo Godemonstrated0:23Preview on a real phone; auto-installed in simulators
Xcodedemonstrated0:21iOS Simulator, Mac only
Android Studiodemonstrated0:21Android emulator on Mac or PC
Supabasedemonstrated0:17Backend; Clerk added as third-party auth
Clerkdemonstrated1:26Login; Expo copy-prompt; OTP sign-up; dashboard
React Nativeexplained0:18One codebase for iPhone and Android
ChatGPT Imagesexplained2:17Made the Pip mascot (three poses)
Duolingoexplained0:32Pattern source: start button, highlights, ticks
Firebasementioned1:42Alternative auth
Claude Designmentioned0:49Suggest a layout from your inspiration
TestFlightmentioned1:51Share iPhone test builds before approval
PostHogmentioned2:35Day two metrics
Node.jsmentioned0:33Checked by the skill

Action items

    Resources mentioned

    Resources
    • docRajat's resources website for the session
    • docHome-screen prompt 0:42:00
    • docProfile-screen prompt 1:47:00
    • docClerk's Expo copy-prompt (from the Clerk dashboard) 1:38:00
    • docSlide deck

    Extraction notes

    This page was built from an auto-generated transcript, which garbles product and people's names. Those were corrected silently in everything above and logged here for transparency. The warnings flag claims that were true on the recording day but change fast.

    Transcript corrections applied

    The transcript saysThe trainer actually means
    White (React, White, or Supabase)Vite
    SuperbaseSupabase
    Clock / Club (in Clerk contexts)Clerk
    X4 (React Native and X4)Expo
    ANV files.env files
    Cloud DesignClaude Design
    post-hocPostHog
    After Lid / After LibAfterLit (Rajat's app)
    PromQuest / Task questPromptQuest / Start Quest
    HarsithHarshit (Tyagi)
    Eventorunresolved - the paid animated-character platform
    Dot (a ChatGPT app)unresolved; not recorded as fact

    True on recording day — verify before relying