anjani

A personal corner of the web. Notes, projects and writing.

Browse

  • Home
  • Blog
  • Projects
  • About
  • Contact
+

Your card here

Open slot

A featured note, project or link can live here.

Coming soon

Made by anjani
© 2026 All Rights Reserved

BlogProjectsAbout
Contact
anjani
All writing
THE NOTEBOOK / 5 min read

Building a review schedule that actually sticks.

A short build log: what spaced repetition says about forgetting, and the small scheduler that came out of it.

Sample authorNovember 15, 2026 RSS
StudyBuild logMaths
Three overlapping flashcards above a dotted curve on a soft green and blue canvas
On this page
The problem with re-readingWhat forgetting looks likeThe rules I settled onThe schedulerHow a session flowsWhat a day looks likeListen, watch, shareWhat I would change next
PART OF A SERIESStudy notes
  1. Building a review schedule that actually sticks.
BUILD LOG Complete sample

Most study plans fail in the second week. The material is not harder. The plan simply asks you to remember too much, too often, with nothing telling you what to look at today. This is a short log of a small scheduler that fixes that one problem.

The problem with re-reading#

Re-reading feels productive because everything looks familiar. Familiar is not the same as recalled. If you can recognise a page but cannot reproduce it from a blank sheet, the page has not been learned yet.

The one-line version

Test yourself on a card just before you would forget it. Too early wastes time. Too late means starting again.

What forgetting looks like#

A simple model says memory decays exponentially. The chance of recalling a card after ttt days is

R(t)=e−t/SR(t) = e^{-t/S}R(t)=e−t/S

where SSS is the stability of the memory, in days. Each successful review makes SSS larger, so the next gap can be longer. A failed review shrinks it again.

If we want to review when recall has dropped to a target of R∗R^*R∗ = 0.9, we solve for ttt:

t=−Sln⁡R∗≈0.105 St = -S \ln R^* \approx 0.105\,St=−SlnR∗≈0.105S

So a card with a stability of 20 days comes back in about two days. That is the whole idea behind the schedule.

The rules I settled on#

After a few weeks of trying things, the rules fit in a short table.

Result of the reviewStability changeNext review
Forgot itS × 0.5 (minimum 1 day)Tomorrow
HardS × 1.2About 1 day later than last time
GoodS × 2.0Based on the formula above
EasyS × 3.0Based on the formula above
These numbers are a starting point

The multipliers are rough. Watch how often you answer "forgot" and nudge them. If more than one in five reviews fails, the gaps are too long.

The scheduler#

The core is one small function. It takes a card and a grade and returns the updated card.

lib/schedule.ts
ts
type Grade = "forgot" | "hard" | "good" | "easy";
type Card = { stability: number; due: Date };
 
const factor: Record<Grade, number> = { forgot: 0.5, hard: 1.2, good: 2, easy: 3 };
 
export function review(card: Card, grade: Grade, now = new Date()): Card {
  const stability = Math.max(1, card.stability * factor[grade]);
  const days = Math.max(1, Math.round(-stability * Math.log(0.9)));
  const due = new Date(now.getTime() + days * 86_400_000);
  return { stability, due };
}

Two details matter. The minimum of one day stops a card from coming back within minutes. And the function never mutates its input, which makes it easy to test and to undo a mis-tap.

How a session flows#

A study session is a loop with one decision in it.

Loading diagram…

Diagram source
graph LR
  A[Open today's queue] --> B[Show the question]
  B --> C[Try to answer from memory]
  C --> D{Grade yourself}
  D -->|Forgot| E[Back tomorrow]
  D -->|Hard or good| F[Longer gap]
  D -->|Easy| G[Much longer gap]
  E --> H{More cards due?}
  F --> H
  G --> H
  H -->|Yes| B
  H -->|No| I[Done for today]

What a day looks like#

On a typical day the queue holds a mix of new cards and returning ones. The picture below is the card layout I use: question on the front, a short answer and one example on the back.

A sketch of the card layout. Keep answers short enough to say out loud.
Three overlapping flashcards above a dotted curve

A sketch of the card layout. Keep answers short enough to say out loud.

A few habits keep the queue small:

  • Write one idea per card.
  • Phrase the front as a question, not a topic.
  • Delete cards you no longer care about.
  • Stop at a fixed number of new cards per day.

Listen, watch, share#

Some ideas travel better as sound or video. These components load nothing from other sites until you press play.

A short test toneSample audio
0:000:00
Loads from YouTube only when you press play.Watch on YouTube
SSample post@example

Posts can sit in the article as a small card, with a live version one tap away.

Placeholder text
Post on XView original post

What I would change next#

The model treats every card alike, but some ideas are simply harder. A per-card difficulty value would help, and so would a way to see the whole curve for a deck. Both are small additions to the same function.

Where to start

Pick ten cards today. Review them tomorrow, then in a few days. The schedule takes care of the rest.

S
WRITTEN BYSample author

Placeholder byline. Replace this with a short line about the author.

KEEP READING
A little more than words.

An open notebook for ideas of every shape. A living guide to everything you can put in a post.

Hello, world

First post on the new site. This is a placeholder - replace it with real writing.

Your first rich post.

From a blank file to a small corner of the internet.

ON THIS PAGEThe problem with re-readingWhat forgetting looks likeThe rules I settled onThe schedulerHow a session flowsWhat a day looks likeListen, watch, shareWhat I would change nextBack to top ↑