github VortXTV/VortX v0.3.14-beta.9
0.3.14 Beta 9

latest releases: v0.3.16, v0.3.15, v0.3.14-beta.31...
one month ago

0.3.14 Beta 9

Note on the downloads. The CI build for this release is being repaired, so the Apple TV,
iPhone/iPad and Mac builds attached here all carry a -local suffix: they were built on a
development machine from the same tagged commit, and they are the exact builds that were tested on
device. Their SHA-256 checksums are in SHA256SUMS-local.txt. Reproducible CI assets will be added
alongside them shortly, at which point the local ones and this note will go.

The biggest release since 0.3.14 opened. A Mac can now do the heavy work for an Apple TV, the built-in player finally reads the second picture layer of a 4K Blu-ray rip, Dolby Vision plays through to the end instead of falling to HDR10, Atmos reaches your receiver, and Blu-ray subtitles work for the first time.

Let a Mac be the engine

Turn on the engine on a Mac, pair an Apple TV to it with a six digit code, and the Mac does the container and file work while the Apple TV spends its whole chip decoding and showing the picture. Video is copied across untouched, never re-encoded, so Dolby Vision stays true Dolby Vision and the picture is identical. Because the Mac has room to hold the whole film instead of a small moving window, you can seek anywhere, backwards as well as forwards, which the Apple TV cannot do alone. VortX finds the Mac on your network by itself, or you can type its address for setups like Tailscale, and nothing is shared until you pair. If the Mac sleeps, quits, or leaves the network mid-film, playback carries on where it was. The Mac can run the engine with no window open. Off by default, and nothing changes for anyone without a Mac.

The protocol underneath is plain HTTP and JSON with a bearer token and no Apple-specific types in it, so the Android and desktop clients can implement the same thing later.

Dolby Vision

Dolby Vision plays, and keeps playing. Alongside the Dolby Vision picture the app publishes a plain HDR one as a safety net. That safety net had its Dolby Vision configuration stripped out but kept the Dolby Vision brand in its header, so it announced a format it was not carrying, and the player threw it out within milliseconds every time it loaded it. It was also advertised as the cheaper of the two, so the player actively preferred the broken one over the working one. Nine times out of nine that safety net was loaded, playback died before a single frame was requested. The header is corrected, the two are no longer offered side by side inside one stream, and once a real Dolby Vision picture is on screen the player is held to it.

Profile 7 files keep their second picture layer on the built-in player. Most 4K Blu-ray Dolby Vision rips carry the picture as a base track plus an enhancement layer holding the detail in the brightest highlights and deepest shadows. On the built-in player that second track was thrown away unread and the picture was flattened to ordinary HDR with no Dolby Vision information at all. We now build our own player engine from pinned upstream sources, and it pairs the two tracks and combines them the way the format intends.

A title that needs a moment is no longer killed at ten seconds. The startup check asked whether the file was ready once, before it could have been, then fell into a blind ten second countdown with no further checking. Two of every eight titles were ended that way, one a tenth of a second after its first piece of video was already prepared and waiting.

Dolby Vision no longer flickers before it settles, and starts at the beginning. Repeated identical display-mode requests are ignored, so the HDMI link renegotiates once instead of several times. Titles also start where you asked instead of about fourteen seconds in.

Audio

Dolby Atmos reaches your receiver. On a file whose audio is Dolby Digital Plus with Atmos, the Atmos data is carried through untouched. On a file whose only audio is TrueHD, Apple TV cannot pass that through at any quality, so it is converted and the badge honestly says surround rather than Atmos.

Dolby Digital Plus is actually produced now. A Dolby Vision file with TrueHD or DTS-HD MA audio has to be converted before that lane can play it. The converter always asked for Dolby Digital Plus and settled for AAC when it could not have it, and that encoder had never been built into the app, so it settled every single time. It is in the build now.

Every audio track in the file is offered. The rule for alternate audio demanded a different language from the main track, so a file with seven English tracks qualified none of them and the audio menu had nothing to pick.

Subtitles

Blu-ray subtitles work for the first time. Blu-ray discs store subtitles as pictures rather than text, and nothing in the subtitle path could read a picture, so a Blu-ray remux offered no subtitles of its own at all. Those pictures are now read on the device and turned into ordinary subtitles, appearing in the normal list with the normal styling. This is a first pass and it shows: recognition is bounded so it can never slow playback, which brings real limits worth reading in Known issues below. It is not flawless on stylised or non-Latin type, and a file carrying its own text subtitles still uses those first.

