- 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.
- Search input no longer loses focus mid-typing while filtering (#2).
- All 36 !important declarations removed from styles.css in favor of
selector-specificity bumps, clearing the directory scanner's
'!important' finding.
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.
GitHub's deprecation annotation on the 0.2.3 run flagged the prior
v4/v4/v2 actions for using Node 20, which is removed from the runner
in September 2026. Move to actions/checkout@v6, actions/setup-node@v6,
and actions/attest-build-provenance@v4 — all on the node24 runtime.
Maintenance release that ships through the new tag-triggered workflow:
- Build now signs main.js / manifest.json / styles.css with GitHub
artifact attestation, addressing the directory's missing-attestation
finding on prior assets.
- pnpm install no longer aborts on the esbuild post-install script, so
the directory's build verification runs cleanly.
- styles.css uses full 6-digit hex throughout.
- New workflow signs main.js / manifest.json / styles.css with GitHub
artifact attestation on every tag push, then creates or updates the
matching release. Going forward, pushing a 'X.Y.Z' tag is enough to
ship a verified release.
- Expand all '#fff' shorthand to '#ffffff' for hex-format consistency
flagged by the community directory scanner.
Portal CI installs with pnpm, which blocks postinstall scripts by default
and fails the build verification. Declare esbuild as an allowed builder
so pnpm install completes cleanly.
Replaces the earlier grid-density screenshots with the wall view — which is
both the new default density and the visually distinctive feature the plugin
is named for. Adds a capture-expanded screenshot so the README shows the
title + body + pin/color flow at a glance.
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.
processFrontMatter parses YAML to a JS object and re-serializes — it
preserves data but not formatting (comments stripped, flow lists
become block lists, key order normalized, quote styles changed).
Previously every pin/archive/color flip silently reformatted the
user's frontmatter and bumped mtime, which also caused the card to
jump to the top of the recent-sorted grid.
All three (pin, archive, color) now live in the plugin's own
data.json keyed by file path. Frontmatter equivalents are still
read as a fallback for notes the user authored manually with
pinned: / archived: / color:. Storing an explicit false / null in
plugin data lets the UI override frontmatter when the user toggles
off via the picker.
Rename and delete events migrate or drop the entries.
The only remaining processFrontMatter writes are the explicit
user-initiated 'add tag to frontmatter' and 'rename tag across
vault' commands, where reformatting is acceptable because the
user opted in.
Resized to 1700px wide (sips -Z), kept under 600KB each. Hero image
shows the masonry layout with the PINNED/OTHERS section split, color
variety across cards, and varied content (lists, code, checkboxes).
Modal screenshot demonstrates markdown-rendered preview with code
syntax highlighting and the action row.
Storing an explicit null for the path means the picker's Default choice
overrides any frontmatter color: value, so users can always reset a
card to no color via the UI.
Color was previously written via processFrontMatter, which bumped the
file's mtime. With sort-by-modified that pushed the card to the top of
the grid every time the user picked a color, and polluted the note's
edit history. Color now lives in plugin settings keyed by file path,
read with frontmatter color: as a fallback. Frontmatter values still
display so notes authored with explicit colors keep working; new picks
through the UI are stored as plugin data and applied to the card in
place without a re-render. Rename/delete events migrate or drop the
entry.
A Google Keep-style masonry card view for Obsidian. Quick capture, inline
edit, pin, color, archive, multi-select, lazy infinite scroll, smart
search, three densities, and a markdown-rendered preview modal.