// AUDIO_HAXOR — WALKTHROUGH

Tutorial index Docs hub
Progress
04 / 19

04.Plugins tab

VST / VST3 / AU / CLAP inventory, status badges, KVR resolve & update queue, dependency graph, reverse xref, disk-usage strip. This is the tab AUDIO_HAXOR was born around.

Plugins tab with status badges, KVR buttons, and disk usage strip
assets/plugins.png · Plugins tab

Open the tab

Press Cmd+1 or click Plugins. The tab header exposes:

  • Scan Plugins (id="btnScan") — dispatches scan_plugins with { customRoots, excludePaths }. While running the label becomes ⟳ X / Y + ETA.
  • Resume Scan (id="btnResumeScan") — visible only if a previous scan was stopped partway.
  • Stop (id="btnStopPlugins") — appears during an active scan.
  • Check Updates (id="btnCheckUpdates") — dispatches check_updates against KVR for every plugin. Disabled if no plugins have been scanned yet.

The plugin list — columns & status badges

Each row is built by buildPluginCardHtml() in frontend/js/plugins.js:416. Fields shown:

  • Name — with search-match highlighting.
  • TypeVST2 / VST3 / AU / CLAP, rendered as a colored chip (type-vst2, type-vst3, etc.).
  • Manufacturer.
  • Size — humanized (e.g. "2.3 MB").
  • Modified — mtime.
  • Architectures — one badge per slice found inside the plugin bundle (x86, x64, ARM64, etc.).

Three status categories drive the update badge (from pluginStatusCategory() at frontend/js/plugins.js:409):

  • Update availablebadge-update. KVR says a newer version exists.
  • Up to datebadge-current. KVR has a version string and it matches.
  • Unknown latestbadge-unknown. KVR couldn't find the plugin by name / manufacturer.

Per-row actions

  • Web (btn-mfg) — opens the manufacturer URL. Disabled as btn-no-web when KVR hasn't resolved a URL.
  • KVR (btn-kvr) — opens the KVR product page.
  • Download (btn-dl-kvr) — only rendered when an update is available; opens the download URL.
  • Folder (btn-folder) — reveals the plugin bundle in Finder / Explorer / your native file manager.

Right-click any row for the context menu (Favorite, Add note, Copy path, Export selection, etc.). The delete sub-tree comes from the shared _pathDeleteItems() helper at frontend/js/context-menu.js:14 — every inventory row across the app (plugins, samples, presets, MIDI, PDF, video, files) gets the same items: Move to Trash, Securely delete (3-pass DoD 5220.22-M overwrite via the fs_secure_delete Tauri command at src-tauri/src/lib.rs:8567), and Copy path. Adding a new inventory tab automatically inherits the same menu.

Filters, search, and sort

  • Search input — fuzzy search across name + manufacturer. Toggle the regex button (regexPlugins) to switch from FZF to full regex.
  • Type filter — multi-select dropdown (VST3, VST2, AU, CLAP). Converted from a native <select> into a cyberpunk multi-check widget by frontend/js/multi-filter.js.
  • Status filter — multi-select (update, current, unknown).
  • Sort — click any column header. Default: name ascending. State persists across launches via sort-persist.js.

The query is dispatched to db_query_plugins({ search, type_filter, status_filter, sort_key, sort_asc, search_regex, offset, limit }). The tab paginates — you don't see all 20 000 plugins at once, you see the current page.

Disk-usage strip

At the top of the table is a compact disk-usage row (frontend/js/disk-usage.js, updatePluginDiskUsage() around line 124). It pulls aggregates from db_plugin_filter_stats and displays:

  • Total count (or "X / Y" when a filter is applied)
  • Per-type counts: VST3, VST2, AU, CLAP, Other
  • Total size on disk

KVR resolve & update flow

KVR lookups are managed by frontend/js/kvr.js. The core flow (resolveKvrDownloads(), line 3):

  1. Deduplicate the plugin list by manufacturer.toLowerCase() ||| name.toLowerCase().
  2. Skip any plugin whose key is already in the cache (loaded from kvr_cache_get).
  3. For each remaining plugin, call resolve_kvr(kvrUrl, pluginName) — the Rust side fetches the KVR product page and extracts the current version and download URL.
  4. Write results to the cache via kvr_cache_update, and re-render each plugin card in place.
  5. Rate-limit: 2 seconds between requests to stay polite.

While the queue runs, the header shows a status line like "3 downloads found · 18 pending".

Dependency graph — Cmd+G

Press Cmd+G (or the Show Dependency Graph action) to open the modal from frontend/js/dep-graph.js. It draws from the xref cache (_xrefCache, keyed by project path → plugin references) and exposes four views:

  • Most Used — plugins sorted by how many projects reference them.
  • By Project — projects sorted by plugin count, drill into each.
  • Orphaned — plugins installed on disk that appear in zero projects.
  • Analytics — breakdowns by type, manufacturer, extremes (biggest plugin chain, smallest, etc.).

The header shows unique plugins, projects indexed, total references, orphaned count. A fuzzy search box filters the active view. The xref cache itself is built by the Build plugin xref index action (see step 07) which walks every supported DAW project and parses its plugin references.

Import / export

  • Export JSONexport_plugins_json.
  • Export CSVexport_plugins_csv.
  • Import JSONimport_plugins_json. Merges into the live table.
  • Export plugin xref — writes the entire xref cache (project → plugin list) as JSON. Action exportPluginXref, default Cmd+Shift+J.

Scan history for plugins

Every plugin scan writes a snapshot to the plugin_scans table. Use the History tab (step 14) to inspect individual runs, compare two runs with Diff, or delete old entries. IPC: history_get_scans, history_get_detail, history_delete, history_clear, history_diff, history_latest.

TipOn first scan, run Check Updates and Build plugin xref index so the dependency graph is ready. Both are long-running but cached — later scans are incremental.