Novaryn

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

Working

The 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

Working

Admin-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 progress

Token-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 @source directives pointing at the workspace packages — Tailwind never scans inside node_modules, which is where workspace packages are symlinked, so classes used inside @novaryn/ui would otherwise be tree-shaken away.
  • Set data-product and data-scheme on <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 run pnpm 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.