An activity heatmap looks simple: one square per day, darker colors for more activity. The harder question is what an empty square actually means. Was nothing recorded, did collection start later, or did the request fail?
AIClaw 3.10.0 adds a welcome screen with separate session and usage calendars. The release is published, and the implementation discussed here is pinned to that tag. The useful change is more specific than the new layout: the screen keeps the meaning and availability of its underlying records visible.
Two tabs, two different measurements
The welcome component starts on the sessions tab. It groups the current session list by each session's creation timestamp. The accompanying caption explicitly says that this is based on the current conversation list.
That is a creation calendar, not a count of messages, completed agent turns, or time spent working. Resuming an old conversation does not create another session-creation event. A record absent from the current list cannot contribute to this view. This is useful for orientation, but it is not a permanent audit log of all historical activity.
The usage tab answers a different question. It requests 365 days through the existing desktop usage bridge, then maps each daily record to input tokens plus output tokens. It does not turn those tokens into a currency balance or estimate credits.
Keeping those measurements separate avoids suggesting that a busy-looking conversation list and heavy model usage must tell the same story.
Load usage when it is requested
The component watches the selected metric. Selecting usage calls window.aiclaw.usage.summary(365) when no summary has been loaded. It guards against overlapping loads and retains a successful summary in the component for subsequent tab switches.
Opening the welcome screen therefore does not itself require a usage-history request. This is a small implementation choice, but it keeps a secondary visualization from adding an eager request to the default view.
There is also a boundary: this is component-local caching. The code shown here does not implement polling or automatically refresh a successful summary whenever another model request completes.
Unknown and zero are different values
The calendar helper takes daily values and an optional first-recorded date. For usage, dates before collection began receive a null value. If there is no first recorded timestamp, the calendar remains unknown rather than inventing a year of zero usage.
Once the recorded range begins, a missing daily entry is represented as zero. That is the helper's interpretation of the available summary; it cannot independently prove that every request was collected.
The rendering keeps unknown cells visually subdued and gives them a distinct tooltip. A failed request has an explicit error and retry control. Its total is shown as a dash, so an unavailable result is not presented as a successful zero-token measurement.
Those states matter even when the chart is decorative. A pale square should not silently make a stronger claim than the storage behind it can support.
Calendar arithmetic follows local dates
The helper constructs the last 365 local calendar dates, including today, and pads the grid into complete Sunday-first weeks. Padded dates outside the visible interval are hidden. Future records do not enter the visible-year total.
It advances dates with calendar operations rather than treating every day as an identical millisecond interval. Session timestamps are grouped into local date keys, and month labels use the selected interface language.
Color intensity is relative to the largest daily value in the visible interval, with four nonzero levels. It is not a fixed threshold or a normalized comparison across different users and time periods. Two equally dark squares in separate calendars can represent different absolute values; the tooltip supplies the daily count.
What the tests establish
For this article, I downloaded the public, tag-pinned helper and its calendar tests into a temporary directory and ran them with Node's test runner. All four tests passed.
They check the 365-date interval and complete-week padding, future-value exclusion from totals, grouping of real creation timestamps, invalid-timestamp handling, unknown-versus-zero usage, and leap-day coverage without duplicate dates.
The release notes separately report 411 passing renderer tests with one skipped, 375 passing desktop UI checks, and successful local build and type checks. I did not rerun that broader suite or perform real-provider usage collection for this article. The published desktop smoke script uses controlled fixtures for the welcome screen's request, failure, and retry behavior.
The calendar is part of the released workspace redesign, not a proposal for an unreleased analytics system. Its practical value comes from showing the records it has, naming the measurement, and leaving missing evidence visible.