Hacktoberfest Open-Source AI Challenge: Week 4
What I built: Echoes Offline is a tiny, Día de los Muertos–inspired oral-history companion. You write a memory about someone you love, and it creates a warm, printable remembrance card with a small ritual prompt.
The emotional center of this project is simple: a family story should not have to pass through an account, a database, or a paid API before it can be held with care.
Demo and source: View the source on GitHub
The ghost in this machine is private
Halloween gets us thinking about voices from elsewhere. Día de los Muertos asks us to make room for the voices that are already part of us.
I wanted to build something gentler than a generic chatbot: a place for one memory, one person, and one small act of remembering. The interface is intentionally short. There is no profile, no prompt history, no “engagement” loop. You enter a name and a moment; Echoes returns a card you can print or keep.
That constraint shaped the technical decision too. The app has no application server.
How it works
flowchart LR
A[Memory typed by a family member] --> B[Echoes Offline browser UI]
B --> C[Transformers.js in the browser]
C --> D[Open-weight DistilBERT model]
D --> E[Feeling + ritual prompt]
E --> F[Printable remembrance card]
D -. first download only .-> G[Model asset host]
B -. never .-> H[(No app database / no text upload)]
The browser loads Transformers.js and an open-weight DistilBERT sentiment model. The model is downloaded directly by the visitor’s browser, then cached there for reuse. The memory text is passed only to that local model instance.
The first run needs a connection to fetch model assets. That is an honest trade-off. But after the asset is cached, the project does not need a backend or a secret key to understand the feeling in a memory. If the model cannot load, Echoes still produces the card in a clear no-AI fallback mode.
Why open innovation mattered here
Open-weight AI was not decorative in this project; it made the privacy promise possible.
A hosted text API would have been faster to wire up. It would also have meant asking someone to send a personal memory — maybe about a grandparent, maybe about a loss — to a service they do not control. Running the model in the browser changes that relationship:
- No account: there is nothing to sign into and no profile to build.
- No application database: Echoes has nowhere to store the text.
- No API key or per-request price: the app can be copied, inspected, and hosted as a static site.
- A future beyond one vendor: the model can be swapped, improved, or run from a local bundle without redesigning the product around a closed endpoint.
The model is small on purpose. This is not trying to impersonate the person who is remembered. It only recognizes a broad emotional signal — warmth or tenderness — and uses that to select a respectful ritual prompt. The user’s own words remain the heart of the card.
A small technical choice with a large consequence
The hardest product choice was to keep the AI narrow. A generative model could fabricate elaborate prose, but it might also overwrite a memory with something smoother and less true. Echoes instead preserves the first meaningful sentence and lets the open model contribute only a modest emotional reading.
That made the app more honest. It does not claim to resurrect a voice. It makes a place to listen to the one the family already has.
Built with
- Plain HTML, CSS, and JavaScript
- Transformers.js
- The open-weight
Xenova/distilbert-base-uncased-finetuned-sst-2-englishmodel in ONNX form - No backend, account system, or application database
The project includes an MIT license, a setup guide, a privacy note, and the architecture diagram above.
Try it
- Open Echoes Offline in a modern browser.
- Select Load a sample or write a short memory.
- Select Create an echo.
- On the first analysis, allow the browser to download the model assets.
- Use Print this echo to make a keepsake card.
If you are a judge, the sample is already built into the interface. No sign-in or testing credentials are required.
What I learned
I began with the question: can a tender tool also be technically modest?
The answer was yes, with trade-offs. Local browser inference means a first-run download and less expressive output than a hosted model. In return, it gives the most sensitive part of the experience — the memory itself — a boundary I can explain in one sentence: it stays in the browser.
That is the kind of open innovation I want more of: not just a model anyone can inspect, but a product whose privacy promises are visible in its architecture.
Thank you for reading — and for making room for the stories that should not disappear.
Top comments (0)