← Back to projects

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.

Vestige review card, answer side

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

ServiceUsed 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 TTSSentence-length audio
Fish AudioJapanese sentence audio (replaced Soniox after testing on real heteronyms)
UnsplashImages for words that can be pictured
wiktionary-to-yomitan, JMdictDictionary data (the first is the open-source project I contributed to earlier)
OpenSubtitles-derived word listsWhich 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.