// AUDIO_HAXOR — WALKTHROUGH

Tutorial index Docs hub
Progress
01 / 19

01.First launch & orientation

Boot sequence, HUD header, process stats strip, tab bar with eighteen surfaces, and the welcome panel that seeds your first scan.

Main window on first launch — HUD header, process stats strip, tab bar, and the default Plugins landing tab
assets/plugins.png · Default landing — header + stats + tab bar + plugins table. On a fresh install the Plugins tab shows a welcome panel instead of a populated table until the first scan runs.

What loads when you open the app

AUDIO_HAXOR is a Tauri v2 desktop app. When you launch it from Applications (macOS), the Start menu (Windows), or your application menu (Linux), the Rust backend in src-tauri/ initializes first: SQLite opens in WAL mode with a single writer and a round-robin read-pool, the walker thread pools spin up, preferences are loaded from the file-backed store, and the audio-engine subprocess is spawned.

Next, the WebView loads frontend/index.html and frontend/js/app.js runs its boot sequence (lines 87–143):

  1. Show the global progress indicator.
  2. Load preferences via prefs.load().
  3. Fetch i18n strings with get_app_strings using the uiLocale pref.
  4. Hide Stop / Resume all unless a scan is already in progress.
  5. Restore every setting from preferences.
  6. Initialize the audio engine output stream.
  7. Render cache stats (Settings → Database Caches).
  8. Restore audio player state and dimensions.
  9. Initialize tab drag-reorder, multi-filters, sort persistence, settings-section drag.
  10. Load recently-played, global tag bar, xref cache, filter states, FZF search params.
  11. Initialize smart playlists.
  12. Show the floating player if Show player on startup is on and history exists.
  13. Start the folder watcher if Folder watch is enabled.
  14. Dismiss the splash screen after build info.
  15. Restore the last active tab.
  16. Auto-load the first page of every SQLite-backed tab in parallel.

HUD header — what every chip means

The strip across the top is your command center. Left to right:

  • Logo & brand — musical note glyph, "AUDIO_HAXOR" wordmark, "by MenkeTechnologies" byline. Version string (id="appVersion") comes from package.json / tauri.conf.json / Cargo.toml, synchronized at build time by scripts/sync-static-build-meta.mjs. Optional git rev shows in id="appGitRev".
  • Process stats chips — live process telemetry from get_process_stats:
    • CORES — CPU core count
    • CPU — current usage percentage
    • RSS — resident memory
    • VIRT — virtual memory
    • THR — thread count
    • POOL — Rayon worker pool size
    • FD — open file descriptors
    • UP — process uptime
    • PID — process ID
  • Inventory countersPLG · SMP · DAW · PRE · MID · PDF. Populated from get_active_scan_inventory_counts.
  • Scan buttons:
    • Scan All (🗲) — id="btnScanAll", dispatches scan_unified.
    • Stop All (■) — id="btnStopAll", hidden when idle, visible mid-scan.
    • Resume All (▶) — id="btnResumeAll", only visible when one or more walkers are paused.
  • Scan status badgeid="scanStatusBadge" — free-form status line populated by scanners.
  • Stats dot row — colored dots for Plugins Found, Up to Date, Updates Available, Samples, MIDI, DAW Projects.

The tab bar — 18 surfaces

Directly under the header, in declared order, with default keyboard bindings where they apply:

Plugins      Cmd+1    Samples      Cmd+2    DAW          Cmd+3
Presets      Cmd+4    MIDI         Cmd+5    PDF          Cmd+6
Videos       (none)   Favorites    Cmd+7    Notes        Cmd+8
Tags         Cmd+9    Files        Cmd+0    History      F3
Visualizer   F4       Walkers      F5       Audio Engine F6
ALS Generator (none)  Crate        (none)   Settings     Cmd+,

