Apps
Every Clone surface lives under apps/. They share the same JWT/API-key identity boundary, the same event schema (packages/schema), and the same backend (apps/server). Surface-specific behavior — read-only-plus-live-actions on Desktop vs. edit-plus-analytics on Web, terminal-shaped UX on CLI, MCP-native tooling on apps/mcp — is the only differentiator.
At a glance
| App | Stack | Role |
|---|---|---|
| Web | Vite + React 19 + Tailwind v4 | Marketing site, dashboard, memory editing, analytics. |
| Server | Django 6 + DRF + simplejwt + Anthropic SDK | The single backend; owns Recording, Memory, Prediction, Voice, Access. |
| MCP | Node + @modelcontextprotocol/sdk | MCP-server facade over the Server's Recording/Memory/Prediction layers. |
| CLI | Node | Terminal client and recording producer. |
| Desktop | Electron + electron-vite + React 19 | Capture + live actions; read-only views into Memory. |
Boundaries
- Identity — every authenticated request carries either a 60-minute simplejwt access token or a
clone_…API key. Refresh runs on a 50-minute timer in client surfaces; servers never refresh on the user's behalf. - Schema —
packages/schema/events.ts(TypeScript) andpackages/schema/events.schema.json(Python validator) describe the sameCloneEventwire shape. Add a new event in both files at once. - State — no client surface persists business state of its own. Anything that should outlive a session goes to the Server via the REST endpoints documented under API Reference.