Dev Stats

Anyone can say they have been programming for twenty years. This is the measurement: an exploratory analysis of every commit in my GitHub account, read straight from git history rather than estimated.

269

Repositories analysed

128 original, 141 forks

28,103

Commits processed

across every branch and tag

20.7

Years of history

first commit: 6 Jan 2006

43

D3 charts ported to Python

the reflex-rosencharts set

Every repository was cloned with git clone --bare --filter=blob:none — a partial clone that pulls the commit graph and directory trees but no file contents. 269 repositories, 71 MB, 17 seconds, zero failures.

Twenty years, no gaps

The first commit is dated 6 January 2006 and there has not been an empty year since 2012. Counts below are authored commits, original repositories, merge commits excluded — 3,253 of the 28,103 commits processed.

Authored commits per year
YearCommits
200622
200997
201039
201116
201260
20132
20141
2015151
2016133
20172
2018120
2019966
2020349
202135
202299
202359
2024122
2025202
2026778

778 commits in 2026

spread across 39 new repositories

The 2019 spike (966 commits) is almost entirely the blog's automated static generation, not hand-written work.

The inflection was October 2025

Monthly commits from January 2024 onward. The step up in October 2025 has held for twelve months, which makes it a new regime rather than a spike.

Authored commits per month, January 2024 to September 2026
MonthCommits
2024-010
2024-020
2024-038
2024-040
2024-0522
2024-068
2024-0723
2024-0812
2024-0917
2024-1019
2024-115
2024-128
2025-013
2025-0210
2025-031
2025-040
2025-050
2025-069
2025-077
2025-0821
2025-0910
2025-1041
2025-1166
2025-1234
2026-019
2026-0294
2026-03130
2026-0459
2026-0566
2026-06193
2026-0785
2026-0861
2026-0981

10 → 76 commits/month

a 7.6x acceleration, sustained for a year

Process improved in steps, not ramps

Share of commits following the Conventional Commits specification (feat / fix / docs / test / ci). Two discrete jumps: in 2025 messages stopped being labels and became descriptions; in 2026 the convention became the default.

Share of commits following Conventional Commits, by year
YearConventional commits (%)
202684.2
202522.8
202417.2
202315.3
202211.1
20215.7
20204.3

84.2% in 2026

median commit subject: 18 characters in 2024, 66 in 2025-2026

Years run newest first; the top row is the chart's highlighted benchmark.

The last twelve months, day by day

Every other figure on this page is frozen at the analysis date. This one is live: the calendar is fetched from GitHub in your browser when the page loads, so it always shows the trailing year as it stands today.

What I build vs. what I study

The same six topics, measured twice: as a share of my original repositories, and as a share of the repositories I fork to read. Forks run one to two years ahead of production — today's forks predict the code of 2028.

Built — original repos

Share of original repositories by topic
TopicShare (%)
AI / Agents19.5
Reflex21.1
Web / API15.6
Data / ML12.5
Linux / CLI10.2
DevOps4.7

Studied — forks

Share of forked repositories by topic
TopicShare (%)
AI / Agents38.3
Reflex0.0
Web / API12.1
Data / ML15.6
Linux / CLI0.7
DevOps9.2

19.5% → 38.3%

AI and agents: share of what I build, share of what I read

Python, with Markdown as a second language

File-type composition across the 9,692 files in the original repositories (9,634 of them classified below). Much of the JavaScript and HTML is compiled output rather than written code, so the real profile is close to monolingual Python.

Files by group and type
GroupTypeFiles
CodePython3259
CodeJavaScript1926
CodeTypeScript96
CodeShell63
CodeGo25
MarkupHTML1861
MarkupCSS252
DocsMarkdown1118
DocsText91
Data & ConfigData / CSV552
Data & ConfigYAML / TOML170
Data & ConfigJupyter130
Data & ConfigJSON91

11.5% Markdown

one file in nine is documentation

Working with Spec-Driven Design leaves a measurable trace in the file tree: the specs are committed alongside the code.

A portfolio and a reading library

Just over half of the account is forks. Those are not abandoned copies: they are the reading list, which is why they are counted separately from the work.

Repositories by kind
KindShare (%)
Original47.6
Forks52.4

Licences

  • MIT86
  • GPLv340
  • Other21
  • Apache-2.016
  • GPLv27

The MIT-over-GPL crossover dates the cultural shift of the Python ecosystem almost as precisely as carbon dating.

128 original · 141 forks

269 repositories analysed in total

The code gets written on Sundays

One bar, split by day of the week from Monday to Sunday. Saturday and Sunday together take more of it than Monday, Tuesday and Wednesday combined.

Authored commits by day of the week
DayCommits
Mon200
Tue390
Wed293
Thu229
Fri260
Sat852
Sun1029

57.8% on weekends

and only 0.4% between midnight and 6 a.m.

A sustainable rhythm rather than an all-nighter habit: the work is episodic and concentrated — 397 active days, a median of 3 commits on an active day, and a maximum of 126 in one.

From repository to release

Not every repository is meant to ship, and the funnel says how many actually do: how many are original work, how many show real branch and PR flow, how many carry tagged releases, and how many end up installable.

Repositories at each delivery stage
StageRepositories
Repositories269
Original128
Branch / PR46
Tags17
PyPI12

269 → 12

repositories that reach a published PyPI package

Sprints and marathons

Each point is a repository: horizontally, the days between its first and last commit; vertically, how many commits it holds. The upper left is compressed sprints; the right is the long-running projects. Hover a point for its name.

Lifespan and commit count of the most active repositories
RepositoryLifespan (days)Commits
omagnome153
reflex-mapcn138
mcp-joke-server134
fastapi_todos1643
vigia-eew1946
quiz2847
prismal143440
python-android_sms229138
ecrespo-localpaquetes27346
reflex_resume28750
python-autoaccesibilidad40349
tutorial_fastAPI140945
pysms-send234529

53 commits in one day

omagnome: 173 files, a single sitting

Not plotted: ecrespo.github.io, with 1,451 commits over 2,609 days, most of them the blog's automated static generation rather than hand-written work. On the same axes it would squash every other repository into one corner.

Two projects the numbers single out

prismal

Multi-agent orchestration on top of LangGraph. MIT.

  • 440 commits in 143 days (3.1 a day, sustained)
  • 18 versioned releases
  • 67 merge commits — real branch and PR flow
  • 35 test commits: the only repository with real test volume in its history
reflex-rosencharts

43 D3 + Tailwind charts ported to Reflex, in pure Python. MIT.

  • One of 24 Reflex components, 12 of them published to PyPI
  • Eleven components released between 14 and 24 June 2026
  • The charts on this very page are built with it

Figures as of 2026-09-13. Source: https://github.com/ecrespo. Charts built with reflex-rosencharts.

Built with Reflex