Videos, ALS Generator, and Crate are reachable from the tab bar (drag them into any slot you like) and from the command palette (Cmd+K); they do not ship with a default Cmd+N binding because the digit row is already saturated. Rebind any of them in Settings → Keyboard Shortcuts if you want a hotkey.

Tabs are draggable (frontend/js/drag-reorder.js) and the order persists across launches; a drop emits the toast.reordered_main_tabs toast. To reset to defaults use the command palette entry Reset Tab Order.

Active-tab state is persisted — when you relaunch, you land back where you left off. Switching tabs is instantaneous; the per-tab data is loaded lazily via db_query_* calls so a 400 000-row sample library doesn't stall the boot sequence.

The welcome panel

On first launch, the Plugins tab shows a welcome card prompting you to kick off a scan. This card is gated on db_plugin_filter_stats returning zero rows — as soon as any scan finishes, the welcome card disappears and is replaced by the normal table view. You can reproduce the welcome state on any tab by clearing that tab's SQLite table (Settings → Clear All Databases).

First actions — the recommended path

  1. Press Cmd+, to open Settings (step 02).
  2. Paste your sample / plugin / DAW / preset / MIDI / PDF roots into the respective Scan Directories textareas. Each scanner has its own list — this is intentional so you can point each walker at a different tree.
  3. Set up your blacklist (node_modules, .Trash, backups, etc.).
  4. Return to the main view and hit Scan All in the header (step 03).
  5. While the scan runs, switch to the Walkers tab (F5) to watch live per-walker directory streams.

Survival tips

  • Press ? at any time to toggle the help overlay with the full shortcut cheat sheet.
  • Press Cmd+K for the command palette — every action in the app (including the ~150 entries added across recent releases for per-scanner stops, per-tab export/import, player track actions, and resets) is reachable from there.
  • If you want a light theme, press Cmd+Y or hit the Theme button in the HUD header.
  • If the CRT scanlines distract you, press F1 to toggle them. Neon-glow toggles with F2.
  • If a scan goes sideways, Cmd+. stops every active walker and subprocess.
  • Every keybinding above is rebindable in Settings → Keyboard Shortcuts (~120 customizable entries — see step 18).

macOS platform polish

Several quality-of-life fixes run silently in the background on macOS — you do not configure them, but it’s useful to know they exist when something looks “wrong” and isn’t.

  • Mission Control / Spaces previews — on stock WKWebView, switching to Mission Control or moving the window to another Space shows a blank gray thumbnail (WebKit bug 146877, open since 2015). AUDIO_HAXOR layers an NSImageView snapshot above the WebView and refreshes it every 1.5 s while focused, so Mission Control / Cmd-Tab / Spaces grab a real bitmap of what you were just looking at instead of an empty rectangle. The live WebView is unhidden the moment focus returns. Source: src-tauri/src/space_preview_macos.rs.
  • App Nap mitigation — macOS will throttle, coalesce timers, and (under memory pressure) page out the app after long idle, which makes the first sample playback after walking away for hours lag for several seconds. AUDIO_HAXOR holds an NSProcessInfo activity assertion (same option set Music.app uses) so the host stays unthrottled. The laptop can still sleep when you walk away — we just block the Nap throttle, not full system sleep. The audio-engine subprocess gets its own keep-alive: the host pings it every 30 s of idle so JUCE’s pages stay resident.
  • Tray popover Escape key — the menu-bar popover is a borderless NSPanel, so its WKWebView rarely becomes first responder and JS keydown never fires. tray_popover_escape_macos.rs installs a local NSEvent monitor so Escape closes the popover anyway.
  • Background-mode breadcrumbsapp.log picks up APP BG: resignActive / APP BG: becomeActive on every focus transition, plus HEALTH + HEALTH-JS lines every 30 s with RSS, IPC counters, JS heap, cache sizes, and audio-engine subprocess vitals. If the app ever feels sluggish, that log + engine.log (which captures stack frames + dyld images on engine SIGSEGV) is the fastest path to a diagnosis.