Project document
Background Schema
Where learner data lives and what shape it takes.
Principles
No accounts, no tracking, no network. Everything a reader does stays in their browser.
Keys
ts
// ubr:progress — completion timestamps by "series/chapter"
type Progress = Record<string, string>; // ISO date
// ubr:comments — per chapter; absent key means "show seeded comments"
type Comments = Record<string, Comment[]>;
interface Comment {
id: string; name: string; text: string;
likes: number; liked: boolean; at: string;
replies?: Comment[]; // one level only
}
// ubr:theme — "light" | "dim"Seeding
Each chapter derives two or three editorial comments deterministically from its key. The first time a reader posts, likes or replies, the seeded list is copied into storage and edited from then on.
Content
Series, chapters, playgrounds and diffs are static modules in the bundle and versioned with the code.
Clearing data
Clearing site data in the browser resets progress, comments and theme.