note Plans change; this page shows intent and the architectural work each item needs, not dates.
flowchart LR
subgraph NOW["Now"]
A0[Hardening: 7 fixes]
A1[App Store and Play Store launch]
A2[Staging API]
A3[DPDP privacy review]
end
subgraph NEXT["Next"]
B1[More worlds opening]
B2[Audio narration]
B3[Friends and activity sharing]
end
subgraph LATER["Later"]
C1[Learned feed policies]
C2[More languages]
C3[Second region]
end
NOW --> NEXT --> LATER
note These came out of checking this report line by line against the code. Each is a gap between how the system should behave and how it behaves today. None is urgent at today's scale, and each is small.
| # | Area | Today | Improvement | Why it matters |
|---|---|---|---|---|
| 1 | Feed planner | Rules are deterministic, so every logged propensity is 1 | Add a small, logged amount of exploration (for example, swap one slot in ten for a ranked alternative) | Without it, off-policy evaluation of a learned feed is impossible; this unblocks the learned-policy work below |
| 2 | Sync | Rejected mutations are deleted from the outbox | Keep rejections whose type or version is newer than the server in a parked table and retry after the next deploy; report rejection counts in the health event | A newer app talking to an older API never loses a learner's action |
| 3 | Sync | The change feed is pruned after 180 days with no signal to devices | When a cursor is older than the oldest kept change, answer "reset" and have the device do a full snapshot pull | A phone left in a drawer for half a year still catches up correctly |
| 4 | Sync | Each user-data mutation is its own transaction | Claim ids and apply user-data mutations in one transaction per push, as analytics events already are | Fewer round trips per push; the first step of the scaling plan |
| 5 | Deploys | /readyz checks only the database connection | Also check that the schema is at the migration level the build expects | A machine can never take traffic ahead of its schema |
| 6 | Rate limits | The per-person sync limit counts recent rows in sync_mutations on every push | Move the counter to a cheap per-user window (in memory or at the edge) | Removes a query from the hottest path as traffic grows |
| 7 | Experiments | The registry, assignment and holdout exist, but nothing is running | Launch the first experiment (a question-style hook in the content layer) and its readout view | Proves the whole loop end to end before a decision depends on it |
flowchart LR
H1[1 · feed exploration] --> C1[Learned feed policies]
H7[7 · first experiment] --> C1
H2[2 · park rejected mutations] --> S[Safer sync]
H3[3 · feed reset signal] --> S
H4[4 · batched transactions] --> SC[Scaling stage 1]
H6[6 · cheaper rate limit] --> SC
H5[5 · schema-aware readiness] --> D[Safer deploys]
roadmap Store launch. Move from TestFlight and Firebase App Distribution to the App Store and Google Play. Builds already come from CI and carry signed release info; the remaining work is store listings, privacy labels and review.
roadmap Staging API. A separate API and database for pre-release testing, so app builds can be tested against a server that is not production. The content preview channel already covers content.
roadmap Privacy review. A formal review under India's Digital Personal Data Protection Act: notices, consent records, data requests and a retention schedule. Most mechanisms (export, delete, consent, pseudonyms) already exist.
roadmap More worlds. Worlds now on a waitlist open as their topics are written. Waitlist sign-ups decide the order. Content-only: no app release needed.
roadmap Audio narration. Narrated layers for listening on the go. Audio files ship as content-addressed files through the same pipeline; the app adds a player and offline caching.
roadmap Friends and activity. Follow friends, see what they are learning, and challenge them. Builds on share links and deck sharing; needs a social graph table and privacy controls.
roadmap Learned feed policies. Today the feed uses the rule policy
feed.rank/rules@3. Once it explores a little (see Hardening), decision logs with real propensities make it possible to evaluate and train new policies offline (off-policy evaluation), using only lake rows from learners who gave research consent, then roll them out through the feed experiment layer.
flowchart LR
L[(decision logs<br/>with propensities)] --> F[filter: research consent]
F --> T[train candidate policy]
T --> O[off-policy evaluation]
O -- better than rules@3 --> E[experiment in the feed layer]
E -- wins --> P[promote policy]
O -- not better --> T
roadmap More languages. Captions already support English and Hinglish; more Indian languages follow the same content fields, with search and the planner language-aware.
roadmap Second region. See Scaling Plan, stage 2.
${sch.nav()}