Skip to main content

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.

PackageWhat it is
@clone/schemaSingle source of truth for CloneEvent and other cross-stack wire shapes. TypeScript types and JSON Schema move together.
@clone/designBrand assets — logos, icons, social cards. Consumed via Vite alias by Desktop and Web.

When to add a new package

Don't, unless:

  1. The same code must be referenced verbatim from two or more active surfaces (e.g. Web and Desktop), and
  2. 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.