UI components

Free, copy-in React components for the views your app would otherwise rebuild — result cards, Monte Carlo bands, tax-rate curves, amortization tables. Headless core, hand-rolled SVG, zero chart-library dependencies, and an audit footer (result_id + engine_version + disclaimer) on by default.

Registry-first, the shadcn way: you copy the source into your app and own it — no npm dependency, no version treadmill. Eighteen components today. Source, registry, and a live gallery: github.com/numeratica/ui.

A few of them

MonteCarloBands

87%of 10,000 paths funded to plan end
10th$120,000 25th$540,000 Median$1,250,000 75th$2,180,000 90th$3,420,000
Illustrative projection, not financial advice.
montecarlo-1.0.0 · mc_1a2b3c4d

SavingsWaterfall

$29,500allocated, in priority order
1. 401(k) match$6,000 2. HSA$4,300 3. IRA$7,000 4. 401(k)$9,200 5. Taxable$3,000
savings-waterfall-1.0.0 · sw_6f7a8b

Use one

Copy the component's files (listed in registry.json) into your app, point it at a response, ship:

import { MonteCarloBands } from './components/MonteCarloBands';

const res = await fetch('https://api.numeratica.com/v1/retirement/monte-carlo', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ current_age: 45, retirement_age: 65, /* … */ }),
}).then((r) => r.json());

<MonteCarloBands response={res} />

Props are typed against the OpenAPI spec, and the repo's CI regenerates those types and fails on drift — so the UI provably matches the API. Theming is override-only: set any --nmr-* token on a parent and the components follow (light and dark ship out of the box). It's source you own — issues get a weekly triage pass; the paid product is the API underneath.