Skip to main content
Glama

Sprachen — Multilingual Vocabulary Trainer with MCP Agent

A local, single-user vocabulary trainer with Leitner spaced repetition, domain/topic organization, and a ChatGPT MCP agent for lessons — plus optional OpenAI assistance in the app.

Project page

More background and write-up:

Related MCP server: FlashLearn

Runs locally

This project is meant to run on your own machine (or local Docker). It is not a hosted SaaS, and there is no cloud/CDK deploy in this repo.

  • Single-user, no login / no auth

  • Data stays in a local SQLite file under data/

  • Do not expose the app to the public internet without adding your own access control

Features

  • Leitner 6-box spaced repetition

  • Multiple languages (UI + vocabulary): German, English, Spanish, French, Portuguese, Swiss German

  • Domains/topics for organizing entries

  • Fuzzy answer matching (typo-tolerant)

  • Conjugation practice

  • Grammar reference (cheat sheets; create/refine via MCP chat)

  • Worksheets / grammar tests (create via MCP, fill in the app, results for later analysis)

  • Optional OpenAI-powered translation suggestions

  • ChatGPT MCP at /mcp (persistence + review + grammar + worksheets; AI stays in ChatGPT)

Quick start

Prerequisites

  • Node.js 18+ and npm

  • An OpenAI API key if you want AI features (optional for core review)

Initialize

git clone <this-repo-url>
cd sprachen

npm install
cp .env.example .env

Edit .env and set at least:

DATABASE_URL="file:../data/sprachen.db"
OPENROUTER_API_KEY=your_openrouter_api_key_here
NEXT_PUBLIC_NATIVE_LANG=de
# Optional — train only some targets (omit = all except native):
# NEXT_PUBLIC_TARGET_LANGS=en,es,fr

NEXT_PUBLIC_NATIVE_LANG is your mother tongue / source language (de | en | es | fr | pt | gsw). Set it once at install time.

NEXT_PUBLIC_TARGET_LANGS limits which languages you train (comma-separated). Example: en,es,fr for three languages only. Leave empty for all targets except your native language. Restart the app after changing it.

Create or upgrade the SQLite database (applies Prisma migrations; backs up an existing DB to data/backups/ first):

npm run db:migrate

Start the app:

npm run dev

Open http://localhost:4810.

npm run dev starts Next.js on port 4810 (MCP at /mcp) and the optional OpenAI MCP tunnel (health 4811). Web only: npm run dev:web.

Daily on iPhone (offline, no cloud)

Native iOS (download + listen, lock-screen audio): open ios/Sprachen.xcodeproj on this Mac, sign with your Apple ID, and install to the iPhone over USB. Details: docs/ios.md.