Every subtitle track in the file is offered. A file carrying thirty-nine subtitle languages used to show one.

We build our own player engine now

This is the piece of the release we are proudest of, and it is what made everything above possible.

VortX used to take the player engine as a prebuilt package, which meant taking whatever version that package happened to ship and waiting for someone else when it lagged. It no longer does. We build the whole stack ourselves from pinned upstream sources: mpv, libplacebo and FFmpeg, nine slices across Apple TV, iPhone, iPad and Mac, with two patches of our own on top.

Our mpv is 895 commits ahead of the last upstream release. Not a fork that drifted, a deliberate pin to master because the Dolby Vision enhancement-layer work we needed lives there and has not been released yet. Waiting for it would have meant waiting months.

libplacebo is built from source at API 371 rather than the 360 the prebuilt package carried. That one matters more than it looks: mpv's enhancement-layer support is compiled out entirely below API 367, silently, with a perfectly green build. Bumping mpv alone would have produced a build that looked correct and did nothing. Both had to move together, and finding that out cost real time.

FFmpeg stays where it was, deliberately. We audited every one of the 67 FFmpeg functions VortX calls against the newer line and found none of them removed or changed, so the move is safe on our side. What we have not done yet is rebase the player package's own FFmpeg patches onto it, and until that is measured we are not moving. The bounded cost of standing still is one file type: a Profile 7 Dolby Vision file that packs both picture layers into a single interleaved track needs a splitter the current version does not carry, so those files play from the base layer alone. Files that carry the two layers as separate tracks, which is most of them, work.

Two patches are ours. One carries the Dolby Vision enhancement-layer work through the packaging our Apple builds need. The other makes the render surface notice when it has been resized, which is why rotating a phone no longer tears down and rebuilds the entire video pipeline.

We also turned on the Dolby Digital Plus encoder, which had never been compiled in, so the converter that always asked for it stopped silently settling for AAC.

The cost of owning this is real and worth being honest about: nine slices to rebuild, upstream to track, and the two patches to carry forward every time either moves.

Moving the app into the backend

A sideloaded app is a pain to update. Unsigned IPAs expire, re-signing is a chore, and every fix we make is worthless until you go through that again. So we are steadily moving VortX's behaviour out of the app and onto our own servers.

The goal is blunt: as close to 99 percent of what VortX does should be changeable without you installing anything. When something breaks, we fix it once on our side and every device picks it up, usually within a few minutes of opening the app.

A lot of it already works this way. Ratings, posters and artwork, the skip-intro database, source pooling, the add-on and catalog behaviour, and a growing set of feature switches all come from our own services rather than being baked into the build. This release wired up several more of those switches and made the app pick up changes when you bring it back to the front rather than only after a full quit. It also made a bad setting unable to keep the app shut: after three failed launches it discards what we sent and starts on the settings built into the app.

What cannot move is the part that has to run on your device: the player, the decoder, Dolby Vision, and the engine. Those still need a build. Everything else is heading server-side, and each release moves more of it.

Everywhere else

Apple TV tells the system what you are watching, and the same card is fixed on iPhone, iPad and Mac. Playback registered nothing with tvOS, so the Now Playing card sat empty and no system transport reached VortX. The card now carries the title, show and episode, poster and position, and play, pause, skip and scrubbing all work. On iPhone, iPad and Mac the card gains the poster, the series details and a working position bar, and an explicit Play sent from Control Center no longer pauses a playing title, which it used to because play, pause and toggle all ran the same toggle. The position it reports at the first frame is the real one rather than zero.

Turning subtitles off no longer loses your subtitle for the rest of the session. Switching an add-on or external subtitle off used to discard it outright, so turning subtitles back on left you with nothing to turn back on. It is kept now, and external subtitles sit in the list as proper rows alongside the file's own.

The Mirror Continue Watching from Stremio setting does what it says. The toggle existed but was not wired to anything, so turning it on changed nothing. It now genuinely mirrors, and the settings text on every platform was rewritten to describe what actually happens rather than what was intended.

Rewinding goes back. The player was only offered a few seconds of film behind wherever it had downloaded to, and it downloads a long way ahead of what you are watching, so the earliest point it would return to was often already ahead of you. It now holds two and a half minutes of playing time behind you.

Coming back from an episode returns you to that episode. The page trusted whatever Continue Watching had got round to saving rather than what actually played.

Signing in with the QR code works. The code pointed at a link that opens the home page, so scanning appeared to do nothing. It now opens the approve page, and that page no longer loses your request when you sign in.

