Gallery Docs
Documentation version
Gallery Docs

Gallery TV — Feature Audit vs. Jellyfin and Plex

Audit date: 2026-09-26. Re-verified against source 2026-10-03 after a further run of feature work (Watch Together landed in the TV app, favorites extended to movies and series, server-side video chapters, PiP added then removed). Every “closed” claim below was checked by reading the actual gallery-tv source, not just by trusting commit messages — see the inline file references.

This audit compares the gallery-tv app with the official Jellyfin and Plex TV clients. It lists what Gallery TV already does, and which features the other two offer that Gallery TV lacks. It supports the broader Gallery vs. Plex and Gallery vs. Jellyfin comparisons.

The Gallery TV column comes from reading the gallery-tv source. The Jellyfin and Plex columns come from general product knowledge and public release notes, so treat them as a checklist to verify rather than as a spec. Per-platform notes (tvOS vs. Android TV) are called out where behavior differs.


Table of Contents#

  1. Platform Scope
  2. What Gallery TV Has Today
  3. Gaps vs. Jellyfin and Plex
  4. Server Features With No TV Screen Yet
  5. Out of Scope
  6. Suggested Order of Work

Platform Scope#

gallery-tv is built on react-native-tvos (React Native 0.81, Expo 54). That stack produces builds for exactly two platform families:

Platform Status
Apple TV (tvOS) Supported by the stack. Playback uses AVPlayer through expo-video.
Android TV / Google TV Supported by the stack. The manifest declares the Leanback launcher. Playback uses Media3 (ExoPlayer) through expo-video.
Fire TV (Fire OS) Fire OS is Android-based, so the Android TV APK should install. Not tested, and it needs Amazon Appstore packaging and its own remote key checks.
Fire TV (Vega OS) Not reachable. Vega OS uses Amazon’s own React Native runtime and SDK, not react-native-tvos.
Roku, Samsung Tizen, LG webOS, game consoles Not reachable from this stack. Each needs a separate codebase.

This audit therefore covers tvOS and Android TV only. Jellyfin and Plex features that exist only on Roku, Tizen, webOS, or consoles are not gaps for this app. Those platforms remain a gap for Gallery as a whole, as the Plex and Jellyfin comparison docs already say.

Release readiness items unrelated to features:

  • eas.json defines only an internal preview APK profile for Android. There is no store submission setup for either platform.

Area Feature
Sign-in Device-code pairing with QR code, so no on-screen keyboard is needed. Server URL entry. Multiple saved accounts with a switcher. Per-account PIN lock (set in the web UI, enforced on the TV).
Home Hero banner for the most recent in-progress item, Continue Watching, Next Up (“NEW” badge), Recently Added per movie or series library, latest podcast episodes, Continue reading row for audiobooks (getContinueReading, home.tsx). Long-press an item for an action sheet to mark watched/unwatched or dismiss from Continue Watching. Rows load independently, with skeletons.
Cinema Movie and series libraries with poster grids. Sort, genre and decade filters. Alphabet index rail. Focus preview panel. Movie and series detail with cast and crew — cast/crew are now focusable and link to a person page with TMDB filmography (person.tsx, PersonCard.tsx). Season and episode lists with played badges. Mark watched/unwatched per movie, episode, season, or whole series (movie.tsx, season.tsx, series.tsx). Version picker for movies/episodes with several files (formatCinemaVersionLabel, wired into detail screens and the player).
Music Music libraries, release detail, track queue, shuffle, repeat-one, and a mini audio bar that persists while browsing, with a favorite/like toggle on the currently-playing track (MiniAudioPlayerBar.tsx).
Podcasts Podcast library, episode list (newest first, paged), mark played or unplayed, resume position reporting.
Books & audiobooks Book/audiobook libraries, library grid with a focus preview panel, book detail with file or chapter list (getAudiobookChapters) and chapter-seek, Continue reading on Home (audiobooks.tsx, book-library.tsx, book-detail.tsx). Gated behind the audiobooks feature flag.
Albums (photos & videos) Album list, album detail grid, and an item viewer with a favorite/like toggle per item (albums.tsx, album.tsx, album-item.tsx), reachable from the sidebar.
Playlists Cross-media playlist list, playlist detail, an item viewer with a favorite/like toggle, and a “create/edit playlist” dialog plus an “add to playlist” dialog from other screens (playlists.tsx, PlaylistFormDialog.tsx, AddToPlaylistDialog.tsx), reachable from the sidebar.
Video playback HLS through the transcoder, with direct play and remux when the server allows. Resume-or-restart prompt. Quality picker. Audio track picker. Subtitle track picker with real WebVTT rendering (styled cue overlay, bold/italic/underline). Speed (0.5×–2×). Subtitle offset control. Trickplay scrub thumbnails. Accelerating d-pad seek with commit-on-select. Minimize to a persistent bar. Progress reporting every 10 seconds. Skip Intro / Skip Credits banners from getCinemaItemMarkers. Autoplay next episode with a countdown banner and a Settings toggle. System-level picture-in-picture was added and then removed in the same cycle (player.tsx); the JS-level minimize bar is the only “keep watching while browsing” affordance today.
Watch Together Start a session from the movie or episode action sheet (createWatchSession), or join one by entering an invite code on a dedicated screen (watch-join.tsx). Playback sync rides on SSE (eventSource.ts) plus watchSync.ts/watchClient.ts, wired into PlayerContext (movie.tsx, season.tsx, PlayerContext.tsx).
Search Server-side title search (simpleSearch) across movies, series, music releases, and podcasts, plus a per-library searchCinemaActors fan-out so cast/crew names match too, debounced as the user types (search.tsx).
Settings Interface density (Comfortable, Dense, Big), screen timeout, profile PIN on/off, autoplay next episode toggle, server URL with session status, app version, display scale info, log out. Persisted player preferences: default audio language, default subtitle language, subtitle display mode (Default / Always show / Only forced), default quality cap — applied automatically by the server on every new playback session (matching audio/subtitle track auto-selected, quality capped), not just remembered for the settings screen.
Platform Feature flags respected (Cinema, Music, Podcasts, Audiobooks). Remote key handling including play/pause, rewind, fast-forward, and Android back. Keep-awake during playback. Density scaling from window width. Real device capability detection (@gallery/capabilities-native) for codec, HDR (including Dolby Vision), and audio-channel support on iOS/tvOS and Android, shared with gallery-app. Android TV “Watch Next” row (packages/homescreen-native, useWatchNextSync).
Quality 100+ Jest test files beside the code.

