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.