by yuzuvalentine
Adds a Cards Plus view to Bases: a card layout with extra features.
Bases Plus
An Obsidian plugin that adds a Cards Plus view to Bases: a card layout like the built-in Cards view, as a base for extra features.
Requires Obsidian 1.13.0+ (Bases plugin API + declarative settings).
Features
Cards (same as the built-in Cards view)
- Card size, image property, image fit (cover / contain), image aspect ratio
- The image property accepts
[[attachment.png]]links,embeds, vault paths, external URLs, and colors ("#ff8800",rgb(...); quote hex values in YAML). For lists, the first item that resolves is used. - Fallback image property: used when the image property is empty, doesn't resolve to an image, or fails to load (e.g. main
localCover, fallbackcover). - Grouping with group headers and counts, property values rendered by Obsidian (links, tags, checkboxes…)
- Click a card to open the note (Ctrl/Cmd-click or middle-click opens it in a new tab), hover the title for a preview, right-click for the file menu
Extras
- Card gap: spacing between cards, 0–48px (default 12px)
- Title property: show a property as the card title instead of the file name (falls back to the file name when empty)
- Title lines: clamp card titles to N lines (0 = no limit)
- Image fills card (show info on hover): the card is just the image; on hover the title and properties slide up and fade in over a dark overlay (scrollable if taller than the card). Always shown on touch screens and on cards without an image; reduced-motion users get a fade only.
- Show property labels toggle
- Collapsible groups: click the chevron on a group header. Collapsed groups are remembered per view (saved as
collapsedGroupsin the.basefile), and renaming a collapsed group keeps it collapsed. - Plugin settings (Settings → Bases Plus):
- Group header font size
- Select button placement: Bases toolbar (next to Sort / Group / Filter) or Row above the cards. The toolbar button is inserted into Obsidian's own toolbar, which has no public API; if a future update changes the toolbar so it can't be found, the button falls back to the row above the cards automatically.
- Command: Bases Plus: Toggle select mode works on the Cards Plus view in the active tab and can be given a hotkey (Settings → Hotkeys). It uses only the official API, so it keeps working whatever happens to the toolbar.
- Rename groups: click a group header to edit it. Enter or clicking away applies, Esc cancels. After you confirm, the group-by property is rewritten in every note in that group (list items matching the old value are replaced; numbers and booleans keep their type). Clicking No value sets the property on those notes. Only works when grouping by a note property, not a formula or file property.
- Select mode (the Select button, the Toggle select mode command, or right-click a card → Select):
- Click to toggle a card, Shift-click to select a range, Esc to exit
- Select all checkbox in the toolbar, and a Select group button on each group header when grouping (clicking it also turns on select mode)
- Add tags: adds to
tags, skipping tags a note already has (case-insensitive) - Set property: sets
property: valueon every selected note, overwriting existing values. Type is Text / List / Number / Checkbox / Date / Date & time, and is guessed from existing values. - Remove properties: pick from the properties the selected notes have (with counts)
- Delete: asks first, then moves the files to trash using your "Deleted files" setting
- Right-click a selected card for the same actions, plus other plugins' multi-file menu items
Project layout
src/main.ts Plugin entry: registers the view, command and settings tab
src/settings.ts Plugin settings tab (declarative settings API)
src/image.ts Resolves an image property to an image URL or color
src/bulk.ts Frontmatter edits: add tags, set/remove properties, rename group, delete
src/modals.ts Dialogs for the bulk actions
src/views/cards-plus/
CardsPlusView.ts The view class: wires the modules below together
options.ts View options (settings menu), defaults, reading the config
card.ts One card: title, properties, click / hover / right-click
cover.ts Card cover image, with fallback property
groups.ts Group headers: collapse, rename, "Select group"
selection.ts Select-mode state (no DOM)
toolbar.ts Select button in the Bases toolbar + the bulk-action bar
bulk-actions.ts Bulk actions on selected cards (dialog → edit)
styles.css View styles (loaded automatically by Obsidian)
manifest.json Plugin id/name/version (id = folder name in the vault)
esbuild.config.mjs Bundler; outputs main.js
scripts/install.mjs Copies main.js, manifest.json, styles.css into a vault
Build
npm install # once
npm run build # type-check + production bundle -> main.js
npm run dev # watch mode: rebuilds main.js on every save
npm run lint # eslint with the official obsidianmd rules
Install into a vault
Use a separate test vault for development, not your main vault.
The plugin goes in <vault>/.obsidian/plugins/bases-plus/ and needs main.js, manifest.json and styles.css.
One-off install:
npm run build
npm run install-plugin -- "C:\path\to\TestVault"
Dev loop (auto-copy on every rebuild):
$env:OBSIDIAN_VAULT = "C:\path\to\TestVault"
npm run dev
Then in Obsidian:
- Settings → Community plugins → turn off Restricted mode, then enable Bases Plus.
- Open or create a
.basefile → view picker → Add view → Cards Plus. - Use the view's settings (the toolbar menu) to pick an image property, image fit, card size and labels; pick the shown properties in the Properties menu.
Reloading after changes: run Reload app without saving from the command palette. Turning the plugin off and on does not rebuild a Bases view that is already open, so the old view code keeps running. The community plugin Hot-Reload (pjeby/hot-reload) can also reload automatically; the install script writes the .hotreload file it looks for.
Release
Bump version in manifest.json (or run npm version patch), then npm run build, and attach main.js, manifest.json and styles.css to a GitHub release.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.