· 2026
Rahman OS
- Next.js 16 (App Router, cacheComponents)
- React 19
- TypeScript
- Tailwind CSS v4
- shadcn/ui
- Convex
- @convex-dev/auth
- Phosphor Icons
- cmdk
- idb (IndexedDB)
- DOMPurify
- sanitize-html
- Vitest
- bun (package manager)
- Docker
Constraints
- 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.
- 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.
- `components/apps/` files are app-local compositions, not portable slices; a composition is only promoted to a slice once it is generic and reusable.
- The Convex backend is excluded from the Next build (tsconfig exclude) and deployed separately via `convex deploy`; `convex/_generated` MUST be committed before deploy.
- bun is the installer only — the runtime stays Node 22, and the Docker runner boots `node server.js`.
- Use `bun run test`, never `bun test` — the builtin runner shadows the script, ignores vitest.config.ts and exits 0 having run nothing.
- 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.