cd /news/ai-tools/ofrenda-an-altar-where-dead-open-sou… · home › topics › ai-tools › article
[ARTICLE · art-161770] src=dev.to ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

Ofrenda: An altar where dead open-source repos come back to talk

A developer built Ofrenda, a local-first tool that takes the URL of an abandoned GitHub repository, reads its git history (first and last commits, last commit message, top committers, plus stars, forks and archive status when GitHub responds), and generates an epitaph and obituary with a local Gemma 3 model. A floating 3D sugar skull then answers questions in the first person, grounded in the repo's README and Markdown docs via EmbeddingGemma retrieval, in English or Spanish. The project runs entirely on a laptop with 8 GB of VRAM using Ollama and open-weight models.

by read7 min views2 publishedNov 1, 2026

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine

#

What I Built

Every developer has a graveyard. The library you loved in 2014. The framework your first job ran on. The tiny utility that did one thing perfectly until its last commit, years ago, quietly said goodbye.

Ofrenda is an altar for them. In Mexico, on Día de Muertos, families build an ofrenda: photos, marigolds, candles and the things the dead loved, so their spirits can find their way home for a night. I wanted the same for the code we have lost.

You paste the URL of an abandoned GitHub repository and Ofrenda:

Opens the grave. It clones the repo's full history (without down its files) and reads the facts of its life from git: when it wasborn (first commit), when itdied (last commit), itslast words (the last commit message), and its most devotedmourners (who committed most). If GitHub answers, it adds stars,heirs (forks) and whether it was archived. 2. Writes the epitaph. A local Gemma 3 model writes an epitaph, an obituary and three things the project left behind, grounded in those facts and the README. 3. Summons the ghost. A floating 3D sugar skull, crowned with marigolds and painted like acalavera , becomes the repo's ghost. You ask it questions; it answers in the first person from its own README and docs, and its jaw moves with every word it streams. It blinks, too.

It speaks English and Spanish (one toggle switches the page, the ofrenda and the ghost), and when you are done, you break the bond and the skull goes back to sleep, ready for the next spirit.

The theme was Ghost in the Machine: here the ghost is literally the machine's own history, and it speaks.

#

Demo

The full demo (a second question, then breaking the bond) is here as an MP4.

Ofrenda runs entirely on your machine, so there is no hosted demo: the whole point is that nothing leaves your computer. Setup takes three commands:

#

Code

An altar for dead open-source projects. Paste the URL of an abandoned GitHub repo and Ofrenda reads its git history, builds a Día de Muertos ofrenda for it and summons its ghost: a floating 3D sugar skull you can question. Everything AI runs on your own machine with open-weight models.

Built for the DEV Hacktoberfest Open-Source AI Challenge, week 4: Ghost in the Machine. The full demo, with a second question and breaking the bond, is in docs/media/demo.mp4.

| The ofrenda | The oracle | | | |

What it does #

The ofrenda : born (first commit), died (last commit), last words (last commit message) most devoted mourners, commit count and, if GitHub answers, stars, heirs (forks) and whether it was archived. Gemma writes its epitaph, its obituary and three things it left behind. #

The séance : ask the ghost anything. It answers in the first person, grounded in the repo's README and…

#

How I Built It

Open-weight models, run locally with Ollama: #

Gemma 3 (gemma3:4b) writes the epitaph and plays the ghost. The epitaph comes back as JSON thanks to Ollama's structured outputs; the séance streams token by token. #

EmbeddingGemma (300M parameters, 622 MB) powers the retrieval: the repo's README and Markdown docs are split into 800-character fragments, embedded with its recommendedtitle: none | text: /task: search result | query: prompts, and the four closest fragments, plus the top of the README, become the ghost's "memories".

Both fit comfortably on a laptop GPU with 8 GB of VRAM.

The rest of the stack:

git does the archaeology.git clone --filter=blob:none --no-checkout brings the entire history but no file contents; onegit log pass yields every fact, andgit show HEAD:<path> fetches only the docs the ghost needs. Even huge histories open in seconds. #

