Cross-platform media library manager with smart playlists and VLC integration.
Built with Tauri v2, React, TypeScript, and SQLite.
- Workspace-based library - Scan directories for video files and auto-index metadata
- Smart playlists - Filter-based dynamic playlists with multiple conditions (contains, starts_with, equals, etc.)
- Series detection - Automatically extracts series name and episode number from filenames (
S01E05,EP12,#03,- 01patterns) - Playback modes - Sequential, Random, or Repeat per playlist
- VLC integration - Single file or queued multi-file playback via VLC
- Cross-platform - Linux, macOS (Apple Silicon / Intel), Windows
- Node.js 22+
- Rust stable
- VLC 3.x
- Linux:
libgtk-3-dev libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libssl-dev
make setup # Install all dependencies
make dev # Start dev server (downloads VLC + launches Tauri)
make test # Run all tests (cargo test + tsc + vitest)
make build # Production build for current platformSee make help for all available targets.
| Layer | Technology |
|---|---|
| Framework | Tauri v2 |
| Frontend | React 19, TypeScript, Vite |
| Backend | Rust, SQLite (rusqlite) |
| Playback | VLC (external process) |
| CI/CD | GitHub Actions |
src/ # React frontend
App.tsx # Main UI (sidebar, media list, search, filters)
components/ # PlaylistDialog, WorkspaceDialog
hooks/ # useApi (Tauri command bridge)
types/ # TypeScript interfaces
src-tauri/src/ # Rust backend
lib.rs # Tauri app setup + command registration
commands.rs # 14 Tauri commands (workspace, media, playlist, playback)
db.rs # SQLite operations + dynamic query builder
models.rs # Data models (Workspace, MediaFile, Playlist, PlaylistFilter)
scanner.rs # Directory traversal + series name extraction
Pushes to master trigger:
- Test (Linux) - lint, type check, unit tests, clippy
- Build (Linux / macOS arm64 / Windows) - platform builds with bundled VLC
- Release (on
v*tag) - artifacts uploaded to GitHub Releases