Disclosure: I build VibeLing, a vocabulary app. This post is about the scheduler inside it — what it does, what we deliberately didn't build, and the thing that broke once real people started using it.
Every spaced repetition app has one function at its core: given a word and everything that has happened to it so far, return a date. Show it again on that date. Everything else — the card UI, the audio, the streak counter — sits on top of that one decision.
We got that function wrong in an interesting way, so here is how it works now and what it cost to get there.
The state we keep per word
Two numbers and a state machine. That's the whole model.






