Clients

One library, five surfaces

The Android client is a single Kotlin and Jetpack Compose codebase that changes shape based on the device it launches on. It mirrors the web client screen for screen on every non-admin path — server configuration deliberately stays on the web.

Server

The engine

A .NET 10 minimal-API service backed by PostgreSQL with pgvector, shipped as one Docker image that also serves the built React client on port 8080.

  • Parallel scanning — libraries scan and enrich per unit with live per-item progress over SignalR.
  • Transcoding — FFmpeg in the container, HLS sessions, NVENC/NVDEC and CUDA tone mapping when a GPU is passed through.
  • Recording — IPTV tuners, timeshift, scheduled DVR, and Comskip commercial detection.
  • Analysis — silence and black-frame detection producing season-clustered intro, recap, preview, and credits markers.
  • Operations — scheduled backups with atomic restore, a live log tail, an email dispatch worker, and a background task queue with per-task cancellation.
  • Extensibility — metadata, artwork, lyrics, discovery, list-sync, and request providers all load as plugins.
https://vora.home.lan/admin
The Vora admin dashboard
Admin dashboard — tasks, libraries, plugins, and server health
Web client

The complete Vora

React, TypeScript, and Vite, themed entirely through CSS custom properties so a template swap recolors the whole client — brand mark included.

  • Browse — Home spotlight and smart lists, library browse with filter and sort, cinematic detail pages.
  • Discover — Discovery feeds, For You, Watchlist, and a month/week/day release calendar.
  • Organize — collections with content sync and chronological ordering, manual playlists, and rule-tree smart playlists.
  • Listen — a full audio hub for music, podcasts, and live radio with an overlay player.
  • Watch live — a real EPG grid, an in-player guide, and DVR session management.
  • Administer — libraries, users, invitations, plugins, IPTV, requests, overlays, backups, logs, and templates.
https://vora.home.lan/library
The Vora web library browse page
Library browse with filter, sort, and collections
vora.home.lan/media
Media detail page
Media detail
vora.home.lan/live
Live TV guide
Live TV guide
vora.home.lan/audio
Music hub
Music hub
Android phone

Native, not a wrapper

Kotlin and Jetpack Compose throughout, with the API client generated from the server's own OpenAPI document and design tokens synced straight from the web theme.

  • Media3 playback — ExoPlayer with fully Compose-owned player chrome, a quality and tracks panel, and marker skip overlays.
  • Background audio — a media session that drives the lock screen, Quick Settings, and Wear OS, with a sleep timer, crossfade, and a five-preset equalizer.
  • Cast and PiP — Google Cast switching mid-playback and picture-in-picture on user-leave.
  • Multi-server — saved servers, profile picker, and skip-ahead sign-in.
  • Live updates — SignalR keeps permissions and the active template in sync without a restart.
  • Encrypted at rest — bearer tokens sealed with Google Tink, keyset wrapped by the Android Keystore.
Vora on an Android phone, home screen
Home
Vora on an Android phone, now playing
Now playing
Android TV

The same app, ten feet back

Vora detects the television form factor at runtime and rebuilds its shell around the D-pad — no separate build, no separate codebase.

  • Focus first — every control carries a Vora focus ring, and initial focus is claimed on entry so the remote always has somewhere to go.
  • Plex-style drawer — pressing LEFT at the edge of a row opens navigation, with focus gating so the remote never gets lost behind it.
  • Guide grid — the Live TV channel grid and in-player guide are built for a remote, not adapted from touch.
  • Chrome that gets out of the way — the top bar hides, the hero shrinks, and the player controls are pure Compose.
Vora running on Android TV
Android TV home — D-pad focus and a shrunken hero
Android TV live guide
Live guide grid
Android TV player
Player with marker skip
Android Auto

Your library on the dashboard

Vora's audio service is a Media3 MediaLibraryService, so the car gets a real browse tree rather than a mirrored phone screen. Video is deliberately excluded.

  • Music — Recently Played, Top Tracks, Liked Songs, Artists, and Albums.
  • Podcasts — new episodes and your subscriptions.
  • Radio — favorites and all stations, played as a real queue so previous and next skip between stations.
  • Favorite from the wheel — a custom star command toggles the current station, in sync with the phone.
  • Resume — playback resumption rebuilds the persisted queue for the car's resume tile.
  • Scrobbling — plays recorded from the car feed Recently Played and Top Tracks like any other surface.

Sideloaded builds need Android Auto's Developer settings → “Unknown sources” enabled before Vora appears as a car media source. That is a device setting, not a limitation of the app.

Vora browse tree in Android Auto
Browse tree on the head unit
Vora now playing in Android Auto
Now playing with the favorite action

Ready to run it?

One image, one database, your media mounted read-only.