The Mac creates the Daily pack and TTS. The iPhone downloads over home Wi-Fi (http://<mac-ip>:4810) and then plays from local files with the Mac off.

Environment

Copy from .env.example:

Variable

Required

Purpose

DATABASE_URL

yes

SQLite path relative to prisma/ (default file:../data/sprachen.db)

OPENROUTER_API_KEY

for AI features

OpenRouter API key (models are chosen in Settings)

NEXT_PUBLIC_NATIVE_LANG

yes

Source language (de by default)

NEXT_PUBLIC_TARGET_LANGS

no

Comma-separated targets, e.g. en,es,fr (empty = all except native)

CONTROL_PLANE_API_KEY

for ChatGPT tunnel

OpenAI org key with Tunnels Read + Use

TUNNEL_PROFILE

optional

Tunnel profile name (default sprachen)

Never commit .env or .env.production — only .env.example is tracked.

Docker (optional, local)

No separate database container. SQLite lives in ./data:

export OPENROUTER_API_KEY=your_openrouter_api_key_here
npm run docker:up

App: http://localhost:4810.

ChatGPT MCP

Persistence MCP at /mcp (domains, entries, conjugations, review/Leitner, grammar, worksheets, stats). Details for tunnel-client and ChatGPT Developer Mode: SETUP.md.

npm run dev          # app + tunnel (development)
npm run start        # app + tunnel (after npm run build)
npm run start:web    # production web only
npm run mcp:tunnel   # tunnel only

Grammar via chat

Grammar chapters live in the DB and are shown under Grammatik in the app. Content is created and refined in chat (ChatGPT/Claude with MCP):

  1. New — learn a topic → AI asks whether to save → create_grammar_topic (RULE + EXAMPLES + NOTE)

  2. Resume — “I want to learn possessives” → search_grammar_topics / get_grammar_topic → discuss from your saved chapter

  3. Personalize — add your own mnemonic → upsert_grammar_blocks (after confirmation)

Worksheets via chat

Worksheets live in the DB and are shown under Arbeitsblätter in the app. The AI creates them from your grammar/vocabulary; you fill them in the app.

  1. New — ask the AI to load your grammar/vocab/stats, then save a worksheet → create_worksheet (8 question types: multiple choice, cloze, free text, error correction, sentence reorder, matching, true/false, conjugation grid)

  2. List / inspect — list_worksheets / get_worksheet to resume or tweak an open sheet (update_worksheet until completed)

  3. Analyse — after you finish in the app, get_worksheet_results shows answers, auto-grade, manual overrides, and weak tags/topics

Voice Chat workaround

ChatGPT Voice Chat cannot call MCP tools directly. Use text MCP first, then voice, then sync back:

  1. Load context in text chat — ask ChatGPT (with the MCP plugin enabled) to fetch the vocabulary / due cards / lesson context you need via MCP.

  2. Start Voice Chat — continue in the same conversation so that context is already in the thread.

  3. Practice by voice — train as usual; Voice Chat only talks, it does not write to the database.

  4. Sync after voice — switch back to text and tell ChatGPT something like: „Okay, aktualisiere die Einträge basierend auf der Lehrer-Erfahrung.“ so it updates progress / entries through MCP.

Without that last step, the spoken lesson stays only in the chat history.

Leitner boxes

Cards move through 6 boxes with increasing intervals:

Box

Interval

1

immediately (0 days) — new cards and wrong answers

2

3 days

3

7 days

4

14 days

5

30 days

6

60 days

Correct → one box up. Wrong → back to box 1. Due cards have nextReviewAt in the past.

Tech stack

Next.js 15 · TypeScript · tRPC · SQLite + Prisma · Tailwind / shadcn/ui · OpenAI (optional) · Vitest

Development

npm run lint
npm run test
npm run build
npm run db:migrate      # backup + apply migrations (default on every machine)
npm run db:migrate:dev  # create new migrations locally
npm run db:backup       # copy DB to data/backups/
npm run update          # git pull --rebase, install, migrate, build (PM2 restart via pm_id / PM2_PROCESS)
npm run db:push         # optional schema sync shortcut
npm run db:studio

License

MIT — see LICENSE.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

  • Save vocabulary from any AI chat; see each word in every language you know; review it with FSRS.

  • Free: turn your AI chats into spaced-repetition vocabulary. 13 tools, reads and writes.

  • Lexpad is a vocabulary notebook and flashcard app with spaced repetition (Leitner boxes) for learning words in 81 languages, including English, Spanish, French, German, Arabic, Turkish and Persian. Connect it to ChatGPT, Claude or any MCP client, and your assistant works with the words you collected yourself: • Save words and phrases you ask for, with meanings, example sentences and a level (A1–C2). • Find anything: browse and filter your whole notebook by due, new, struggling, starred or mastered words, level, topic or date added. • Practise: get quizzed on today's due words. Every answer counts as real review, moves the word through the Leitner boxes and keeps your streak. • Edit: fix spellings, change or reorder meanings, star or retire words. Deleting needs its own permission, and the assistant asks first. Lexpad never invents vocabulary: it only works with the words you add, by hand, from a text, or imported from Anki or a Kindle. Sign-in is OAuth on a Lexpad page; your password is never shared, and you can disconnect at any time. Works alongside the Lexpad web app and Android app. Guide and example prompts: https://lexpad.app/features/assistants

  • Make Anki, Quizlet, Mochi and Brainscape decks and review your vocabulary from the chat.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A vocabulary-bank MCP server that allows users to collect unfamiliar words, organize them into decks, review with spaced repetition, and enrich with definitions and pronunciation, all stored locally.
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Local Leitner flashcard MCP server enabling AI clients to create decks, manage cards, study with spaced repetition, and track progress.
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    A local MCP server that helps you maintain a personal Japanese learning knowledge base, including vocabulary, confusion relations, mistakes, and spaced-repetition reviews. It provides tools and prompts for managing and reviewing your Japanese learning data without calling external LLM APIs.
    6
    -