Schrollar teaches hard ideas in small pieces. Each idea is a box with up to five layers:
| Layer | Purpose |
|---|---|
| Hook | One picture or line that makes you care. |
| Why | The problem the idea solves. |
| How | The mechanism, usually with a hands-on interactive. |
| Code | A short, real implementation. |
| Try | A question answered with a confidence rating: "Guessing", "Kinda sure" or "Bet my chai". |
Boxes belong to topics, and topics to worlds: Graphs, Algebra, Strings, Data Structures, Dynamic Programming, How AI Thinks, Speed and GPUs, and Music Theory. Boxes declare what they build on, so the app can order them, warn you when you skip ahead, and draw maps.
flowchart LR
F[Feed<br/>planner picks the next boxes] --> B[Open a box]
B --> D[Go deeper<br/>Why → How → Code → Try]
D --> K{Worth remembering?}
K -- Keep --> R[Review card<br/>FSRS schedule]
K -- Move on --> F
D -- confident and wrong --> R
R -- due --> RV[Review: recall, then rate]
RV --> R
RV --> F
Around that loop: daily puzzles with shareable challenge links, search and exploration by world and topic, decks, maps of every topic, reminders, captions in English and Hinglish (Hindi in Latin script), and an account that syncs across devices.
| Part | Technology | Role |
|---|---|---|
| Client | React 19, TanStack Router, Dexie (IndexedDB), Vite, service worker | The whole learner experience, offline-capable |
| Native shells | Capacitor 8 (iOS and Android) | Store distribution, push, haptics |
| Edge | Cloudflare Worker and Workers Assets | Serves the app and content, link previews, API proxy, rate limits |
| Content store | Cloudflare R2 and the edge cache | Signed manifest; immutable, hashed content files |
| API | Node 22 and Hono, bundled with esbuild, on Fly.io | Accounts, sync, sharing, push registration |
| Jobs | Same codebase, separate process | Learner models, reminders, retention, lake export |
| Database | Postgres (Supabase), monthly partitions for analytics | System of record |
| Data lake | Parquet files on R2 | Pseudonymous analytics for notebooks and models |
| Push | APNs, FCM, Web Push | Reminders when cards are waiting |
| Resend | Sign-in codes | |
| Monitoring | Sentry, Prometheus metrics on Fly, uptime checks | Errors, health, alerts |
A pnpm and Turborepo monorepo:
| Package | Holds |
|---|---|
apps/web | The client (also the code inside the native apps) and the Cloudflare Worker |
apps/mobile | Capacitor projects for iOS and Android |
apps/api | The API, background jobs and migrations |
tools/content-cli | Validates, builds, signs and publishes content |
packages/content-schema | The content format: boxes, layers, templates, release info |
packages/protocol | Everything the client and API exchange: sync mutations, payloads, responses |
packages/learning | Spaced repetition (FSRS), card derivation, learner state, mastery |
packages/planner | The feed planner: decides what comes next |
packages/decisions | Decision logging: candidates, scores, propensities, explanations |
packages/experiments | Deterministic experiment assignment, shared by client and server |
packages/events | The analytics event catalogue: names, props, PII class, retention |
packages/playables, scenes, renderer, ui | Interactives, illustrations, box rendering, design tokens |
${sch.nav()}