DEV Community

Cover image for I built an altar for the code my repo buried at MLH Global Hack Week (git-ofrenda + local Gemma)
Aniruddha Adak
Aniruddha Adak Subscriber

Posted on

I built an altar for the code my repo buried at MLH Global Hack Week (git-ofrenda + local Gemma)

This is a submission for the MLH x DEV Writing Challenge

What I Built

git-ofrenda 🕯️🌼 is a tiny CLI that builds an altar for the code your repo buried.

Every long-lived repository has a graveyard: files that handled real traffic for years, went through a hundred commits, and then disappeared in a commit called "Removed old cruft". git log still remembers them. Nobody visits.

git-ofrenda digs them up:

  1. It walks your git history and finds every file that was deleted and never came back (renames and resurrections don't count).
  2. It pulls each file's life story from git: who added it and when, who removed it and when, the commit message that killed it, how many commits it lived through, and its last lines of code.
  3. A local Gemma 3 model writes each one a short epitaph and remembrance.
  4. It renders a static, candlelit altar page, one headstone per file.
  5. ofrenda seance lets you ask a dead file questions. The ghost only knows its own git record.

I built it in the last week of October, during MLH's Global Hack Week: Hacktoberfest season, when Halloween and Día de los Muertos were both a few days away. The idea came from that overlap: Halloween gets the séance, and Día de los Muertos gets the part I actually care about, remembering the work that came before us. Open source runs on code somebody wrote, maintained, and eventually retired.

It's one Python file, standard library only, with 11 unit tests and a SKILL.md so a coding agent can run it for you.

What I learned along the way

  • Let git own the facts, let the model own the words. Every date, count and name on a headstone is printed straight from git. Gemma only writes the epitaph and the short paragraph, and the page labels which is which.
  • Small models invent numbers, so check them in code. If an epitaph contains any number that isn't in the file's facts, it's rejected and retried. After three misses the headstone falls back to a plain template and says so.
  • Generic prompts give generic poetry. My first run gave me twelve epitaphs about "silent echoes" and "digital dust". Telling the model to play on something specific to that file (its name, its last line, its cause of death) and banning the stock phrases fixed most of it. view.js from early Express got "'Return str;' – A final, insistent plea."
  • The guard catches fake statistics, not fake meaning. Gemma once called a 769-line test file "small" because its last test was tiny. That's exactly why the numbers never come from the model.

Demo

Live altar for Express.js: https://aniruddhaadak80.github.io/API_projects/git-ofrenda/

I pointed it at the Express repo: 6,183 commits and 502 files deleted and never revived. The altar shows 12 headstones, the .js files that lived through the most commits, many from Express's 2009-2011 era.

The Express altar

One headstone with its last words opened

The build and a séance, as they ran in the terminal:

Build log and séance in the terminal

I asked lib/express/core.js why it was let go, and it answered with its real commit message ("old cruft"), the person who removed it, the 200 days it lived and its actual last line of code, then said "the veil hides the specifics" for the part git doesn't know. That's the behaviour I wanted.

Try it on your own repo:

ollama pull gemma3:4b
python3 ofrenda.py list  ~/src/your-repo                      # what did it bury?
python3 ofrenda.py build ~/src/your-repo --model gemma3:4b    # build the altar
python3 ofrenda.py seance ~/src/your-repo path/to/dead/file.js --model gemma3:4b
Enter fullscreen mode Exit fullscreen mode

GitHub logo aniruddhaadak80 / API_projects

Deployment URL of API_projects

Code is in the git-ofrenda/ folder (MIT).

Partner Technologies

Gemma (Google DeepMind)

Gemma 3 4B Instruct writes every epitaph and speaks at every séance. I ran it as a 4-bit GGUF (ggml-org/gemma-3-4b-it-GGUF, Q4_K_M, about 2.5 GB) through llama.cpp's llama-server, and the same code also talks to Ollama's native API.

How it's wired:

  • The prompt hands Gemma a facts block for one file and asks for exactly two lines, EPITAPH: and REMEMBRANCE:.
  • Code validates the shape, rejects any number not present in the facts, and retries up to three times before falling back to a template.
  • For the séance, the file's record is the model's whole world, and it's told to say "the veil hides it" for anything outside it.

What I measured on a machine with 2 ARM CPU cores, 7 GB RAM and no GPU:

Gemma 3 4B (Q4_K_M) Gemma 3 1B (Q4_K_M)
Altar of 12 headstones 317 s (≈26 s per file) 118 s
Fell back to the template 0 of 12 2 of 12
Generation speed ≈8 tokens/s ≈27 tokens/s

The 1B model is three times faster, but its epitaphs were noticeably more generic, so 4B is my default. Five minutes for an altar you build once per repo is fine.

Working with Gemma locally was the right call for this tool: a repo's history is full of names, internal commit messages and code that was removed for a reason. With an open-weight model on your own machine, nothing leaves it, there's no API key, and it keeps working offline.

GitHub

The code lives on GitHub, git itself does all the archaeology (git log --diff-filter=D, git show <death>^:path), and the demo altar is hosted on GitHub Pages as a single static HTML file.

Hackathon Experience

I did this one solo and fully online, during MLH's Global Hack Week: Hacktoberfest in October 2026. Most days that month started with the "Today in GHW" livestream, and the sessions that shaped this project were the Gemma session with Google DeepMind and the one on agent skills and MCP servers. The first is why I tried running Gemma on a plain CPU instead of reaching for an API; the second is why git-ofrenda ships with a SKILL.md.

What I'll remember most is the moment it first worked: opening lib/express/core.js on the altar. Born November 2009, 222 commits, 6 keepers, gone in June 2010 with "Removed old cruft", and its last lines still there, wiring a request to a Router. One of the earliest pieces of a framework a huge part of the Node.js world was built on, and most people using Express today have never seen it.

git-ofrenda doesn't bring that code back. It just lights a candle for it.

If you run it on your own repo, I'd love to see what your altar looks like. Drop it in the comments. 🕯️

Top comments (0)