Repository navigation
Releases: myICOR/icor-for-life-scratchpad
Release list
0.2.0
ICOR for Life - Scratchpad 0.2.0
Relicensed under MIT. Releases before 0.2.0 remain under the ICOR for Life
Source-Available License (Code) v1.0.
Everything in this release is under the MIT licence (LICENSE). "ICOR",
"ICOR for Life", "myICOR" and "Paperless Movement" stay trademarks of
Paperless Movement, S.L. (TRADEMARK.md), and contributions are welcome as
pull requests with a DCO sign-off (CONTRIBUTING.md). Nothing about how the
plugin runs has changed.
Also since 0.1.0
- Release workflow: actions pinned to commit SHAs, the release published with
gh, and a release run can never mint its own tag. - README rewritten for the person installing the plugin, not the person rebuilding it.
Needs Obsidian 1.13.0 or newer. Copy main.js, manifest.json and
styles.css into <vault>/.obsidian/plugins/icor-for-life-scratchpad/.
0.1.0
ICOR for Life - Scratchpad 0.1.0
The first release: a floating note window you reach from any application
with a hotkey you pick yourself, a menu bar icon, and an obsidian://
door for Raycast, Alfred and Shortcuts. Desktop only.
This is a clone of Raycast Notes built on a real Obsidian popout window.
It was first built as "Quick Notes Menu", a capture box that appended a
line to the daily note; Tom realigned it to this shape on 2026-09-09,
before anything shipped, so the capture box and the daily-note append are
gone and there is nothing to migrate.
What it does
- Press your hotkey anywhere. The window comes forward with your last
note in it. Press it again and it goes away; so does Escape. Nothing is
registered until you record a chord. - It is a real Obsidian editor. Your other plugins work in it. The
tab strip and the view header are hidden inside that window only.
Readable line width is your own setting: a narrow window fills its
width, a fullscreen one centres the column the way the main window
does. The inline title stays: it is where a note is renamed. - Three ways to make a note, behind the toolbar's plus glyph. A
unique note filed by date and named from the clock,
00 Daily Scratchpad/2026/09/202609091812with the defaults, which is
what the core Unique note creator would call it; pressing it again
inside the same minute opens that note rather than numbering a second
one. Today's daily note, where Obsidian's own Daily notes plugin
keeps it, read from that plugin's own folder and format, opened
untouched when it is there and created empty when it is not, without
the daily-note template, which is the core plugin's job. And a
subject note, an Untitled with the caret in the inline title and
the word selected, so the subject is typed first. All three are
commands; only the unique note carries a chord. You rename by typing in
the title, which is Obsidian's own rename. - A toolbar at the top right: always on top, the actions palette,
browse notes, new note. The drag handle is the whole top band behind
it: under the default hidden frame style Obsidian puts the window's
drag region on the title bar and the tab strip, both of which this
window hides. - Fullscreen and maximise work. Always on top switches off while the
window is expanded, because macOS does not allow both, and comes back
when it is not. - A character count at the bottom centre.
- Twelve actions, each with a real command behind it, and, for eight
of them, a chord that is live only inside the window and that collides
with no Obsidian default. - Browse notes across the whole scratchpad folder, subfolders
included: pinned first, then the rest by Modified or by Created, flipped
by the toggle under the search field or by Tab and remembered. Each row
shows the note's first line, the moment its own block is ordered by and
how long it is, with pin and delete on the row. Delete goes to your
configured trash with an Undo in the notice. With the sibling plugin
ICOR for Life - Content Tracker installed, that plugin supplies the
recent order instead, so the two agree; without it the scratchpad sorts
its own folder and says nothing. obsidian://icor-scratchpad?vault=<name>&text=<text>creates a note
with that text and shows the window; without text it just shows it.
Not in this release
The bottom-right round button from the Raycast reference is deliberately
not here: in Raycast it is Raycast AI's text tools, and this window is a
real Obsidian editor where every text action already has three homes.
Iris ruled it out and reserved no space for it. Copy Deeplink and Create
Quicklink are Raycast concepts with no Obsidian equivalent and are not in
the palette; the palette has no placeholder rows.
A status text beside the menu bar icon (the setStatus hook exists and
is wired to nothing).
Reviewed against
Flint's 2026-09-09 read of the 1.13.7 bundle, all thirteen points:
openPopoutLeaf clamps to 600 by 600 and shows in a microtask, so the
bounds are set synchronously on the next line; the popout's own
BrowserWindow comes from the popout's own require; hide() is
invisible to Obsidian, which is what makes the toggle work, and
activeWindow goes stale after it, so a modal waits for a real focus
event; hiding the title bar and the tab header removes both drag regions;
the popout comes back visible on relaunch with no marker, so it is
recognised structurally; the filename charset is the union of Obsidian's
and Windows'; the count is editor.getValue().length; the manifest
charset; and the ownership design in point 13. The first-line rename it
reviewed is gone, replaced by Obsidian's own inline title.
Vex's 2026-09-09 security review of that ownership design, which came
back BLOCKED and is now answered: H-1 (the watcher is on the directory,
debounced, compare-before-act), M-1 (every registry path validated,
O_NOFOLLOW on the one cross-vault read), M-2 (the record's four fields,
built one by one, ownerPath compared and displayed only), M-3 (a
missing or malformed record never claims ownership), M-4 (no other
vault's data.json is read), M-5 (the README and SECURITY disclosure),
M-6 (the hygiene ban became a two-file allowlist, watched red first), and
L-1 to L-5. Vex re-verifies against his own demonstrations.
Iris's 2026-09-09 chrome spec, all seven rulings.
Beta round 1, fixed
Tom's first live test on 2026-09-09 found seven defects. All seven are
fixed in the same round, and each fix carries a test that was watched
fail on the exact defect it names before it was believed.
- The find bar opened under the traffic lights with its close button
unreachable. The reserved top band never existed: the rule was written
asbody.icor-scr-window .view-content, which is (0,2,1), against
Obsidian's own.workspace-leaf-content[data-type='markdown'] .view-content { padding: 0 }at (0,3,0). The band selector now carries
the leaf class and wins, and the test computes both numbers rather than
trusting the reading. - None of the chords did anything. Obsidian's
Scopematches a key
byevent.key, and macOS rewritesevent.keyunder Option: Option-N
arrives as "Dead". The Scope is gone. One keydown listener on the
popout's document, capture phase, matchesevent.codeagainst the same
table the chips are drawn from, and touches nothing else. - "Open in main window" only focused Obsidian.
getLeaf('tab')
iscreateLeafInTabGroup(), which callsgetMostRecentLeaf()with no
root and therefore searches the root split and the popouts together, so
the scratchpad's own leaf won and the note opened inside the popout.
The tab now goes into the main window's own tab group, a note already
open there is revealed instead of opened twice, and the scratchpad
hides itself unless it is pinned above everything. See round 2 below
for the second half of this one. - The find bar could not be closed. Besides defect 1, Escape was
taken by the plugin. Escape now closes an open find bar first, yields
to a palette or a menu second, and hides the window only when nothing
else is listening. The order lives in one pure function and the test
pins it. - The find bar could not be navigated: Enter and the arrows did
nothing. Same root as defect 2, second half:pushScopereplaces the
window's single scope pointer andScope.handleKeyfalls through to
its parent, not down the stack, so a scope pushed on top of the
search's own swallowed every key the search needed. Nothing is pushed
any more, and the new listener ignores every key that is not in the
table and every key pressed inside the find bar. - New notes landed in the folder root as "Untitled". They are filed
into a dated subfolder and named from the clock now, and the inline
title is shown so a note can be renamed by typing in it. - The window could not be dragged, and the green button was dead.
The drag region was the pill alone, a small target in the corner with
nothing to say so; it is the whole top band now. Fullscreen and
maximise were disabled to protect always on top; they are allowed
again and the flag is restored from the setting when the window comes
back, with the saved rectangle never taken from an expanded window.
Beta round 2, fixed
Tom's second live test passed defects 1 and 3 to 7 and found two more.
- In fullscreen the note hugged the left edge of the screen while the
main window centres the same note. The plugin forced readable line
width off inside the window, which is right at 480 pixels and wrong at
2000. The override is deleted rather than replaced by a width class the
plugin toggles: Obsidian's whole readable-line-width behaviour is a
max-widthon the editor's sizer, and a max-width larger than the
space available never binds, so a narrow window fills its width and a
wide one centres, inline title included, with nothing written by this
plugin at all. A member who turned readable line width off keeps a
full-width window at every size. - "Open in main window" made a split column, with no tab header and
no close button, becausecreateLeafInParent(rootSplit, -1)inserts
into the split itself rather than into a tab group. The route that
works isgetMostRecentLeaf(rootSplit)with the root named, then
setActiveLeafon that leaf, thengetLeaf('tab'), which now finds
the main window's tab group instead of the popout's.
Not verified outside the test suite
This version is built and gated without a running Obsidian. The parts
only a live vault can settle:
- The window opens at the intended size with no 600 by 600 flash, and
comes back where it was left. - The hotkey shows and hides it from another application.
- The top band drags the window, and the traffic lights do not ...