FSRS for Obsidian: remember what matters
Obsidian is called a "second brain". But to truly become one, links alone aren't enough — you need memory.
I built a spaced repetition plugin powered by the modern FSRS algorithm. It remembers what you studied and when, how hard it was, and predicts your recall probability. All data stays in your .md files — nothing is sent to any server.
Why another repetition plugin?
Because you shouldn't have to fiddle with cards when your notes are already right there.
SM-2 vs FSRS
SM-2 repeats everything at the same intervals. Miss a week? Progress resets. You can calculate it on a napkin.
Problems with SM-2 in practice:
- Same intervals for easy and hard material — you review what you know and what you don't at the same rate
- Progress reset after a break — skipped a week? Start over.
- No forgetting prediction — the plugin won't tell you that you're about to forget
FSRS solves all of this. At the same retention level, it requires roughly 30% fewer repetitions — and with FSRS-6 used in the plugin, the real-world difference is noticeably larger.
FSRS plugin vs other tools
| Feature | Obsidian + FSRS (this plugin) | Anki + FSRS | RemNote + FSRS |
|---|---|---|---|
| Data format | ✅ .md, your files |
⚠️ SQLite, optional cloud | ⚠️ Local or cloud by choice |
| Card context | ✅ Full note, links, graph | ⚠️ Snippets of text | ✅ Note = card |
| Card creation | ✅ Note = card | ❌ Copy-paste, form | ⚠️ Quick from rem |
| Algorithm | ✅ FSRS | ✅ FSRS | ✅ FSRS |
| Privacy | ✅ Fully offline | ⚠️ Local, optional account | ✅ Offline mode |
| Sync | ✅ Not needed — sync your vault | ✅ Free via AnkiWeb (optional) | ❌ Pro subscription only |
| Open source | ✅ Fully open | ✅ Fully open | ❌ Closed |
| Visuals & extras | ✅ heatmap | ✅ add-ons available | ✅ built-in |
| Analytics | ✅ SQL-like queries, filtered views | ✅ Free, add-ons | ⚠️ Basic free, advanced paid |
How FSRS understands your memory
FSRS calculates three parameters for each card based on review history (date and rating):
| Parameter | Meaning | How it changes |
|---|---|---|
| Difficulty (D) | How hard the material is | Stays nearly constant — a hard topic stays hard |
| Stability (S) | How firmly the memory is held, in days | Grows with each successful review |
| Retrievability (R) | Probability of recall right now | Falls every second after review |
After each answer (Again / Hard / Good / Easy) the algorithm recalculates difficulty and stability. Retrievability decays on its own — when it drops below the threshold, the card appears in the review list.
The threshold is configurable: want 90% retention? You'll review more often. 80% is enough? Fewer reviews.
How it looks in Obsidian
Nothing but Obsidian is required. Install the plugin and go.
1. Add FSRS fields to a note
Open the note you want to turn into a card. Call up the command palette (Ctrl/Cmd+P) and run:
FSRS: + Add FSRS fields to frontmatter
A reviews array will appear in the frontmatter — this is where the plugin stores review history. A review button is added right after the frontmatter:
---
reviews: []
---
```fsrs-review-button
```
In reading view, the code block becomes a button. Click it to see four rating options: Again, Hard, Good, Easy. No need to switch to edit mode.
You don't have to insert the button manually — the plugin adds it automatically when initializing a card. If you disable auto-add in settings, you can insert it via FSRS: □ Insert review button block.
The plugin records dates and ratings into the reviews field. After a couple of reviews, the frontmatter will look something like:
---
reviews:
- date: "2025-03-15T12:00:00Z"
rating: 2
- date: "2025-03-17T08:00:00Z"
rating: 3
---
The rating value: 0 = Again, 1 = Hard, 2 = Good, 3 = Easy.
2. Create a review table
In a separate note (e.g. your daily note), open the command palette and run:
FSRS: ⬒ Insert default fsrs-table
No SQL knowledge needed — the command inserts a ready-to-use block. It looks like this:
```fsrs-table
SELECT file as " ", difficulty as "D",
stability as "S", retrievability as "R",
date_format(due, '%Y-%m-%d') as "Next"
LIMIT 20
```
In reading view, the block becomes a table with all your cards, sorted by urgency — most forgotten first.
3. Review without leaving the table
This is the main workflow. Hover over a filename in the table — a popup appears with the note content and the review buttons inside it. Rate the card and move on to the next.
The entire review cycle stays in one window:
- Open the note with the table
- See which cards are due
- Hover over a card — read the content
- Click a rating — the card updates
- Move to the next row
Later you can customize the query. Here are some practical examples:
| Query | What it does | Why |
|---|---|---|
WHERE retrievability < 0.6 |
Cards about to be forgotten | Review before it's too late |
WHERE state = "New" |
Cards with no reviews yet | See what you added today |
WHERE file = "Topic" |
A specific note (by filename without path or extension) | Check one card's status |
ORDER BY reps DESC |
Most-reviewed cards | See what you've practiced most |
All available fields and conditions are in the user guide.
5. Review heatmap
To see your progress over the year — how many reviews per day — insert the block via FSRS: Insert heatmap fsrs-heatmap (Ctrl/Cmd+P) or create it manually:
```fsrs-heatmap
```
In reading view, a day-grid appears showing your activity.
Installation
The plugin is available in the Obsidian community catalog.
- Open Settings → Community plugins → Browse
- Search for FSRS
- Click Install
- Enable the plugin in Settings → Community plugins
What else
- User guide — step-by-step instructions for all features
- Technical article — architecture, Rust/WASM, performance
- Repository on GitHub — source code
Evgene Kopylov, 2026






Top comments (0)