How it works

Git history, drawn to scale.

commit.city replays the real history of public GitHub repos, file by file and commit by commit, and draws it as a city you can scrub, fly through and share. This page covers what the city shows, how it's built, and what it does and doesn't do with your data.

Swap the domain

Take any GitHub URL and change github.com to commit.city. There's no sign-up and nothing to install.

URLWhat you get
commit.city/torvaldsA person's year: every public repo they committed to in the last 365 days, wired to their avatar.
commit.city/vercelAn organisation: its 24 busiest repos, with everyone's commits.
commit.city/facebook/reactOne repository and every contributor, over the last year.
commit.city/denoland/deno?all=1A 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.
A city draws commits that landed on the default branch of a public repo. That's why it can show fewer than your contribution graph, which also counts pull requests, issues, reviews and private work. The panel shows both numbers.

Controls

InputAction
drag · right-drag · scrollorbit · pan · zoom
click a repo or a leaderboard rowinspect it; Esc goes back
drag the timelinescrub to any moment
Space · ←/→ · Shift+←/→play/pause · ±1 day · ±1 hour
1–6, ↑/↓speed, from 1 hour to 2 weeks per second
Athe agent lens: colour beams by human, bot or AI agent
Rrecord a video clip of the year
Home · End · O · L · H · Fstart · 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] or devin-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/… or copilot/….

Automation that isn't an AI agent (Dependabot, Renovate, GitHub Actions and other [bot] accounts) counts as bot. Everything else is human.

Disclosed work only. The lens can only see what agents sign. Code an agent wrote that a person committed without a trailer looks human, so read the agent share as a floor, not an exact figure. The rules are open: schema/agents.json, and pull requests for new agents are welcome.

Agents it recognises

Claudecommits as itself · Co-authored-by trailer · message footer · GitHub account · branch names
Copilotcommits as itself · Co-authored-by trailer · GitHub account · branch names
Cursorcommits as itself · Co-authored-by trailer · GitHub account · branch names
Codexcommits as itself · Co-authored-by trailer · GitHub account · branch names
Devincommits as itself · Co-authored-by trailer · message footer · GitHub account · branch names
Julescommits as itself · Co-authored-by trailer · message footer · GitHub account
Geminicommits as itself · Co-authored-by trailer · message footer · GitHub account
Aidercommits as itself · Co-authored-by trailer · message footer
Ampcommits as itself · Co-authored-by trailer · message footer
OpenHandscommits as itself · Co-authored-by trailer · GitHub account · branch names
Replit Agentmessage footer
Lovablecommits as itself · Co-authored-by trailer · GitHub account
v0commits as itself · Co-authored-by trailer · GitHub account
Juniecommits as itself · Co-authored-by trailer · GitHub account
Sweepcommits as itself · Co-authored-by trailer · GitHub account · branch names
Factorycommits as itself · Co-authored-by trailer · GitHub account
CodeRabbitcommits as itself · Co-authored-by trailer · GitHub account · branch names

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.

Sharing

README card

A self-contained SVG with your skyline, stats and language mix. Make one on the README card page, or use:

[![my city](https://commit.city/api/card?t=YOU)](https://commit.city/YOU)

Video

Press Record (or R) in any city to render a short clip of the year playing back, in 16:9, 9:16 or 1:1. It renders entirely in your browser: MP4 where the browser supports it, otherwise WebM.

Link previews and moments

Every city has a link preview image, so pasting commit.city/you anywhere unfurls into your skyline. Share → copy this moment gives a link that reopens at the same date, speed and camera angle.

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

Rulecommit.cityAction / CLI
Windowthe last 365 days, or everything with ?all=1 on a reposince, default 365 days
Peopletop 50 repos by your commitstop 60 (max_repos)
Orgsthe 24 busiest reposn/a
Repo sizeup to ~1.5 GB on diskno limit
Big reposthe deepest folders fold into one building until a repo fits 2,500 files (60,000 across a city)
Skipped pathsnode_modules, dist, vendor, virtualenvs, caches, lockfiles, *.min.js, *.map
Binary filescount 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

  1. Click Use this template and create a repo (any name).
  2. In the new repo, set Settings → Pages → Source to GitHub Actions.
  3. Run Actions → commit-city → Run workflow. It then rebuilds every week and only re-reads repos that moved.
  4. 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

EndpointReturns
/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/liveThe 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:

ParameterEffect
t=2026-03-14 or t=2026-03-14T21:30open at that moment (t=end for now)
speed=1h|6h|1d|3d|1w|2wplayback speed per second
play=0 · orbit=0 · hud=0start paused · no auto-orbit · no panels
focus=owner/repostart focused on a repo
lens=agentsstart with the agent lens on
embed=1embedded 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

DiscoverGitHub's GraphQL API finds the repos, the window and, for a person, which commits are theirs.
ReplayEach repo is replayed from git itself over GitHub's smart-HTTP protocol v2, no git binary, no disk.
CacheRepo records are keyed by head commit and shared by every city that includes the repo.
RenderA three.js viewer draws instanced towers, beams, bloom and a day-night sky.

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.