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. This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine https://dev.to/challenges/hacktoberfest-week4-2026-10-26 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: 1. Opens the grave. It clones the repo's full history without downloading its files and reads the facts of its life from git: when it was born first commit , when it died last commit , its last words the last commit message , and its most devoted mourners 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 a calavera , 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 https://github.com/JorgeCM2004/Hacktoberfest 2026 Week4/blob/main/docs/media/demo.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 Ofrenda 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 https://dev.to/challenges/hacktoberfest-week4-2026-10-26 . The full demo, with a second question and breaking the bond, is in docs/media/demo.mp4 https://github.com/JorgeCM2004/Hacktoberfest 2026 Week4/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 https://ollama.com : - 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 recommended title: 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; one git log pass yields every fact, and git show HEAD: