What changed: the Requests tab of the Usage page shows a heatmap card like
CC Switch's: a cell per day for the last 53 weeks, Monday on top, month
names over the weeks and weekday names at the edge, a Tokens / Requests /
Cost switch (kept in localStorage), a five-shade Less…More legend, and a
tip on each day with its date, tokens, requests and cost.
How: GET /api/usage/heatmap (usage.HeatmapOf) reads QueryPage's cached
request index over a hidden period, "heatmap", which starts on the Monday 52
weeks before this week's. Its rows are summed by local calendar day in both
the compact and the ledger path. So no raw log is scanned per render, and the
days count what the chart counts:
- the page's agent/provider/model/key filters, but not the period or day
picked;
- the gateway's own rejections left out;
- cost of priced calls only, with an unpriced count.
The days are in the local time zone and the shades use theme tokens
(.l0–.l4, as in the sessions calendar). There are no left-border accents and
no native <select>. A click never scrolls the page. A narrow window scrolls
the card sideways inside itself, with the newest week in sight (kept there
as it's laid out or resized, until the reader scrolls back), and the weekday
names stay at the card's edge. The card is hidden when no day has calls. New
strings are in zh, zh-TW, ja and de.
Run:
- go test -tags nogui ./internal/usage ./internal/gui (new TestHeatmapDays,
TestHeatmapOf, TestUsageHeatmapRoute); gofmt -l clean; go vet darwin,
GOOS=linux and GOOS=windows go vet -tags nogui on both packages; go build
for darwin, linux and windows.
- New internal/gui/tests/usage-heatmap.test.cjs in Chromium and WebKit, at
420 and 1100, in en, zh, zh-TW, ja and de, plus dark and the empty case.
It checks:
- the cells, labels, legend and the busiest and quiet days;
- the newest week in sight and only the card scrolling sideways;
- the tip's text and that it stays inside the card;
- that a metric click moves nothing and is kept;
- that the filters, but no period or day, are sent.
- Breaking checks: with the keep-at-end guard reverted, 5 of its 11 subtests
fail in WebKit; with the server's heatmap dropped, TestUsageHeatmapRoute
fails.
- i18n-keys, click-scroll, gui-de, gui-ja, gui-zh-tw, sessions-usage-open
and all usage-*.test.cjs GUI tests pass in both engines (161 each).
- A sandboxed `magpie web` (temp HOME, 2605 fake calls over 400 days, ports
3671/3672): the card fills 369 days at 1280 and 420 wide, and the tip
reads "2026年10月1日周四 / 2.6M token · 23 个请求 · ≈$1.05+".