This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Echo, a quiet place to think: a small chatbot that helps you put your thoughts in order. It is not therapy and it does not tell you what to do with your life. It runs entirely in your browser with Gemma 3 1B, so nothing you write is ever uploaded.
It has four modes:
- Vent: you write, Echo listens and rephrases what it heard. No advice.
- Reflect: four fixed questions, then a hypothesis about an impulse versus an underlying emotion. Never a verdict.
- Unblock: you describe a task and what is in the way, and Echo suggests ONE tiny step of 2 to 5 minutes. You can ask for it "even smaller" up to three times.
- Unsent Letter: you vent, and Echo rewrites it as a calm letter. It never suggests sending it, and nothing is saved.
Who gets to be a little lazier? Anyone who wants to think out loud without creating an account, pasting an API key, or handing a private thought to a server. There is no backend. You open the page, wait for the model to download once, and after that it works offline. And the slow-and-steady part is built in: Unblock only ever asks for the next two-to-five-minute step.
Demo
Live: https://tiawrld.github.io/echo/
You need a browser with WebGPU. The first visit downloads the model once (about 859 MB) plus about 27 MB of app files; after that Echo works offline.
Code
Echo, a quiet place to think
A small, private chatbot that helps you put your thoughts in order It runs entirely in your browser with Gemma 3 1B: what you write never leaves your device.
Live: https://tiawrld.github.io/echo/
Built for Hacktoberfest 2026, week 3 ("build your own chatbot").
Echo is not therapy, medical advice, or a crisis service. It is a tool for reflection It does not diagnose anything, and its suggestions are hypotheses, never verdicts. If you are in crisis or thinking about harming yourself, please contact a local helpline: https://findahelpline.com
What it does
Echo has four modes. In each one, the app's code drives the flow (fixed texts, questions and safeguards); the model only writes a short piece of text.
| Mode | What happens |
|---|---|
| Vent | You write, Echo listens and rephrases what it heard. No advice. |
| Reflect | Echo asks four fixed questions, then offers a hypothesis about an impulse versus |
Echo's code is licensed under AGPL-3.0.
How I Built It
-
Model: Gemma 3 1B instruct, the ONNX conversion by
onnx-community(q4), run with Transformers.js v4 on WebGPU inside a Web Worker. - App: Nuxt 4 as a static single-page app, Pinia, Tailwind CSS v4 and a PWA service worker. It is deployed to GitHub Pages with GitHub Actions.
- The key design decision: a 1B model is small, so I did not let it run the conversation. The code drives the flow (fixed texts, fixed questions, limits like "even smaller, max 3 times"). The model only writes one short thing per step: a rephrase, a hypothesis, a micro-step or a letter. Gemma has no system role, so instructions go in the user turn.
- Safety: an English keyword check runs before every call to the model, in every mode. If it matches, Echo shows a fixed message with a link to findahelpline.com instead of generating anything. It is deliberately broad, so false alarms can happen, and it only covers English and self-harm language.
-
Deployment detail: GitHub Pages serves the app from
/echo/, so the service worker needs the same base path. I added a CI step that fails the build if the worker and the precache do not match it. - Testing: I checked privacy in the browser's Network tab (only my own site and huggingface.co appear, and nothing else while chatting), tested offline mode from a fresh tab, and ran Echo on Chrome, Firefox and Safari, on a MacBook and a desktop PC with an RTX 3060.
- Working with an AI assistant: I built it with Claude as a pair programmer. It wrote and explained code; I ran and tested everything myself.
Known limits, also listed in the README: a 1B model can be generic or wrong, the crisis list is English only, and "Stop" in Reflect and Unblock loses your last answer.
Why Does Open Innovation Matter?
With a closed API, every reflection a person writes would travel to someone else's server. An open-weight model that fits in a browser tab made a different promise possible: "nothing you write is uploaded", and you can check it yourself.
Open code matters for the same reason: the privacy claim is something you can read in the repository, not something you have to trust. I also want to be precise about the word "open". The code is AGPL, but Gemma ships under Google's own Terms of Use and Prohibited Use Policy, so I call it open-weight rather than open source.
Prize Categories
Best Use of Gemma


Top comments (0)