Brief
What had to change
Explore a manifest-driven OS-style interface without making the operating-system metaphor the main website thesis.
Approach
How the work was shaped
The site is maintained as a downstream of his own OS work: he physically re-laid this repo onto mso's slice layout so a fix landed upstream ports across as a file copy instead of a manual translation (120 import sites across 81 files survived on a one-line tsconfig edit), then ported mso's import-cycle and WCAG-contrast checkers and its slice-boundary lint rules — widening the cycle scan to `components/` because 55 of the 81 modules that consume a slice live there, so mso's narrower scan would have left most of this tree unchecked. Framework limits are met head-on rather than worked around: the OS deep links are explicit static route directories rather than a `[slug]` catch-all, because `dynamicParams` is rejected outright under `cacheComponents` and a one-segment catch-all would answer every unknown top-level URL with a 200 and a blank desktop; `os-app-slugs.test.ts` then diffs the slug list against the live catalog, the marketing routes and the directories on disk so the three cannot drift silently. Status audits run as parallel verifiers checking claimed-done against actual code, which is how a latent production outage surfaced — `convex/files.ts` called `assertSession` without importing it, and `convex/` is excluded from the root tsconfig, so `tsc --noEmit` never saw it and uploads threw only once deployed.
Outcome
What the result changed
Homepage JS 1,188 KB → 606 KB, by moving the OS behind an on-demand boot
Constraints that shaped the system.
- 01
The OS chrome is a user preference picked per surface, not the product: three desktop shells (macOS, Windows, Dashboard) and three mobile shells (iOS, Android, Mobile), stored as { desktop, mobile }, defaulting to macOS + iOS.
Constraint - 02
Portable slices under `frontend/slices/` are treated as upstream — the rule is 'prefer wiring over editing; edits make `rr update` harder' — and may only be imported through the `@/features/<slice>` alias, never by deep or relative path.
Constraint - 03
`components/apps/` files are app-local compositions, not portable slices; a composition is only promoted to a slice once it is generic and reusable.
Constraint - 04
The Convex backend is excluded from the Next build (tsconfig exclude) and deployed separately via `convex deploy`; `convex/_generated` MUST be committed before deploy.
Constraint - 05
bun is the installer only — the runtime stays Node 22, and the Docker runner boots `node server.js`.
Constraint - 06
Use `bun run test`, never `bun test` — the builtin runner shadows the script, ignores vitest.config.ts and exits 0 having run nothing.
Constraint - 07
No Clerk: auth is `@convex-dev/auth`. shadcn primitives only — no raw `<dialog>` / `<input type=date|file>`. `proxy.ts`, not `middleware.ts`, on Next 16.
Constraint
