Developer analytics
AtoAxis turns editor heartbeats into total time, daily averages and breakdowns by project, language, editor, operating system and branch. Every view can be filtered and drilled into, and it also reports keystrokes, characters and AI-attributed lines.
Metrics available
Time
- Total time for today, 7 days, 30 days or a custom range
- Daily average, active days and best day
- Today’s running total and duration blocks
Breakdowns
- Project, programming language, editor, operating system and branch
- Each item also shows how many distinct days you touched it, not just its total
Activity volume
- Keystrokes, characters added/deleted, active days and raw heartbeat counts
AI attribution
- AI lines by agent, AI heartbeat share and daily AI versus human series
Ranges and what counts as a day
Every metric is asked for over a range. Four named ranges exist alongside an explicit start and end date, and a day is a calendar day in the timezone the client sends, falling back to UTC when it sends none, so a session that runs past midnight lands where you expect it.
- today, last_7_days, last_30_days and all_time
- An explicit start and end date for anything else
- All time is bounded by your first recorded heartbeat, not by a retention window
- Ranges apply to breakdowns and daily series alike, so totals and charts always agree
Explore and drill in
The numbers above are not a fixed report. One filter bar drives every view: narrow to a project, a language, a branch or an editor and the timeline, the breakdowns and the AI-versus-human split all recompute against the same range. The filter state lives in the URL, so a particular slice is a link you can bookmark or send.
- Activity timeline: when the work happened across the range, as blocks rather than one daily bar
- Human vs AI: the daily split between AI-attributed and hand-typed work, under any filter
- Projects: every project ranked for the current filter, each expandable to its files
- Activity heatmap: the day-of-week and hour-of-day pattern behind "when do I actually code"
- One duration model behind all four, so switching view never changes the total
How the numbers are produced
Heartbeats are rolled into daily aggregates in ClickHouse. Consecutive heartbeats form duration blocks; a long gap ends one and idle gaps are excluded.
Why the total is lower than wall-clock time
A heartbeat is produced by an edit, a save or a file switch. Time spent reading, in a meeting or away from the keyboard produces none, so the gap closes the current block instead of extending it. The number is time spent changing code, which is the only quantity the editor can observe honestly.
Per-project analytics
Every metric above also exists scoped to a single project, which is where most questions actually get answered: not how long you coded, but how long that project took.
- A daily time series for one project across the selected range
- The files touched inside the project, with their own totals
- The AI versus human split for that project alone
- Regex project rules and manual merges, so two checkouts of one repository stop counting as two projects
Attribution and coverage
Line changes resolve to one of three classes, and coverage is reported as a percentage rather than being hidden. A metric that cannot be established is null with the reason attached; it is never rendered as a confident zero.
- AI: lines a hook or client explicitly attributed to a named agent
- Human: keystrokes and characters the editor observed you type
- Unattributed: changes that arrived without proof of either, kept separate rather than guessed
Numbers you can re-derive
Aggregates are a projection of the raw heartbeats, not the record itself, so they can be rebuilt. A rebuilt projection is published only once it reconciles, and each response carries the version it was built from.
- A day can be reprocessed from raw history without deleting anything
- A reconciliation that fails leaves the previous version readable instead of publishing a broken one
- Responses report the data version they were produced from, so a stale read is detectable
- The raw heartbeat stream is browsable directly, so any figure can be traced back to the events under it
Goals and leaderboards
Two optional layers sit on top of the analytics, and both need the server to run PostgreSQL. Neither changes how coding time is measured.
- Goals: a daily, weekly or monthly target for coding time, optionally scoped to one project or language, tracked against the same canonical timeline. A goal can be an upper bound as easily as a lower one.
- Leaderboards: opt-in boards for coding time, hand-typed time, AI-attributed time or estimated AI spend, weekly or monthly. A board ranks only the people who joined it; nothing is compared automatically.
What is not measured
The analytics here produce no productivity score and no quality estimate, and nothing in them ranks you automatically. Two opt-in extras sit alongside: leaderboards, which compare only the people who joined the same board, and a streak-and-level display on the overview. Work outside a connected editor or the AI transcript agent is not inferred.
- No single analytics number is presented as a verdict on a day
- No automatic comparison between accounts; leaderboards rank only opted-in members and require PostgreSQL on the server
- The streak, level and quest widgets on the overview are cosmetic and feed back into no metric
- No judgement of the code itself: lines changed is a volume, not a quality signal
- Nothing is inferred from typing speed or code shape to fill a gap in attribution
Related pages
Developer analytics FAQ
- How is coding activity measured?
- Editor activity is recorded and grouped into sessions instead of inferred from commits.
- How is coding time calculated?
- Close heartbeats form a duration block and idle gaps are excluded.
- What ranges are available?
- Today, 7 days, 30 days, all time and explicit start/end dates.
- Can I see language usage?
- Yes. Each heartbeat carries a detected language and aggregate totals.
- Are keystrokes counted?
- Yes. Keystrokes and characters are aggregated by project and day.