{#snippet seg(items: { value: string; label: string }[], active: string, pick: (v: string) => void)}
{#each items as it (it.value)} {/each}
{/snippet} {#snippet arcGauge(label: string, pct: number | null)}
{pct === null ? '—' : `${Math.round(pct)}%`} {label}
{/snippet} toknmtr — dashboard

Dashboard

{#if ov.dateRange.earliest && ov.dateRange.latest} {range.label} · activity {fmtDateShort(ov.dateRange.earliest)} – {fmtDateShort( ov.dateRange.latest )} {:else} {range.label} · no activity in this window yet. {/if}

Notional cost · {range.label} {fmtUsd(ov.totalCostUsd)} API-equivalent · subscription is flat-rate {#if spark} {/if}
{fmtCompact(ov.totalTokens)} tokens
{fmtInt(ov.sessionCount)} sessions
{fmtCompact(ov.eventCount)} events

Usage over time

{@render seg( [ { value: 'tokens', label: 'Tokens' }, { value: 'cost', label: 'Cost' } ], seriesMetric, (v) => (seriesMetric = v as 'tokens' | 'cost') )} {@render seg( [ { value: 'bars', label: 'Bars' }, { value: 'area', label: 'Area' } ], seriesType, (v) => (seriesType = v as 'bars' | 'area') )}
{fmtCompact(ov.totalTokens)} Tokens
{fmtCompact(ov.totalInputTokens)}↓ {fmtCompact(ov.totalOutputTokens)}↑
{fmtInt(ov.sessionCount)} Sessions
in window
{fmtCompact(ov.eventCount)} Events
{fmtInt(ov.eventCount)}
{fmtCompact(ov.toolCallCount)} Tool calls
{fmtInt(ov.toolCallCount)}

By model

{#if modelView === 'donut'} {@render seg( [ { value: 'cost', label: '$' }, { value: 'tokens', label: 'Tokens' } ], donutMetric, (v) => (donutMetric = v as 'cost' | 'tokens') )} {/if} {@render seg( [ { value: 'donut', label: 'Donut' }, { value: 'share', label: 'Bars' } ], modelView, (v) => (modelView = v as 'share' | 'donut') )}
{#if modelView === 'donut'} {:else if byModel.length}
{#each byModel as m (m.model)}
{modelLabel(m.model)} {fmtUsd(m.costUsd)}
{fmtPct(m.costShare)} of cost {fmtCompact(m.totalTokens)} tok {fmtInt(m.eventCount)} events
{/each}
{:else}

No model usage in this window.

{/if}

Cache efficiency

Prompt caching stores the stable prefix of your prompt (system prompt, tools, earlier turns) so repeat requests skip reprocessing it.

Cache write — the first time a chunk of context is cached (≈1.25× the input rate).

Cache read — that context reused on later turns (≈0.1× the input rate, ~10× cheaper).

Claude Code resends the whole conversation each turn, so most of the input side becomes cheap cache reads. $ saved is those reads priced at the read rate vs. what they'd cost at the full input rate.

Subscription

/usage
{#if gauges.length}
{#each gauges as g (g.host)}
{g.host}
{@render arcGauge('Session', g.sessionPct)} {@render arcGauge('Week', g.weekAllPct)} {@render arcGauge('Sonnet', g.weekSonnetPct)}
{/each}
{:else}

No usage gauges yet.

{/if}

By model over time

{@render seg( [ { value: 'cost', label: 'Cost' }, { value: 'tokens', label: 'Tokens' } ], modelSeriesMetric, (v) => (modelSeriesMetric = v as 'tokens' | 'cost') )} {@render seg( [ { value: 'area', label: 'Area' }, { value: 'bars', label: 'Bars' } ], modelSeriesType, (v) => (modelSeriesType = v as 'bars' | 'area') )}

Activity by hour

{@render seg( [ { value: 'tokens', label: 'Tokens' }, { value: 'cost', label: 'Cost' } ], hourMetric, (v) => (hourMetric = v as 'tokens' | 'cost') )}

Cumulative cost

running total · {range.label}

Top tools

by call count
{#if tools.length} {#each tools as t (t.toolName)} {/each}
Tool Calls Errors Avg latency Output
{t.toolName} {fmtInt(t.callCount)} 0}> {t.errorCount > 0 ? `${fmtInt(t.errorCount)} (${fmtPct(t.errorCount / t.callCount)})` : '—'} {fmtMs(t.avgDurationMs)} {fmtBytes(t.totalResultBytes)}
{:else}

No tool calls in this window.

{/if}

Recent sessions

View all →
{#if sessions.length}
{#each sessions as s (s.host + '/' + s.sessionId)}
{#if data.showTranscripts} {basename(s.project)} {:else} {basename(s.project)} {/if} {#if s.gitBranch}{s.gitBranch}{/if}
{s.host} {relativeTime(s.lastEventAt)}
{fmtInt(s.eventCount)} ev {fmtInt(s.toolCallCount)} tools {fmtCompact(s.totalTokens)} tok {fmtUsd(s.costUsd)}
{/each}
{:else}

No sessions in this window.

{/if}

Web usage

searches & fetches

Which tools fail, and when

errors over time

When do I work

events by day & hour · UTC