by InVerse
Forked from Doomscroll
Resurface your own notes on a spaced-repetition schedule. Nothing is ever written into your notes.
IntelliScroll
Scroll your own notes, resurfaced on a forgetting curve.
A fork of Doomscroll that replaces the pure-random shuffle with a spaced-repetition scheduler.
Nothing is ever written into your notes. No frontmatter properties, no inline markers, no note IDs. Every scheduler already in the Obsidian ecosystem either stamps state into your notes or requires you to author flashcards; IntelliScroll keeps all state in its own sidecar files and treats the notes you already wrote as the review material.
Installs as a separate plugin (intelliscroll), so it can sit alongside
Doomscroll rather than replacing it.
Why a scheduler instead of a shuffle
In a single-author vault, "recently modified" is the wrong signal — the notes you just wrote are the ones you already know. What matters is time since you last saw it. That is a forgetting curve, not a recency feed.
So the feed keeps its scroll format and gains a scheduling engine behind it.
Four are available, and the default is off, which reproduces the original
shuffled feed exactly:
| Algorithm | Notes |
|---|---|
Off | The original shuffle. Default, so upgrading changes nothing. |
FSRS-6 | Recommended. The only option that handles irregular review timing well — which a scroll feed inevitably produces. |
SM-2 | Classic SuperMemo 2. Transparent, no fitted parameters, included as a baseline. |
Leitner | Fixed interval ladder, two grades. The simplest option. |
What it deliberately does not do
- It does not guess how well you remembered something. Automatic grading can only ever conclude "engaged" or "not engaged"; it never invents a negative rating. Behavioural proxies match explicit self-ratings only about 65% of the time, so a card you scroll past is recorded as unseen, not as failed — its schedule is untouched, only its priority rises. Feeding skips in as failures would fabricate lapses and spiral.
- It is not a memory trainer. Reviewing a whole note is re-reading, not active recall: expect roughly 40–50% one-week retention versus 60–70% for flashcards. This is a resurfacing layer for notes you do not want to formalise into cards.
State and privacy
All scheduling state lives in two files beside the plugin
(srs-log.ndjson and srs-snapshot.json). Nothing is sent anywhere, and no
note file is modified — that is the property the test suite guards hardest.
Features
- Four scheduling algorithms — Off, FSRS-6, SM-2, Leitner — chosen in an algorithm preset, overridable from the feed header for a single session
- Named presets for filters, algorithms, and display, plus a total preset that names one preset from each group
- Per-card rating when you want to correct the schedule by hand, with the four ratings coloured by what they mean: forgetting red, difficulty orange, success green, triviality blue
- A per-note ignore list for notes you never want to see again, written straight from a card
- A floating control in any note opened from the feed — the note stays marked while you read it, so you can rate it when you actually know, rather than at the moment you clicked the card
- Interface in English or 简体中文, following Obsidian by default
- Preset export and import as JSON, to the clipboard or a vault file
- Shuffled card feed, not another list sorted by modification date
- Manual reshuffle when the current batch is not doing it for you
- Optional infinite scrolling that loads more notes as you reach the end
- At most 20% of each batch is reserved for notes seen in the last seven days, unless there are not enough unseen notes
- 30-minute cooldown before a note can appear again
- Back button for the batch you should not have reshuffled
- Filters for folders, tags, filename patterns, search queries, and file types
- Cover images from frontmatter, Markdown, or HTML
- Standalone vault attachments, including images that are not linked from a note
- Markdown previews with an optional Simplified view
- Lazy image loading
- Works on desktop and mobile
- Scroll position survives switching panes
Installation
This installs as IntelliScroll (intelliscroll), so it can sit alongside
Doomscroll rather than replacing it.
-
Clone this repository into your vault's
.obsidian/plugins/directory:git clone https://github.com/lmce72/intelliscroll .obsidian/plugins/intelliscroll -
Navigate to the plugin directory and install dependencies:
cd .obsidian/plugins/intelliscroll npm install -
Build the plugin:
npm run build -
Enable the plugin in Obsidian settings under Community plugins.
Settings
Settings are organised as named presets across four groups. A group can hold any number of presets, and each group has one active preset. A filter preset decides which notes are eligible for the feed, an algorithm preset decides how they are scheduled, a display preset decides how they look, and a total preset names one preset from each of the other three.
Filter presets
Which notes are eligible for the feed.
- Folders, tags, and filename patterns (globs): each dimension is independently either a whitelist ("only these") or a blacklist ("exclude these"). The dimensions routinely want opposite treatment, so folders can be "only these" while tags are "exclude these"
- Search query: Filter notes with Obsidian-style search syntax, such as
tag:#workor[status:Draft] - File types:
image,document(PDF, EPUB, docx…),video,audio,other, andnotefor Markdown notes. Documents and images are deliberately separate categories - Include media-only notes: Show Markdown notes containing only images or other attachments (default: on)
Hiding standalone files keeps notes in the feed. The file-type rule is a blacklist of the standalone kinds, not an empty whitelist, so turning it off removes attachments without removing notes. This replaces the old "show non-Markdown files" toggle.
File-type filtering is path-based, so a Markdown note that embeds a PDF
classifies as note, not document. It therefore targets standalone files —
which is where attachments actually appear as feed items.
Algorithm presets
The scheduling engine.
- Algorithm: Off, FSRS-6, SM-2 or Leitner (default: Off, which reproduces the original shuffled feed exactly)
- Grading: Automatic only, automatic with manual override, or manual only
- Automatic grading sensitivity: How much evidence counts as engagement
- Desired retention (FSRS, 0.70–0.97): Target chance of still remembering a note when it returns. Raising it shortens intervals and increases the number of reviews steeply. 0.85–0.90 suits most people
- Maximum interval (FSRS): Longest gap in days before a note returns
- Fuzz due dates (FSRS): Spread due dates slightly so notes do not all return on the same day
Display presets
How the feed looks and where a note opens.
- Simplified view: Show concise previews with readable tables, links, and code; turn off for full Markdown formatting (default: on)
- Reduce animation: Turn off card and transition animations
- Preview size: Show a small, medium, or large text preview (default: medium)
- Where a note opens: The pane a card opens into
- Frontmatter properties before preview / after preview: Property names to render before or after the note body (one per line)
- Frontmatter image properties: Property names to check for images (default:
cover,image,banner)
Total presets
A total preset is a composite: it names one preset from each of the filter, algorithm, and display groups.
How presets behave
- Inheritance is copy-on-inherit. Copying a preset produces a fully independent one, and later edits to either copy do not affect the other. Copying a total preset also copies the three sub-presets it references, so the copy stays independent there too.
- Migration. Existing flat settings are migrated into a single preset named
Defaultin each group, and aDefaulttotal is selected. The old flat fields are then removed, so downgrading to an older build loses your configuration. - Storage. Presets live in
data.json, which is gitignored, so they do not travel with the repository or sync via git. Export and import are how you move a configuration between machines or back it up: either copy the JSON to the clipboard or write it to a file in the vault. Importing is additive — existing presets are kept, colliding ids are reassigned, and colliding names are numbered. - Managing presets. Each group has a section in settings for creating, renaming, copying and deleting presets. A group always keeps at least one, so the last in a group cannot be deleted.
Usage
- Click the gallery icon in the ribbon or use the "Open feed" command
- Click any card to open the note in a new pane
- Click the refresh icon when you want a new batch
- Click the back arrow to return to the previous batch
- Click the filter button in the feed header to switch filter presets, or adjust the current filter. A temporary change lasts for the session only and is discarded when the feed is reopened; the save button turns it into a named preset
- Click the sliders icon to change the algorithm, grading or FSRS parameters on the spot — these last for the session only and are discarded when the feed is reopened, so it is safe to experiment
- With resurfacing on and grading not set to automatic-only, each card carries two buttons: a gauge for rating it by hand, and an ignore button for notes you never want to see again
- A note opened from the feed keeps a floating control in its pane for as long as the session lasts, so you can rate it after reading it
- Select your presets in settings to tune which notes appear and how
Development
npm run dev # Watch mode for development
npm run build # Production build
License
MIT.
IntelliScroll is a fork of Doomscroll by Oleg Yaroshevych. The original copyright notice is retained in LICENSE; the feed, indexing, rendering and settings infrastructure are his work, and this fork adds the scheduling engine on top.
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.