Day one

1

Clone and install

Anonymous watch works with zero environment variables. See Quickstart if you need sign-in or sync locally.
2

Read the non-negotiables

CLAUDE.md and AGENTS.md (agent-facing, but the rules apply to every contributor): Expo has changed recently — check the versioned docs at docs.expo.dev/versions/v57.0.0/ before writing code against memory — and the database is never reset. No supabase db reset, no migration down, no drop table/truncate without a bounded where, no editing a file already in supabase/migrations/. Schema changes are always a new, additive, idempotent migration.
3

Run the two gates before you push

Both come back clean — CI runs the identical two gates.

The two gates

Both gates are clean on main — zero type errors, zero test failures. A change that breaks either doesn’t merge.
CI runs the same two gates in .github/workflows/checks.yml.

House rules digest

What changed and why — no feat:/fix: prefixes. Run git log --oneline -20 and match the existing style.
Every feature must render without any environment keys. Clerk hooks may only be called behind useClerkReady() — see src/auth/AuthRoot.tsx for the incident that rule comes from: a component that mounted outside the provider called useAuth() directly and blanked the app.
Renaming a persisted key does not migrate a viewer’s data — it orphans it. See src/state/storage.ts and Architecture.
Amber means now; crimson means LIVE. No third accent color, no purple, no glassmorphism. Real flag images, never emoji. Honor blocklist.json before any stream plays. Drop closed channels only. NSFW content stays behind its off-by-default toggle.
Most modules are TDD’d. A behavior change updates the test that encoded the old behavior, with a comment saying who decided — see Watch.test.tsx for the pattern.
The codebase narrates its non-obvious decisions inline — why a storage key can’t be renamed, why an effect reads a ref. Match that density; don’t add “what the next line does” comments.

Repo map

Good first areas

Catalog sources

Each source in src/catalog/sources/*.ts is a small, independently testable adapter — a good shape to learn the merge pipeline from.

Pure recommendation modules

src/recs/ is pure and thoroughly tested (vector, taste, similar, candidates, blend) — no I/O to set up locally.

Worker relay tests

worker/src/relay.test.ts covers the allowlist, the refusal path, and HLS playlist rewriting in isolation.

Public API surface

api/catalog.ts’s op switch is a readable entry point into how the catalog is served without ever leaking a stream URL.