cd /news/large-language-models/ofrenda-a-gentle-oral-history-keeper… · home › topics › large-language-models › article
[ARTICLE · art-160562] src=dev.to ↗ pub= topic=large-language-models verified=true sentiment=↑ positive

Ofrenda: a gentle oral-history keeper built on Gemma 3

A developer at 3Dogs Nexus built Ofrenda, an open-source oral-history tool that interviews users about deceased loved ones and generates a memorial "ofrenda card" using Google's open-weight Gemma 3 27B model via an OpenAI-compatible endpoint. The system enforces a grounding rule requiring each generated detail to share at least two content words with the user's input, dropping any detail that fails, and stores memories only in the visitor's browser via localStorage with no backend logging. The project runs as a single AWS Lambda Function URL in Python 3.12 with a vanilla JavaScript client, includes nine automated tests using fake model calls, and is licensed Apache-2.0.

by read5 min views8 publishedOct 29, 2026

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine I built Ofrenda, a gentle oral-history keeper. You type a memory of someone who has died, a grandparent, a friend, a pet. The system interviews you with a few warm follow-up questions, one at a time, each one tied to something you actually said. At the end it gives you an ofrenda card with a title, a short remembrance, three concrete details, and one line in their own words if you shared one.

The project is named for the ofrenda, the offering placed on a Día de los Muertos altar. I wanted something that would honor the past without inventing it.

The worked example throughout the demo is a grandmother named Rosa. She made tamales every December in her tiny kitchen in Tucson, sang old rancheras in a blue apron, loved Cielito Lindo, and used to say "a kitchen with no music is a kitchen with no love." The card the system wrote for her is warm and accurate because everything on it came from what was typed.

Privacy is built into the bones of the thing. The backend never stores, logs, or forwards any memory. Cards are saved only in the visitor's browser with localStorage. There is no account. You visit, you talk, you leave with something you can keep.

Live demo: [https://wtiebbqscexgkzkest37g4ffly0zujci.lambda-url.us-east-2.on.aws/](https://wtiebbqscexgkzkest37g4ffly0zujci.lambda-url.us-east-2.on.aws/)

Video walkthrough: [https://youtu.be/s2KdX96chDQ](https://youtu.be/s2KdX96chDQ)

The card shown in the video was generated live during recording, nothing was staged.

People cherish memories of loved ones, friends, or even beloved pets that have passed OFRENDA lets you capture those stories in a respectful "ofrenda card" that can be saved locally and shared with family. The card contains a short remembrance, three concrete details drawn from what you told the system, and, when available, a line quoted from the person themselves. All content is generated by the open-weight Gemma 3 model, honoring the spirit of Día de los Muertos while keeping the process fully open-source.

Built for the DEV Hacktoberfest 2026 week-4 challenge (Ghost in the Machine) by 3Dogs Nexus. Runs on the open-weight google/gemma-3-27b-it model via an OpenAI-compatible endpoint.

Interview – You type a short description of the person The system asks up to five warm, short follow-up questions, each based on something you…

Repository: https://github.com/DKJager/ofrenda The server is a single AWS Lambda Function URL written in Python 3.12 using only the standard library. It serves the page on GET and handles two JSON routes, one for the interview turns, one for card generation. The client is plain vanilla JavaScript. Nine automated tests run with fake model calls, no API key or network needed. The whole thing was built from an empty repository during the challenge window, first commit October 28th, 2026. Licensed Apache-2.0.

The architecture is deliberately thin. One Lambda function. No frameworks, no databases, no external storage. The model calls go to Gemma 3 (google/gemma-3-27b-it, Google's open-weight model) through the Nebius Token Factory OpenAI-compatible API. The function URL does everything else.

The core mechanic is a grounding rule. When the card is generated, every detail must share at least two content words with what the user typed, stopwords removed. If a detail fails that check, it gets dropped. The prompt also instructs the model to use only facts the user gave and not to invent names, places, or events. This is the guardrail that keeps the ofrenda honest.

The interview flow works like this. You type a memory. Gemma reads the conversation history and returns one short follow-up question based on something you mentioned. It does this up to five times, then writes the card. The history is capped at twelve turns, fifteen hundred characters each, to keep things within the Lambda timeout.

I learned some practical lessons along the way. The first working version was a stub that never called the model. It always answered "Tell me more about that," and the tests passed anyway because the tests were stubs too. I had to rewrite the tests to require actual model calls before they would count as passing.

The first grounding check used plain word overlap and let words like "the" and "and" count as shared words. An invented detail slipped through. I fixed it by removing stopwords before counting.

Gemma rejected a conversation that began with an assistant turn, returning HTTP 400. Now the history is normalized to always start with the user.

Long card outputs made the function hang near the Lambda timeout. I capped the card call at 350 tokens and set the client timeout to eighty seconds. That solved it.

This project would not have the same meaning with a closed model. Gemma is named, pinned, and swappable. Any OpenAI-compatible host can serve it, and it can run locally. The remembrance prompt and grounding check are public in the repository, so anyone can audit exactly what the card may and may not contain. The memories never have to leave for a vendor's logs. A closed API simply could not give a family that guarantee.

When you are asking someone to share a memory of their grandmother, the trust has to be real. Open-weight models and open-source code make that trust verifiable.

This challenge asked us to honor the past in the spirit of Día de los Muertos, and I took that literally. An ofrenda is not a performance. It is a small, careful act of remembrance. I wanted the software to feel the same way. The interview is patient. The card stays close to what you said. Nothing is embellished for effect. The model listens more than it speaks.

Rosa's card holds a blue apron, a December kitchen, one song, and one sentence she used to say. Those details matter because they are hers, not because they are dramatic. Ofrenda tries to leave room for that kind of quiet specificity. It does not try to summarize a life. It just holds a few things steady for a moment.

Best Use of Gemma. Gemma 3 powers both the conversational interview and the card generation, and the whole system is built around its ability to ask grounded, non-inventive questions and produce a remembrance that stays faithful to what the user actually said.

── more in #large-language-models 4 stories · sorted by recency
── more on @ofrenda 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/ofrenda-a-gentle-ora…] indexed:0 read:5min 2026-10-29 · —