FSRS
approvedby evgene-kopylov
This plugin has not been manually reviewed by Obsidian staff. Free Spaced Repetition Scheduler integration. Implements FSRS algorithm for spaced repetition flashcards directly in your notes.
FSRS for Obsidian
Free Spaced Repetition Scheduler โ a modern spaced repetition algorithm for Obsidian. The plugin turns your notes into FSRS-based flashcards for effective memorization.
๐ Table of Contents
[toc]
๐ Features
- ๐ FSRS Algorithm โ more efficient than SM-2
- ๐ฏ Retention Control โ 70โ97% target level
- โก High Performance โ Rust/WASM for fast computations
- ๐ Dynamic Interface โ auto-updating lists
- ๐ฑ Mobile Support โ iOS(?), Android(โ)
- ๐จ Flexible Configuration โ filtering, sorting, customization
- ๐ Statistics โ track your progress
๐ฆ Installation
Install from the community catalog (Settings โ Community plugins โ Browse โ FSRS).
Beta versions via BRAT
- Install BRAT
- Add the repository:
https://github.com/Evgene-Kopylov/fsrs_plugin
Installation Requirements
- Obsidian v1.12.7 or higher
- WebAssembly support (enabled by default)
Platform Support
| Platform | Status |
|---|---|
| Linux (x86_64) | โ |
| macOS | โ (not tested) |
| Windows (x86_64) | โ |
| Android | โ |
| iOS | โ (not tested) |
๐ Quick Start
- Create a card โ open a note โ run the command
Add FSRS fields to file header(Ctrl/Cmd+P). - Add a review button โ use the command
FSRS: Insert review button(Ctrl/Cmd+P), or insert a```fsrs-review-button```block manually, or enable auto-adding in settings. - Insert a table โ use the command
Insert default fsrs-table(Ctrl/Cmd+P), or create a```fsrs-table ...```block manually. - Start reviewing โ open the table, hover over a file name, and click a rating.
A detailed step-by-step guide with screenshots: Usage Guide
๐ Usage
The fsrs-table Block (SQL-like Syntax)
The fsrs-table block uses SQL-like syntax to customize how cards are displayed.
Basic syntax:
```fsrs-table
SELECT field1, field2 as "Header", field3
ORDER BY field4 DESC
LIMIT 30
```
Available columns:
| Field | Description | Notes |
|---|---|---|
file | card file name | clickable link |
reps | number of repetitions completed | |
stability | card stability (S) | FSRS parameter |
difficulty | card difficulty (D) | value from 0 to 10 |
retrievability | retrievability (R) | probability of correct recall |
due | next review date and time | |
state | card state | New, Learning, Review, Relearning |
elapsed | days since last review | |
scheduled | days until next review |
Block parameters:
SELECTโ choose fields to display (required)ORDER BYโ sort by a specified field (ASCascending,DESCdescending)LIMITโ limit the number of rows (0uses the value from plugin settings)
Limitations:
- No subqueries, JOIN, aggregations (
COUNT,SUM,AVG),GROUP BY,UNION WHEREsupports only simple conditions:=,!=,<,>,<=,>=,~(regex),!~,AND,OR- The only function available is
date_format(field, 'format') - Unknown field in
SELECT,WHERE,ORDER BYโ error with field name indicated - Column order in
SELECTis preserved in the displayed table
More: How the SQL parser works
Examples:
- Urgent cards (by due date):
```fsrs-table
SELECT file as " ", r as "R",
s as "S", d as "D",
due as "Next review"
LIMIT 20
```
- All cards sorted by date:
```fsrs-table
SELECT *
ORDER BY due ASC
LIMIT 100
```
FSRS Parameters and Configuration
The plugin uses rs-fsrs โ the official Rust FSRS implementation by the algorithm authors (L-M-Sherlock). Rationale:
- rs-fsrs โ maintained by the FSRS team, synced with the Python reference implementation, actively updated.
- fsrs-rs โ third-party implementation, long outdated, incompatible with current FSRS versions.
User-configurable (Settings โ FSRS โ Algorithm Parameters):
| Parameter | Default | Description |
|---|---|---|
request_retention | 0.9 (90%) | Target retention rate |
maximum_interval | 36500 days | Maximum interval between reviews |
enable_fuzz | true | Randomize intervals to counter card grouping |
Not yet configurable:
wweights (17 parameters) โ the core of FSRS, determining the forgetting curve. The plugin uses defaults optimized by FSRS authors on the Anki corpus (millions of reviews).- Parameter optimization on user statistics โ not supported. Users cannot retrain weights on their responses. Planned for future versions.
Review Button in Notes fsrs-review-button
```fsrs-review-button
```
FSRS Card Format
FSRS cards are stored in the note's frontmatter under the reviews field:
---
reviews:
- date: "2026-01-15T10:30:00Z"
rating: 2
- date: "2026-01-20T14:15:00Z"
rating: 3
---
Fields of each review session:
dateโ date/time in ISO 8601ratingโ0(Again),1(Hard),2(Good), or3(Easy)
Notes:
reviewscan be[]for new cards- Each review adds a session to the array
- FSRS calculates the next review date based on history
- The plugin adds these fields automatically
๐ฎ Plugin Commands
Via Command Palette (Ctrl/Cmd+P)
- FSRS: Add FSRS fields to file header
- FSRS: Find cards to review
- FSRS: Review current card
- FSRS: Remove last card review
- FSRS: Show review history
- FSRS: Insert review button
- FSRS: Insert default fsrs-table
- FSRS: Show fsrs-table syntax help
Via the Status Bar
- Button
๐FSRS:at the bottom of the Obsidian window
โ๏ธ Settings
FSRS Algorithm Parameters
| Setting | Description | Default |
|---|---|---|
| Request Retention | Target retention level | 0.9 (90%) |
| Maximum Interval | Max interval (days) | 36500 (~100 years) |
| Enable Interval Fuzz | Randomize intervals (ยฑ5%) | Enabled |
Default Settings for New Cards
| Setting | Description | Default |
|---|---|---|
| Initial Stability | Initial stability | 0.0 |
| Initial Difficulty | Initial difficulty for new cards | 0.0 |
Display Settings
| Setting | Description | Default |
|---|---|---|
| Auto Add Review Button | Automatically add review button | Disabled |
Filter Settings
| Setting | Description | Example |
|---|---|---|
| Ignore Patterns | Ignore patterns | .obsidian/, templates/ |
๐ง The FSRS Algorithm
FSRS is a modern spaced repetition algorithm by Jarrett Ye. Implements FSRS-5 (rs-fsrs v1.2.1). Compared to SM-2:
- Learns memory patterns via machine learning
- Adapts to your memory speed
- Requires 20โ30% fewer reviews for the same retention level
- Handles breaks (weeks/months) much better
Key Concepts
- Retrievability (R) โ probability of successful recall
- Stability (S) โ time it takes for R to decay from 100% to 90%
- Difficulty (D) โ information difficulty (affects how stability grows)
The algorithm uses 21 parameters optimized on millions of reviews.
Read more: ABC of FSRS
๐ ๏ธ Development
Development happens on GitLab: gitlab.com/Evgene-Kopylov/FSRS-plugin. The GitHub repository is a mirror.
Tech Stack
- Frontend: TypeScript, Obsidian API
- Algorithm: Rust (compiled to WebAssembly)
- Build: esbuild, wasm-pack
- Testing: Rust (cargo test) + TypeScript (vitest)
Rust and TypeScript Responsibility Split
Principle: Rust is the computation core, TypeScript is a thin wrapper for the Obsidian API.
Release Pipeline
The project uses GitLab CI/CD for automated build, test, and release:
Building from Source
Build Requirements
- Node.js 18+
- npm
- Rust (with
wasm32-unknown-unknowntarget) - wasm-pack
- binaryen (wasm-opt, installed via
npm install)
git clone https://gitlab.com/Evgene-Kopylov/FSRS-plugin.git
cd FSRS-plugin
npm install
npm run build
# Install plugin in vault
ln -s "$PWD" /path/to/vault/.obsidian/plugins/fsrs
# Development (optional)
npm run dev
WASM Integration
The plugin uses Rust/WASM for FSRS computations:
- WASM binary is embedded into the plugin via base64
- No network requests โ everything runs locally
- High performance โ native-level computation
Read more: WASM Integration
๐ License
This plugin is licensed under LGPLv3.
LGPL permits:
- Use in proprietary software
- Requires modified library source code to be open
Main Rights
- โ Use (free, including commercial use)
- โ Study (access to source code)
- โ Distribute
- โ Improve
Requirements
- Library modifications must remain under LGPLv3
- Dynamic linking is allowed without disclosing application code
- Maintain copyright notices
- Provide source code when distributing modifications
For Obsidian Users
- Free to use for personal/commercial purposes
- Derivative plugins must be under LGPLv3
- Modifications to Rust WASM components must be under LGPLv3
Full text: LICENSE
๐ Acknowledgements
- Jarrett Ye (ๅถๅณปๅณฃ) โ author of the FSRS algorithm
- Obsidian Community โ inspiration and support
- Rust Community โ WASM tooling
- DeepSeek โ a powerful and convenient development tool (code, refactoring, localization)
- All contributors โ improvements and bug reports
๐ Additional Resources
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.