FastAPI streams newline-delimited JSON to the browser: progress while the grave opens ("Reading the bones…", "Lighting the candles…"), then the ofrenda, then the ghost's words. #

three.js sculpts and paints the oracle in code, with no 3D assets at all: - The skull is a single high-resolution sphere, displaced vertex by vertex into cheekbones, temples, deep eye sockets and a chin.

  • That one mesh is then cut along the smile , so the jaw is the very same surface: at rest it looks like one seamless skull, and it opens on every streamed token.
  • The tattoos (marigold eye rings, a monarch butterfly, vines with rosebuds, the heart-shaped nose) are drawn with Bézier curves on a canvas and projected onto the face in the shader.
  • The marigold crown is a few hundred instanced petals, and a bloom pass makes the eyes and candle flames glow.

Tests: 51 pytest tests cover the git archaeology, chunking and search, prompts in both languages, the Ollama client and the streaming API, using a tiny git repo built on the fly with fixed dates.

A few things I learned on the way:

Small models love an escape hatch. My first prompt told the ghost to say*"The spirits are silent on that."* when unsure. The 4B model said it to everything, even when the answer was the first line of the README. Putting the memories first and the rules after, with silence as the very last resort, fixed it. #

The top of a README is where projects announce their death. Retrieval alone sometimes missed it, so the first README fragment is always among the ghost's memories. #

Small models leave crumbs. One epitaph ended with a stray", 3: from half-closed JSON, so every generated text goes through a small tidy-up step. #

Small models garble numbers. The ghost proudly announced 254,833 stars for a repo with 25,483. Giving it25,483 with a thousands separator instead of25483 fixed it. #

Rules at the top fade; rules at the end stick. The 4B ghost kept recommending libraries that appear nowhere in its README. A one-line reminder appended right after each question worked far better than any rule in the system prompt. It still slips more often in Spanish, which tells me a bigger Gemma would be worth it. #

Check that your GPU is actually used. My first runs were painfully slow: an interrupted Ollama update had left its CUDA library missing, so everything ran on the CPU.ollama ps saying100% CPU was the clue.

#

Why Does Open Innovation Matter?

Because open source is the only kind of software that can have an afterlife.

When a closed product dies, it is simply gone. When an open-source project dies, its code, its history and its maintainers' words stay readable by anyone, forever. That is what makes Ofrenda possible at all: every fact on the altar comes from a public git history.

Open models matter for the same reason. With open weights running locally:

Nothing leaves your machine. The repo and your questions never reach a third-party API, which matters if you point it at your company's internal graveyard. #

It works offline and costs nothing per question. #

I can swap the medium.OFRENDA_MODEL=gemma3:12b and it runs a bigger ghost on a bigger GPU; any Ollama model works.

An altar for open-source code, built only on open-source tools and open models, felt like the right way to honour them. Ofrenda itself is AGPL-3.0, so its own ghost will always be readable too.

#

The Spirit of It

Día de Muertos is not a sad holiday. It is about remembering with joy, and about the belief that the dead are only truly gone when nobody remembers them. Open-source projects are the same: request has been deprecated since 2020, but thousands of people learned HTTP in Node.js with it. Its ghost deserves a candle.

The moment it landed for me was the first real séance. I asked request how it died, and after a few lines about its 2,270 commits and the people who maintained it, it said:

"It just… stopped. The commits ceased. The repository remained, a silent shell. My last words, echoing in that README, were a lonely admission of my own demise."

Nothing in that answer was invented: the deprecation notice really is the first thing in its README, and its last commit really is a typo fix in that very notice.

So: who would you summon first? Tell me in the comments, and I will light a candle for it.

#

Prize Categories

Best Use of Gemma : Gemma 3 runs the ghost and writes the epitaph, and EmbeddingGemma powers its memory, both locally through Ollama.

── more in #ai-tools 4 stories · sorted by recency
── more on @ofrenda 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/ofrenda-an-altar-whe…] indexed:0 read:7min 2026-11-01 · —