Personal offline "in-flight entertainment" media library for Android
  • Svelte 46.1%
  • Rust 23.8%
  • TypeScript 15.2%
  • Kotlin 13.9%
  • CSS 0.8%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Eidenz 89b7ab5c73 Add boarding screenshot to README
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 03:47:15 +02:00
.vscode Initial release 2026-08-02 02:52:07 +02:00
plugins/tauri-plugin-cabin-bridge Native background audio, shuffle/loop, sleep timer, dest clock, long-press watched 2026-08-02 03:18:14 +02:00
public Initial release 2026-08-02 02:52:07 +02:00
screenshots Add boarding screenshot to README 2026-08-02 03:47:15 +02:00
src Boarding state: save the pass without starting the flight clock 2026-08-02 03:45:24 +02:00
src-tauri Boarding state: save the pass without starting the flight clock 2026-08-02 03:45:24 +02:00
.gitignore Initial release 2026-08-02 02:52:07 +02:00
index.html Initial release 2026-08-02 02:52:07 +02:00
package-lock.json Initial release 2026-08-02 02:52:07 +02:00
package.json Initial release 2026-08-02 02:52:07 +02:00
README.md Add boarding screenshot to README 2026-08-02 03:47:15 +02:00
svelte.config.js Initial release 2026-08-02 02:52:07 +02:00
tsconfig.app.json Initial release 2026-08-02 02:52:07 +02:00
tsconfig.json Initial release 2026-08-02 02:52:07 +02:00
tsconfig.node.json Initial release 2026-08-02 02:52:07 +02:00
vite.config.ts Initial release 2026-08-02 02:52:07 +02:00

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

Home — continue watching and library rows Series detail with per-title theme tint Music library Now playing sheet with sleep timer Flight mode Boarding pass ready at the gate

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 with pickFolder (OPEN_DOCUMENT_TREE → real path), playVideo (mpv intent + result), all-files-access commands; desktop shims for dev.