This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
On Día de los Muertos, families build an ofrenda: an altar with marigolds, candles, the food someone loved, the song that was theirs, a photograph. The idea is that the dead stay close as long as someone keeps telling their story.
The stories are the fragile part. They sit in a few heads and a few chat threads. And the obvious tool for turning scattered memories into writing, a cloud AI, asks you to paste your grandmother's last recipe into a company's server.
So I built ofrenda, a command line tool with zero dependencies. You answer eight questions about someone you miss: name, who they were to you, a food, a song, a scent, something they always said, one story you never want to lose, and optionally a photo.
A model running on your own laptop writes a short remembrance from your answers. Then the tool builds one HTML file: a papel picado banner that sways, three flickering candles, marigold petals drifting down, your remembrance typing itself out line by line, and an offerings tier for the food, song, flower, and phrase.
Demo
Code
🕯️ ofrenda
A ghost story where the ghost is someone you love.
Answer seven questions about a person you miss. A language model running on your own laptop writes their remembrance. You get a candlelit altar page you can keep forever.
No cloud. No account. No API key. No upload. Nothing leaves your machine.
Built for the Hacktoberfest Open-Source AI Challenge: Ghost in the Machine
The idea
On Día de los Muertos, families build an ofrenda: an altar with the food, the song, the flowers, and the stories of people who have died. The ritual says someone stays present as long as someone tells their story.
The stories are the fragile part. They live in a few heads and a few chat threads. If you hand them to a cloud AI to help you write them down, you upload your grandmother's last recipe to a company's server.
ofrenda keeps…
How I Built It
Model: gemma3:4b, an open-weight model, served by Ollama on localhost. One environment variable swaps it (OFRENDA_MODEL=llama3.2).
Code: one Node file, no dependencies. It asks the questions, calls Ollama's /api/chat, and renders the altar as a single HTML file with the photo embedded as base64.
Prompts: two. One writes the remembrance, one runs the echo. Both are built around the same rule: use only what the person told you, and leave gaps empty.
Built with: Antigravity
Why Does Open Innovation Matter?
I could not have built this honestly with a closed API.
It ran with the wifi off. I turned the wifi off, ran the whole thing, and it worked. The only time the tool needs internet is the one-time model download.
[SCREENSHOT: terminal with wifi-off icon visible]
Nothing about a dead person left my machine. Answers, photo, chat, and output all stay in a folder on disk. That folder is gitignored so one careless git add . cannot publish a family's private stories.
Nothing can be switched off under it. The output is a plain HTML file with the photo inside it. No framework, no hosted viewer, no account. A memorial that depends on a company keeping an API alive is not much of a memorial. A file you can open in thirty years is.
I could change how it behaves. I swapped models with one variable, and I rewrote the echo's rules until it refused what it should refuse. With a hosted model, someone else's policy sits between me and that prompt.
It cost nothing to run. I rewrote prompts dozens of times with no metered calls.
My Agent Session
Prize Categories
Gemma
Top comments (0)