Atoms and catalogs
The obvious question about auri's architecture: why ship curated catalogs instead of a bag of atoms you compose yourself? Because our components have two consumers — and the second one is a language model with a context window.
Every component is an atom
Under the hood, auri is atoms-first: every component is independently importable (import { Stat } from '@aurilabs/ops'), tree-shakeable, free of cross-component dependencies, and drawing from the same @aurilabs/core tokens. And atoms live once — if a future catalog needs a component another
one has, it references the same atom, never a fork.
Why atoms alone aren't enough
A human developer browses docs and imports what they need. An agent can't — it only speaks a vocabulary that has been taught to it, in its system prompt, before the conversation starts. That changes the economics of "just pick what you want":
- Context is a budget. Every component in the prompt-pack costs tokens on every request, forever.
- Choice dilutes reliability. Models emit small, coherent vocabularies cleanly; sprawling menus breed prop confusion and hallucinated components. Our emission gate measures this on every change.
- Trust is a set property. "These twelve components, taught by this exact pack, emit cleanly across model families" is a claim about the collection — it can't be inherited by an untested hand-rolled subset.
A catalog is the answer to all three at once: the subset an agent needs, taught coherently (one intent scale, one action idiom, shared rules), evaluated as a set, versioned at a stable URL that agents can cache.
A catalog is three thin artifacts over the atoms
- The contract — a JSON Schema scoping exactly this set of components.
- The prompt-pack — the teaching text for exactly this set, evals included.
- The registration — one object handing the set to the renderer.
That's it. The catalog isn't a wall around the atoms; it's the packaging that makes them teachable and testable for models.
Catalogs mix — by design, today
Mixing is the protocol's sanctioned mechanism, not a special case:
const catalog = createCatalogRegistry([basicCatalog, opsCatalog /*, formsCatalog */]); Components from every registered catalog coexist on one surface — the console on this site's
front page mixes basic-catalog layout with ops components in every frame. A future forms catalog slots in identically.
ops, concretely
ops is short for operations: the vocabulary agents use to report, monitor, and ask permission — stats, charts, tables, timelines, logs, approvals.
It's the first catalog because it's the shape of nearly every agent-to-human conversation about work
in progress.
Compose your own
The end state honors both instincts: curated catalogs as the front door, and the catalog composer for teams that want their own vocabulary — pick atoms across catalogs, get a generated contract, a merged prompt-pack, and an emission-eval run against your composition. Ownership of the vocabulary itself, with the same evidence behind it.