Cadora · design spec
Everything needed to rebuild or extend the FinOps surface — the exact tokens, the metric tile, the breakdown row, the token split, the since toggle, and every state they must render. The components below are live HTML; edit them here or lift the specs into Figma.
Dark instrument surface · blue-to-green for cost · amber reserved
--blue · #3b82f6Cost bar start · active toggle--green · #16c784Cost bar end--green-soft · #75f0a8Daily bar top--amber · #ffd08aAttention only · sparingly--bg · #0f172aPage ground--panel · #1e2937Metric tile--panel-2 · #162237Split · daily block#0d1526Cost bar ground--line · #334158Borders · row rules--text · #f5f7fbNumbers--muted · #9aa8bcLabels · tokens/$costCost reads blue → green, never red: spend is information, not an error. Amber stays reserved for the review gate and integrity warnings — it does not appear in a healthy FinOps panel.
System sans for numbers · monospace for the tokens/$cost voice
| Role | Family | Size / weight | Notes |
|---|---|---|---|
| Metric number | system-ui | 22–24px / 700 | The tile's headline value |
| Metric label | system-ui | 11–12px / 400 | Muted, above the number |
| Breakdown label | system-ui | 12–13px / 700 | Model / executor / funding, ellipsis on overflow |
| tokens / $cost | mono | 11–12px | Muted · 990.8k / $1.9895 |
| Panel / section label | system-ui | 12–15px | FinOps · By model |
| Metric | Value | Metric | Value |
|---|---|---|---|
| Tile radius | 8px | Tile padding | 14px |
| Bar height | 8px | Bar radius | 999px |
| Cost-row grid | .7fr 1fr auto | Row gap | 8px |
| Daily height | 92px | Daily-fill width | 68% |
| Cost precision | $0.0000 | Token format | 1.0k · 1.00M |
Four totals across the top of the home page
The panel every attribution question turns on
Label · cost bar · tokens / $cost
Every condition the surface must render
Funding · subscription (default)
By fundingFunding · metered (billed API)
By fundinggpt-5.5 · cost estimated from the public rate table
Zero-cost run (fixture / mock)
No usage yet
Empty window
Cost by dayNo runs in window
Cache-heavy split (typical)
Undated run
Cost by dayThe number, and the arithmetic behind it
| Metric | Definition |
|---|---|
| Runs | Archived runs inside the active window. |
| Generation tokens | input + output — the tokens the model read fresh and wrote. |
| Context tokens | input + output + cache creation + cache read — the full volume moved, so cache stays visible. |
| Cost | Summed per-node dollars. Backend-reported when the backend gives dollars (Claude Code); otherwise priced from the public rate table and flagged estimated (Codex). |
| Token split | The three classes behind context: in, out, and cache (creation + read combined). |
| By model / executor / funding | The same spend grouped three ways. Executor is the backend that ran the node; funding is subscription or metered. |
| Cost by day | Per-day cost bars across the window, scaled to the costliest day. |
The same aggregation, in the terminal — cadora usage
| Flag | Effect |
|---|---|
--archive-dir <dir> | Which runs/ archive to read. Default runs. |
--since <when> | Window cutoff: an ISO timestamp, Nd (days), or Nh (hours). Same filter as the dashboard toggle. |
--json | Emit the structured summary — every by_model / by_executor / by_funding / by_day group plus per-node rows — for another tool. |
Words are part of the design
| Do | Not |
|---|---|
| Attribute — "by executor: codex $0.38" | "Total spend: $2.36" |
| Mark the estimate — "estimated from the rate table" | Show an estimate as a billed figure |
| $1.9895 · four decimals, always | ~$2 · $1.99 |
| 990.8k · 1.00M | 990842 tokens |