devto 2026-10-05 원문 보기 ↗
This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
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.
Live app: https://vocab.slotify.work/
Demo login (registration is closed on the public tunnel):
chad
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.
Open-source, self-hosted vocabulary trainer built for Chad while he learns Polish from English cues.
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.
Repo: https://github.com/aldorr/chad-vocab
Stack: Vite + React UI, Hono API, SQLite. MIT license.
Open-source AI is not a bolt-on — it is the grading and photo path:
server/src/lib/lmstudio.ts). Without a vision-capable Gemma load, photo import does not work.REGISTRATION_ENABLED=false on the public tunnel, a seeded chad login with an English→Polish starter deck, branding as Chad Vocab.Chad’s practice data should not need to leave the house. Local Gemma means:
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.
Please let me know what you think, how you would improve it, and if you found this at all useful. Thanks!