Documentation
How the platform fits together
Enough to orient yourself and adopt a package. The deep detail lives beside the code, in the repository, where it can be reviewed with the change it describes.
Packages
Three packages, adopted independently
Dependencies point downward only. Each package has to be worth adopting on its own, because a product adopts them one at a time.
@novaryn/tokens
WorkingThe source of visual truth. TypeScript in, CSS custom properties out. Colour maths, the contrast-space ramp, type scale, spacing, elevation, motion, and the six product identities.
- @novaryn/tokens
- @novaryn/tokens/css
- @novaryn/tokens/tailwind
@novaryn/theme-engine
WorkingAdmin-controlled theming. A Zod-validated theme document, a resolver that emits a minimal CSS variable patch, five presets, and React bindings.
- @novaryn/theme-engine
- @novaryn/theme-engine/react
@novaryn/ui
In progressToken-driven primitives. Surface, Button, ButtonLink, Badge, Kbd, ProductMark, Reveal, TopLight, SchemeToggle, AssistantOrb. No component hard-codes a colour.
- @novaryn/ui
Getting started
The monorepo is pnpm workspaces plus Turborepo, on Node 22 or later. From a clone: pnpm install, then pnpm build (which runs tokens → theme-engine → ui → www in dependency order), then pnpm test. The site runs with pnpm --filter @novaryn/www dev on port 3100.
The assistant on this site works with no configuration — without an API key it answers from deterministic retrieval over the same knowledge base. Set ANTHROPIC_API_KEY and the same UI is served by Claude Opus 5 instead.
Consuming the design system
One import wires up Tailwind, the generated token layer, and the bridge that keeps every utility a live reference to a custom property:
@import "@novaryn/tokens/tailwind";in your root stylesheet.- Add
@sourcedirectives pointing at the workspace packages — Tailwind never scans insidenode_modules, which is where workspace packages are symlinked, so classes used inside@novaryn/uiwould otherwise be tree-shaken away. - Set
data-productanddata-schemeon<html>. Those two attributes are orthogonal: product selects the hue ramps, scheme selects surfaces and depth.
Conventions worth knowing before you contribute
- Never edit
packages/tokens/css/tokens.css. It is generated. Change the TypeScript source and runpnpm tokens:build. - Never hard-code a colour, radius, duration or shadow. If a variant is missing, add the variant. The Tailwind bridge clears the stock palette, so this is enforced by the compiler rather than by review.
- Every token is
--nv-prefixed. Tailwind owns the bare namespaces, and the prefix lets these packages drop into an app that already has its own CSS without a collision. - Motion must answer a question — where did this come from, is the system working, or did my action land. If it answers none of them, delete it.
- Glow is reserved. A glowing edge means a model is involved. It is vocabulary, not decoration, and it only holds if it is never spent on anything else.
Adoption in the products
Novaryn's own products ship from their own repositories and adopt these packages by their own decision — nothing is pushed into them. The practical blocker today is Tailwind: this monorepo is on v4 (required, because @theme inline is what makes runtime theming possible at all) while the older products are still on v3. Adoption waits on their upgrade or on a v3 bridge, which has not been written.
Next
Questions the docs do not answer
The on-site assistant is grounded in this same material, and it will say when something is not covered rather than guess. Or email a person.