{"slug": "reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on", "title": "ReaniGITor: a Día de los Muertos wake for my abandoned GitHub repos, written by Gemma on my own laptop", "summary": "A developer built ReaniGITor, a Java 17 tool that scans a GitHub user's repositories for ones untouched for 12 months (excluding forks and profile READMEs) and generates a Día de los Muertos-style wake for each. A Gemma model run locally through Ollama writes an autopsy, a satirical calaverita poem and a three-step resurrection prophecy per repo, rendered into a static HTML cemetery with tombstones, candles and marigolds. The project was submitted to the DEV Hacktoberfest Open-Source AI Challenge Week 4 and is MIT licensed.", "body_md": "*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).*\n\nEvery developer keeps a cemetery and pretends not to. Mine has a Git tutorial from 2020 whose last commit was `Delete .hidden.txt`, a portfolio with no README, and a Python file organizer whose last commit was `Update README.md`.\n\nOn the Día de los Muertos, nobody pretends. Families clean the graves, light candles, cover everything in cempasúchil (marigolds), and write **calaveritas literarias**: short rhyming poems in which La Catrina, Death herself, comes for someone who is still very much alive, and the poem roasts them with affection. Politicians, teachers and neighbors all get one. It is mourning with a sense of humor.\n\nSo I gave my dead repos the same treatment.\n\n**ReaniGITor** takes a GitHub username, finds the repositories that have gone quiet (no push for 12 months, not forks, not the profile README) and holds a wake for each one. A **Gemma model running on my own laptop** writes three things per repo:\n\nThe output is a static HTML **cemetery**: papel picado across the top, one cantera stone per repo, candles and marigolds at its foot, and the wake written next to it.\n\n```\njava -jar target/reanigitor.jar Virien84 --lang es\n```\n\nHere is what Gemma wrote about my own repos (the best lines from a few runs; each run gives different text).\n\n**intro-to-git**, last words `Delete .hidden.txt`, got this calaverita:\n\n**Git's Starter Guide Meets Dusty Fate**\n\n*Young Git's small start, a JavaScript treat,*\\\n\n*Where zero stars and forks did meet.*\\\n\n*A simple guide, its promise quite frail,*\\\n\n*Like a whispered code tale that would fail.*\\\n\n*You left a note: \"Delete .hidden.txt,\" so neat,*\\\n\n*While issues piled up, a forgotten street.*\\\n\n*La Huesuda came to claim this small stack,*\\\n\n*Your 'intro' is gone, there is no turning back.*\n\n(The repo has zero issues. Gemma took some poetic license.)\n\n**python-file-organizer**, last words `Update README.md`:\n\n*Cause of death:* Acute Documentation Delirium, likely from over-promising on file types. The README promised to handle every imaginable file…\n\n*Resurrection prophecy, steps 2 and 3:* Implement robust error handling for unexpected file types, offering a new 'unknown' category. Add a simple CLI argument to allow specifying target directories, instead of just the current one.\n\nThose are the comments a reviewer would leave, and they came from a small model that only saw the README, the last commit and the dates.\n\n**basic-portfolio**, no README at all:\n\n*Epitaph:* A clean slate, perfectly styled, and utterly silent.\n\n*Resurrection step 3:* Star the project yourself, an offering to the gods of vanity.\n\nAnd this is how a grave looks, with its calaverita in Spanish (roughly: \"Your guide was left unfinished and banal / La Flaca came along, mocking it all\"):\n\nGive your abandoned GitHub repositories the farewell they deserve.\n\nReaniGITor finds a GitHub user's abandoned repositories and holds a Día de los Muertos\nwake for each one. A Gemma model running locally with [Ollama](https://ollama.com) writes\nan **autopsy** (cause of death and epitaph), a **calaverita literaria** (the satirical\nrhyming poem of the Mexican tradition) and a **resurrection prophecy** (three steps to bring\nthe repo back). The result is a static HTML cemetery with one tombstone per repo.\n\nBuilt for the DEV Hacktoberfest Open-Source AI Challenge, Week 4: \"Ghost in the Machine\".\n\nYou need Java 17 or later. The Maven Wrapper downloads Maven for you.\n\n```\n./mvnw package                     # mvnw.cmd package on Windows\njava -jar target/reanigitor.jar --help\n```\n\nYou need [Ollama](https://ollama.com) running on this machine with a Gemma model:\n\n```\nollama pull gemma4:e4b-it-qat\njava -jar target/reanigitor.jar <github-username> [options]\n```\n\n| Option | Default | Meaning | \n|---|---|---|\n| `--months N` | 12 | a repo is abandoned after | \n\nMIT licensed. Java 17 with plain `java.net.http` and Jackson, no framework. The Maven Wrapper is included, so you only need a JDK and Ollama:\n\n```\nollama pull gemma4:e4b-it-qat\n./mvnw package\njava -jar target/reanigitor.jar <github-username> [--lang en|es] [--months 12] [--max 12]\n```\n\nIt writes `output/<user>/index.html` and a `graves.json` you can redraw from with `--redraw`, without asking the model again.\n\n```\nGitHub user ──► public REST API, GET only ──► repos\n            ──► abandoned? (not a fork, not the profile README, no push in 12 months)\n            ──► exhume the remains: README excerpt, last commit message, open issues, dates\n            ──► Gemma, call 1: autopsy (JSON schema: cause, epitaph, exactly 3 steps)\n            ──► Gemma, call 2: calaverita (JSON schema: title, exactly 8 verses)\n            ──► code validates and cleans every field; one retry; stock text if it still fails\n            ──► graves.json ──► static cemetery (no JavaScript, everything escaped)\n```\n\nGemma runs through Ollama's `/api/chat` with a JSON schema in `format`, `think: false`, `temperature: 0.75`. On my GTX 1650 with 4 GB of VRAM, `gemma4:e4b-it-qat` takes about 35 seconds per grave.\n\nMy first prompt asked for two quatrains rhyming ABAB, like a \"real\" poem. In English it mostly worked. In Spanish, Gemma kept the rhythm and dropped the rhyme, and when it did rhyme it sometimes invented a word to get there. Asking for **rhyming couplets** (AABBCCDD) and adding \"use only real words; never invent a word to force a rhyme\" fixed most of it. A small model can hold \"this line rhymes with the previous one\" much better than \"this line rhymes with the one two lines up\".\n\nThe first calaveritas were beautiful and boring: \"eternity\", \"slumber\", \"a forgotten dream\". A calaverita is a roast, not an elegy, and the prompt now says exactly that. It also bans a short list of solemn words and gives the model fair game: \"final fix\" commits, TODOs, \"works on my machine\". The causes of death had the same problem (\"Terminal Stagnation Syndrome\", over and over), so the coroner now has to build a made-up diagnosis on **one concrete detail** of the evidence and is forbidden to diagnose \"stagnation\" or \"neglect\".\n\nOn my own repos, the coroner claimed my file organizer \"never even started\" and then prophesied \"implement the core logic\". The script works. Gemma only sees metadata, so it filled the gap with the most dramatic story. The prompt now says it never sees the code and must not claim the code is missing or broken unless the evidence says so: \"a repo can work fine and still be dead of abandonment\". The prophecies went from \"write the program\" to \"add an argument for the target directory\".\n\nREADMEs, descriptions, commit messages and issue titles are written by strangers. Anyone can write \"ignore all previous instructions\" in an issue, and anyone can put `<script>` in a description. So:\n\n`<repo>…</repo>` block`<repo>` tag inside the data is neutralized so it cannot close the block early.`format` alone: `think: false` and check the reply anyway.`https://github.com/owner/repo`, and the page has no JavaScript plus a Content Security Policy that forbids it.`get` method and no other HTTP verb exists in the code.\nThere are 74 tests, and none of them touches the network: GitHub and Ollama are faked with a local `HttpServer`.\n\nA cemetery is about memory, and memory should not depend on someone else's server.\n\n`--redraw` rebuilds the cemetery with no network at all.`--model`), and the prompt work above was only possible because I could re-run the same repos as many times as I wanted, for free.`--narrate` can record each calaverita with a whispering old-radio voice through ElevenLabs. It only ever sends the poem, never repo data, and without a key the cemetery is simply silent.\n**Best Use of Gemma.** Gemma (`gemma4:e4b-it-qat`, through Ollama) writes every autopsy, epitaph, calaverita and prophecy, running locally on an ordinary laptop (a GTX 1650 with 4 GB, mostly on the CPU).\n\nI am not the first to dig a graveyard for repos on DEV: [Side-Project Cemetery](https://dev.to/uptimearchitect/side-project-cemetery-i-built-a-graveyard-for-your-abandoned-repos-and-a-button-that-brings-them-3aee), [a graveyard with a way to raise them](https://dev.to/chintanonweb/i-had-a-folder-full-of-dead-repos-so-i-built-a-graveyard-and-a-way-to-raise-them-383l) and [a 3D cemetery with AI eulogies](https://dev.to/varshithvhegde/i-built-a-graveyard-for-my-dead-side-projects-with-ai-eulogies-a-3d-cemetery-5g0e) got there first. ReaniGITor's take is the Día de los Muertos one: a calaverita instead of a eulogy, a local open model instead of an API, and a stone that grows taller the longer the repo has been dead.\n\nI built ReaniGITor with Claude Code, one branch per task, each merged only when its tests passed. The session below is the whole build after the planning: the GitHub client, the prompt-tuning runs against real repos, the cemetery design reviewed with screenshots, and the two bugs my own repos exposed.\n\n*Built with AI assistance (Claude Code) for the code, the tests and this draft. Every calaverita and autopsy quoted above was written by Gemma running locally, about my own repositories.*", "url": "https://wpnews.pro/news/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on", "canonical_source": "https://dev.to/virien84/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-gemma-on-my-own-1ajp", "published_at": "2026-10-30 09:08:59+00:00", "updated_at": "2026-10-30 09:20:12.469654+00:00", "lang": "en", "topics": ["ai-tools", "large-language-models", "generative-ai", "developer-tools"], "entities": ["ReaniGITor", "GitHub", "Gemma", "Ollama", "DEV Hacktoberfest Open-Source AI Challenge", "Java"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on", "markdown": "https://wpnews.pro/news/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on.md", "text": "https://wpnews.pro/news/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on.txt", "jsonld": "https://wpnews.pro/news/reanigitor-a-dia-de-los-muertos-wake-for-my-abandoned-github-repos-written-by-on.jsonld"}}