On this page
requests, the Python HTTP library, began on 13 February 2011 with a commit called "first commit" that added one file: an empty README. Hugo began in July 2013 with a four-line README. React began in May 2013 with 43,123 lines across hundreds of files, because its first public commit was a release of code that already existed.
I pulled the first commit of popular repos in our index, checked each one against GitHub, and kept 20 where the first commit really is the start of the public history. The table lists them oldest first.
The 20 first commits
| Repo | Date | First commit message | Size |
|---|---|---|---|
| Keyfactor/ejbca-ce | 15 Nov 2001 | "This commit was generated by cvs2svn to compensate for changes in r3," | 107 files, 8,951 lines |
| psf/requests | 13 Feb 2011 | "first commit" | 1 file, empty |
| DapperLib/Dapper | 1 Apr 2011 | "initial commit" | 18 files, 1,904 lines |
| frappe/erpnext | 8 Jun 2011 | "Sourced wnframework-modules from Google Code as erpnext" | 300+ files, 162,635 lines |
| apache/fineract | 20 Apr 2012 | "initial commit" | 2 files, 10 lines |
| facebook/react | 29 May 2013 | "Initial public release" | 300+ files, 43,123 lines |
| gohugoio/hugo | 4 Jul 2013 | "Initial commit" | 1 file, 4 lines |
| microsoft/PowerToys | 19 Dec 2013 | "Initial commit" | 3 files, 132 lines |
| apache/airflow | 6 Oct 2014 | "First official commit" | 52 files, 5,023 lines |
| pallets/quart | 20 Mar 2017 | "Initial version of Quart" | 46 files, 3,765 lines |
| Blockstream/esplora | 17 Nov 2018 | "initial checkin" | 164 files, 13,824 lines |
| fastapi/fastapi | 5 Dec 2018 | ":tada: Start tracking messy initial stage" | 11 files, 1,787 lines |
| miguelgrinberg/microdot | 19 Mar 2019 | "Initial commit" | 7 files, 478 lines |
| litestar-org/litestar | 5 Dec 2021 | "initial" | 20 files, 1,252 lines |
| egraphs-good/egglog | 2 Feb 2022 | "Get something started" | 7 files, 640 lines |
| langchain-ai/langchain | 24 Oct 2022 | "initial commit" | 64 files, 1,796 lines |
| Portkey-AI/gateway | 23 Aug 2023 | "Initial commit" | 50 files, 4,680 lines |
| anthropics/claude-code | 22 Feb 2025 | "Claude Code" | 6 files, 315 lines |
| ComposioHQ/composio | 11 Apr 2025 | "initial commit" | 21 files, 1,875 lines |
| NousResearch/hermes-agent | 23 Jul 2025 | "initital commit" | 8 files, 865 lines |
Scroll the table sideways to see every column.
Dates are the author dates GitHub shows. "300+" means GitHub's API stops listing files at 300, so the real count is higher.
Empty starts, imports and seeds
Read in a row, the first commits look like one of three kinds of start.
The empty start
requests, Hugo, PowerToys and Fineract all began with a README and little else: requests' README was empty, and Hugo's had four lines. This is what you get when someone creates the repo first and writes the code afterwards. The first commit records the moment someone decided the project would exist, and it says nothing about what the project would be.
The import
React, ERPNext, Esplora and EJBCA arrived fully formed. React's first commit is a public release of 43,123 lines, with a Gruntfile and a contributing guide already in place on day one. ERPNext's message says exactly where its code came from: 162,635 lines moved over from Google Code. EJBCA's first commit was written by a migration tool, cvs2svn, which shows that the project's history began in CVS before it moved to Subversion and later to Git. For these repos the first commit records a move, and the earlier history happened somewhere else.
The seed
Airflow, FastAPI, Quart, microdot, egglog and litestar started with a small, working core. FastAPI's first commit has 11 files, and two of them are applications.py and routing.py, which are still at the same paths in the project today. Airflow's first commit already has an executors package and a command-line script, 52 files in all. I think egglog's message, "Get something started", is the most honest commit message on this list.
Commit messages
"initial commit" or "Initial commit" is the most common first message, used by 8 of these 20. Many tools write it by default, so it tells you nothing about the project.
The messages that break the pattern show what the author was thinking at that moment:
- "First official commit" (Airflow): the word "official" suggests there were unofficial commits before it.
- ":tada: Start tracking messy initial stage" (FastAPI): an emoji and an apology in one line.
- "Sourced wnframework-modules from Google Code as erpnext" (ERPNext): a full record of where the code came from, in one sentence.
- "Initial public release" (React): the word "public" points to a private history before it.
- "initital commit" (Hermes Agent): a typo in the first word anyone saw, which I find reassuring. The same first commit also checked in two
__pycache__files.
Old projects and new ones
Six of the 20 started in 2022 or later: egglog, LangChain, Portkey's gateway, Claude Code, Composio and Hermes Agent. Their first commits look like the older seeds, with a few files and at most a few thousand lines. Hermes Agent began with 865 lines across 8 files, close to FastAPI's 1,787 lines across 11.
The difference is in what came after. Hermes Agent's history on GitHub now runs to nearly 50,000 commits in its first 15 months, while requests has about 6,500 commits in 15 years. The first commit looks much the same across eras, but the rate at which code piles up afterwards has changed a lot, and that is a separate post.
Limits of first commits
A first commit is the start of the history you can see, which is sometimes later than the start of the project.
- React's 2013 commit is a public release of older code, and the same is true of any project that went open source after being built inside a company.
- Some projects restart their repo or squash their early history. Composio's public history starts in April 2025, and I won't guess at what came before it.
- EJBCA's 2001 commit survived two migrations, from CVS to Subversion and then to Git. ERPNext records its own move, from Google Code, in the commit message.
- Git stores an author date and a commit date, and they can differ. Quart's first commit was authored on 20 March 2017 and committed on 14 May 2017. I used the author date, which matches what GitHub shows.
I left out a lot of famous repos on purpose. If our clone of a repo stopped at 500 or 1,000 commits, its "first commit" is only the oldest commit we fetched, and quoting it would be wrong. That ruled out Django, mem0, ratatui and several others, and Gitea and Prefect have no usable history in our index at all. 15 of the 20 in the table have their full history in our index. For the other five (Dapper, egglog, Claude Code, microdot and Portkey's gateway), our clone was capped, so I confirmed the first commit directly on GitHub. Temporal, which I first left out, turns out to have its full history indexed: its first commit is "The new beginning", 20 files on 24 October 2016.
If you want to see the first commit, the busiest day and the longest streak for a repo you work on, the stats page on repowise shows them for any public GitHub repo. Here is requests, for example.
How we measured
We took every public repo in our index with 500+ GitHub stars and read the first commit recorded in its git history. We kept a repo if its full history was indexed (no commit cap) and the first commit date looked like the project's real start, or if our clone was capped but GitHub confirmed the same first commit. That left 20. For each one I looked up the oldest commit on the default branch through the GitHub API and confirmed the SHA, date and message match. The file and line counts come from GitHub's commit API, which lists at most 300 files per commit. Data checked on 6 October 2026.