Gaps vs. Jellyfin and Plex#

The previous version of this audit had one high-priority gap and eight medium-priority gaps. Six of those nine are now closed (verified against source, not just commit messages), a seventh (Favorites) is further along than before but still partial, and Watch Together has moved from the Low-priority “not in the TV app” list to done. Nothing new has been promoted to High — the remaining Medium items are all still genuinely medium: each is either blocked on external tooling (Top Shelf), a broad cross-cutting effort with no single landing point (accessibility, localization), or a smaller polish item than what was just shipped.

High priority#

None currently. Mark watched or unwatched (movies, episodes, seasons) — done. Movie, episode, season, and whole-series marking all call updateViewHistory from an action sheet, and dismissing an item from Continue Watching is wired to dismissContinueWatching (movie.tsx, season.tsx, series.tsx, home.tsx).

Medium priority#

Gap Gallery TV today Jellyfin / Plex
Favorites for movies, series, and podcasts Partial, further along. useLikeStatus (the like/unlike hook) is now wired into movie and series detail, in addition to the music mini-player, album items, and playlist items (movie.tsx, series.tsx, MiniAudioPlayerBar.tsx, album-item.tsx, playlist-item.tsx). Still missing from season detail and podcast screens, and there is still no Favorites row on Home. Both. Jellyfin has a Favorites row. Plex has Watchlist, which is a different idea.
Home screen integration — tvOS Top Shelf Android TV “Watch Next” row shipped (packages/homescreen-native, synced from useWatchNextSync). Apple TV Top Shelf still not implemented — still blocked on tooling: @bacons/apple-targets, the Expo config-plugin approach for adding Apple extension targets without ejecting, does not support the com.apple.tv-top-shelf extension point (confirmed against its README’s “Not yet supported” list). Shipping it needs a hand-authored config plugin instead. Android TV “Watch Next” row and Apple TV Top Shelf, so in-progress items appear on the device home screen. Both vendors support at least one of these.
Audio and video chapters Partial. Audiobook chapters ship (getAudiobookChapters, chapter list with seek in book-detail.tsx). The server now exposes video chapters too (CinemaChapter model, getCinemaChapters endpoint, gallery/db/cinema_chapter.go, gallery/handlers/cinema_chapters.go) — generated into the API client, but gallery-tv has no call sites for it yet, so this is now a straightforward wiring gap rather than an open question about server support. Both show chapters on video. Jellyfin has chapter thumbnails on the seek bar.
Accessibility Still only a handful of files set accessibility props. Both work with VoiceOver and TalkBack. Focus-driven UIs still need labels.
Localization Still English only, no i18n library. Both are translated into dozens of languages.
Screensaver Still screen timeout setting only. Jellyfin Android TV has an in-app screensaver showing library artwork.
Be a remote-control target Still not supported. Both let another device start playback on the TV (“Play On” in Jellyfin, Plex Companion). Gallery’s Watch Together is a different feature.

