- Svelte 46.1%
- Rust 23.8%
- TypeScript 15.2%
- Kotlin 13.9%
- CSS 0.8%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .vscode | ||
| plugins/tauri-plugin-cabin-bridge | ||
| public | ||
| screenshots | ||
| src | ||
| src-tauri | ||
| .gitignore | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| svelte.config.js | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
Cabin
Personal offline "in-flight entertainment" media library for Android (sideloaded), built with Tauri 2 + Svelte 5 + a vendored copy of the Facet design system.
One dark, OLED-friendly library over downloaded movies, anime series and music:
- Pick a folder per category (Movies / Series / Music) — Cabin scans and parses filenames
(
SxxEyy, anime- 03, release-tag stripping) and reads music tags (lofty) with embedded cover-art extraction. - Video plays in mpv-android (
is.xyz.mpv, install once from Play Store / F-Droid) via intent handoff. mpv reports the exit position back, so Continue Watching / next-up episode tracking works seamlessly. MKV, HEVC, ASS subs — all fine. - Music plays in-app (persistent audio element, mini player + queue). FLAC/MP3/OGG/Opus/AAC.
- Optional TMDB artwork/metadata fetch (Settings → API key → "Fetch artwork now"), done once on Wi-Fi; posters/backdrops cached on-device. Without art, cards get deterministic gradient covers.
- Flight mode: enter route + duration, get an animated plane arc, time-to-landing, a destination clock, and "you can fit N more episodes" hints.
- Background music for real: playback runs in a native foreground service with lockscreen controls, shuffle-all, loop modes and a sleep timer — screen off, music on.
Screenshots
Dev
npm install
npx tauri dev # desktop window (folder picker via zenity/kdialog, video via local mpv)
Rust tests (filename parser + scanner): cd src-tauri && cargo test.
Android build
Requires: JDK 21 (~/.jdks/jdk-21.0.12+8 — NOT the system JDK 25, Gradle 8.14 can't run on it),
Android SDK (~/Android/Sdk, platform 36, NDK 27), rustup Android targets.
export JAVA_HOME=~/.jdks/jdk-21.0.12+8
export ANDROID_HOME=~/Android/Sdk
export NDK_HOME=$ANDROID_HOME/ndk/27.2.12479018
npx tauri android build --debug --target aarch64 # debug APK
adb install src-tauri/gen/android/app/build/outputs/apk/universal/debug/app-universal-debug.apk
On first launch grant "All files access" (the Settings page prompts for it) — Cabin scans real
paths under /storage/emulated/0 directly. All Android specifics (permissions, mpv <queries>,
CabinFileProvider) live in the plugins/tauri-plugin-cabin-bridge library manifest so
regenerating gen/android never loses them.
Layout
src/— Svelte 5 app.src/vendor/facet/is a vendored copy of the Facet tokens + components.src-tauri/src/— scanner (scan.rs), filename parser (parse.rs, tested), music tags (music.rs), TMDB (tmdb.rs), JSON persistence (state.rs).plugins/tauri-plugin-cabin-bridge/— the only native code: Kotlin plugin withpickFolder(OPEN_DOCUMENT_TREE → real path),playVideo(mpv intent + result), all-files-access commands; desktop shims for dev.