Skip to content
Andrés Sanabria
All projects

Armin

v0.5.0 · AppImage

A local-first spaced-repetition desktop app where cards store their prerequisites, with an MCP server that lets agents author decks.

Problem

I wanted to learn with spaced repetition and kept bouncing off Anki. Making cards ate the time reviewing was supposed to save, and the app schedules every card as if they were all independent. Knowledge is not independent: HTML unlocks CSS, CSS and JavaScript unlock everything after that. No spaced-repetition app I could find models that hierarchy, which is why a review backlog in a new subject feels overwhelming. It is overwhelming, because the app is showing you cards you are not ready for.

(For the memory model behind spaced repetition, Nicky Case’s “How to remember anything” is still the best explanation. For the hierarchy argument, this post is the one that fixed my mental model.)

The chart below is the shape Armin schedules against: a card becomes reviewable only when the cards it depends on have been learned.

Graph of knowledge items unlocking each other through prerequisites

Decisions

Build local-first on Electron

Chose

An Electron app with a local SQLite store; the data never leaves the machine.

Local-first is a learning decision, not just a privacy one. A review habit has to survive offline mornings, and the corpus of cards is the kind of data a learner should own as files. Electron is heavy, and I accepted that cost for the native modules and the packaging tooling I did not have to fight.

Turned down

  • Web appIt cannot own local files and it answers to connectivity.
  • TauriSmaller bundle, but better-sqlite3 native modules and the Electron Forge toolchain were the faster, safer path to shipping.

Let agents author decks over MCP

Chose

A local MCP server exposing authoring tools: create decks and cards, import whole hierarchies with prerequisite links, edit, archive, delete, and read the graph.

The server speaks stdio inside the app. The safety comes from the graph, not from restricting tools: prerequisites stay inside a deck, self-edges and cycles are rejected the moment they are proposed, and the batch import checks the hierarchy before writing anything. Reviews stay human on purpose. There is no tool that answers a review for you.

Turned down

  • A hosted APIIt moves the data off the machine, which defeats the point of the app.
  • A read-only surfaceAn agent that can only read leaves the human typing every card, which is the exact chore the agent should absorb.

Schedule with FSRS behind a prerequisite lock

Chose

ts-fsrs for scheduling, plus a lock: a prerequisite card is secured only when every review unit it generates has reached the Review state with stability above a floor.

The lock is what turns the prerequisite graph into scheduling. A locked card is pushed out of the queue until its prerequisites are secured; unlocking restores normal scheduling, and locks recompute transitively after every review. The stability floor is configurable per deck, so a learner can trade strictness for pace.

Turned down

  • SM-2, the algorithm Anki usesIt treats every card the same no matter how the learner has been answering. FSRS tunes to the actual review history.

Ship one platform, unsigned

Chose

An AppImage for Linux, published to GitHub Releases and the AUR, deliberately unsigned.

One honest artifact beats three warning-laden ones. The AUR package repackages the AppImage without the FUSE dependency, which is the Linux distribution story that actually matters to me. Code-signing waits until there is a reason for it.

Turned down

  • Paying for code-signing certificatesIt costs money the project does not have, for warnings on platforms I am not shipping anyway.
  • Shipping Windows and macOS builds tooThe build config exists for both, but unsigned installers nobody can run without fighting their OS are noise, not reach.

Result

Armin homepage showing the Decks list with demo decks, due counts, and a New deck button
The Decks homepage: demo decks with due and new counts, ready to review.
Armin prerequisite graph for the Demo How the Web Works deck, showing locked cards unlocking from bits and bytes down to HTTPS and CDNs
The prerequisite graph in action: locked cards unlock as their prerequisites are secured.

v0.5.0 ships as an AppImage on GitHub Releases and as armin-bin on the AUR. CI runs lint, typecheck, unit tests, MCP server tests, and Playwright E2E under xvfb on every pull request. Code-signing and auto-update are deferred together, on purpose.

Casts

Armin02 / 03
Cast — to be added

A local-first spaced-repetition desktop app where cards store their prerequisites, with an MCP server that lets agents author decks.

Ask about my work