This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
Chad Vocab is a self-hosted vocabulary trainer I built for Chad, a friend who is learning Polish.
He is able to enter his own language pairs, or photograph a text book page, which gets converted into a vocabulary deck. He can make other language pairs and other decks, if needed. In this demo, he gets English cues and answers in Polish — by typing or speaking. Near-miss answers are graded by an open-weight Gemma model running locally through LM Studio. Spoken answers go through optional ElevenLabs Scribe when he pastes his own API key, otherwise open Whisper via Scriberr. He can also photograph a textbook page; Gemma vision proposes pairs, and he reviews them before anything hits the deck.
It does not have to be big. It has to matter to him: a private practice loop that keeps his speech and photos on a household laptop, not a cloud AI subscription.
Demo
Live app: https://vocab.slotify.work/
Demo login (registration is closed on the public tunnel):
-
Username:
chad -
Password:
mXz1cvwHZZgg
The app runs on my machine behind a Cloudflare Tunnel to vocab.slotify.work, so it is only reachable while the host is awake for judging. LM Studio and Scriberr stay on localhost and are not exposed. LM Studio and any Open Whisper endpoint could potentially be used.
Quick path for judges: log in as chad → practice an English cue in Polish → try a close-but-wrong spelling and watch Gemma accept or correct → open Deck to see the starter list, add/remove words, scan a vocab page or generate audio.
Video Demo
Code
aldorr
/
chad-vocab
Open-source Polish vocab trainer for Chad — local Gemma + Whisper
Chad Vocab
Open-source, self-hosted vocabulary trainer built for Chad while he learns Polish from English cues.
- English → Polish (or any language pair you set)
- Type or speak — spoken answers go through local Scriberr (Whisper)
- Fuzzy grading — LM Studio + an open model such as Gemma accepts near-misses
- Photo → deck — Gemma vision reads a textbook page; you review before import
- Optional accents — ElevenLabs TTS / Scribe per account (bring your own API key)
- Mastery queue — needs-practice first; learned cards rare; last 5 mixed with review
Live demo (while the host machine is awake): https://vocab.slotify.work/
MIT licensed. Self-host forever — a later hosted free/paid offering (if any) does not close the source.
Quick start
Requirements
Repo: https://github.com/aldorr/chad-vocab
Stack: Vite + React UI, Hono API, SQLite. MIT license.
How I Built It
Open-source AI is not a bolt-on — it is the grading and photo path:
-
Gemma via LM Studio — fuzzy answer grading and textbook photo OCR (
server/src/lib/lmstudio.ts). Without a vision-capable Gemma load, photo import does not work. - Scriberr / Whisper — local speech-to-text fallback when no ElevenLabs key is on the account.
- Optional ElevenLabs — per-account encrypted API key on Progress for accented word audio and faster Scribe STT. Chad can add his own key; the open path still works without it.
-
Demo hardening for the challenge —
REGISTRATION_ENABLED=falseon the public tunnel, a seededchadlogin with an English→Polish starter deck, branding as Chad Vocab.
Why Does Open Innovation Matter?
Chad’s practice data should not need to leave the house. Local Gemma means:
- spoken answers and textbook photos stay on the laptop
- no paid cloud model required to practice
- we can swap models in LM Studio without rewriting the app
- anyone can clone the MIT repo and run the same stack
A closed API would be easier for a weekend demo URL. It would also send a friend’s language practice to someone else’s server. Open-weight inference is what made “build it for Chad, keep it private” possible.
My Agent Session
Prize Categories
- Best Use of Gemma — local Gemma for fuzzy grading and textbook photo extraction
- Best Use of ElevenLabs — optional per-account TTS / Scribe for accented practice (bring-your-own key)
- Best Use of Entire — agent session embedded above
More...
Please let me know what you think, how you would improve it, and if you found this at all useful. Thanks!
Top comments (3)
This is really cool!! The local AI angle makes a lot of sense here. Nice work!
Thanks!
After creating this, though, I wondered how an app like Duolingo can recognize words and pronunciations so quickly. It takes a long time locally, and even with the elevenlabs API, it's slower than my phone and Duolingo. Would love to get this to work faster.
Yeah, that makes sense! Duolingo probably has a lot of optimisation behind the scenes that’s hard to match with a local Gemma/Whisper setup.
Still, I really like the privacy-first tradeoff here and being able to run everything locally.It feels like a great foundation to optimize later