Day one
1
Clone and install
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
The two gates
CI runs the same two gates in
.github/workflows/checks.yml.
House rules digest
Commit messages are short prose sentences
Commit messages are short prose sentences
What changed and why — no
feat:/fix: prefixes. Run git log --oneline -20 and match the existing style.Anonymous keyless mode is a non-negotiable
Anonymous keyless mode is a non-negotiable
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.Storage keys keep the atlas. prefix forever
Storage keys keep the atlas. prefix forever
Renaming a persisted key does not migrate a viewer’s data — it orphans it.
See
src/state/storage.ts and Architecture.Design non-negotiables
Design non-negotiables
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.Tests accompany behavior
Tests accompany behavior
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.Comments state constraints code can't show
Comments state constraints code can't show
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.