# audiofiles > Manage your sample library without the waits. ## What It Is audiofiles is a standalone desktop sample manager. It stores samples by content hash so nothing is ever duplicated, organizes them in virtual file systems that don't touch your disk, and exports them formatted for 14 hardware samplers. Built entirely in Rust. ## Design - **Brand:** "audiofiles/" in Recursive Mono Bold. Short form: "af/" - **Default theme:** Bold black and white (pure #000000 background, #ffffff text, sharp system accent colors). Bundled themes (dark, light, and high-contrast variants) live in `crates/audiofiles-browser/themes/`. - **Typography:** Recursive Mono Bold for the logo; egui system font for all UI text. ## Features ### Sample Import - Import folders of audio samples (WAV, AIFF, FLAC, MP3, OGG, M4A, ALAC, CAF, BWF) - Three import strategies: flat, new VFS, or merge into existing VFS - Content-addressed storage (SHA-256) with automatic deduplication - Progress display with cancel support; partial imports remain valid - Drag-and-drop import (standalone app) - CLI argument import (`audiofiles-app /path/to/folder`) - Post-import folder tagging prompt ### Virtual File System (VFS) - Organize samples in virtual directories independent of disk location - Multiple VFS roots (switch between collections via sidebar or dropdown) - Create, rename, delete VFS roots and directories - Move and rename sample links (instant, metadata-only operations) - Breadcrumb navigation with clickable path segments - Keyboard nav: j/k or arrows, Enter to open, Backspace to go up - Directories always sort before files - Cascade delete (deleting a VFS removes all its nodes) - Background right-click context menu: New Folder, Import Folder, Deselect ### Audio Analysis - Configurable analysis pipeline (enable/disable each type): - Loudness: peak dB, RMS dB, LUFS (bs1770 ITU-R BS.1770-4) - BPM detection (stratum-dsp, requires 2+ seconds of audio) - Musical key detection - Spectral: centroid, flatness, rolloff, zero-crossing rate, onset strength - Loop detection: cross-correlation + beat alignment - Classification: rule-based into 16 categories - Waveform generation: downsampled peak pairs for display - Background worker thread (non-blocking UI) - Progress bar with cancel support - Re-analyze previously analyzed samples ### Classification (16 Categories) Kick, Snare, HiHat, Cymbal, Percussion, Bass, Vocal, Synth, Pad, FX, Noise, Music, Ambience, Impact, Foley, Texture Two-layer ML system: rule-based broad classifier (Layer 1) + 200-tree Random Forest for drum sub-classification (Layer 2). 94.4% accuracy on labeled drum samples. ### Tag System - Hierarchical dot-notation tags (e.g., `genre.electronic.house`, `instrument.drum.kick`) - Auto-suggested tags from analysis with confidence scores and reasoning: - Classification, BPM, genre hint, key, loop/oneshot, loudness character - Review suggestions screen: accept/reject per-suggestion with Accept All / Reject All - Tag entire folders during import - Add/remove tags manually in detail panel - Bulk tagging across multi-selection (Cmd+T) ### Collections - Cross-VFS sample groupings for quick access - Create, rename, delete collections - Add/remove samples from any VFS ### Dynamic Collections - A collection with a non-NULL `filter_json` is a saved search (the old "smart folder" feature, merged into the collections table in migration M015) - Sidebar section with collapsible list - Click to apply saved filter instantly ### Search + Filtering - Text search by sample name (folder or global scope, 500 result limit) - Filter panel: BPM range, duration range, key selector (with compatibility mode), classification checkboxes, tag prefix filter - Filters combine with AND logic - `/` to focus search bar - Similarity search: weighted Euclidean distance on analysis vectors ("Find Similar" in context menu) - Near-duplicate detection: VP-tree indexed peak envelope fingerprint comparison ("Find Duplicates" in context menu) ### Preview Playback - Double-click or Space to play/pause - Plays through system audio via cpal - Selecting a different sample switches playback - Status footer shows currently playing filename ### MIDI Instrument Mode - Chromatic mode: play any sample across the keyboard with pitch shifting - Multi-sample mode: assign samples to key zones with velocity layers - ADSR envelope (per-sample linear ramps) - 8-voice polyphony with oldest-note stealing - 3-octave piano keyboard UI with click-to-set root note - Drag samples from file list to keyboard to create zones - Toggle with I key; panel appears below file list ### Native Drag-Out - Drag samples from the file list to Finder, Desktop, or DAW (REAPER, Ableton, Logic, etc.) - macOS: NSDraggingSession via AppKit (deferred to run loop, session lifecycle callbacks) - Windows: OLE DoDragDrop with CF_HDROP (blocking modal) - Temporary symlinks provide friendly filenames (content store uses hash names) - Multi-file drag (all selected samples) - 4-pixel dead zone prevents accidental drags during clicks ### Export - Export VFS subtree to filesystem (preserving directory structure or flattened) - Device export with 14 bundled hardware sampler profiles: - Dirtywave M8, Elektron Digitakt, Digitakt II, Octatrack, Model:Samples - Roland SP-404 MKII, Akai MPC, Polyend Tracker, Synthstrom Deluge - 1010music Blackbox, Korg Volca Sample 2, TE OP-1 - Novation Circuit Rhythm, NI Maschine+ - Profiles handle sample rate conversion, bit depth, channel count, filename sanitization, file size limits - Rhai scripting engine for custom/community export profiles - Export dialog with device picker, destination, preview, progress - Metadata sidecar option (.audiofiles.json per sample) ### Cloud Sync (MNW SyncKit) - Optional cloud sync via Makenotwork accounts - E2E encrypted (ChaCha20-Poly1305 + Argon2) - Push/pull changelog sync with conflict resolution - Per-VFS toggle for syncing audio files vs metadata-only - Cloud-only samples: visible with cloud icon, metadata searchable, no local blob required - Auto-sync scheduler (configurable interval: 5/15/30/60 min) - PKCE OAuth authentication flow ### OTA Updates - Background update checker (custom reqwest-based, not Tauri) - Consent dialog: Download (opens browser) or Not Now - Non-intrusive bottom-right overlay notification ### File List + Sorting - Multi-column table: Name, BPM, Key, Duration, Classification (configurable) - Click column header to sort (ascending, descending, reset) - Directories always first regardless of sort ### Selection - Single-click, Cmd+Click (toggle), Shift+Click (range) - Shift+Arrow to extend selection - Cmd+A to select all - Keyboard navigation: j/k or arrow keys ### Bulk Operations - Bulk delete, move, rename, tag (add/remove) across multi-selection - 50-deep undo stack (Cmd+Z) - Rename pattern engine: {name}, {ext}, {bpm}, {key}, {class}, {duration}, {n}/{nn}/{nnn} tokens - Live preview of rename results before applying - Bulk modal UIs: tag editor (Cmd+T), directory picker, pattern builder (F2) ### Detail Panel - Waveform display with click-to-seek (rendered from pre-generated peak data) - Metadata: duration, sample rate, channels, peak dB, RMS dB, LUFS, BPM, key, classification - Tag editor (add/remove chips) - Auto-hides when window is narrow (< 700px) - Resizable (200-400px) ### Context Menus - Sample: Preview, Find Similar, Find Duplicates, Play as Instrument, Copy Path, Export, Delete - Folder: Open, Rename, Export, Delete - Multi-select: Tag, Move to, Rename, Copy Paths, Delete - Background (empty space): New Folder, Import Folder, Deselect ### Keyboard Shortcuts - j/k or arrows: navigate - Enter or Right: open directory / preview sample - Backspace or Left: go up - Space: play/pause - /: focus search - I: toggle instrument panel - S: toggle sidebar - D: toggle detail panel - Cmd+A: select all - Cmd+Z: undo - Cmd+T: bulk tag - F1: help overlay (also reachable via Help toolbar menu → Keyboard shortcuts) - F2: bulk rename - Cmd+I / Cmd+,: About modal (toggle update-check preference) - Delete: delete (with confirmation) - Escape: close dialog / clear search ### Themes - Bundled themes (audiofiles default + community themes; see `crates/audiofiles-browser/themes/`) - Dark: audiofiles, Tokyo Night, Catppuccin Mocha, Dracula, Nord, Gruvbox Dark, Rose Pine, Everforest, Solarized Dark, Kanagawa - Light: Catppuccin Latte, Ayu Light, Flatwhite, Neobrute, Gruvbox Light, Rose Pine Dawn - High Contrast: High Contrast - Custom themes: drop .toml files into `~/.config/audiofiles/themes/` - Theme selector in toolbar ### Standalone App - Native desktop window (eframe, 900x600 default, 600x400 minimum) - System audio output via cpal - Drag-and-drop files and folders (import) - Native drag-out to Finder/DAW (export) - CLI argument import - macOS app bundle with squircle icon, file associations (.wav, .flac, .mp3, .ogg, .aiff) - System tray icon with Show Window / Toggle Playback / Quit - OTA update notifications ### Data Storage - SQLite database (versioned migrations) - Content-addressed sample store (files named by SHA-256 hash) - Waveform data cached in database - Database local to the app ### Platforms - macOS (primary, signed + notarized) - Windows, Linux ## Price License key required. Sold via Makenot.work store. Source-available (PolyForm Noncommercial 1.0.0). ## Tags Music Production, Samples, Audio, Sample Manager, Hardware Sampler, Rust --- ## Technical Reference ### Tech Stack - **Language:** Rust (2024 edition), zero `unsafe` in production code (17 justified FFI blocks in platform drag-out) - **Audio Decoding:** Symphonia 0.5.5 - **Analysis:** stratum-dsp 1.0 (BPM/key), bs1770 (LUFS), realfft 3.5 (spectral) - **Database:** SQLite via rusqlite 0.31 (bundled) - **Hashing:** SHA-256 (content-addressed storage) - **GUI:** eframe + egui 0.34 (windowed) + cpal 0.17 (audio output) - **Export Scripting:** Rhai 1.21 (sandboxed: 100K ops, 32-level calls) - **Sync:** synckit-client (ChaCha20-Poly1305, Argon2, reqwest) - **Font:** Recursive Mono Linear Bold (logo) **Workspace:** 5 crates — `audiofiles-core` (sync-only library), `audiofiles-browser` (egui UI), `audiofiles-app` (standalone desktop), `audiofiles-sync` (cloud sync), `audiofiles-rhai` (export scripting) ### Testing Tests cover: database, store, VFS, tags, analysis (incl. ML classifier), search, export, instrument, smart folders, rename, fingerprint, similarity, state orchestration, theme parsing, preview decoding, updater, license activation, and full end-to-end pipelines. ### Status License key activation required. --- ## Appendix: Building from Source on Linux audiofiles is built entirely in Rust and compiles on Linux without modification. The source is available on sourcehut. ### Prerequisites - Rust toolchain (stable, 1.75+): https://rustup.rs - System packages for audio and graphics (package names for Debian/Ubuntu): ``` sudo apt install build-essential pkg-config libasound2-dev libgtk-3-dev \ libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev \ libssl-dev libfontconfig1-dev ``` For Fedora/RHEL: ``` sudo dnf install gcc pkg-config alsa-lib-devel gtk3-devel \ libxcb-devel libxkbcommon-devel openssl-devel fontconfig-devel ``` For Arch: ``` sudo pacman -S base-devel alsa-lib gtk3 libxcb libxkbcommon openssl fontconfig ``` ### Clone audiofiles depends on the `synckit-client` crate via a relative path. Clone both repositories side by side: ``` git clone https://git.sr.ht/~maxmj/synckit-client git clone https://git.sr.ht/~maxmj/audiofiles ``` Your directory should look like: ``` parent/ synckit-client/ audiofiles/ ``` ### Build the Standalone App ``` cd audiofiles cargo build --release -p audiofiles-app ``` The binary is at `target/release/audiofiles-app`. Run it directly or copy it to a location in your `$PATH`. ### Run Tests ``` cargo test --workspace ``` ### Sync (Optional) Cloud sync requires a Makenotwork account. Set the environment variables before launching: ``` AF_SYNC_SERVER_URL=https://makenot.work AF_SYNC_API_KEY=your-key audiofiles-app ``` Without these variables, the app runs fully offline with all features except sync.