Inspiration
The GitHub contributor graph is accurate and forgettable. We wanted to hear how a project grew: who showed up first, when the crunch weeks came, when new people arrived. A mechanical music box felt right: a punched paper roll, a brass comb, a warm wooden lid.
What it does
Pick Deno, Vite or Bun, or type any public repository, and Commit Chorus plays its first year in about a minute and a half.
- Every commit is a note, played on its author's instrument on the day it was written.
- Every week is a bar of seven beats, and quiet weekends become rests.
- Regular contributors earn their own instrument (glockenspiel, harp, upright piano, violin, viola, cello pizzicato); everyone else shares a soft piano. Deno's first year opens with Ryan Dahl alone on glockenspiel, then Bert Belder's harp joins.
- A paper roll scrolls under the playhead, holes light up as their notes sound, and commit messages tick by underneath.
- The same repository always plays the same song. At the end you get a short summary and a link that plays it for anyone you send it to.
How we built it
- Planned first with the Devpost Learn skill pack: scope, PRD, technical spec and a build checklist, all in the repository's
devpost/folder, including every revision the build forced. - Built with Claude Code as the coding agent, in React 19, TypeScript and Vite.
src/loader/reads a repository's oldest commits page by page from the anonymous GitHub REST API (the first year, or the first 1,000 commits).src/music/arranger.tsis a pure, deterministic function from commits to a score: a C–Am–F–G chord cycle, stepwise melodies where the commit hash picks the step, busy days as quick runs, and a bass line with a soft string pad under quiet weeks.src/audio/engine.tsplays the score with the Web Audio API: CC0 VSCO-2 instrument samples, look-ahead scheduling, a generated reverb and a gentle compressor. The same code renders offline for automated level checks.src/roll/RollCanvas.tsxdraws the roll on a canvas and follows the heard position (the audio clock minus the output latency), so a hole lights when its note is actually heard.- Tests: Vitest for the arranger and the loader, and Playwright scripts that render audio offline and check peak and loudness.
Challenges we ran into
- Making history sound like music. The first Deno roll handed four of six instruments to drive-by contributors, so the main voices were buried in "everyone else". Instruments are now earned at 3, 6 or 10 commits depending on the size of the repository.
- Balancing a mix the agent cannot hear. "Does it sound balanced?" became a measured check: each instrument is rendered alone and its level compared. The cello and the background piano were turned down and the string pad up.
- Sync. Scheduling time runs ahead of what you hear, so the roll follows the audio clock minus the device's output latency.
- Rate limits. Anonymous GitHub API access allows 60 requests an hour. A live fetch that runs out of budget now plays what it has and marks the song as capped, and the three presets are bundled so the demo always plays.
Accomplishments that we're proud of
- Nothing is random, yet it sounds composed: every melodic note belongs to the week's chord or the C-major pentatonic scale, and silence in the history sounds like thinning texture instead of dead air.
- You can recognise a project by ear. Bun's first year is almost entirely Jarred Sumner; Deno's is a slowly growing ensemble.
What we learned
Planning with the agent before any code was written kept the project small and finished. The written scope and its "explicitly cut" list (no private repositories, no per-commit diff sizes, no AI-generated music) stopped several detours, and the checklist's revisions section records why each plan change happened.
What's next for Commit Chorus
Choosing any year or date range, exporting the song as audio or video, alternative instrument boxes, and signing in with GitHub to lift the anonymous rate limit.
Built With
- canvas
- claude-code
- github-api
- playwright
- react
- typescript
- vite
- vitest
- web-audio-api
Log in or sign up for Devpost to join the conversation.