Swap the domain
Take any GitHub URL and change github.com to commit.city. There's no sign-up and nothing to install.
| URL | What you get |
|---|---|
| commit.city/torvalds | A person's year: every public repo they committed to in the last 365 days, wired to their avatar. |
| commit.city/vercel | An organisation: its 24 busiest repos, with everyone's commits. |
| commit.city/facebook/react | One repository and every contributor, over the last year. |
| commit.city/denoland/deno?all=1 | A repository's entire history, from its first commit. |
The first visit builds the city while you watch, repo by repo: a few seconds for a small account, a few minutes for a big one. After that it's cached and opens instantly for everyone, and anyone can ask for a fresh build once it's a few hours old.
Reading a city
- Islands are repos. Each is a squarified treemap of the repo's file tree. In an org city, repos cluster into sectors.
- Platforms are directories, stacked by depth, so the shape of an island is the shape of its architecture.
- Towers are files. Height is line count; colour is file type. Footprints never move, so you can watch a single file grow, shrink, get renamed or disappear.
- Beams are commits. Each one flies from the author to the island it lands on, and the files it touched flash.
- Repos cool as they go quiet: hot, active, cooling, dormant, abandoned. The beam to an abandoned repo thins to a thread.
- Days and nights follow the timezone the commits were actually made in.
Controls
| Input | Action |
|---|---|
| drag · right-drag · scroll | orbit · pan · zoom |
| click a repo or a leaderboard row | inspect it; Esc goes back |
| drag the timeline | scrub to any moment |
| Space · ←/→ · Shift+←/→ | play/pause · ±1 day · ±1 hour |
| 1–6, ↑/↓ | speed, from 1 hour to 2 weeks per second |
| A | the agent lens: colour beams by human, bot or AI agent |
| R | record a video clip of the year |
| Home · End · O · L · H · F | start · now · auto-orbit · labels · hide UI · focus the hovered repo |
The agent lens
A growing share of commits are written by AI agents and automation. commit.city classifies every commit it replays as human, bot or a specific AI agent, from the signatures they leave in git and on GitHub:
- The commit author. Agents that commit under their own account, like
copilot-swe-agent[bot]ordevin-ai-integration[bot]. - Co-authored-by trailers. Claude Code, Cursor, Copilot and others add one when they help write a commit.
- Message footers, like Claude Code's “Generated with Claude Code” or Aider's
aider:prefix. - On the live view, the account behind an event and agent branch names like
claude/…orcopilot/….
Automation that isn't an AI agent (Dependabot, Renovate, GitHub Actions and other [bot] accounts) counts as bot. Everything else is human.
Agents it recognises
Press A in any city to colour the beams by who sent them. The panel then breaks the year down by agent, and the timeline splits by author.
GitHub, live
commit.city/events turns GitHub's public timeline into a city in real time. Every repo that shows up gets a tower, every push, pull request, issue, star, fork and release drops in as a beam, and repos that go quiet sink away after a few minutes. The panel keeps a running count of humans, bots and agents.
GitHub publishes its public timeline a few minutes behind, as a sample of everything happening, so the view runs a few minutes behind real time too. It shows public activity only.
Privacy
- Public data only. The builder reads public repositories with a token that can't see anything private. Private repos never appear on commit.city.
- No source code is kept. A city stores file paths, line counts and timestamps, all things anyone can already see on GitHub. Repo records are cached so the next visitor doesn't rebuild them.
- No ads, no trackers, no analytics cookies. A cookie is set only if you sign in, to remember who you are.
- Sign-in asks for no permissions. It proves you own an account, so you can manage its city. Builds you start then use your own GitHub API quota.
Hiding your city
Open your city, press Share, then Sign in with GitHub. You can leave individual repos out of your city, or hide it entirely. Hiding deletes your city and your repo cities and keeps them from being rebuilt. Org owners who want an org city hidden can open an issue.
Limits
| Rule | commit.city | Action / CLI |
|---|---|---|
| Window | the last 365 days, or everything with ?all=1 on a repo | since, default 365 days |
| People | top 50 repos by your commits | top 60 (max_repos) |
| Orgs | the 24 busiest repos | n/a |
| Repo size | up to ~1.5 GB on disk | no limit |
| Big repos | the deepest folders fold into one building until a repo fits 2,500 files (60,000 across a city) | |
| Skipped paths | node_modules, dist, vendor, virtualenvs, caches, lockfiles, *.min.js, *.map | |
| Binary files | count as 12 lines | |
Private repos: run it yourself
The same pipeline ships as a GitHub Action and a dependency-free Python CLI. Both write one self-contained HTML page (three.js, your data and your avatar inlined) that you can host anywhere. Private repos are opt-in and always anonymised: they show as private/repo-N, every path is renamed, and only sizes and timing stay real.
Template + Action
- Click Use this template and create a repo (any name).
- In the new repo, set Settings → Pages → Source to GitHub Actions.
- Run Actions → commit-city → Run workflow. It then rebuilds every week and only re-reads repos that moved.
- Open
https://<you>.github.io/<repo>/.
To include private repos, set include_private = true in commit-city.toml and add a fine-grained token with read-only Contents and Metadata as the COMMIT_CITY_TOKEN secret.
Command line
pipx install git+https://github.com/azank1/commit-city commit-city build --login YOU --out my-city.html # public repos GH_TOKEN=... commit-city build --login YOU --include-private # plus private, anonymised
API & embeds
| Endpoint | Returns |
|---|---|
/api/card?t=… | The README card, SVG. theme=light, animate=0, all=1. |
/api/og?t=… | The 1200×630 link-preview image, PNG. |
/api/city?t=… | A city's status and metadata (JSON): ready, missing or hidden, with stats and the human/bot/agent split. |
/api/live | The latest public GitHub events, compacted and classified (JSON). |
Embedding a city
<iframe src="https://commit.city/you#embed=1" width="100%" height="480" style="border:0"></iframe>
Hash parameters work on every city URL:
| Parameter | Effect |
|---|---|
t=2026-03-14 or t=2026-03-14T21:30 | open at that moment (t=end for now) |
speed=1h|6h|1d|3d|1w|2w | playback speed per second |
play=0 · orbit=0 · hud=0 | start paused · no auto-orbit · no panels |
focus=owner/repo | start focused on a repo |
lens=agents | start with the agent lens on |
embed=1 | embedded mode: no site bar, scroll doesn't zoom until clicked |
The payload format is versioned and documented: schema/lapse.schema.json.
How it's built
The hosted builder runs as serverless functions. A shallow fetch with deepen-since pulls just the window's commits, and a partial filter blob:limit=128k holds back big blobs (binaries are recognised by name; big text files come in one follow-up fetch).
A small pack parser and tree differ replay the first-parent history, tracking every file's existence and line count. Your browser drives the build (start, one call per repo, finish), so no function has to outlive its time limit and you get to watch it come together.
Parity is tested: the TypeScript engine is checked against a Python replay that uses a real git clone and numstat, on synthetic repos covering renames, merges, symlinks, binaries, .gitattributes, timezones and agent signatures, and on real repos. Everything is open source: github.com/azank1/commit-city.
FAQ
Is this affiliated with GitHub?
No. commit.city is an independent, MIT-licensed project. GitHub is a trademark of GitHub, Inc.
A build failed or looks wrong. What now?
Retry from the city page; repo records already built are kept. If it keeps failing, open an issue with the URL.
Can I use it for my team or company?
For public repos, just use the org URL. For private code, run the Action in your own org: nothing leaves your GitHub, and the page it publishes is yours to host where you like.
Who made this?
azank1, with three.js, the Inter and JetBrains Mono typefaces, and resvg. Contributions are welcome.