Packages
Two cross-surface packages live under packages/. They are intentionally tiny — most code in the monorepo belongs to one app, not to a shared package — and they exist only when something must be referenced from both client and server.
| Package | What it is |
|---|---|
@clone/schema | Single source of truth for CloneEvent and other cross-stack wire shapes. TypeScript types and JSON Schema move together. |
@clone/design | Brand assets — logos, icons, social cards. Consumed via Vite alias by Desktop and Web. |
When to add a new package
Don't, unless:
- The same code must be referenced verbatim from two or more active surfaces (e.g. Web and Desktop), and
- Inlining it in
apps/<surface>/would force consumers to drift over time.
If only one surface owns the concept, keep it in that surface's tree. Cross-stack abstractions invented before they're needed are a known smell in this codebase — see apps/AGENTS.md.