Releases: prehakanson-art/OrivioTVAppleTV
Release list
Orivio TV v5 — new native player
Orivio TV v5 is a rebuild of how playback actually works. The headline is a new native player, but the real story is that most of the pipeline between "a file on a debrid server" and "pixels on your TV" was replaced or repaired.
Downloads
| File | Bundle ID | Use it for |
|---|---|---|
Orivio-TV-v5-sideload.ipa |
com.orivio.tv.appletv |
Sideloading (Sideloadly / AltStore). They re-sign it with your own Apple ID. |
Orivio-TV-v5-dev.ipa |
com.orivio.tv.appletv.dev |
Installing alongside/over a dev build signed with your own team. |
Both are Release builds of the same code.
The new native player
Dolby Vision used to reach the screen by remuxing: the app rewrote the movie on the fly into a format Apple's player would accept, served it to itself over a local HTTP server, and played that. It worked, but it cost memory, disk, CPU and startup time — and it was the source of a whole class of crashes.
v5 replaces it with a direct sample-feed engine. FFmpeg demuxes the file, the compressed video is fed straight into the display pipeline, and nothing is rewritten or written to disk.
- Dolby Vision Profile 5, 7 and 8, with Profile 7 converted to 8.1 (enhancement layer dropped, RPU converted) so Apple's pipeline accepts it
- HDR10 / HDR10+ pass through untouched — the dynamic metadata rides inside the bitstream
- The stream is tagged with the file's real base-layer compatibility flavor (8.1 HDR10-base vs 8.4 HLG-base). Assuming HDR10 made 8.4 files render with visibly wrong colors
- Flat memory (~150 MB for an entire movie) instead of memory that climbed until the system killed the app
- The old remux tier is gone — about 1,500 lines including a POSIX HLS server, playlist windowing, disk budgeting, and the failure modes that came with them
Smoother playback on heavy remuxes
The stutter that plagued high-bitrate UHD remuxes turned out to be real, measurable, and specific.
Encoders differ in how deeply they reorder frames. A file using runs of 7 consecutive B-frames (~83% B-frames, reorder depth ~8) forces the decoder to hold and reorder eight 4K 10-bit frames before it can emit anything — so on older Apple TV hardware its output arrives in bursts, roughly three group-boundaries per second. Files with shallow IPBPB structure never hit it. Filming the TV at 240 fps confirmed it on the glass: about three repeat/catch-up frame pairs per second, while every software clock read perfect.
v5 fixes it by decoding ahead: the engine runs its own VideoToolbox decode session, keeps finished frames in a display-ordered buffer, and hands the display layer ready-to-flip pixel buffers. Burst decoding can no longer reach the screen.
Also fixed along the way:
- Frame timing — MKV stores timestamps in whole milliseconds while a 23.976 fps frame lasts 41.708 ms, so every frame landed slightly off the display's grid. Timestamps and durations are now snapped to the exact frame grid
- Buffering — a 10-second compressed buffer with an escalating cushion, so a cold link produces one honest pause instead of a stop-start loop
- Audio starvation — the clock now holds when either queue runs dry (audio-only starvation was dragging video into visible hitches, since video is slaved to the audio clock)
Audio
- Everything plays: TrueHD, DTS-HD, FLAC, Opus decode to PCM; AC3, E-AC3 and AAC pass through compressed
- Dolby Atmos passes through on DD+/E-AC3 tracks. TrueHD-Atmos cannot be bitstreamed on tvOS by any app, so those decode to PCM
- Correct 5.1/7.1 channel order. FFmpeg emits back-surrounds before side-surrounds; the CoreAudio layout tags expect the reverse. Every multichannel track was playing rear content from the side speakers and vice versa
- Track ranking — commentary and described-audio tracks no longer win the default pick, and preferred-language/channel-count ranking decides the rest
- Multichannel LPCM now carries a channel layout (without it, lossless tracks were silent)
Embedded subtitles
Subtitle tracks inside the file now work: SubRip, ASS/SSA, MOV_TEXT, plus PGS and DVD bitmap subs — the ones that exist nowhere else on disc remuxes.
They appear in the normal picker next to addon subtitles, labeled by language and format, with forced tracks marked. Selecting one replays a buffered backlog so cues appear immediately instead of when the demuxer's read-head catches up.
Display handling
Grey-screen and handshake trouble came from renegotiating the HDMI mode too often and at the wrong moments. v5 follows the discipline good players use:
- One display switch per session, requested while the loading screen is still static — never over live video
- The app waits for the panel to report the new mode and hold it steady before attaching video
- No in-app switch back. The mode is held for the whole session; tvOS reverts it on its own when the app backgrounds
- The request is clamped to what the TV actually advertises (DV → HDR10 → HLG → leave it alone)
- Frame rate is matched on the one switch, so 24 fps film isn't shown with 3:2 pulldown
- Manual re-sync: triple-press Play/Pause to renegotiate the connection if your TV ever wedges — it works blind, which matters when the screen is grey
Reliability
- Fixed an 80 MB-per-session leak — playback engines were kept alive by a retain cycle and their queues never freed, so sessions accumulated until the system killed the app mid-movie
- Mid-movie engine switching works: the old engine is stopped properly (it used to keep decoding, giving a frozen picture over doubled audio) and playback resumes at the right position
- Stuck-engine recovery: if a remembered engine choice can't open a file (AVPlayer can't open MKVs, for example), the app clears that memory and retries the same source automatically instead of marching through every link
- VLC resume uses the position-fraction API — VLC silently ignores time-based seeks on network streams, so it restarted movies from zero
- Seeking no longer stacks a buffering penalty, so scrubbing lands and plays promptly
- Crash classes from earlier builds (preferences-size aborts, memory kills, teardown races) are fixed
Convenience
- Per-title memory for audio track (matched by exact track, not just language), subtitles, engine and playback speed
- Playback info panel (swipe down): DV profile, FEL/MEL enhancement-layer type, resolution, frame rate, the display's live refresh rate, bitrate, and a decision log explaining why each choice was made
- Chapters, scrub thumbnails, precise seeking, and a Skip Intro control that's actually focusable
Note for older Apple TV hardware: the 2017 Apple TV 4K handles most content well, but the very heaviest disc remuxes (70–90 Mbps) sit at the edge of what it can decode. Decode-ahead removes the stutter that came from frame reordering; if a specific file still struggles, a WEB-DL of the same title will play comfortably.
Orivio TV v4
Everything that changed since v3. Two builds are attached, both unsigned — sign them with Sideloadly or your own tool.
| Download | Use it when |
|---|---|
OrivioTV-0.7.15-tvos-unsigned.ipa |
Your sideload tool accepts a real tvOS app. |
OrivioTV-0.7.15-sideloadly-unsigned.ipa |
Sideloadly (and anything else with an iOS-only validator). Identical tvOS arm64 binary — only the Info.plist claims iOS. |
Accounts
- New Accounts hub. Settings → Accounts now holds Orivio, Stremio, sync status, add-on health and backups in one screen, instead of scattering them across Integrations.
- Stremio sync now goes both ways. Add-on collection, library, Continue Watching and Watched push back to Stremio as well as pull from it, on a 30-second auto-sync plus a Sync Now button. v3 only pulled.
- Sign in with Orivio, Stremio, or both, from the same place, by QR.
- Sync status you can actually read. A persisted log of the last 80 events (time, area, outcome), the pending queue, the last error, and a provider check you can run on demand.
- Local backups. Export your add-ons, plugin repositories, library, Continue Watching and Watched as plain JSON and paste it back on another box — no account needed.
- Add-on health check. Measures how fast every installed manifest responds, so you can find the slow or dead provider behind long Home and source loading. It only reads manifests; it changes nothing.
- Export and re-import your add-on setup as a list of manifest URLs.
Sync fixes
- Removed items stopped coming back. Library removals now go into a durable pending-delete queue with tombstones that get reasserted right before a pull. Previously a removal was only a debounced push and a 3-minute in-memory grace — kill the app, go offline, or let a token expire in that window and the next full snapshot resurrected the item permanently.
- Continue Watching stops bloating. It's rebuilt from the account snapshot instead of piling up device-local rows that nothing ever cleared.
- No more bare
tt1234567rows. Titles and artwork missing from Cinemeta are now resolved through TMDB by IMDb id and backfilled onto existing rows — without touching playback position, timestamps, or triggering a push. A real title is never regressed back to an id. - Stremio series pointers no longer fake progress. Stremio can store a series pointer with no runtime and no offset; importing those as 0/1s progress made hundreds of old library entries show up as in-play.
Playback
- Fixed: the picture never came back after a pause. Any load following a pause — switching episodes, an Up Next advance, changing source or engine while paused, a failover armed while backgrounded — swapped the URL in and never opened it, because
KSPlayerLayer.set(url:)only opens a stream while autoplay is still armed andpause()clears that flag. The 30-second watchdog fired, then every failover candidate died the same silent way until "every available source was tried". - Fixed: crashes on 4K and high-bitrate 1080p. KSPlayer's
ThumbnailControllerunrefs a packet once per pass rather than once per read, so every read after the first leaked its buffer — the leak scaled with bitrate, not file size. Replaced with our ownScrubThumbnailer, which unrefs every packet, can be interrupted mid-read through an AVIO callback, carries a wall-clock budget, and caps thread count. - Fixed: the buffer ceiling was never enforced on Auto. The Auto profile skipped the byte cap entirely and relied on a seconds cap, which is bitrate-blind — 36 seconds of "unknown" tier is a few tens of MB on an ordinary stream and hundreds on a high-bitrate 4K one, which is what got the app jetsammed. On Auto the byte budget now acts as a ceiling that can shrink the seconds cap but never inflate it; an explicitly chosen profile still wins in both directions.
- VLC audio routing. VLC never goes through KSPlayer, so a VLC-only session ran under tvOS's default
soloAmbient— the wrong ducking, interruption and route policy for long video. It sets the playback category itself now. - Exit is immediate once you confirm it. The confirmation button is still the guard against a stray Back press; after that there's no extra display-mode wait.
Browsing
- Content rating on the meta line (PG-13, R, TV-MA…) on every theme, in the APK's order: Type • Rating • Genre • Runtime • Year • IMDb.
- Per-episode cast, plus a taller description on the focused episode card.
- Up Next rows on Home, with remaining-time and new-episode badges on Continue Watching cards.
- Artwork filled in on synced rows that arrived with none, from whatever the catalogs already loaded.
- A slow add-on no longer freezes the app. Home hands over focus and sidebar input after the first frame instead of waiting for every catalog request to finish.
- Apple TV HD (A8, 2 GB) drops recurring animation and compositing cost while keeping the artwork; focus stays legible through rings and borders.
- Community Collections logo migration moved off the launch path — it runs when you open the screen, not when the app opens.
Also in v4 (landed after the v3 tag)
- Collections: account-wide library with per-profile visibility, per-folder visibility with a profile drill-down, and switching whole collections off account-wide.
- Collection focus artwork: animated GIF support with three quality modes, off by default on constrained boxes; static focus art; full-bleed covers and uniform row height.
- Catalog pages stream into the grid instead of loading everything before anything appears.
- Two-way sync propagates deletions, auto-syncs every 30 seconds, and offers a manual account sync.
- Fixed an Apple TV 4K gen 1 freeze at launch, GIF choppiness/overflow/grey squares, doubled focus-art URLs, and made the 30-second auto-sync cheap enough not to stutter on A10X.
Known gaps. Series per-episode watched history still isn't synced from Stremio (it's a compressed bitfield that needs the full episode list to decode); movies-watched, all Continue Watching and all saved items are. Top Shelf remains off — it needs an App Group, which a free Apple ID cannot grant.
Orivio TV v3
Orivio TV v3 — this release is all about themes and older Apple TV performance. Pick a whole new look for the app, mix-and-match detail/profile/player styles, and enjoy smoother scrolling on the Apple TV HD.
❤️ Help put Orivio TV on TestFlight
Orivio TV is free and open-source. I'm raising funds to get it onto TestFlight so it can be installed without sideloading. If you'd like to help:
📥 Which file do I download?
OrivioTV-V3-Sideloadly.ipa— use with Sideloadly (or similar sideloaders).OrivioTV-V3-tvos.ipa— use with Xcode (Devices & Simulators) or Apple Configurator.
Both are the same unsigned arm64 build for Apple TV HD / 4K (tvOS 17+); your sideload tool re-signs it with your Apple ID on install. Bundle id com.orivio.tv.appletv.
Everything new since v2
🎨 New theme system — six full looks
Settings → Themes now lets you switch the app's entire look, each a ground-up design (not a reskin):
- Aurora — a faithful recreation of the Stremio Apple TV UI: reflective/tilting posters, a focus-following meta header (title, runtime, rating, IMDb, cast), portrait Continue-Watching cards with library checks, a left icon rail that expands with a gradient, and a consistent focus line so the row you're on always sits neatly under the hero.
- Marquee — an HBO-Max-style dark theme.
- Streamline — a Hulu-style theme whose focus color follows your accent.
- Theater — a Netflix-inspired look with a top nav bar.
- Onyx — a focus-driven, backdrop-forward layout.
- Cinema — a clean graphite home.
🧩 Mix-and-match "look axes"
Independently choose, in Settings → Themes:
- Detail Page style (Orivio / Marquee / Streamline)
- Profile Screen style
- Player Layout (Classic or a native-style HBO transport)
…on top of whatever app theme you pick.
⚡ Apple TV HD (A8) performance
The themes now respect the per-device performance tiers, so older boxes do less wasted work while capable devices are unchanged:
- The heavy native "card platter" focus effect drops to a lightweight scale-only focus on the A8.
- Card shadows, the looping poster sheen, and hero cross-fades are gated on the low-power tier and Reduce Motion.
- Images stay capped to the device's framebuffer, and hero metadata is fetched with debouncing.
🛠️ Fixes & polish
- Reflective posters no longer clip their highlight; the hero fills the screen and blends into the stage with no row "peek" or flicker while scrolling.
- Column-preserving up/down navigation is consistent across every theme's rows.
- Numerous layout, spacing, and focus refinements throughout the new themes.
Orivio TV
Orivio TV — a native Apple TV media player. This is a huge update over the first release: the app is rebranded to Orivio, and it adds Live TV, a plugin/scraper system, offline downloads, Cloud Library, native Dolby Vision, deep account sync, and a long list of playback and UI improvements.
❤️ Help put Orivio TV on TestFlight
Orivio TV is free and open-source. I'm raising funds to get it onto TestFlight so it can be installed without sideloading. If you'd like to help:
📥 Which file do I download?
OrivioTV-V2 (Sideloadly).ipa— use with Sideloadly (or similar sideloaders).OrivioTV-0.7.15-tvos.ipa— use with Xcode (Devices & Simulators) or Apple Configurator.
Both are the same unsigned arm64 build for Apple TV HD / 4K (tvOS 17+); your sideload tool re-signs it with your Apple ID on install. The bundle id is now com.orivio.tv.appletv, so this installs as a new app — sign into your account and everything syncs back down.
Everything new since v0.7.15
🎨 Rebrand
- Renamed to Orivio TV — new name, app icon, top-shelf art, in-app logo, and backdrops.
🆕 Major new features
- Live TV — IPTV tab with M3U playlists, per-row "Show All", location/language config, curated country fallback, in-app embed, and a toggle to hide the tab when unused.
- Discover — in-app browser for the live Stremio community add-on catalog with one-tap install, plus community pages.
- Plugins / scrapers — a JS scraper runtime (Nuvio plugin system) so community scraper repos work on tvOS.
- Offline downloads — download titles for offline play, shown as poster cards in Library with an Apple TV storage bar.
- Cloud Library — browse and play your debrid cloud files directly.
- Collections — streaming-service presets, a single tidy Home row, editable tile shapes, HQ artwork, and reordering.
- P2P streaming — TorrServer client for magnet/torrent playback without debrid (currently hidden behind a settings toggle).
- Parental guide — IMDb content advisories on the detail page.
- AnimeSkip — automatic anime intro/outro skipping.
- Deep linking —
nuvio://(open a title) andstremio://(install an add-on).
▶️ Playback
- Native Dolby Vision output for DV profile 5/8 (true dynamic DV instead of HDR10 tone-map).
- Dolby Vision Profile 7 → 8.1 on-device conversion (dual-layer DV7 files get native DV), with a device-aware default (off on 3 GB gen-1/2) and a conversion-speed control so it can run on older boxes.
- External player engine — hand any stream to Infuse, VLC, VidHub, nPlayer, etc., with a player picker and optional subtitle forwarding.
- Full styled ASS/SSA subtitles via VLC routing (toggle).
- Buffer controls — buffer profile (Auto / Conservative / Large) and size-target read-ahead cache (500 MB / 1 GB / 2 GB / Max).
- Display matching — opt-in HDR/refresh-rate switching with a 23.976 AFR bias for Android parity, plus fixes so exiting no longer wedges the TV on a grey/green screen or turns it off.
- Instant manual play, pause when the app switcher appears, and full-HD trailers.
🔎 Sources & streaming
- Smart source ranking — quality scoring (resolution, codec, HDR, audio, cached-first) per add-on.
- Badger badge packs — visual badges on source rows and in the in-player Sources panel.
- Auto Link Selector — per-profile auto-play of the best link, with hold-to-play-manually.
- DMM Cast / external links supported; add-ons that return no links now show why.
- Tolerant handling of any add-on manifest/stream shape, browser User-Agent to get past bot protection, and specific failure reasons instead of "didn't respond".
- Debrid — RealDebrid, Premiumize, and TorBox, with QR device login, TorBox instant-cache checks, and cross-provider fallback.
- Confirm before removing an add-on; "cached only" now truly filters to cached links.
⏭️ Continue Watching & resume
- Up Next card that appears at the end-credits chapter (with an N-seconds-before-end fallback), auto-advancing on a countdown you control.
- Smarter resume — re-scrapes a fresh link and auto-plays the one that best matches what you last watched (Dolby Vision / HDR / Atmos / resolution) at your saved position, so expired debrid/Comet links no longer drop you to the start; the full list stays as failover.
- Spoiler-blur options, focus recovery, and much smoother scrolling (no per-card offscreen passes or re-renders on focus).
🔄 Account sync
- Multi-profile sync fixed — non-primary profiles now do a full two-way sync (previously only profile 1 fully synced).
- Watched history removals now sync across devices.
- Library no longer resurrects items removed on another device.
- Plugins, debrid keys, and Trakt logins now sync with the phone app, not just tvOS↔tvOS.
- Home layout (catalog order, collection placement, custom titles, hidden rows) now syncs correctly with the phone.
- Continue Watching removals are durable (persisted retry queue) and the Home row polls every 30s to stay live across devices.
- Player / TMDB / theme / badge / collection settings and installed add-ons all sync; first sign-in is additive so it never wipes local-only data. "Refresh Add-ons" pulls from the account without deleting your list.
🏠 Home & interface
- Home layout modes (Modern / Grid / Classic) with a distinct look each, full-bleed hero under the collapsed rail, and a hero backdrop/trailer that follows focus.
- Extensive sidebar polish — smoother expand/dim motion, swipe-right exit, in-sync labels, overscan-friendly icon spacing.
- Focus-marquee scrolling for long titles, and "See All" only catches vertical focus when you're directly above/below it.
- Top Shelf Continue Watching on the tvOS home screen (requires a paid Apple Developer account to enable).
- Detail page: clickable synopsis opens a scrollable full-description overlay.
⚙️ Settings
- A full visual redesign (grouped lists + icon tiles) and 15 batches of new controls: subtitle styling/timing/forwarding, skip-intro, stream filters, poster size/labels, app-wide font, granular TMDB enrichment toggles, auto-play source, reuse-last-link, video scaling, player OSD/overlay toggles, Experience Mode (Essential / Advanced), and Settings Style (Classic / Zen / Horizon).
- A dedicated Performance tab — master toggle, per-effect animation controls, Reduce Motion, FPS overlay, and a reset button.
🐞 Stability & performance
- Fixed a stack-overflow crash on player exit, an Auto Link Selector crash, add-on catalogs with duplicate IDs crashing the focus engine, and orphaned player audio on early exit.
- Vendored/patched KSPlayer to fix an FFmpeg audio-decode crash.
- Cut playback memory on RAM-limited Apple TVs to stop mid-playback out-of-memory kills; right-sized image decode/cache on Apple TV HD.
- Faster loading (higher concurrency, no artificial delays) and fixed observer leaks / sync-merge data loss.
⚠️ Notes
- Unsigned build — sideload with your own Apple ID; free Apple IDs need a re-sign every 7 days.
- Sync connects to the existing Nuvio account backend, so it interoperates with the Nuvio phone app.
Built on Nuvio (GPLv3). 🤖 Release notes assembled with Claude Code
NuvioTV for Apple TV v0.7.15
Unsigned tvOS build — sideload it onto an Apple TV with Sideloadly or AltStore (signs it with your own Apple ID).
Requirements
- Apple TV (tvOS 17+), paired to a Mac/PC over the same network
- Sideloadly (or AltStore) + your Apple ID
Install
- Open Sideloadly, plug in / select your Apple TV.
- Drag in this .ipa, enter your Apple ID, and sideload.
- Free Apple IDs expire the app after 7 days — re-sideload to renew.
Built from source at this tag. Provider keys are not included; the app browses and plays via addons out of the box.