Introduction
An open-source, config-driven decision-lock for visual choices and strategic calls — reviewable options in, a deterministic build brief out.
A visual or strategic decision usually dies in a document. Someone writes "warm, editorial, not corporate," three people picture three different things, and the build pass guesses. Loupe replaces that ambiguity with reviewable choices.
You describe the decision as a typed config. Loupe turns each choice — an image crop, a color palette, a type specimen, a motion feel, a layout mock — into a real, rendered option tile. Locking a tile recomposes a sticky live preview and keeps a deterministic export brief in sync. That brief, markdown and JSON, is the ground truth the next build pass consumes — whether the builder is a person or an agent.
Lock a tile below and watch the preview and the brief move with it. This is the real React adapter, themed with the Night Atlas tokens — nothing is mocked.
The wedge
Most "design decision" tooling makes you choose between two bad options: a Figma board nobody can diff, or a text log nobody can see. Loupe sits exactly between them.
- It is seen, not described. Every option renders the actual thing — a real crop of a real board, a real type family at a real weight. The decision-maker sees what they are choosing.
- It is the contract, not a screenshot of one. The export brief is derived from the same selections that drive the preview, so the preview and the brief can never drift. Hand the brief to a build pass and it is exact.
- It is agent-native. The config is a Zod schema;
toJsonSchema()emits the exact contract an agent fills. An agent can author a decision-lock, screenshot-verify it, and export the brief without a human writing TypeScript. - It is portable. The generator produces
index.htmlwith JS and CSS inlined and copies referenced assets beside it. The result runs underfile://or a static host with no runtime package dependency.
Loupe is a decision-lock and build-brief tool. It does not define a general product-definition standard and it does not implement the resulting product. The interactive example on this site is a verified public demo; catalogue fixtures are not production-adoption proof.
Install and use
There are two ways to consume Loupe, and they cost very differently. Default to the first.
Install the published generator and schema, author a loupe.config.ts, then run your build script. The exact current package versions live in the typed catalogue contract.
The generated artifact contains the interactive picker, live preview, export brief, and copy action. Asset-light configs may be one file; configs that reference images or other assets include the copied files beside index.html. See the agent method for the full explore → author → generate → verify → export loop.
When a shipping app needs the picker live in its own UI, mount the React adapter and import the canonical styles once.
The five @lucentive-labs/loupe-* packages are published to npm from Loupe's canonical repo (LucentiveLabs/loupe) with provenance. They do not share one aggregate Loupe version: use the per-package versions in the catalogue fact contract. The packages reference documents every export.
The packages
Loupe is a small set of layers. The headless core holds all the logic; everything above it is a thin renderer.
loupe-schema
The Zod config contract a human or agent fills — Config, parseConfig, toJsonSchema, validateConfig.
loupe-core
Framework-free headless core — the store, the derivations, the crop math, the theme tokens.
loupe-dom
The canonical vanilla renderer — mount, renderToString, and the shared styles.css.
loupe-generator
The Node-only builder that emits the portable static artifact and copies referenced assets.
loupe-react
The React 19 adapter — <Loupe /> and the headless useLoupe() hook.
Where to go next
Quickstart
Author a config, render it, read back the brief.
Core concepts
Groups, options, specimens, the composed preview, and the export brief.
The crop model
Normalized rects, the exact cover math, and a live crop you can switch.
Interactive tutorial
Edit a config in the browser and watch the brief recompute.