1

Clone and install

pnpm only. The lockfile and patchedDependencies are pnpm’s — switching to npm or yarn causes lockfile drift.
2

Start the dev server

Starts the Metro dev server for web at http://localhost:8081. For iOS/Android/web via Expo Go or a simulator, use:
3

Watch something

That’s it. Anonymous watch works with zero environment variables configured, and the codebase is written to keep it that way. Sign-in, sync, and the nightly recommendation jobs each turn on independently when their keys exist.

Environment variables

Copy .env.example to .env.local. Every variable is optional — none is required for anonymous watch.
Never put a secret in an EXPO_PUBLIC_* variable. Those ship in the client bundle, readable by anyone who loads the page.

Client (EXPO_PUBLIC_*, safe to ship in the bundle)

Server-side jobs only (scripts/*.ts, GitHub Actions — never EXPO_PUBLIC_*)

After the Vercel Marketplace provisions Clerk and Supabase, vercel env pull --yes writes the real client values into .env.local for you.

Testing

Runs jest-expo with @testing-library/react-native available for component tests.

Building for web

Exports a static web build to dist/.

End-to-end smoke test

Builds the web export, serves dist/ on localhost:4173 via serve, and runs a Playwright test that loads the app, waits for a live channel’s video to actually be playing, and asserts the crimson LIVE pill is visible.