← 목록

Chad Vocab: Vocabulary practice with local Gemma!

devto 2026-10-05 원문 보기 ↗


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):

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:

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.

▸ get_challenge_details id=78 Hacktoberfest Weekend
id=78 Hacktoberfest Weekend
Prompt: build with open-source AI for a friend. Theme: Build for a Friend. Required tag #hf26challenge. Deadline Oct 5 2026 06:59 UTC. Writing quality weighted most heavily. Prize categories include Best Use of Gemma, ElevenLabs, Entire.
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.

▸ seed_and_lock npm run seed:chad; REGISTRATION_ENABLED=false
npm run seed:chad; REGISTRATION_ENABLED=false
Seeded chad with Polish←English deck (12 cards). Registration returns 403 on the public tunnel.
▸ github_push gh repo create aldorr/chad-vocab --public --push
gh repo create aldorr/chad-vocab --public --push
https://github.com/aldorr/chad-vocab

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

More...

Please let me know what you think, how you would improve it, and if you found this at all useful. Thanks!