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.
| Year | Commits |
|---|---|
| 2006 | 22 |
| 2009 | 97 |
| 2010 | 39 |
| 2011 | 16 |
| 2012 | 60 |
| 2013 | 2 |
| 2014 | 1 |
| 2015 | 151 |
| 2016 | 133 |
| 2017 | 2 |
| 2018 | 120 |
| 2019 | 966 |
| 2020 | 349 |
| 2021 | 35 |
| 2022 | 99 |
| 2023 | 59 |
| 2024 | 122 |
| 2025 | 202 |
| 2026 | 778 |
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.
| Month | Commits |
|---|---|
| 2024-01 | 0 |
| 2024-02 | 0 |
| 2024-03 | 8 |
| 2024-04 | 0 |
| 2024-05 | 22 |
| 2024-06 | 8 |
| 2024-07 | 23 |
| 2024-08 | 12 |
| 2024-09 | 17 |
| 2024-10 | 19 |
| 2024-11 | 5 |
| 2024-12 | 8 |
| 2025-01 | 3 |
| 2025-02 | 10 |
| 2025-03 | 1 |
| 2025-04 | 0 |
| 2025-05 | 0 |
| 2025-06 | 9 |
| 2025-07 | 7 |
| 2025-08 | 21 |
| 2025-09 | 10 |
| 2025-10 | 41 |
| 2025-11 | 66 |
| 2025-12 | 34 |
| 2026-01 | 9 |
| 2026-02 | 94 |
| 2026-03 | 130 |
| 2026-04 | 59 |
| 2026-05 | 66 |
| 2026-06 | 193 |
| 2026-07 | 85 |
| 2026-08 | 61 |
| 2026-09 | 81 |
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.
| Year | Conventional commits (%) |
|---|---|
| 2026 | 84.2 |
| 2025 | 22.8 |
| 2024 | 17.2 |
| 2023 | 15.3 |
| 2022 | 11.1 |
| 2021 | 5.7 |
| 2020 | 4.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
| Topic | Share (%) |
|---|---|
| AI / Agents | 19.5 |
| Reflex | 21.1 |
| Web / API | 15.6 |
| Data / ML | 12.5 |
| Linux / CLI | 10.2 |
| DevOps | 4.7 |
Studied — forks
| Topic | Share (%) |
|---|---|
| AI / Agents | 38.3 |
| Reflex | 0.0 |
| Web / API | 12.1 |
| Data / ML | 15.6 |
| Linux / CLI | 0.7 |
| DevOps | 9.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.
| Group | Type | Files |
|---|---|---|
| Code | Python | 3259 |
| Code | JavaScript | 1926 |
| Code | TypeScript | 96 |
| Code | Shell | 63 |
| Code | Go | 25 |
| Markup | HTML | 1861 |
| Markup | CSS | 252 |
| Docs | Markdown | 1118 |
| Docs | Text | 91 |
| Data & Config | Data / CSV | 552 |
| Data & Config | YAML / TOML | 170 |
| Data & Config | Jupyter | 130 |
| Data & Config | JSON | 91 |
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.
| Kind | Share (%) |
|---|---|
| Original | 47.6 |
| Forks | 52.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.
| Day | Commits |
|---|---|
| Mon | 200 |
| Tue | 390 |
| Wed | 293 |
| Thu | 229 |
| Fri | 260 |
| Sat | 852 |
| Sun | 1029 |
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.
| Stage | Repositories |
|---|---|
| Repositories | 269 |
| Original | 128 |
| Branch / PR | 46 |
| Tags | 17 |
| PyPI | 12 |
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.
| Repository | Lifespan (days) | Commits |
|---|---|---|
| omagnome | 1 | 53 |
| reflex-mapcn | 1 | 38 |
| mcp-joke-server | 1 | 34 |
| fastapi_todos | 16 | 43 |
| vigia-eew | 19 | 46 |
| quiz | 28 | 47 |
| prismal | 143 | 440 |
| python-android_sms | 229 | 138 |
| ecrespo-localpaquetes | 273 | 46 |
| reflex_resume | 287 | 50 |
| python-autoaccesibilidad | 403 | 49 |
| tutorial_fastAPI | 1409 | 45 |
| pysms-send | 2345 | 29 |
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
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
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.