Vestige
A local-first spaced-repetition app that replaces Anki, with FSRS scheduling and its own card-creation pipelines.
What it does
Cards enter a deck three ways: hand-curated import, mining sentences from real media, or generation from a frequency list. All of it runs inside the app. A daily review loop schedules each card with FSRS, the algorithm Anki itself now defaults to.
I've tested it with Danish, Spanish, French, Japanese, Russian, Czech, Polish and Mandarin.

The answer side of a card: the word, an English definition, the example sentence with its translation, a picture, and the four FSRS rating buttons, each showing when the card would come back.
The front is audio only (the word and the sentence, no text), so reading comes after listening.
Outside services it orchestrates
| Service | Used for |
|---|---|
| Claude API (Sonnet 5) | One call per candidate word: classifies it, validates or writes the example sentence, and writes bilingual and monolingual definitions. Batched, with cost estimated before each run. |
| edge-tts (local server) | Audio for single words |
| Soniox TTS | Sentence-length audio |
| Fish Audio | Japanese sentence audio (replaced Soniox after testing on real heteronyms) |
| Unsplash | Images for words that can be pictured |
| wiktionary-to-yomitan, JMdict | Dictionary data (the first is the open-source project I contributed to earlier) |
| OpenSubtitles-derived word lists | Which words to teach first |
Decisions I recorded in the spec
- Scheduler: I evaluated SuperMemo's SM-20 and rejected it. It is only available as a metered paid API, runs non-locally, and its performance claims are self-reported. FSRS is free, open-source and offline.
- Backend language: Python over Go or Rust, because spaCy has trained models for Czech and Chinese segmentation and the other two have no equivalent.
- Database: SQLite instead of per-file JSON state, because a growing candidate pool and continuous per-card tracking outgrew flat files.
- Schema: one fixed card shape instead of Anki-style templates, since the scope is vocabulary only. That keeps the API simple.
Architecture
Next.js frontend → REST API → FastAPI service layer → SQLite. Both halves run as Windows services via Shawl, started at boot.
Honest limits
- Single-user and local by design.
- The backend has no automated tests yet. Adding them is on my list.
- Built with Claude Code from my written spec and mockup; I review and run everything.