Star20 downloadsPaint colored covers over any part of a note, then click to reveal. Each note remembers its own covers.
Paint coloured covers over any part of a note, then click them to reveal what is underneath. Each note keeps its own covers, and they come back every time you open it.
This is the Obsidian port of the desktop Overlay Colors tool. The desktop version paints over the whole screen; this one paints over the note itself, so the covers scroll with the text, survive a restart, and follow the note when you rename or move it.
Markdown notes only. This plugin does not work on PDFs, Canvas files, images, or anything else that isn't a markdown note. See Markdown notes only below for why, and for pointers to plugins that do handle PDFs.
Copy main.js, manifest.json, and styles.css into:
<your vault>/.obsidian/plugins/note-occlusion/
Then enable Note Occlusion in Settings, Community plugins. Restart Obsidian if it does not appear straight away.
| Mode | What the mouse does |
|---|---|
| Draw | Drag on the note to paint a cover. Drag a cover to move it, drag a grip to resize, right-click for colour, bring-to-front, or delete. The note is not editable while this is on. |
| Text | Select text to hide it. These covers are anchored to the selected words and are recalculated when you switch between Reading and editing modes. |
| Delete | Right-click a cover to remove it immediately, no menu. This is the same delete action available from Draw mode's right-click menu, just one click instead of two. The note is not editable while this is on. |
| Reveal | Click a cover to show what is under it. Click again to hide it. Everything else in the note works normally. |
| Pass | Covers stay visible but ignore the mouse entirely, so you can select and edit text through them. |
Switch modes from the toolbar, from the status bar item, or with the Cycle mode command. Escape leaves Draw, Text, or Delete mode back to Reveal. There are no default hotkeys, because single letters would be typed into your notes. Assign your own under Settings, Hotkeys, searching for "Occlusion".
A delete, wherever it happens, goes through the same undo history as every other change, so Undo brings back a cover removed by accident.
Hide every cover resets a note for another pass, which is the study loop this is built for. It has a command, so you can put it on a hotkey.
| Before | After |
|---|---|
![]() |
![]() |
In the plugin's own data.json, under
.obsidian/plugins/note-occlusion/data.json, keyed by note path. Nothing is
written into your notes, so the markdown stays clean and no frontmatter is
added.
Consequences worth knowing:
.obsidian, so covers sync only if you sync that folder.A drawn cover's horizontal position and width are stored as a fraction of the note's content width, and its vertical position in pixels from the top of the content.
That means covers hold their place when you resize the pane or the window, change the reading width, or scroll.
It does not mean drawn covers survive switching between Reading mode and Live Preview / Source mode. Obsidian renders the same note through two different engines for those - CodeMirror for editing, the markdown renderer for reading - and they don't produce the same line heights, heading sizes, or block spacing for identical text. A cover's vertical position is a fixed pixel distance from the top of whichever one is currently on screen, so a cover positioned in one mode is not guaranteed to land over the same content in the other.
Text covers avoid this problem: they store the selected text and nearby context, then find those words again in the current renderer. Use Text mode when a cover must follow content between Reading and editing modes. If the selected words themselves are edited or deleted, that text cover cannot be located until the original words exist again.
Drawn covers are anchored to a position, not to the words under them. If you add or remove text above a cover, the text moves and the cover does not. For a note you are actively writing, cover it after the text settles. Dragging a cover back into place takes a second, and Undo is available if you overshoot.
Covers only appear on markdown notes. Opening a PDF, a Canvas file, an image, or any other non-markdown view and expecting covers to work there won't do anything, silently.
This isn't a missing checkbox, it's a limit of the plugin API. Obsidian's PDF viewer (and Canvas, and image views) is a different kind of view entirely, rendered by PDF.js onto canvases that Obsidian creates and destroys as you scroll, with no equivalent of a note's stable content element to anchor a cover's position against. There's no public API into that viewer. The plugins that do overlay PDFs, like PDF++, say as much themselves: they rely on private, undocumented internals that can break on any Obsidian update. That's a different engineering commitment than this plugin makes, so it's out of scope here rather than done unreliably.
If what you actually want is to occlude or annotate PDFs, look at PDF++, Study PDF, or Local PDF Annotator instead. They're built against the PDF viewer specifically.
Occlusion-style studying isn't a new idea, and this isn't the only Obsidian plugin doing it. Worth knowing what else is out there before you settle on one:
What this plugin does that those don't: draw a cover directly over live note text with no pre-formatting and no export step, anchored per note the same way the desktop Overlay Colors app worked. Whether that's reason enough to run this instead of an established plugin is a judgment call, not something a README can settle for you.
npm install
npm run dev # watch build
npm run build # typecheck, then a production main.js
npm run test # store and persistence checks
src/types.ts holds the geometry helpers ported from the Python models.py.
They were checked case by case against the original: 40 resize cases, 8 handle
anchors, and the contrast-colour rule all produce identical numbers.