terminal timelapse · git history · complexity
Watch your codebase heat up, frame by frame.
gitlapse replays a repository's history like a video: per-function cognitive complexity, animated commit by commit, so you can watch hotspots ignite — and cool. Straight from the object database, no checkouts.
gitlapse file-search-on frame 87/240 ▶ 8x 5d2897c 2026-06-02 feat: archive readers files 214 functions 1102 cognitive 5804 ▁▁▂▂▃▃▄▄▅▅▅▆▆▇▇█▇▇▆▆▆▅▅▅▄▄▅▅▆▆▆▇▇▇ COG CYC Δ HOTSPOT 38 21 ▲ +6 parseQuery query.go:86 24 17 walkTree walk.go:112 6 5 ▼ -3 readAttrs attrs.go:41
what you get
A video player for your repo's history.
No checkouts, ever
Historical file contents stream straight from the git object database — ls-tree plus one persistent cat-file --batch. Your worktree is never touched.
Fast by content address
Parse results are cached by blob SHA, so a file is only re-analysed on frames where it actually changed. 240 frames of a 591-file repo compute in seconds.
17 languages
Go via the standard library's AST; sixteen more through pure-Go tree-sitter grammars, powered by codemetrics.
Video-player controls
Play, pause, step, jump to either end, and change speed from 1 to 30 fps — while frames keep computing in the background.
Hotspot deltas
Every frame ranks the most cognitively complex functions and marks movement — ▲ igniting, ▼ cooling, or newly born.
Headless export
Render the same UI off-screen to an asciinema cast or an animated GIF — drop your repo's history straight into a README.
languages analysed per frame
checkouts — history is read in place
to compute 240 frames of a 591-file repo
Languages: go · python · javascript · typescript · rust · java · ruby · c · c++ · c# · php · swift · kotlin · scala · perl · r · matlab
get it
Install.
Requires git on your PATH. The container image ships with it.
brew install --cask richardwooding/tap/gitlapse
go install github.com/richardwooding/gitlapse@latest
docker run -it --rm -v "$PWD:/repo" ghcr.io/richardwooding/gitlapse /repo
# replay the repo you're in gitlapse # replay another repo, denser timeline gitlapse --max-frames 500 ~/src/somerepo
# keys space play / pause ← → step one frame [ ] slower / faster (1–30 fps) g G jump to start / end q quit
share it
Export the timelapse.
The exporter renders every frame through the same terminal UI as live playback — what you watched is exactly what you ship.
# asciinema v2 cast — play or embed gitlapse --export cast --out repo.cast # animated GIF for your README (needs agg) gitlapse --export gif --out repo.gif
# pacing and canvas gitlapse --export gif \ --fps 15 --width 120 --height 40 # machine-readable timeline, no TUI gitlapse --dump > timeline.tsv