Settings we send reach you, and a bad one cannot keep the app shut. Several of the switches we use to turn a feature off without shipping a build were never read by the app. They are read now, they refresh when you bring the app back to the front, and a setting that stops the app opening is discarded after three attempts.

Ratings sit on the artwork like they belong there. On landscape cards the badge is one piece of the app's own frosted glass, with the score leading and the other services following a hairline rule.

Rotating your phone no longer restarts the picture. Our own build of the player engine notices the new shape and redraws instead of tearing the whole pipeline down. Resizing the Mac player window gets the same fix.

In-place update over Beta 8, nothing resets.

Please test

  • Dolby Vision, the main ask. Play a title deep into the film, not just the first minute. It should engage Dolby Vision and stay there.
  • A Mac as the engine. Turn it on in the Mac app, pair the Apple TV with the code, and play a Dolby Vision MKV. Seeking backwards should work, which it cannot without a Mac.
  • Blu-ray subtitles. On a Blu-ray remux the subtitle menu should now offer the disc's own subtitles.
  • Audio and subtitle menus. On a file with many tracks you should see all of them.
  • Atmos. On a Dolby Digital Plus Atmos file your receiver should show Atmos; on a TrueHD-only file it should honestly show surround.

Known issues

  • Play from start, from inside the player, does not work. The button on the detail page is fine; the one in the player controls is not.
  • Recognised Blu-ray subtitles render larger than they should. They read correctly; a sizing pass is next.
  • Recognised Blu-ray subtitles stop partway through a film. Reading the pictures costs real time, so it is given a fixed budget to guarantee it can never stall playback. A feature-length disc carries well over a thousand lines per language and exhausts that budget long before the credits, and once it is spent no further lines are produced for the rest of the session. Lines already recognised keep showing; new ones stop appearing. This is the limitation we most want to remove.
  • On the Dolby Vision lane, only the first four Blu-ray subtitle languages actually produce text, but every language is still listed. Picking any of the others gives you an entry that stays permanently blank rather than an honest "not available". The cap exists so recognition can never slow playback; listing the ones it will never fill is our bug, not a design decision, and the menu should show only what it can deliver. The built-in player reads the disc's pictures directly and is not affected.
  • Recognised Blu-ray subtitles cannot be time-shifted. The subtitle delay control does not apply to them, because they travel a different path from the subtitles it was built for. A file's own text subtitles and add-on subtitles still adjust normally.

Android

A fully functional Android app matching the Apple app feature for feature is landing this August.

Android is a separate, from-scratch app on the same Rust engine, not a port. Today it is roughly a third of the way there: about 42,000 lines against the Apple app's 153,000, with 5 of 15 build sessions finished.

Done: the foundation, and it is real. The engine runs natively with the same catalogs, library, search, discover and account sync the Apple app uses. Add-ons install and manage. Titles, series, seasons, episodes, watched state and Continue Watching all work. The design system is in place across phones, tablets and foldables, and appearance, tab-bar, debrid-key and remote-config layers landed this cycle.

Next, and it is the one that matters: the player. Source ranking, then ExoPlayer, then mpv as the primary engine, then torrents. Until that lands Android browses everything and plays very little, which is why it is not promoted alongside the Apple builds yet.

Then: settings and profiles, Live TV, backup and import, and Android TV shipping as the same APK rather than a separate one.

The published Android build remains Beta 6 and is unchanged by this release. The August target is the whole thing at parity, not a staged trickle.

Install

Mac (.dmg, easiest, never expires). Download VortX-macOS-v0.3.14-beta.9-local.dmg, drag VortX into Applications, then clear Apple's one-time quarantine: open it once, click Done, then System Settings > Privacy & Security > Open Anyway (or run xattr -dr com.apple.quarantine /Applications/VortX.app). Full guide: Install on Mac.

iPhone, iPad, Apple TV (sideload the IPA). The IPAs are unsigned, because VortX is open-source and distributed outside the App Store with no Apple Developer ID yet, so you re-sign them yourself with Sideloadly, AltStore / SideStore, or Signulous. No jailbreak. Full guide: Installing on iPhone, iPad, and Apple TV.

Android. On Android TV or Fire TV, the Downloader app with dl.vortx.tv fetches the newest APK.

Each Apple asset lists a SHA-256 checksum (SHA256SUMS-local.txt for the current -local builds) so you can confirm your download matches what was published. Once the reproducible CI assets land they carry SHA256SUMS-ci.txt, which lets you check them against what the public GitHub Actions workflow built from this code.

Don't miss a new VortX release

NewReleases is sending notifications on new releases.