DEV Community

Cover image for Chad Vocab: Vocabulary practice with local Gemma!
Allan Dorr
Allan Dorr

Posted on

Chad Vocab: Vocabulary practice with local Gemma!

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

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

GitHub logo 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

  • Node.js 20+
  • Scriberr running locally (Homebrew: brew tap rishikanthc/scriberr && brew install scriberr)
  • LM Studio with an open model loaded (Gemma recommended) and the local server started
  • Photo →…

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:

  1. 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.
  2. Scriberr / Whisper — local speech-to-text fallback when no ElevenLabs key is on the account.
  3. 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.
  4. Demo hardening for the challenge — REGISTRATION_ENABLED=false on the public tunnel, a seeded chad login 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

Building Chad Vocab for Hacktoberfest Weekend
You

We need to submit this for the Hacktoberfest Weekend Challenge: Build for a Friend. The app is for Chad — he's learning Polish. Demo at https://vocab.aldorr.net/ with one login, registration closed.

Agent

Checking the challenge rules and auditing the workspace against the prompt: open-source AI at the core, built for one real person during the challenge window.

You

Stick with open source at the core and optional ElevenLabs per account. This is the Chad Vocab App. Login should be for him. Close signup so the public tunnel doesn't get flooded.

Agent

Implementing Chad Vocab branding, REGISTRATION_ENABLED=false for the demo, and seeding username chad with an English→Polish starter deck. Public repo at github.com/aldorr/chad-vocab. Live demo credentials go in the DEV post only, not in git.

Rebuilt the production client so https://vocab.aldorr.net/ shows Chad Vocab with demo-login-only. Verified Chad can log in and practice Polish from English cues. Staging the DEV challenge draft next for the user to edit before publish.

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)

Collapse
 
anika_jha_33ae1d9afc69178 profile image
Anika Jha •

This is really cool!! The local AI angle makes a lot of sense here. Nice work!

Collapse
 
aldorr profile image
Allan Dorr • • Edited

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.

Collapse
 
anika_jha_33ae1d9afc69178 profile image
Anika Jha •

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