- New "Flat sticky notes" setting disables the per-card wall rotation.
Requested by a Reddit user who wanted notes to sit perfectly straight.
- Drop the third-party "builtin-modules" dependency in favor of Node's
built-in node:module.builtinModules — addresses a directory-scanner
hygiene warning.
- Drop text-decoration-color on colored-card links, since it was only
partially supported by Obsidian's bundled Chromium and the inherited
underline color reads fine.
- Add CONTRIBUTING.md covering build, dev, PR conventions, and the
release workflow.
Fixes#2: the debounced render emptied the view container on every
keystroke and re-created the search input, so focus dropped each time
filtering finished. Capture the active-element + selection range before
emptying, then restore focus and cursor position after the new input is
mounted.
Also rewrites every !important in styles.css (36 occurrences) by
bumping selector specificity instead — chaining 'body' / 'input.' /
'textarea.' / '.modal.' to win against Obsidian's defaults cleanly.
This clears the directory scanner's '!important' findings.
Single light-theme override block in styles.css covering:
- Cards (border, hover lift), card hover-action buttons, tag chips
- Active filter chip, sort/archive/density toolbar buttons
- Bulk-action floating bar, capture action buttons + Discard button
- Modal action buttons on uncolored notes
New theme-agnostic colored-surface treatment:
- Capture wrap gets has-pick-color when a color is chosen; title,
body, placeholders, action icons and Discard button all flip
to white so they remain legible against the dark color palette
- Card hover-action buttons on colored cards now have a dark
translucent backdrop instead of just floating white icons
- Backlinks badge readability rules for both colored and light states
Wall view:
- New 'theme' wall background that uses Obsidian's
--background-primary and --background-modifier-border for full
theme adaptivity; this is the new default
- Light-theme variants for the dark-only walls (slate, blueprint,
chalkboard, cork) so picking them in light mode doesn't crash
a dark wall into a light card surface
- Wall card shadows lighter in light mode
Modal preview:
- Inherits the note color: paints the modal background, makes
inner content transparent, lighter tag chips and code-block
backgrounds for contrast
- Title, action buttons, and edit-mode textarea all forced to
light colors when the modal has a note color
- Restored Obsidian's .modal-bg dim backdrop (was being set
transparent, removing the dim overlay)
- Hidden Obsidian's built-in × close (it overlapped the action row)
Capture box:
- Auto-saves on focus loss with a 200ms grace window so the color
popup doesn't trigger a premature save
- Title input no longer triggers save on Enter; plain Enter inserts
a newline; ⌘/Ctrl + Enter saves explicitly
- Discard button next to Save
- Save button styled as mod-cta primary
Lint:
- Discard tooltip lowercased to satisfy ui/sentence-case
- document.activeElement → activeDocument.activeElement for
popout-window compatibility (obsidianmd/prefer-active-doc)
Capture box (Keep parity):
- Title input above body, both visible only when capture is focused
- Discard button next to a primary Save button
- Pin and color toggles in the action row; picking a color tints the
whole capture box so you preview the sticky color before saving
- Auto-save on focus loss (200ms grace so the color popup menu doesn't
trigger a premature save)
- Plain Enter inserts a newline; cmd/ctrl-Enter saves
- Title typography: 20px / 500 weight, divider between title and body,
inputs are flush (no nested borders)
- Capture also auto-adds the new note to the current wall when in
wall mode
Wall view:
- Pinned cards float to the top in pinOrder
- 3D pushpin head on pinned wall cards (red gradient + drop shadow,
softer shadow on light backgrounds)
- Removed the floating + add button (redundant with the capture box)
- Removed the wall switcher dropdown; one implicit wall, exposed via
a 'Clear wall' command in the palette
Modal preview:
- Inherits the note's color: paints the modal background, transparent
inner panels, lighter tag chips and code-block backgrounds for
contrast on the dark color palette
- Hidden Obsidian's built-in × close (overlapped with the action row);
Esc / click-outside / Open-in-tab still close
Bulk actions:
- 40px buttons with 20px icons (was 32/16) for better legibility,
vertical divider between count and actions
Async/await cleanup:
- onOpen, onClose, render, and the bulk-trash handler no longer
declare async without an await; require-await passes locally
The bigger half is the new "wall" view: a sticky-note styled,
vertically-scrolled, curated subset of your notes.
- New density modes 'wall' and 'wall-compact' selectable from the
toolbar. Wall is now the default density on fresh installs.
- Per-card sticky-note look: deterministic 1-3 degree rotation
seeded by file path, paper-style drop shadow, hover lift to 0deg.
- Eight wall backgrounds (cork, whiteboard, slate, paper, graph,
blueprint, linen, chalkboard) chosen from the settings tab.
Default: slate.
- Walls are curated, not auto-filled. The wall starts empty; users
add notes via the floating + button (FuzzySuggestModal picker)
or via the empty state's "Fill from current view" shortcut
(only offered when the current filter has <= 200 notes).
- Right-click any card on the wall: "Remove from wall".
- Command "Clear wall" (palette) wipes the current wall.
- The freeform-canvas prototype was scrapped in favor of the
column layout after testing showed dragging cards onto a giant
scattered canvas was unusable at vault scale.
Bot fixes:
- async onClose / async render / async make-trash arrow had no
awaits. Made onClose and onOpen non-async (return Promise.resolve)
to match Obsidian's signature; render is now sync; the trash arrow
is sync too (its body's awaits are inside a ConfirmModal callback).
- Switched view content access from this.containerEl.children[1] to
this.contentEl. Fixes a tab-switching ghosting bug — newer Obsidian
versions can wrap views in extra layers, shifting the children
index, so renders were occasionally landing on the wrong element.
Per the developer docs, contentEl is the stable getter.
- The wall FAB moved from position: fixed to position: absolute
inside the body container, so it disappears with its tab instead
of bleeding across panes.
- Added @typescript-eslint/require-await to the local eslint config
so the next round of these doesn't slip past.
Bumps minAppVersion to 1.7.2 (the lowest version where every API the
plugin uses is supported — processFrontMatter and revealLeaf were the
two that pushed this up).
ESLint pass against eslint-plugin-obsidianmd is now clean (0 errors,
0 warnings). Notable changes:
- Removes the deprecated MarkdownRenderer.renderMarkdown fallback;
always uses MarkdownRenderer.render now (minAppVersion covers it)
- Replaces Workspace.activeLeaf reads with Workspace.getActiveViewOfType
- Replaces Vault.trash with FileManager.trashFile to respect the user's
configured deletion preference
- Replaces window.confirm() with a small ConfirmModal so the bulk-delete
prompt is consistent with the rest of the UI
- Dynamic style assignments now use HTMLElement.setCssStyles rather than
el.style.* directly
- All static modal styling has been moved out of inline styles into CSS
classes (keep-modal-stack, keep-modal-row, keep-modal-buttons, etc.)
- Async event handlers that returned Promise<void> where the listener
expects void are now sync wrappers that internally void-await
- Empty catch blocks now have explanatory comments
- Removes 'this' aliasing in openNotePreview (uses arrow function instead)
- Drops unused vars and fixes sentence case in setting descriptions
Adds eslint.config.mjs with the obsidianmd recommended config so future
changes can be lint-checked locally before pushing.
main.ts is now the canonical source; main.js is the compiled artifact
committed alongside so manual installs work without a build step. Class
signatures and the public types (KeepCardsSettings, Filter, ParsedQuery,
ColorDef, BatchState) are explicitly typed; tsconfig is lenient on
implicit any and null checks to keep the diff against the hand-authored
JS minimal for this initial port. Subsequent passes can tighten the
types incrementally.
Build: npm install && npm run build (or npm run dev for watch mode).
Addresses the reviewer note in the obsidian-releases PR about needing
the .ts source committed for transparency.