This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Ofrenda is a small web page that helps you write a remembrance for someone who has died, then sets it on a little altar. You give it a name, who they were to you, the foods and songs they loved, and one memory in your own words. A language model running on your computer turns that into a short piece of writing in your voice, and the altar lights a candle while it writes.
I read "Ghost in the Machine" as the people we carry around, not the monsters. The version I wanted was the one where the machine helps you say something about a person who is gone, and then gets out of the way.
The rule that shaped everything: the model may only use what you typed. It is told never to invent a name, a place, a date or a quote. If you give it three details, you get three details back. A remembrance with a made-up fact in it is worse than none.
Demo
Code
kskaranreddy
/
Ofrenda
Write a remembrance for someone you miss using a local Gemma model via Ollama. Runs offline in one HTML file; nothing leaves your computer. Hacktoberfest 2026: Ghost in the Machine.
Ofrenda
Write a remembrance for someone you miss, with a model that runs on your own computer.
You give it a name, who they were to you, the foods and songs they loved, and one memory. A local Gemma model, served by Ollama, writes a short piece in your voice using only those details. A small altar lights a candle while it writes. Nothing is uploaded: the page talks to localhost and nowhere else, so it works with the internet off.
Built for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine.
Run it
You need Ollama and Python (only to serve the page locally).
-
Pull a model:
ollama pull gemma3On a machine with 8 GB of RAM or less, use
gemma3:1b. -
Start Ollama and allow the page to call it.
Windows (PowerShell):
$env:OLLAMA_ORIGINS="*"; ollama serveMac / Linux:
OLLAMA_ORIGINS="*" ollama serveIf the Ollama…
The whole app is one index.html. No build step, no dependencies, no backend.
How I Built It
-
Model: Gemma (
gemma3), served by Ollama onlocalhost:11434. Any model you have pulled shows up in the dropdown, and the page prefers a Gemma if it finds one. -
Page: plain HTML, CSS and JavaScript. It calls Ollama's
/api/tagsto list your models and/api/chatwith streaming on, and reads the newline-delimited JSON as it arrives so the text appears word by word. - Altar: three CSS tiers and a paper-cut banner. The candle's flame fades in when generation starts, and the animation turns off if your system asks for reduced motion.
- Hardware: my laptop has no usable GPU for Ollama, so everything ran on CPU. A short remembrance takes about a minute, which suits the subject.
To run it:
ollama pull gemma3
$env:OLLAMA_ORIGINS="*"; ollama serve # PowerShell
python -m http.server 8000 --bind 127.0.0.1
Why Does Open Innovation Matter?
The input to this tool is grief: a person's name, a story about their family, the song that was playing. I did not want that text to pass through anyone else's server, be logged, or sit in a database that outlives a startup's runway.
With an open-weight model the privacy is structural rather than promised. The page cannot send your memory anywhere because there is no remote to send it to. A closed API can offer a privacy policy. It cannot offer that.
It also means the tool keeps working. An ofrenda is something you come back to every year. A hosted model gets deprecated, repriced or shut down. A model file on your own disk keeps working, and when a better one comes out you swap it in with a dropdown.
The Spirit of It
Ofrenda is built around a simple belief: people never truly leave us as long as their stories live on.
It's about preserving the little things — their words, traditions, favorite memories, and the moments that made them who they were.
Not recreating those we've lost, but creating a space to remember them, celebrate their lives, and keep their stories alive.
Because sometimes, remembering is the closest thing we have to holding on.
Prize Categories
- Best Use of Gemma
Top comments (0)