Skip to content

About

See the story of any git repository: who knows which code, what's risky to change, what changes together. A fast Rust CLI with a browser UI and a terminal UI, all local.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

56 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

English · 简体中文 · 日本語 · 한국어 · Español · Português · Deutsch · Français · हिन्दी

commitscape

commitscape

What you have built, how you stand next to the people you work with, and Cards to share it.

CI Docker images MIT or Apache-2.0 license

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.

commitscape's own story, drawn by commitscape

There are two ways to use it:

  1. From your terminal. Run npx commitscape in 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.
  2. 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.

Getting started

npx commitscape
This 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.

Install

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.

Commands

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.

Cards in a README

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.svg

Or 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.

On the Site

  • 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, /mcp looks 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.

Privacy

On your machine, commitscape sends a repository nowhere until you say yes:

  • share (and a bare commitscape) 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.
  • surviving reads the repository on your machine (given a GitHub address instead, it clones it). health asks GitHub, through the GitHub CLI, about the project it is given.
  • Each run of share, health, surviving or report sends 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=0 or DO_NOT_TRACK=1 turns 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.

How it is built

One Rust engine reads git history, in the CLI on your machine and in the Builder for the Site. The Site never runs git.

Who talks to whom: the Site, the engine service, the Builder, Postgres, R2 and GitHub

  • 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 Build: the first Report, then Lines Changed, the Mainline first

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 view: where the answers come from, and what is kept

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

Self-hosting

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.

Development

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:site

pnpm 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

Stack

  • 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

Commit workflow

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

License

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.

About

See the story of any git repository: who knows which code, what's risky to change, what changes together. A fast Rust CLI with a browser UI and a terminal UI, all local.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages