Better Store
approvedby Real-Fruit-Snacks
A polished community plugin browser: filters, rich details, trending, and installed-plugin management. - This plugin has not been manually reviewed by Obsidian staff.
Overview
Better Store is an Obsidian plugin that replaces day-to-day use of the built-in community plugin browser. It opens as a full workspace tab with real filters, heuristic categories, rendered README previews, GitHub stats, a trending view, and a dashboard for the plugins you already have installed.
It deliberately does not install, update, or remove plugin files itself — install actions hand off to Obsidian's native Community Plugins dialog, so nothing about your vault's security model changes.
Features
- Full workspace view — a filter sidebar, card grid, and detail pane instead of a cramped modal; opens in a tab, a split, or its own window. Stays open while you work.
- Responsive to narrow panes — in a skinny split pane the layout collapses to a single column: filters move into a toggle-able drawer, the detail pane opens as a full-screen sheet, and toolbars wrap. (Desktop-only for now — the mobile experience still needs polish, so the plugin is flagged desktop-only.)
- Filters & sorting — search across name/author/description, category chips, "updated within" (24h → 1 year), minimum downloads, minimum stars, hide installed; sort by downloads, recency, name, trending, GitHub stars, open issues, or recently added.
- Author drill-down — click any author to see everything they've published.
- Full-catalog GitHub scan — with a token, scan every plugin's stars, open issues, and repository creation date into a persistent cache (resumable, cancellable, rate-limit aware) to unlock accurate catalog-wide sorting by those metrics — including a "recently added" view that surfaces genuinely new plugins, not just recently-patched ones.
- GitHub stars on cards — with a token linked, star counts appear on browse cards, fetched only for the cards on screen and cached for the session (togglable).
- "New" detection vs "recently added" — the "New only" filter flags plugins that entered the registry since you started using Better Store (exact, but forward-looking); the scanned "recently added" sort uses repo creation date as a catalog-wide proxy for first release.
- Heuristic categories — Tasks, Sync & Backup, AI, Appearance, Editor, Export & Import, Calendar & Time, Data & Queries, Files & Organization, Publishing & Sharing, Integrations. The official registry has no categories, so these are keyword-derived — imperfect by design and easy to refine.
- Rich details — rendered README with images (sanitized), GitHub stars and open issues, recent releases, and funding links, fetched lazily and cached.
- Trending — local download-delta tracking across catalog refreshes. Builds up as you use the plugin; no external service, no telemetry.
- Installed dashboard — current vs. latest version, update badges, enable/disable toggles (with bulk select), "stale" warnings for plugins unmaintained for a year+, changelog links.
- BRAT panel — when BRAT is installed, lists the beta plugins it tracks and offers one-click add / check-for-updates. Better Store only reads BRAT's list and hands off to BRAT's own commands — never touching another plugin's files.
- Tree view — an explorer-style layout with folders derived from the active sort (download tiers, recency, A–Z, trending, GitHub stars, open issues, recently added), a collapsed Stale folder, persistent expansion, and indent guides.
- Quick jump — a fuzzy search command (
Better Store: Search plugins) that opens any plugin's details from anywhere in Obsidian. - "New" detection — plugins that entered the registry in the last 14 days get a badge and a "New only" filter (togglable).
- Favorites — star plugins to track them; a "Starred only" filter keeps your watchlist one click away.
- Update notifications — a background check marks the ribbon icon (and optionally shows a notice) when installed plugins have updates.
- Update controls — on the Installed tab, skip a specific version (re-notified on the next one), stop checking a plugin entirely, or mute all update nags for 1 hour to 1 week; all reviewable in settings.
- Release notes inline — expand any release in the detail pane to read its changelog without leaving Obsidian.
- Compatibility warnings — flags plugins whose
minAppVersionexceeds your Obsidian version before you install. - Keyboard navigation — arrow keys move through cards and tree rows, Enter opens details, Esc closes the pane.
- Ignore rules — hide individual plugins, everything by an author, or whole categories.
- Plugin profiles — save named enable-sets ("Writing", "Minimal") and switch between them in one click, from the Installed tab or the command palette.
- Export / import — copy your installed list as Markdown or JSON; paste a list back to see what's missing and star it as an install shopping list.
- Maintenance health — a healthy / aging / at-risk chip on the detail pane from update recency and release cadence (togglable).
- Download history — a sparkline built from your own catalog snapshots (togglable).
- Similar plugins — related plugins by shared categories and keywords, one click away in the detail pane (togglable).
- Filter presets — save sidebar filter combinations under a name and reapply them from a dropdown.
- Copy actions — repository URL and BRAT string copy buttons in the detail pane.
Installation
From Community Plugins (recommended)
Better Store is in the official directory: Settings → Community plugins → Browse → search Better Store → Install. Or open the community listing.
Manual
- Download
main.js,manifest.json, andstyles.cssfrom the latest release. - Place them in
YourVault/.obsidian/plugins/better-store/. - Settings → Community plugins → enable Better Store.
Release assets carry GitHub artifact attestations — verify provenance with gh attestation verify main.js -R Real-Fruit-Snacks/obsidian-better-store.
Getting Started
Open the store from the ribbon icon or the command palette (Better Store: Open store).
Commands
| Command | Action |
|---|---|
Better Store: Open store | Opens (or reveals) the store — in a tab, split, or window per your setting |
Better Store: Search plugins | Fuzzy quick-jump to any plugin's details (recently viewed rank first) |
Better Store: Apply plugin profile | Switch to a saved enable-set |
Better Store: Export plugin list (Markdown / JSON) | Copies your installed list to the clipboard |
Better Store: Import plugin list | Paste an exported list and see what's missing |
Better Store: Scan catalog for GitHub stars & issues | Fetch stars / open issues / creation dates for the whole catalog (needs a token) |
Settings
| Setting | Default | What it does |
|---|---|---|
| GitHub token | — | Optional. Link a secret from Obsidian's secret storage holding a GitHub personal access token — it raises the API rate limit (60/hr without) used for stars, issues, and releases. A classic token with no scopes is enough. Only the secret's name is stored in plugin data; the token itself never leaves secret storage. The token is verified automatically when linked — and put straight to work: open detail panes re-fetch their GitHub data and the update check reruns. A Test button re-checks anytime, reporting your remaining rate limit. |
| Cache lifetime | 12 h | How long the plugin catalog is cached. Manual refresh in the store header. |
| Default sort | Downloads | Downloads, recently updated, name, or trending. |
| Open the store in | Tab | Tab, split, or a new window. |
| Hide installed by default | Off | Start browsing with installed plugins hidden. |
| Show "New" badges | On | Highlight plugins that entered the registry in the last 14 days. |
| Show GitHub stars on cards | On | With a token linked, fetches star counts for the cards on screen (one request per plugin, session-cached). Stays inactive without a token so the anonymous 60/hr limit is saved for the detail pane. |
| Scan the catalog for stars & issues | — | Fetches GitHub stars + open issues for every plugin (one request each) into a persistent cache, enabling catalog-wide sort by stars / open issues and a min-stars filter. Requires a token; resumable, cancellable, rate-limit aware. A rescan-freshness slider controls how long scanned stats stay valid. |
| Track recently viewed | On | Ranks recently opened plugins first in quick-jump search. |
| Detail pane toggles | On | Maintenance health chip, similar plugins, download history chart — each individually togglable. |
| Profiles / Filter presets | — | Review and delete saved profiles and presets. |
| Check for updates in the background | On | Checks installed plugins on the cache-lifetime cadence and marks the ribbon icon. |
| Notify when updates are found | On | Shows a notice when the background check finds updates. |
| Update controls | — | On the Installed tab: skip a specific version, stop checking a plugin, or mute all update nags for 1 hour–1 week. Skipped versions, disabled plugins, and mute status are reviewable in settings. |
| Starred plugins | — | Review and unstar favorites. |
| Ignored plugins / authors / categories | — | Review and remove any ignore rule. |
How It Works
- The catalog comes from the official
obsidianmd/obsidian-releasesregistry and stats files. The multi-megabyte stats file is slimmed to totals + last-updated timestamps and cached inside the plugin's own folder. - Detail-view data (README, stars, releases) is fetched lazily per plugin — READMEs from
raw.githubusercontent.com(no rate limit), API data from GitHub with your optional token. - Trending compares download counts across your own catalog refreshes (snapshots kept locally, capped at 30).
- READMEs are third-party content: they're rendered through Obsidian's
MarkdownRendererand then passed through Obsidian's DOMPurify-backed sanitizer as defense in depth. Funding links are only accepted withhttp(s)schemes. - Enable/disable toggles use an internal Obsidian API (the same one used by well-known plugin managers). If a future Obsidian update changes it, those toggles may stop working until this plugin updates — everything else is unaffected.
Architecture
src/
├── main.ts plugin entry: commands, service wiring, update checks
├── view.ts ItemView hosting the Svelte root
├── settings.ts declarative settings tab
├── data/ pure, fully unit-tested modules (no Obsidian imports)
│ ├── registry.ts registry parsing + stats slimming
│ ├── categories.ts keyword → category heuristics
│ ├── filter.ts filter/sort engine
│ ├── tree.ts sort-derived folder grouping
│ ├── trending.ts download-delta snapshots + history
│ ├── newness.ts new-plugin detection
│ ├── service.ts fetch + cache orchestration (IO injected)
│ ├── installed.ts installed-plugin status
│ ├── profiles.ts enable-set diffing
│ ├── portability.ts export/import of plugin lists
│ ├── health.ts maintenance assessment
│ ├── similar.ts related-plugin scoring
│ ├── scan.ts full-catalog scan selection
│ ├── updates.ts update suppression (skip / mute / don't-check)
│ ├── brat.ts BRAT data parsing + command ids
│ ├── token.ts GitHub token check + secret migration
│ └── ... versions, readme URL rewriting, formatting
└── ui/ Svelte 5 components
├── StoreView.svelte tabs, state, wiring
├── FilterSidebar / PluginCard / DetailPane / InstalledTab
├── TreeView / Sparkline / Icon
├── QuickJumpModal / modals (name prompt, import, profiles)
└── store-context.ts typed access to Obsidian internals
Privacy & Permissions
- Network — requests go only to the official
obsidianmd/obsidian-releasesregistry,raw.githubusercontent.com, andapi.github.com. No telemetry, no third-party services. - Clipboard — write-only, and only when you click a copy/export action. The plugin never reads your clipboard.
- Storage — settings and UI state live in Obsidian's plugin data (
data.json); caches live in the plugin's own folder; the optional GitHub token lives in Obsidian's secret storage — plugin data records only the linked secret's name, never the token.
Self-hosting
The repository ships a .gitlab-ci.yml, so the project can also be hosted and built on a self-hosted GitLab instance — the pipeline runs the same verify/build steps, publishes the plugin files as artifacts, and serves the docs site via GitLab Pages.
Development
npm install
npm run dev # watch build
npm run check # TypeScript type check
npm run check:svelte # Svelte component type check
npm test # unit tests (138)
npm run build # production build + bundle verification
Junction/symlink the repo into a test vault's .obsidian/plugins/better-store and enable it.
License
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.