Human34 downloadsScroll-to-reveal flashcard study for diagrams/images. Right-click any folder to open it as a Slide & Reveal view: drop covers over each label, then scroll in place to uncover them one pair at a time.
An Obsidian plugin for flashcard-style study of labeled images — diagrams, anatomy plates, screenshots with callouts, slide exports, maps, sheet music, anything where the question is "what's that part called?" and the answer is a label on a picture.
It's the thing PowerPoint is bad at: instead of duplicating a slide once for every label you want to reveal in sequence, you import the image once, drop covers on the labels, and scroll inside the image to progressively uncover them, one group at a time.
Version 0.5 added a second mode: a cross-diagram quiz that pulls cropped fragments from across an entire folder (or several folders), shuffles them, and asks you to identify each one out of context.
There is no Community Plugins store listing yet. Two install paths:
manifest.jsonmain.jsstyles.cssSlide and Reveal/ inside your vault's
plugin directory:<your vault>/.obsidian/plugins/Slide and Reveal/
manifest.json
main.js
styles.css
Either way, after enabling: right-click any folder in the file explorer and pick Open Slide and Reveal here, or use the command palette: Slide and Reveal: Open Last Folder / Pick Folder.
A few words you'll see throughout the plugin:
Shapes with matching pair numbers reveal and hide together. Useful when one label has multiple boxed regions, or when several labels naturally reveal at the same step.
pair ≥ that value up by 1. Pair-mates of the shifted shapes
stay together. The current shape keeps its number. Use it to "make
room" for a new group at a specific position without manually
renumbering everything above.wheelStepPast100 setting if you prefer wheel
to keep stepping.)Each cover can be "flashed" — revealed for N seconds, then auto-hidden again. Useful for quick self-tests where you want a peek and then return to the recall state. The timer button pulses while running; hover or click again to cancel.
Out-of-context active recall. The quiz crops just the relevant region out of the diagram and asks "what is this?", drawing from a configurable pool of folders.
A cover is eligible for the quiz only when it has a target region — a second polygon over the structure the label points to.
The cover and its target region get a faint dashed connector line between them so the relationship is visible at a glance. Click the target region to select it (it gets its own mini toolbar — delete, vertex-edit, drag-to-move). Covers without a target region are ignored by quiz mode but still work normally in study mode.
Each step has a view toggle below the stage:
Pick a preference and it sticks across steps.
If a label has alternate names, they're shown on the answer screen as "Also called: …". Aliases are also reserved as a future hook for typed-answer grading (not yet implemented).
All shortcuts work while the Slide and Reveal view is focused (clicking on it gives it focus). Shortcuts are skipped when you're typing into a text/number input.
| Key | Action |
|---|---|
| Mod+Z / Mod+Shift+Z | Undo / Redo |
| Mod+Y | Redo |
| Delete / Backspace | Delete the selected shape or target region |
| ← / → | Zoom out / in (configurable, configurable step) |
| ↑ / ↓ | Hide / Reveal one step on the focused image (always active in study mode; invertible) |
| Esc | Disabled so it can't switch tabs. Drafting has a visible Cancel button. |
Right-click on a polygon vertex deletes it (minimum 3 points). Double-click an image canvas while polygon-drafting finalizes the polygon.
Open via Settings → Community plugins → Slide and Reveal → ⚙️.
| Setting | Default | Notes |
|---|---|---|
| Default reveal time (seconds) | 3 | Used by the flash button on a cover without its own per-shape override. |
| Default rectangle color | #3b82f6 (blue) |
Color for new covers. |
| Image scale | 80 % | Persisted across reloads. |
| Sidebar width | 200 px | Drag the divider to change. |
| Pair color propagation | all |
off / first-to-rest / all. Controls whether editing one shape's color flows to its pair-mates. |
| Reveal slider position | left | Left or right side of each image. |
| Left/right arrows zoom | on | Toggle, with a configurable step (default 5%). |
| Up/down arrows reveal | on | Toggle, with an invert flag. In study mode this is always on regardless of the toggle (which then only governs edit mode). |
| Mouse-wheel sensitivity | 60 px / step | Bump up if a gaming mouse on Windows fires huge wheel deltas per click. |
| Mode | study |
study = wheel inside the image steps the reveal rail. edit = wheel is hands-off (you scroll, you draw, you don't fat-finger a cover open). |
| Wheel-step past 100% | off | Past 100% zoom, wheel normally passes through to vertical scroll (so you can pan the wider image). Turn this on to keep wheel stepping the rail even when zoomed. |
| Folders using Slide and Reveal | — | List of tracked folders with one-click open, remove from list, or delete annotation file. |
| Discovered folders | — | Vault scan turns up folders that already have an annotation file (e.g. synced in from another device) but aren't tracked here yet. One-click to add. |
The plugin writes one hidden JSON file per folder: <folder>/.slide-and-reveal.json.
Contents:
rects — shapes per image, keyed by relative path.order — explicit display order (so renaming doesn't reshuffle).revealSteps — last reveal slider value per image.scrollTop — last content-pane scroll position.Plugin-wide settings live in Obsidian's standard plugin data dir
(<vault>/.obsidian/plugins/Slide and Reveal/data.json).
Portability: because annotations live next to the images and use relative paths, you can move/share/sync the whole folder (Dropbox, Drive, syncthing, a zip on a USB stick) and the annotations come along. Drop the folder into a different Obsidian vault and it just works — the plugin discovers it on next scan.
Backward compatibility: older .image-annotator.json files (this
plugin's previous name) are read on load; first save migrates them
silently to the new name.
Requires Node 20+ and pnpm 11+.
pnpm install
pnpm run build # typecheck + esbuild bundle + copy artifacts to PLUGIN_DIR
pnpm run dev # esbuild watch mode (rebuild + copy on every save)
pnpm run typecheck # tsc --noEmit
The build copies main.js + manifest.json + styles.css to
$PLUGIN_DIR (defaults to the hardcoded Plugin Test vault path in
esbuild.config.mjs). Override with PLUGIN_DIR=... to deploy
elsewhere.
The obsidian package and node_modules are externalized — the
shipped main.js is plain plugin code only.
Slide and Reveal/ ← source repo
├── src/
│ ├── main.ts plugin lifecycle, ribbon, commands, file-menu hook
│ ├── view.ts the bulk of the UI (render, drawing, undo, rail, toolbars…)
│ ├── settings.ts settings tab + folder discovery scan
│ ├── modals.ts folder picker, rename
│ ├── quiz.ts quiz pool builder (view-agnostic)
│ ├── quiz-modals.ts quiz UI (scope picker, multi-folder picker, quiz runner)
│ ├── types.ts FolderData, Rect, TargetRegion, Settings, constants
│ └── util.ts small helpers (uid, clamp01, clampPoints, path joins)
├── styles.css all the CSS
├── manifest.json
├── package.json
├── pnpm-workspace.yaml pnpm config (only-built-dependencies allowlist)
├── tsconfig.json
├── esbuild.config.mjs bundles src/main.ts → main.js, copies to PLUGIN_DIR
├── CLAUDE.md per-project AI notes
├── LICENSE
└── README.md
A few load-bearing design choices:
render() empties the root and rebuilds. Scroll
position is captured before empty and restored on the next frame; body-
attached overlays (toolbars, tooltips) are explicitly cleaned up at
the top of each render so they don't orphan.data op (JSON snapshot of FolderData) and
a rename op (actual vault file rename, undone via
app.fileManager.renameFile). Undoing a rename also fires the vault
rename hook, which remaps the annotation keys for free.position: fixed,
because earlier in-canvas placement got clipped by the
overflow: hidden on each shape's block.If you want a deeper tour, CLAUDE.md in the repo has the running
architecture notes used during development.
If you build something on top of it or fix a bug, send a PR or just fork it.
MIT. Do whatever you want with it.