Jellyfin for Android XR & beyond
Turn your headset into a real spatial cinema.
SpatialFin is built for immersive playback from the ground up: Full Space Mode, stereoscopic 3D, spatial audio, voice control, offline media, and Jellyfin SyncPlay.
Designed for headset-scale viewing
Full Space Mode, spatial panel placement, and room-scale interactions make the player feel native to XR instead of adapted from a phone UI.
Built for real media libraries
Stereoscopic formats, spatial audio, libass subtitle rendering, bitrate control, version selection, downloads, and local playback are first-class.
Hands-free and social by default
Voice commands, in-player AI search, and native Jellyfin SyncPlay keep playback comfortable whether you are solo, remote, online, or offline.
See it in motion
Watch the SpatialFin trailer
The current build running in Android XR, including the spatial presentation and player experience.
Why SpatialFin
An XR media client that goes deeper than a skin.
Every major layer of the app, from layout and controls to playback and offline behavior, is tuned for how media actually feels inside a headset.
Headset-scale layouts
Massive spatial panels, restored window placement, orbiting controls, and readable action surfaces built specifically for Android XR.
Instant Configuration
Scan a QR code from the Companion App to setup servers and users instantly.
Hands-free control
Voice commands and AI search preserve immersion while you watch.
Network Shares
SMB and NFS support with automatic discovery and TMDB enrichment.
Smart Playback Engine
Ordered spoken languages, original-audio preference, and series-level memory reduce repetitive track management.
The Full Stack
Everything designed for depth and distance.
Explore the complete technical depth of SpatialFin by category below.
Agency & Placement
- Home + Full Space: Launches in Home Space for side-by-side multitasking; switch to Full Space for a cinematic, theater-scale experience.
- Interactive Agency: Grab and move the entire application or video player window anywhere in 3D space.
- Native XR Controls: Material 3 for XR orbiters float secondary controls in space.
- Persistent Windows: The app remembers where you placed your panels in the room.
Visual Layout
- XR-First Layouts: Larger typography and labeled action buttons instead of dense icon-only controls.
- Large-Target Playback UI: Larger controls and a dedicated chapter picker for easier hand-first interaction.
- Glassmorphic Aesthetic: A UI that feels like it belongs in your physical environment.
Visuals & Audio
- Stereoscopic 3D: Automatic detection and rendering of SBS, top-bottom, and other 3D formats.
- Spatial Audio: High-fidelity positional audio that pins sound to the screen's location.
- Pixel-Perfect Subtitles: Integrated
libassJNI renderer for ASS/SSA anime subtitles.
Quality & Selection
- Version Selection: Choose between different versions, such as 3D vs. 2D or 4K vs. 1080p.
- Adaptive Quality: Pick a resolution preset (Auto / 4K / 1080p / 720p / 480p / 360p); Auto steps down when the network can't keep up.
- Smart Language Handling: Spoken-language ordering and subtitle fallback logic.
Assistant Features
- Unified Smart Assistant: Hold an open palm near your face, or use the mic orbiter, for voice commands and natural-language questions.
- Tiered AI Routing: Deterministic parsing first, then on-device LiteRT Gemma, with optional cloud Gemini fallback when you supply your own API key.
- Contextual Awareness: The assistant uses a rolling subtitle buffer and current playback state for accurate clarifications.
- Stateful Follow-Ups: "Shorter," "movie only," "more like the second one" all chain off the previous recommendation.
Feedback & Diagnostics
- Spatial TTS Feedback: The assistant replies aloud with automatic media-volume ducking.
- In-Player AI Search: Voice search opens as a spatial overlay so you never leave playback.
- Voice Telemetry Dashboard: Per-attempt strategy, skill, and outcome are logged locally to make tuning the assistant straightforward.
Watch Parties
- Jellyfin SyncPlay: Native support for creating, joining, and mirroring watch party states.
- Real-time Sync: Seamlessly stay in step with friends regardless of their device type.
- Group Management: Easy group joining directly from the spatial interface.
Ecosystem
- Server Connectivity: Deep integration with Jellyfin for libraries and collections.
- Seerr Integration: Connect Jellyseerr or Overseerr to search and request media.
Direct Streaming
- SMB & NFS Support: Stream media directly from network shares without a Jellyfin server.
- mDNS Discovery: Automatically find network shares on your local network.
- Metadata Enrichment: TMDB matching for posters, descriptions, and ratings on local files.
Local Playback
- Local Storage: Browse and play videos stored directly on the XR device.
- HTTP Proxy Bridge: High-performance seek support for network streams.
- Local Resume: Progress and unplayed status tracked per video file.
Downloads
- Resumable Engine: Downloads survive app restarts and network swaps.
- Configurable Options: Choose between original files or smaller transcoded versions.
- Foreground Tracking: Monitor download progress in real-time from the system tray.
Offline Experience
- Automatic Mode: Seamlessly switches to offline library when the server is unreachable.
- Complete Mirroring: Offline items include posters, backdrops, and scrubber thumbnails.
- Smart Cleanup: Automatically reconciles library if files are removed manually.
Fleet Management
- Zero-Type Setup: Configure every detail of the headset from your PC/Mobile browser.
- Multi-User Authentication: Pre-authenticate multiple Jellyfin accounts via username/password.
- Remote Preferences: Set language priorities and AI keys centrally.
Advanced Logic
- Network Share Sync: Direct import of SMB/NFS share details including credentials.
- PWA Support: Install the dashboard as a standalone app for fast access.
- Secure Discovery: unique setup tokens protect your local configuration.
SpatialFin is, to our knowledge, the only Jellyfin client that offers on-device encryption for downloaded media. The feature is off by default — enabling it is a deliberate decision about your threat model.
App Lock Modes
- Off: No prompt on launch. Default state; existing users are never prompted.
- Biometric / device credential: Android
BiometricPromptwithBIOMETRIC_STRONG | DEVICE_CREDENTIAL. When encryption is on, the Keystore key is gated by the biometric prompt viaCryptoObject. - SpatialFin PIN: A 4–8 digit PIN you manage, hashed with PBKDF2-HMAC-SHA256 (600 000 iterations, random salt). The PIN also derives the encryption key — a forgotten PIN is unrecoverable by design.
- Wipe-on-wrong-PIN: Configurable 1–3 attempts, then full data wipe via
ActivityManager.clearApplicationUserData()plus deletion of the downloads folder.
Encrypted Downloads
- AES-256-CTR per file: Each new primary-video download is encrypted at finalize time with a random 16-byte IV. Subtitles and pre-existing downloads stay plain.
- Keystore-wrapped DEK: A random 32-byte data-encryption key, wrapped on disk by a key-encryption key that matches the app-lock mode. Hardware-backed in the Keystore on capable devices.
- DEK in memory only: Decryption happens on-the-fly through a custom Media3
DataSource; the plaintext DEK is zeroed when the app is backgrounded. - Delete unencrypted downloads: A Settings action lists pre-existing plaintext files and removes them in bulk. Re-download to get them encrypted.
Companion Enforcement
- Global or per-device: Administrators can enforce the app-lock mode and encryption setting globally, or per device via the new
devicePreferencesmap in the companion config. - Live push over WebSocket: When the admin changes a preference, the companion broadcasts
config_changedand SpatialFin re-syncs within seconds. - Onboarding step: First-run asks the user to pick an app-lock mode before finishing setup, so security posture is set intentionally.
Threat Model
- Protects against offline file dump of the app's private storage or the
Downloads/SpatialFinfolder — ciphertext is useless without the KEK. - Protects against process-level execution while locked — the DEK is not in memory; unwrapping requires biometric auth or the correct PIN.
- Does not protect against a rooted device actively running SpatialFin with the DEK already in memory, or against streaming playback (only downloaded content is encrypted).
Beta access
Try SpatialFin before public release
Access is currently handled through the Google Group and Play beta flow. The steps are simple, but the order matters.
Join the Group
Join the Google Group first so your account can be approved for beta access.
Join GroupInstall
Install the current beta build of SpatialFin from the Google Play Store.