This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 4, Ghost in the Machine.
What I Built
Lumbre is a local-first ofrenda builder. You tell it who you are remembering, then add the foods, songs, stories and sayings that made them them. Each memory lights a candle on the altar. When you're ready, an open-weight model writes a short remembrance to read aloud, and your family can ask questions like "What did she cook on Sundays?" and get answers drawn only from what you wrote.
The whole thing runs on your own machine: a small Python server, one HTML page, and Gemma running through Ollama. No account, no cloud, no API key.
How I Read the Theme
For Día de los Muertos, the ghost isn't a spooky chatbot wearing a dead person's voice. The ghost is the memory itself, the thing that keeps a person present as long as someone tells the story.
So I made one rule and wrote it into the system prompt: the model may only use what you've told it, and it never speaks as the person. If you ask something your notes don't cover, it says the notes don't say, and invites you to add that memory. A remembrance that is short and true is better than a long one that is invented.
Github Project Repo Link
https://github.com/Atharva1723/Lumbre.git
Code
Run it yourself:
ollama pull gemma3
python3 server.py
# open http://localhost:8765
Python 3.9+ standard library only. No pip install. Swap the model with LUMBRE_MODEL=llama3.2 python3 server.py.
How It Works
| Piece | Choice |
|---|---|
| Model | Gemma 3 (open-weight), served by Ollama |
| Backend | ~80 lines of stdlib Python, bound to 127.0.0.1
|
| Storage | One file: data/ofrenda.json
|
| Frontend | Single HTML page, light and dark themes, keyboard accessible, reduced-motion friendly |
| Voice | Browser speech synthesis |
The server has three jobs: save the ofrenda, ask the model for a remembrance from the saved notes, and answer a question from the saved notes. Every model call gets the same grounding instruction.
Why Open Innovation Matters Here
- Privacy. A grandmother's stories and recipes are not training data. With a local model, nothing leaves localhost.
- It works with the lights off. Once the model is pulled, Lumbre runs with no internet at all, which fits a tradition where people sit by candlelight.
- It can't disappear. Your memories are one JSON file you can back up, print, or delete. There's no service to shut down and no subscription to lapse.
- You choose the voice. Because the model is swappable, you can pick whichever one writes in the tone your family would recognize.
What I'd Build Next
- Whisper.cpp so family members can record spoken stories that are transcribed locally.
- A fine-tuned Gemma that writes remembrances in a family's own style.
- Photo captions generated by a local vision model.
The Moment It Landed
[Describe the moment the remembrance mentioned a real detail you typed in, and how it felt.]
Partner Categories
- Best Use of Gemma: Gemma 3 is the model at the core, run locally and swappable. <!-- Add only if true: --> <!-- - Best Use of a .tech Domain: live at https://yourname.tech -->
Top comments (1)
The local-first promise is meaningful when backup and export are equally clear. A user should be able to verify where their memories live, encrypt a backup, and move them without depending on a hosted account or an opaque sync layer.