The player has been rebuilt from the ground up, the disk cache is real now, HDR plays as HDR, and a very long correctness pass went through sync, profiles and Continue Watching. Full breakdown below.
🎛️ The player, rebuilt
Modeled on Infuse, measured off reference captures rather than guessed at.
- New transport — bar, times, title and track glyphs all re-laid out. Dark playhead line at rest, a 16pt dot with a white ring while scrubbing.
- Swipe down for the info panel — Info / Video / Audio / Subtitles tabs. Sources, episodes, engine, speed and PiP all live there.
- Full-screen pickers for sources, episodes, playback speed and engine.
- Remote grammar you can predict — click = play/pause · swipe left/right = scrub, click to commit · click the edges = skip · hold = scan · Menu backs out one step at a time (cancel scrub → close panel → exit).
- A light tap with the controls up swaps the times for start/end wall-clock.
- Clicking near the edge of the pad mid-drag now commits the scrub instead of jumping ±60 seconds — that was the old "I scrub, I click, and it lands somewhere else."
- Removed: the pause overlay, the side panels, the OSD clock and a dead "peek" bar that hadn't had a caller in months.
🖼️ Scrub previews
- Real frames from the film while you scrub, decoded off the disk cache rather than re-downloaded.
- 15-second spacing while scrubbing; touch and hold the wheel to fine-tune and it drops to ~1 second.
- Frames survive cache eviction, so scrubbing back over ground you've already covered stays instant.
💾 Hybrid disk cache
The film now caches to your Apple TV while you watch it, in three tiers:
- Demand — whichever reader has the least road ahead is fed first. Never subject to a ceiling.
- Forward fill — builds a lead of about 10 minutes of video ahead of the playhead.
- Archive — fills from the start of the file in the background, so jumping anywhere in a title lands in cache instead of buffering.
Plus:
- Sliding window when the file is bigger than your free space — a 4K remux no longer just refuses to cache.
- Eviction takes from the front, oldest footage first, only as much as it needs.
- Rewinding a few minutes hits the disk instead of re-fetching.
- Rate-limit aware — the pool remembers the level a provider throttled at and steps down by one connection instead of halving to a crawl, then re-tests every five minutes.
- Add-ons that refuse byte-range requests are detected and skipped by auto-select, instead of silently making seeking and previews impossible for the whole session.
- The cache bar tells the truth now — small gaps are no longer papered over.
🌈 Picture quality
- HDR / Dolby Vision colour fix. Untagged HEVC remuxes were arriving with no colour tags, so VideoToolbox defaulted them to BT.709 SDR and HDR played washed out. Colour is now recovered from the bitstream itself.
- Accurate seeking. Seeks hold the last frame and cut cleanly at the target instead of replaying from the previous keyframe — which is also what made ±10s skips look like they were "jumping."
- Pause-rewind fixed. Pausing for a while and coming back no longer crawls forward to catch up.
- True-24p judder fixed on the one display-request path that had been missed.
- Returning from the app switcher now flushes the pipeline on Dolby Vision sessions.
🔊 Audio & subtitles
- Audio Sync — a per-title lip-sync offset, ±50ms up to ±2s, remembered per movie or show.
- Preferred audio language works on every engine, including streams that announce their tracks late. Commentary and described-video tracks are never auto-picked.
- Subtitle Size and outline colour finally do something. Embedded ASS/SSA tracks were stamping their own font and colour onto every cue, overriding your settings. Native captions are styled too.
- Setting subtitles to None no longer leaves the last line frozen on screen.
- Subtitle language matching fixed — "es" was matching Chinese and Japanese.
🎯 Finding a source
- Auto-select has a deadline — 20s per candidate (60s manual), then it moves to the next link. The resolve chain used to be unbounded by construction.
- Back cancels a slow resolve and reveals the manual list, instead of popping you out of the page entirely.
- The preferred add-on's links are exhausted before falling back, and the app tells you what the stream actually is.
- No more loading-screen flash when auto-select fires.
- Results ranked by add-on capability rather than whoever answered first.
🏠 Home & navigation
- Pinned hero billboard that mirrors whatever you're highlighting. It never auto-advances on its own.
- Hero trailers — rest on a title and its trailer fades in behind the artwork, about 3 seconds cold. Muted by default; both the feature and its sound have toggles.
- Auto-hiding sidebar, revealed by pushing left at the edge (using the focus engine's own "no candidate" signal, so it doesn't fire mid-row).
- Live TV favorites, with a Favorites row and a Live Channels row on Home.
- Full stream names option, so release names wrap instead of truncating.
- Leaving the sidebar lands on the row you left, not the fourth card.
- Detail pages open on Play instead of hopping to the synopsis.
- Fixed the stuck focus lift — the poster that stayed raised while focus moved on.
- Fixed detail pages half-loading permanently after a single network flake.
🗂 Collections
- Categories view — one row per folder, the way the desktop app lays it out.
- Duplicate collections repaired; adding is now an upsert, and switched-off collections are no longer invisible to lookups.
- Trakt community sources — network-based browse endpoints for Netflix, Disney+, Max, Prime Video, Apple TV+, Hulu, Paramount+, Peacock, FX, AMC and BBC One.
- Folder tabs are reachable from anywhere in the grid, and returning from a title no longer reloads the screen.
👥 Profiles
- Add-ons, plugins, debrid, player & subtitle settings, TMDB, theme and badges are all per-profile now, each with its own "Separate per profile" switch in Settings → Account.
- Fixes profiles showing someone else's add-ons and layout — the sync layer had been writing every profile's data to profile 1.
🔄 Sync
- Things you delete stay deleted. Removing a profile, clearing something from Continue Watching, un-saving a title or un-marking watched all used to come back on the next sync. All four are fixed with persisted removal records.
- Trakt and SIMKL sync on their own, no Orivio account required, and every connected service pushes immediately when something changes locally.
- SIMKL Continue Watching cards were being deleted within 30 seconds by the next sync tick. One missing entry in a list; big effect.
- Steady-state full sync went from 8-9 seconds to about 2.
▶️ Continue Watching
- Fixed episodes that opened to a dead screen with no sources. Several identity bugs: shows typed "tv"/"show"/"anime" were being sent to a movie lookup, season and episode numbers were getting dropped, and some rows were keyed by an id the add-ons had echoed back rather than the real one.
- Hold an episode → Play Manually, routed through the same repair.
- Resume no longer gets clobbered back to the start during source switches.
📚 Plex & Jellyfin
Sign in from Settings → Integrations and browse your own server's libraries from the Library tab, including episodes and Up Next.
⚠️ This one is untested. I haven't been able to try it against a real Plex or Jellyfin server, so it ships unverified — treat it as a beta. If it doesn't work for you, please open an issue and say which server and version you're on; that's the only way it gets fixed.
⚡ Performance
A full pass for Apple TV HD (A8) and 4K gen 1 (A10X):
- Store loading, sync decoding and push-body building moved off the main thread.
- Background sync stretched on older boxes, so browsing isn't competing with it.
- Memory budgets and eviction for image, TMDB, playlist and GIF caches, with purges on memory pressure.
- Far less work per button press on the library, discover and collection screens.
- Preview thumbnails no longer re-render the entire player view as they arrive.
🛠 Stability
- First-frame watchdog — a source that opens but never shows a picture used to sit on the loading screen forever. It now fails over after 25 seconds.
- Stall watchdog re-arms instead of firing once and giving up.
- A fix deep in the FFmpeg layer where a seek could queue forever behind a read blocked on a stalled connection — this was much of "plays for a second, then freezes."
- Silent gaps in the cache right in front of the playhead, minted at load time, are gone.
- Live Status panel in the player's Video tab: download rate, lead, bytes on disk, pool state and engine buffer.
Install
Both IPAs are the same unsigned arm64 tvOS build (Apple TV HD / 4K, tvOS 17+); your sideloading tool re-signs on install.
OrivioTV-V7.Sideloadly.ipa— for Sideloadly and similar tools. Uses the historical bundle id, so existing installs update in place with data intact.OrivioTV-V7.Sideload.ipa— generic sideload build with the project's own bundle id.
If something's broken, open an issue — reports with the title and the add-on you used are the most useful. And if you'd like to support the project: ko-fi.com/oriviotv