Low priority#

Gap Notes
Lyrics Neither Gallery’s server nor the TV app show lyrics. Both competitors do on music playback.
Trailers and extras Not a Gallery concept yet.
Collections Not a Gallery concept yet. See the Plex comparison doc.
Now Playing surfaces No integration with the tvOS Now Playing panel or Android media session. Verify current state, since expo-video may set some of this.
Picture-in-picture Gallery has its own minimize bar. Neither the tvOS nor the Android TV system PiP is used.
Audio-only or background music mode with visualizer or artwork Mini bar only.

Server Features With No TV Screen Yet#

Updated 2026-10-03 — Watch Together has moved from Unused to Used, and server-side video chapters are a newly added, still-unused capability:

Server capability API operations TV app
Likes addLikeItem, deleteLikeItem, getAllLikeItemsForUser, isItemLiked Used for music tracks, album/playlist items, movies, and series via useLikeStatus. Still unused for seasons and podcasts.
Playlists getAllPlaylistsForUser, getPlaylist, addPlaylistItem, and related Used — full playlist UI.
Watch Together createWatchSession, joinWatchSession, syncWatchSession, and related Used — start from a movie/episode action sheet, join via watch-join.tsx, synced through watchSync.ts/watchClient.ts/eventSource.ts.
Books and audiobooks getBookLibraries, getBooks, getAudiobookChapters, and related Used — library, detail, and chapter screens.
Video chapters getCinemaChapters New server capability (gallery/db/cinema_chapter.go), not yet called from gallery-tv.
Server-side search advancedSearch, searchCinemaActors, searchPodcasts simpleSearch and searchCinemaActors now both power the TV search screen (movies, series, music, podcasts, and person names). advancedSearch and searchPodcasts remain unused.
Continue listening and reading getContinueListening, getContinueReading getContinueReading now powers a Continue reading row on Home (audiobooks). getContinueListening (music) is still unused.
Dismiss from Continue Watching dismissContinueWatching Used — from the Home action sheet.
Albums (photos and videos) Album endpoints Used — list, detail, and item-viewer screens.
Multiple versions per movie or episode getMovie and getEpisodeItems return every version in items Used — version picker in detail screens and the player.

Out of Scope#

These exist in Jellyfin or Plex but do not fit this app, or this stack, or Gallery as a whole:

Item Reason
Roku, Tizen, webOS, console apps Not buildable from react-native-tvos. See Platform Scope.
Live TV and DVR Gallery has no live TV backend. See the comparison docs.
Offline downloads on TV Neither competitor offers this on TV either.
Managed sub-profiles Not planned by design. The TV account switcher with PIN lock is the intended answer.
Chromecast or AirPlay sender TVs are receivers, not senders.
Parental controls UI Enforced by the server per user. The TV app needs no separate screen.
Admin tasks Handled in the web UI. Neither competitor’s TV app does admin work either.

Suggested Order of Work#

Steps 1–4 from the previous version of this audit are done: mark watched/unwatched, version picker, playlists, person pages + searchCinemaActors in search, photo and video albums, audiobooks, Watch Together. Remaining work, reordered given what’s left:

  1. Finish Favorites for seasons and podcasts, plus a Favorites row on Home. The hook (useLikeStatus) and server endpoints are already proven out in music/album/playlist/movie/series screens — this is wiring a toggle into the two remaining detail screens plus a Home row, not new infrastructure.
  2. Wire up video chapters. The server now has the concept (CinemaChapter, getCinemaChapters) and it’s already generated into the API client — this is a TV-side consumption gap, not an open server question anymore.
  3. tvOS Top Shelf integration — needs a hand-authored Expo config plugin, since @bacons/apple-targets doesn’t support the com.apple.tv-top-shelf extension point. Android TV Watch Next is already shipped.
  4. Accessibility labels and localization, which are easier to add early than to retrofit across a now-larger UI surface.
  5. Screensaver and remote-control target (“Play On” / SyncPlay-equivalent) — smaller, self-contained features once the above land.
  6. Lower priority, unchanged from before: lyrics, trailers/extras, collections, Now Playing surfaces, picture-in-picture (tried and reverted — see Video playback above), audio-only background mode. getContinueListening (music) and advancedSearch/searchPodcasts remain unused server capabilities worth a look alongside these.