English · 简体中文 · 日本語 · 한국어 · Español · Português · Deutsch · Français · हिन्दी
commitscape shows a developer what they have built: pull requests merged, reviews given, and the lines of theirs that still run, counted from each repository's own history with blame. It shows how they stand next to the people they work with, view by view and never by one score, and turns it into Cards for a README, a self-review or a post. It reads the whole history of a large repository in seconds, from git's own data.
There are two ways to use it:
- From your terminal. Run
npx commitscapein any git repository. It says what it will upload and asks first (Enter means yes), reads the history on your machine, uploads the Report locked with a key only the link holds, and opens the link in your browser. The link works for 4 hours, and the Site cannot read what it stores. - On the Site. Sign in with GitHub, then type any GitHub username for their Profile: totals, Surviving Lines, Archetype and Achievements, where their work is, Cards to embed, Proof of Work for a period, Versus and Wrapped. Paste a repository link for its Report and Standings, or choose your own repositories, private ones included. Anyone can stay out of comparisons.
The project is in early development. The CLI and the Site work end to end.
npx commitscapeThis uploads my-project's Report to https://app.commitscape.com.
It holds file paths, people's names and GitHub logins, and commit subjects. No email addresses.
It is locked with a key only the link holds, so the Site cannot read it.
The link works for 4 hours.
Upload it? [Y/n]
https://app.commitscape.com/s/k3f9q2x7#0dbf…
--no-open prints the link without opening a browser, --yes uploads
without asking (for scripts; it never opens a browser), and --expires 12
keeps the link up for 12 hours. commitscape share --list lists the links
this machine made and --delete <link> takes one down.
| How | Command |
|---|---|
| npm | npx commitscape, pnpm dlx commitscape, or npm install -g commitscape |
| Homebrew | brew install pixelactstudio/commitscape/commitscape |
| winget | winget install DevTalan.Commitscape |
| Scoop | scoop bucket add pixelactstudio https://github.com/pixelactstudio/scoop-bucket, then scoop install commitscape |
| Arch (AUR) | yay -S commitscape-bin |
| Debian, Ubuntu | the .deb from the latest release: sudo apt install ./commitscape_*_amd64.deb |
| Fedora, RHEL | the .rpm from the latest release: sudo dnf install ./commitscape-*.x86_64.rpm |
| Cargo | cargo install commitscape |
| Nix | nix run github:pixelactstudio/commitscape |
| A binary | the archive for your platform from the latest release |
Prebuilt binaries cover Linux on x64 and ARM (glibc or musl), macOS on Intel and Apple silicon, and Windows on x64. The npm package installs only your platform's binary, runs nothing at install time, and needs no Node once it runs.
| Command | What it does |
|---|---|
commitscape [path] |
The same as commitscape share: asks, uploads the locked Report and opens its link |
commitscape share [path] |
A locked link to this repository's Report, for any browser; --list and --delete <link> manage them |
commitscape surviving [path] --person <id> |
A person's Surviving Lines: the lines at the head that blame gives them, reformats passed through |
commitscape health <owner/name> |
Whether a GitHub project is alive and whether it depends on one person |
--help on any command lists every option.
The card action keeps Cards from the Site in your repository, up to date on a schedule:
- uses: pixelactstudio/commitscape/actions/card@v1
with:
cards: |
u/octocat/totals?theme=dark .github/cards/totals.svgOr embed a Card's address from the Site directly; its Cards studio at
/u/<login>/cards gives the address for each. Cards open without signing
in, so READMEs can show them.
- Any public GitHub repository. Go to
/gh/<owner>/<name>. GitHub's facts show at once, and the Report follows when its history is read: seconds for most repositories. Lines Changed follow, the default branch's first. - Your own repositories. Choose repositories through commitscape's GitHub App, which can only read. A private repository's Report is shown only to people GitHub says can see it.
- Open to anyone. Cards, Shared Reports and shared Proof of Work. Every other page asks you to sign in with GitHub, so what you open is read with your own GitHub allowance.
- For MCP clients. When the Site sets a token,
/mcplooks up a repository and reads its Report, Profiles and Standings.
/privacy on the Site says what it keeps, where, for how long, and who can
read it.
On your machine, commitscape sends a repository nowhere until you say yes:
share(and a barecommitscape) uploads the Report encrypted with AES-256-GCM. The key is only in the link, after the#, which browsers never send, so the Site stores what it cannot read. No email address is ever included.survivingreads the repository on your machine (given a GitHub address instead, it clones it).healthasks GitHub, through the GitHub CLI, about the project it is given.- Each run of
share,health,survivingorreportsends one anonymous usage count to the Site: the command, how long it took, how it ended, the version and your platform, under a random id. Never a path or anything from a repository.COMMITSCAPE_TELEMETRY=0orDO_NOT_TRACK=1turns it off. - No update checks, and nothing runs at install time.
On the Site, no email address leaves the Builder: the packs the engine service answers from hold none.
One Rust engine reads git history, in the CLI on your machine and in the Builder for the Site. The Site never runs git.
- The Site (TanStack Start on Node) draws every page on the server, for people signed in. It keeps rows and the Build queue in Postgres and files in R2, and asks the engine service for anything that needs a pass over a repository's history.
- The engine service (Rust,
apps/engine) answers from packs: each is a repository's Index at one head, written by a Build and never changed. It fetches a pack from R2 once and keeps it on disk and in memory, so any Window of any repository takes milliseconds. - The Builder takes Builds from the queue, clones the repository and
runs
commitscape build. - The landing page is static, on Cloudflare Workers, apart from the Site.
A cold Build runs two phases at once. A clone without old file contents gives the first Report in seconds; a full clone, sharing the same engine cache, counts Lines Changed: the Mainline first, newest first, within a time budget, with quiet Builds after it for what is left. Each phase copies its rows into the Stored Index in Postgres and uploads a new pack, and the engine service fetches that pack at the first question about it.
A page's loader reads the pack's key from Postgres, asks the engine service with it, and reads rows (Commits pages, branches, pull requests) from Postgres and stored files (file text, the Universe's Atlas, Cards) from R2. Answers are kept in the engine service and, packed, in the Site; a public repository's addresses pinned to a Build are cached for a year.
| Folder | What |
|---|---|
crates/ |
Rust: the engine that reads git, the metrics, the Report and the CLI |
apps/site/ |
The Site: TanStack Start on Node, server-rendered, with Better Auth |
apps/engine/ |
The engine service: answers the Site's questions from packs (axum, tokio) |
apps/builder/ |
The Builder: takes Builds from a Postgres queue, clones the repository, runs commitscape build, loads the Stored Index into Postgres and uploads the pack to R2 |
apps/landing/ |
The landing page: static HTML drawn at build time, for Cloudflare Workers |
packages/server/ |
The database schema and migrations, R2 storage, the queue and the Stored Index loader |
packages/ui/ |
Every screen and chart the Site shows |
packages/data/ |
The Report's types, generated from Rust, and the Data Sources |
- Domain language
- Architecture decisions, the latest ADR-0028
- How the pieces work together
- The Stored Index in Postgres
- GitHub's API limits
- Deploying
- Releasing
The Site, the engine service and the Builder are published as Docker images on every merge and every release. DEPLOY.md runs them in Dokploy, on one server or two, with Postgres, a Cloudflare R2 bucket and the landing page on Cloudflare Workers.
Requirements: Rust (stable), Node.js 24, pnpm 12 and Docker.
git clone git@github.com:pixelactstudio/commitscape.git
cd commitscape
pnpm install
pnpm services
cargo xtask fixtures --force
cargo build --release -p commitscape
cp apps/site/.env.example apps/site/.env
cp apps/builder/.env.example apps/builder/.env
cp apps/engine/.env.example apps/engine/.env
pnpm dev:engine
pnpm dev:builder
pnpm dev:sitepnpm services starts Postgres and an S3 stand-in in Docker. Set
BETTER_AUTH_SECRET in apps/site/.env (openssl rand -hex 32). The Site
runs at http://localhost:3100, the engine service
on port 4100, and pnpm dev:landing draws the landing page at
http://localhost:3200. GitHub sign-in, Sentry and
PostHog stay off while their keys are empty.
| Command | Purpose |
|---|---|
cargo test --workspace |
Every Rust test, the engine service's golden answers included |
cargo clippy --workspace --all-targets -- -D warnings |
Rust lints |
cargo xtask check-layering |
Check that the crates depend on each other only as designed |
pnpm check |
Typecheck, lint, test and build every TypeScript package |
pnpm e2e |
The Site, the engine service and the Builder end to end in Chromium, with accessibility checks |
pnpm db:generate |
Write the migration for a schema change |
cargo xtask bench |
Timings on large repositories |
- Rust, gix and imara-diff; axum and tokio for the engine service
- TanStack Start, React 19, TypeScript and Vite
- Astryx and Tailwind CSS
- PostgreSQL, Drizzle ORM, pg-boss and Cloudflare R2
- Better Auth, PostHog and Sentry
- Turborepo, oxlint, Vitest and Playwright
Commits and pull request titles use Conventional Commits. Releases, version numbers and the changelog are generated from them (RELEASING.md):
feat: count lines changed per person
fix: keep the Window when opening a file
chore: update dependencies
commitscape is open-source software, licensed under either the MIT License or the Apache License 2.0, at your option. Copyright 2026 Dev Talan.
An open-source project by Pixelact Studio.