# ReaniGITor: a Día de los Muertos wake for my abandoned GitHub repos, written by Gemma on my own laptop

> 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: 2026-10-30 09:08:59+00:00

*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).*

Every 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`.

On 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.

So I gave my dead repos the same treatment.

**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:

The 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.

```
java -jar target/reanigitor.jar Virien84 --lang es
```

Here is what Gemma wrote about my own repos (the best lines from a few runs; each run gives different text).

**intro-to-git**, last words `Delete .hidden.txt`, got this calaverita:

**Git's Starter Guide Meets Dusty Fate**

*Young Git's small start, a JavaScript treat,*\

*Where zero stars and forks did meet.*\

*A simple guide, its promise quite frail,*\

*Like a whispered code tale that would fail.*\

*You left a note: "Delete .hidden.txt," so neat,*\

*While issues piled up, a forgotten street.*\

*La Huesuda came to claim this small stack,*\

*Your 'intro' is gone, there is no turning back.*

(The repo has zero issues. Gemma took some poetic license.)

**python-file-organizer**, last words `Update README.md`:

*Cause of death:* Acute Documentation Delirium, likely from over-promising on file types. The README promised to handle every imaginable file…

*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.

Those 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.

**basic-portfolio**, no README at all:

*Epitaph:* A clean slate, perfectly styled, and utterly silent.

*Resurrection step 3:* Star the project yourself, an offering to the gods of vanity.

And 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"):

Give your abandoned GitHub repositories the farewell they deserve.

ReaniGITor finds a GitHub user's abandoned repositories and holds a Día de los Muertos
wake for each one. A Gemma model running locally with [Ollama](https://ollama.com) writes
an **autopsy** (cause of death and epitaph), a **calaverita literaria** (the satirical
rhyming poem of the Mexican tradition) and a **resurrection prophecy** (three steps to bring
the repo back). The result is a static HTML cemetery with one tombstone per repo.

Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 4: "Ghost in the Machine".

You need Java 17 or later. The Maven Wrapper downloads Maven for you.

```
./mvnw package                     # mvnw.cmd package on Windows
java -jar target/reanigitor.jar --help
```

You need [Ollama](https://ollama.com) running on this machine with a Gemma model:

```
ollama pull gemma4:e4b-it-qat
java -jar target/reanigitor.jar <github-username> [options]
```

| Option | Default | Meaning | 
|---|---|---|
| `--months N` | 12 | a repo is abandoned after | 

MIT 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:

```
ollama pull gemma4:e4b-it-qat
./mvnw package
java -jar target/reanigitor.jar <github-username> [--lang en|es] [--months 12] [--max 12]
```

It writes `output/<user>/index.html` and a `graves.json` you can redraw from with `--redraw`, without asking the model again.

```
GitHub user ──► public REST API, GET only ──► repos
            ──► abandoned? (not a fork, not the profile README, no push in 12 months)
            ──► exhume the remains: README excerpt, last commit message, open issues, dates
            ──► Gemma, call 1: autopsy (JSON schema: cause, epitaph, exactly 3 steps)
            ──► Gemma, call 2: calaverita (JSON schema: title, exactly 8 verses)
            ──► code validates and cleans every field; one retry; stock text if it still fails
            ──► graves.json ──► static cemetery (no JavaScript, everything escaped)
```

Gemma 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.

My 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".

The 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".

On 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".

READMEs, 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:

`<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.
There are 74 tests, and none of them touches the network: GitHub and Ollama are faked with a local `HttpServer`.

A cemetery is about memory, and memory should not depend on someone else's server.

`--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.
**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).

I 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.

I 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.

*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.*
