The page: a dark, warm ofrenda with flickering CSS candles, marigold accents, each person's name and dates, a short tribute, and their memory in their family's own words.
Code
Ofrenda Keeper 🕯️
A local remembrance keeper for Día de los Muertos — built for the Hacktoberfest 2026 DEV Challenge, Week 4: Ghost in the Machine.
You write memories of loved ones as simple .txt files. One command
weaves them into a beautiful, self-contained remembrance page
(out/ofrenda.html) — candle glow, marigolds, their names, and the words
you kept for them.
Everything happens on your machine. No cloud, no account, no API Family stories are the most private data there is; this tool treats them that way.
How it works
-
Rules do the structure — parsing memory files (
Name:,Dates:Place:,Memory:), HTML-escaping every word you wrote (so a<in a memory can never break the page), and building the page. - Gemma (Google's open-weight model, running locally through Ollama) does only the writing: a warm 2–3 sentence tribute per person.
- No…
How I Built It
The architecture follows one rule I learned the hard way on a previous project: the model must never be trusted with structure — only with words.
-
Rules do the structure. A small parser reads
Name:,Dates:,Place:,Memory:fields from each text file. Every word of user content is HTML-escaped before it touches the page (a<script>in a memory becomes harmless text, never code). The page itself is one self-contained HTML file — I tested that it makes zero external requests. - Gemma does only the writing. The local model (gemma3:1b via Ollama) receives the person's details and writes a warm 2–3 sentence tribute. That's it — it never sees file paths, never builds HTML, never decides anything structural.
-
Honest fallback. If Ollama is unreachable, a template tribute is used instead — and every tribute on the page is labelled with the engine that wrote it (
gemma-localorfallback-rules). A prompt-echo guard also rejects replies where a small model echoes the prompt's instructions instead of writing a real tribute. - 13 automated tests lock all of this in: parsing, the echo guard, HTML escaping, page self-containment, and a full end-to-end run.
Your real memories stay in memories/, which is gitignored — they can never be pushed anywhere by accident.
Why Does Open Innovation Matter?
A remembrance is intimate data: names, dates, the stories a family tells about its dead. A closed cloud service could build this in an afternoon — but then your family's memories would live on someone else's server, inside a product that could change its terms, start charging, or simply shut down one day. The dead can't consent to that.
Openness fixes it at the root: an open-weight model I can run myself, on a machine I own, with code I can read and keep. Ofrenda Keeper works with the internet off, costs nothing per tribute, and will still work in twenty years — which is exactly the timescale a remembrance deserves.
Disclosure: I built this with the help of an AI coding assistant; every line was read, tested, and verified by me. The demo tributes above were generated by Gemma 3 1B running locally via Ollama on a Linux machine — no cloud APIs were involved at any point.
Prize Categories
- Best Use of Gemma

Top comments (0)