by taka727
Schedule note reviews on the Ebbinghaus forgetting curve and see which notes are due today, with an optional cram mode before exams.
Study Curve
Study Curve schedules reviews of whole notes along the Ebbinghaus forgetting curve. Each note you enroll moves up a fixed ladder of intervals (1, 3, 7, 14, 30, 60 and 90 days by default) when you remember it, and drops back to the start when you forget. If you are studying for an exam, give the deck an exam date: reviews that would fall after the exam are pulled in, and every note in the deck comes back in the final days before it.
Other plugins such as Spaced Repetition (flashcards and entire notes) and Note Review Reminder (spaced reviews and reminders) also schedule note reviews. Study Curve treats one note as one topic you should be able to recall, keeps the review state only in each note's frontmatter, and gives every note a "can you recall it?" section and grading criteria through a built-in template. The user interface is currently in Japanese only; see the Japanese UI reference below. English UI is planned.
Features
- Review whole notes. Grade each review with one of four buttons (☆ ◯ △ ✗) and the next review date is set for you
- A review board with each deck's status, today's reviews, upcoming reviews and notes not enrolled yet
- Optional exam dates: reviews are pulled in before the exam, and the whole deck comes back in the final days
- Code blocks for your daily note (
study-today,study-forecast,study-progress), so you can grade without opening the board - "Create review note" makes a note from the built-in template (or your own) and enrolls it right away
- Enroll the existing notes in a deck's folder in bulk, after confirming the count
- The same workflow on Mac, Windows, iPad and phones. The layout follows the available width
How it works
Intervals
Each stage has a fixed interval, and your grade moves the note between stages.
| Stage | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| Next review in | 1 day | 3 days | 7 days | 14 days | 30 days | 60 days | 90 days |
- ◯ Remembered → stage +1 (stays at the last stage)
- △ Unsure → same stage (the same interval again)
- ✗ Forgot → back to stage 0 (comes back tomorrow)
- ☆ New → same stage, but the next review is always 3 days later
☆ is not "forgot" but "I haven't learned this yet". The forgetting curve measures how well you retain something you once learned; grading unlearned material with ◯△✗ would mix "forgot" and "never learned" on the same scale, and the note would never move up. Tomorrow would only test your short-term memory, and a week is too long for something you just met, so it is 3 days.
You can change the intervals in the settings. There is no ease factor (as in SM-2): the stage alone explains why a note is due today.
The clock button (postpone to tomorrow) moves the review one day later (the day after the later of the due date and today) without changing the stage. It is hidden for decks in their final review period.
Exam dates (optional)
If a deck has an exam date, two things happen. Without one, neither does.
- Pull-in — a review that would fall after the exam date is moved to the exam date
- Final review — when the exam is less than 7 days away (configurable), every note in the deck shows up in today's reviews regardless of its due date
Getting started
- Install Study Curve from Community plugins and enable it
- Open the review board (the brain icon in the ribbon, or the command "復習ボードを開く") and create a deck by following the guidance. If some notes already have
study-deck, the board finds those decks and lets you add them to the settings - Prepare notes
- For a new note, use the command "復習ノートを作成" (Create review note) or "+ ノート" on a deck card
- For existing notes, enroll them from "未登録のノート" (Notes not enrolled yet) on the board, or open a note and run "このノートを復習対象に登録" (Enroll this note)
- From the next day, grade your notes in "今日の復習" (Today's reviews) on the board, or in a
study-todayblock in your daily note
Writing review notes
"Create review note" uses this built-in template ({{title}} is the title you enter). The headings are in Japanese; "思い出せるか" means "can you recall it?" and "答え合わせ" means "check your answer".
# {{title}}
## ✅ 思い出せるか(読む前に)
> 例を見て答えを思い浮かべてから、下の答え合わせを読む。
**例1**
**例2**
**例3**
| 判定 | 基準 | 次回 |
|---|---|---|
| **☆ 初見** | この内容を学ぶのが初めて | 3日後 |
| **◯** | 答え合わせの太字を自分の言葉で言えた | ステージ +1 |
| **△** | 太字は言えたが「なぜ」が出てこない | 据え置き |
| **✗** | 一度学んだはずなのに出てこない | 翌日 |
---
## 🎯 答え合わせ — これを覚えていればOK
- **OK**:
- **なぜ**:
- The note is created in the deck's folder (or in Obsidian's default location for new notes). If the name is taken,
1,2… is appended - Set "復習ノートのテンプレート" (Review note template) to use your own file instead.
{{title}},{{deck}}and{{date}}are replaced. The template's frontmatter is kept, and thestudy-*keys are added to it - The "思い出せるか" heading matches the default heading of the "clear checks after grading" setting
The guide to writing review notes covers writing questions and answers, grading with ☆ ◯ △ ✗, making notes from work notes or with generative AI, and an English version of the template. Finished samples are in docs/examples/en/.
Japanese UI reference
| On screen | In English | Where |
|---|---|---|
| 復習ボード | Review board | Board tab |
| デッキ | Decks | Board section |
| 今日の復習 | Today's reviews | Board section, study-today |
| これからの復習量 | Upcoming reviews | Board section |
| 未登録のノート | Notes not enrolled yet | Board section |
| ☆ 初見 | New (learning it for the first time) | Grade button |
| ◯ 覚えてた | Remembered | Grade button |
| △ あいまい | Unsure | Grade button |
| ✗ 忘れた | Forgot | Grade button |
| 明日に送る (clock icon) | Postpone to tomorrow | Row button |
| 復習対象から解除 (trash icon) | Unenroll | Row button |
| 遅延 / 今日 / 直前 | Overdue / Due today / Final review | Row badge |
| 初回 / 未スケジュール | First review / Not scheduled | Row |
| 試験まで あと N日 / 試験日 未設定 | N days until the exam / No exam date | Deck card |
| 登録 / 遅延 / 休止 / 定着度 | Enrolled / Overdue / Suspended / Retention | Deck card |
| + ノート | + Note (create a review note in this deck) | Deck card |
| 設定に無いデッキ名です / 設定に追加 | Deck name not in settings / Add to settings | Deck card |
| すべて登録 / 登録 | Enroll all / Enroll | Notes not enrolled yet |
| フォルダ名で絞り込み | Filter by folder name | Notes not enrolled yet |
| 処理中… | Working… | Notes not enrolled yet |
| 最初のデッキを作りましょう / デッキを作成 | Create your first deck / Create deck | Board guidance |
| 登録済みのノートが見つかりました / すべて設定に追加 | Enrolled notes found / Add all to settings | Board guidance |
| 名前 / フォルダ / 試験日 | Name / Folder / Exam date | Deck dialog |
| 復習ノートを作成 / 作成 | Create review note / Create | Review note dialog |
| キャンセル / 保存 / 削除 | Cancel / Save / Delete | Dialogs |
| ノートを残して削除 / N 件を復習対象から外して削除 | Delete and keep notes / Delete and unenroll N notes | Deck deletion |
Commands
No hotkeys are assigned by default. Assigning hotkeys to ☆ ◯ △ ✗ lets you grade while reading a note.
| Command (Japanese) | In English | What it does |
|---|---|---|
| 復習ボードを開く | Open review board | Opens the board in a tab |
| 今日の復習を始める(最初のノートを開く) | Start today's reviews (open the first note) | Opens the first note in today's reviews |
| このノートを復習対象に登録 | Enroll this note | Picks the deck from the note's folder, or asks you to choose one (a new name is also added to the settings) |
| 復習ノートを作成 | Create review note | Asks for a deck and a title, creates the note, enrolls it and opens it |
| このノートを復習対象から外す | Unenroll this note | After confirmation, removes study-* from the frontmatter |
| 復習を記録: ◯ 覚えてた / △ あいまい / ✗ 忘れた / ☆ 初見 | Record review: Remembered / Unsure / Forgot / New | Grades the open note |
| このノートの復習を休止/再開 | Suspend / resume this note | Toggles study-suspended |
Code blocks
Put these in your daily note or weekly review.
```study-today
deck: AWS ANS # optional: only this deck
limit: 10 # optional: defaults to the daily limit setting
```
```study-forecast
days: 30 # optional: defaults to the forecast days setting
deck: AWS ANS # optional
```
```study-progress
deck: AWS ANS # optional
```
study-today: the same rows as the board, so you can grade inside your daily notestudy-forecast: a bar chart of how many reviews are due in the next N days. Overdue reviews count toward today and are shown in red at the bottom of today's barstudy-progress: a table of each deck's exam date, enrolled notes, due today, overdue and retention
Settings
| Setting (Japanese) | In English | Default | Notes |
|---|---|---|---|
| ステージごとの間隔(日) | Intervals per stage (days) | 1, 3, 7, 14, 30, 60, 90 | Stage 0, 1, 2… from the left. Empty uses the default |
| 1日に出す上限 | Daily limit | 20 | 0 means no limit |
| 直前総ざらいの日数 | Final review days | 7 | Show every note of a deck when its exam is closer than this |
| 予定グラフの日数 | Forecast days | 14 | Default for the board and study-forecast |
| 採点したら次のノートを開く | Open the next note after grading | On | After grading on the board, open the next note |
| 採点したら本文のチェックを外す | Clear checks after grading | Off | When on, completed checkboxes (- [x]) under the heading below are reset to - [ ]. Other sections, the frontmatter and code blocks are not touched |
| チェックを外す見出し | Heading for clearing checks | 思い出せるか | From a heading containing this text to the next heading of the same or higher level |
| 復習ノートのテンプレート | Review note template | (empty) | Empty uses the built-in template |
| デッキ | Decks | (none) | Name, folder and exam date. Use "デッキを追加" (Add deck) and the edit and delete buttons on each row |
- Invalid numbers are not saved; the reason is shown under the field
- A deck's folder is used to list notes not enrolled yet and to pick the deck when enrolling. With nested folders, the deepest match wins
- Renaming a deck also rewrites
study-deckin its notes (the count is shown before you save). Deck names written in code blocks (deck:) and in your scripts are not changed - Deleting a deck asks for confirmation and lets you either keep its notes or unenroll them
Frontmatter reference
The review state lives only in each note's frontmatter. There is no separate database, so a note shows when it is due next, and Dataview can read it.
---
study-deck: AWS DOP # which deck (exam or subject)
study-next: 2026-09-19 # next review date
study-stage: 2 # review stage
study-history: # the last 20 grades
- 2026-09-12 ok
- 2026-09-16 ok
study-suspended: true # (optional) pause reviews
---
| Key | Type | Meaning | Written when |
|---|---|---|---|
study-deck | text | Deck name. Notes with this key are enrolled | Enrolling, creating a note, renaming the deck |
study-next | date (YYYY-MM-DD) | Next review date | Enrolling, grading, postponing |
study-stage | integer (0–) | Stage, i.e. the position in the interval list | Enrolling (0), grading |
study-history | list of text | Grades (last 20). ok = ◯, hard = △, ng = ✗, new = ☆ | Grading |
study-suspended | boolean (optional) | Suspended; not shown in today's reviews | Suspending / resuming |
Unenrolling removes all five keys and leaves the other keys alone.
Mobile
Study Curve works the same on Mac, Windows, iPad and Android (isDesktopOnly: false; no Node or Electron APIs).
The layout follows the width that is actually available, not the device: a phone in portrait, an iPad in split view and the board in a narrow sidebar on a Mac look the same at the same width.
| Width | Layout |
|---|---|
| Under 520px | Rows stack vertically and grade buttons span the width, showing only the symbols (☆ ✗ △ ◯). Forecast dates every 2 days |
| Under 380px | Forecast dates every 3 days. The progress table scrolls horizontally |
| 520px and over | One line per row, buttons with text (such as "✗ 忘れた"). Deck cards in several columns |
On touch devices, the buttons are large enough to tap easily.
Across devices:
- The review state is in the notes, so it follows your notes through Obsidian Sync, obsidian-git or any other sync
- Don't grade the same note on two devices at the same time. It causes a sync conflict in the note itself
- "Today" is the device's local date. If Obsidian stays open past midnight, the board and blocks redraw with the new date
Privacy and disclosures
- No network requests. Everything runs locally
- Free. No payment, account, ads or telemetry
- It only reads and writes files inside your vault. Open source (MIT)
What it writes:
- The
study-*keys in the frontmatter of enrolled notes (see above) - Notes created with "Create review note" (in the deck's folder or Obsidian's default location for new notes)
- Only when "Clear checks after grading" is on (off by default): completed checkboxes in the chosen section
- Bulk enrolling, renaming a deck and unenrolling a deleted deck's notes all show the count before writing
- Settings are saved to
data.jsonin the plugin's folder
Scripting
const plugin = app.plugins.plugins['study-curve'];
const queue = plugin.getDueQueue('AWS ANS'); // the deck name is optional
getDueQueue(deckName?) returns today's reviews in the same order as the board (overdue → due today → final review). The due-date and final-review rules stay inside the plugin, so templates (Templater and so on) don't need to copy them.
Development
npm install
npm run build # type check + production build, no side effects (used by CI and the directory's build check)
npm run dev # watch build; copies to OBSIDIAN_DEV_PLUGIN_DIR (a test vault) if set
npm test # unit tests (Vitest)
npm run lint # ESLint, including manifest.json
npm run deploy # copies the production build of main to OBSIDIAN_PLUGIN_DIR
Copy .env.example to .env.local and set the paths (.env.local is not committed).
Releases
Pushing a tag (no v, the same as version in manifest.json) makes GitHub Actions create a draft release with main.js, manifest.json and styles.css attached. Check the attachments, then publish it.
npm version patch # updates manifest.json, package.json and versions.json, commits and tags
git push origin main
git push origin <version>
Always bump the version for a fix; replacing files in an existing release is not picked up.
License
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.