A local-first desktop app for any folder of videos you watch in sequence.
Courses, lecture series, conference talks, gameplays, tutorials, workshop recordings, family videos — whatever you've got on disk. Watch what you own, resume where you stopped, track what you watched — without the cloud.
If you have any folder of videos you mean to watch in order — a downloaded course, a season of talks, a backlog of tutorials, a pile of recordings — and you're tired of bouncing between VLC, file managers, and spreadsheets to remember what you watched and where you stopped, Stream Vault is for you.
Point it at a folder, and it indexes, plays, and remembers. It's a thin, fast
desktop shell over mpv. No streaming server. No login. No
telemetry. Your files stay exactly where they are.
- Works with any video folder — the default Video folder preset mirrors your folders as-is. Tell it what to call each video ("video", "lesson", "episode", "part", …) and that label shows throughout the UI.
- Smart scanner presets — optional layouts for common cases:
Course(nested modules),TV series(Season/episode +SxxExx),Movies(flat). Pick a preset at creation, or change it later — a rescan re-reads the folder and keeps your progress. - Resume where you stopped — progress saved every 3s while playing; auto-marked completed past 90%.
- Continue Watching on Home — your in-progress items, ordered by recency.
- Smart cleanup — handles nested folders, season patterns (
SxxExx), release tags, leading numbers (01 -). - Auto-generated artwork — thumbnails and posters via
ffmpegafter each scan. - Custom posters — pick any thumbnail as the group poster.
- Incremental re-scans — match files by path, preserve IDs and progress.
- Built-in search across libraries, groups, and items.
- mpv playback — full keyboard shortcuts, subtitles, audio tracks, hardware decoding. Whatever mpv supports, you get.
- Local-first — single SQLite database under your user data dir. No cloud, no account.
Add screenshots of Home, Library, and Detail views here.
| Layer | Tech |
|---|---|
| Desktop shell | Tauri 2 |
| Frontend | React 19 · TypeScript · Vite · Tailwind 4 |
| Icons | lucide-react |
| Backend | Rust |
| Database | SQLite via rusqlite |
| Player | external mpv over JSON IPC |
| Media tools | external ffmpeg / ffprobe |
Download the latest .deb from Releases and install:
sudo dpkg -i stream-vault_*_amd64.deb
sudo apt-get install -f # if any deps missingThen launch Stream Vault from your application menu.
Runtime dependencies:
mpv,ffmpeg. Install withsudo apt install mpv ffmpeg.
Other platforms (Windows / macOS) are structured-for but not yet shipped — contributions welcome.
- Open Stream Vault.
- Settings → Add Library and pick a folder.
- Keep the default Video folder preset (works for any collection), or pick a preset that matches your layout: Course, TV series, or Movies. Optionally set a unit label ("lesson", "episode", "part", …).
- Click Scan and let it index.
- Pick anything and hit play —
mpvopens, progress is tracked automatically.
Changed your mind about the preset or label? Use the Edit button on any library in Settings. Changing the preset rescans and preserves your progress.
The first launch creates streamvault.db under your platform's app data dir (Linux: ~/.local/share/app.streamvault.dev/).
- Node 20+ and pnpm 10+
- Rust stable (install via rustup)
- mpv and ffmpeg on
$PATH - Linux desktop deps for Tauri 2:
sudo apt install -y \
libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev \
mpv ffmpegpnpm install
pnpm tauri devpnpm tauri build # all bundle targets
pnpm tauri build --bundles deb # .deb onlyThe output lands under src-tauri/target/release/bundle/.
src/ React frontend
views/ Top-level screens (Home, LibraryView, DetailView, Settings)
components/ UI primitives — design system
lib/api.ts Typed wrappers around Tauri invoke
lib/types.ts Shared contract — mirrors src-tauri/src/models.rs
src-tauri/src/
commands.rs Tauri command signatures
models.rs Domain types
db.rs Schema + query layer
scanner/ One module per library kind: courses, series, movies, generic
mpv.rs Spawn mpv + JSON IPC progress polling
thumbnails.rs ffmpeg-based thumbnail/poster generation
The four contract files (models.rs, lib/types.ts, db.rs, commands.rs) are the source of truth — read them first.
A Library is a user-configured root folder. It contains nested Groups (a folder, a season, a module) and leaf Items (a video file). Progress is per-item, and each library carries an optional unit label for how items are named in the UI.
The schema is uniform — it fits any collection of videos. A library's kind
only selects which scanner preset reads the folder:
- Video folder (
generic) — mirrors the folder tree exactly. The default. - Course (
courses) — arbitrary nesting; leading numbers set order. - TV series (
series) — Season/episode folders +SxxExxfilenames. - Movies (
movies) — flat; items skip groups (group_id = NULL).
Because the scanner reconciles by file_path, you can switch presets at any time
and a rescan preserves existing progress.
play_item(id)
→ load item + saved progress
→ spawn mpv with --input-ipc-server=<socket> --start=<resume>
→ poll time-pos every 3s via JSON IPC
→ write to progress table
→ emit item-progress event for live UI updates
→ on exit: final save, mark completed if >90% watched
Only one mpv instance at a time — a new play_item kills the previous session.
- Editable library preset & custom unit labels
- Windows and macOS builds
- Subtitle download integration
- Watch history view
- Library import/export
- External metadata providers (TMDB, TVDB) — opt-in
- Multi-user profiles
Pull requests are welcome. For non-trivial changes, please open an issue first to discuss the approach.
- Code in English (identifiers, errors, logs, commits).
- Keep contract files (
models.rs,lib/types.ts,db.rs,commands.rs) in sync — Rust and TypeScript change in the same commit. - Run
cargo clippyandpnpm lintbefore pushing.
To be defined.