Skip to content

VortX 0.3.15 (build 233)

Latest

Choose a tag to compare

@mamaclapper mamaclapper released this 29 Aug 23:05

0.3.15 - the stable VortX release from 0.3.13 through the complete 0.3.14 line

Install this over 0.3.13 or any 0.3.14 Apple build. On Android, it installs over the production-signed Beta 31 build. The older public Android previews from Beta 1, Beta 6, Beta 10, and Beta 12 used a different certificate and must be uninstalled first. 0.3.15 is the cumulative stable release after 0.3.13. It carries the Apple playback, Dolby Vision, subtitle, source, watch-state, account, and macOS work from every 0.3.14 beta, and it brings the Android app through its production-signed phone, tablet, Android TV, and Fire TV release lane. It also includes the post-Beta 31 reliability, diagnostics, source-selection, localization, and release-feed corrections that were completed before the stable cut.

This is a large release. The sections below are intentionally detailed: they cover the feature work, bug fixes, infrastructure, and known limits that accumulated from the 0.3.13 baseline rather than presenting only the last beta's headline.

Stable-release identity:

  • Apple: 0.3.15 (233).
  • Android: versionName 0.3.15, versionCode 233.
  • Stable source commit: 57f0bd2b68c79cddc5d784187c7079029047ce01.
  • Apple packages: VortX-tvOS-v0.3.15-ci.ipa (7e4aad49f59db588f7f612795ca5602c6fee8974bd654f2377e73ecd25120628), VortX-tvOS-lite-v0.3.15-ci.ipa (05832a1a6fd4df3a040644ac0a347b16444a0bbe250e2fbbb5926a03de8cb78a), VortX-iOS-v0.3.15-ci.ipa (3345a872e545bf40ec9801ef0a2980c5ee481cfdefd21ab28c55e2831f15d026), and VortX-macOS-v0.3.15-ci.dmg (1e64c0ac5b50770d05ed9ea1abf1f974ba176c5b4f0ad8fb0dbdb22cafe79148).
  • Android packages: VortX-0.3.15-full-mpv-universal.apk (b8664be0b09ce710318810158c0283bf87ad47c0748a6c09dac5c1b058a5a5a2), VortX-0.3.15-play-media3-universal.apk (6d1a618b1a4cf9e031800ceed5866f9a2fae1089a5cb98df66adf73ae962e95f), and VortX-0.3.15-play-media3.aab (c35634ec3004ee0209d9f2d161ae4a438e1d2ad9f095d027f49ccf07fa3d8716).

What's fixed

Playback, pause, episodes, and navigation

Pause remains a pause. A paused Dolby Vision or HLS title is no longer allowed to resume because the built-in player treats an open-ended local stream as live. The app distinguishes an ordinary buffering wait from a user pause and reasserts the requested pause only when the player drifts from it. An internal cache-flush EOF is also kept out of the media-completion path, so pausing an episode cannot trigger an automatic next-episode transition.

A series stays on the episode you selected. Episode identity now follows the selected show, season, and episode through source resolution, engine transitions, progress writes, player dismissal, and detail-page refresh. Returning from a late episode no longer walks back through several earlier episodes, and a stale title-page snapshot cannot pair one episode's source or subtitle with another episode's video.

Previous Episode and Next Episode use the intended neighbours. The controls resolve the adjacent episode from the current season and current episode, carry the correct playback identity, and prevent two fast Next presses from starting two loads. A prepared next source survives an engine demote, so the app does not lose the work already done for a binge.

Watched marks belong to the episode that actually finished. A completion from an outgoing episode cannot be attributed to the incoming one during a fast transition. Progress and watched writes are fenced by episode identity, and the detail page republishes when watched membership changes instead of waiting for an unrelated field change.

Back returns to the current episode. Binge advancement, player close, detail-page refresh, source-list context, and subtitle selection now share one current-episode identity. This fixes the common case where pressing Back after episode 13 showed episode 10 or 11 and then offered the wrong source.

Resume no longer blanks the screen or resurrects stale recovery. A resume, a previous-episode jump, and a source switch wait for a usable first frame before applying a mid-file seek. If the target cannot be reached within a bounded window, playback continues from the earliest usable position without regressing the saved position. Once a positive near-target time tick proves the resume succeeded, its watchdog is cancelled immediately, so a later manual seek cannot be mistaken for a failed resume and reapply the old suppression floor.

Manual source changes stay manual. A source selected in the player is the source that is mounted after recovery, and a source failure no longer reloads the title's original source by accident. Automatic hops do not reset the recovery budget, while a deliberate user selection receives a fresh attempt. Resume positions are clamped inside the file actually mounted, and implausibly short placeholder streams are rejected instead of being played at the end of a feature.

The player source selector is ordered by intent. Quality comes first, audio language comes next, and the matching source list is below those filters. A title detail page offers an explicit player choice before playback when the source and platform support it. The same choice is available per launch from the in-player source flow, with a safe compatibility fallback when an engine cannot play the chosen source.

Per-source player choice is available where it is meaningful. A long press or source action can choose the VortX player, AVPlayer or Media3-compatible playback path for that source. The app hides choices that cannot consume the source instead of promising an impossible route. Long episode lists also expose a Scroll to Top action on the Apple surfaces so returning from a late episode does not require repeated remote or trackpad navigation.

Stalls, frame pacing, and buffering

The remux lane has a bounded recovery path instead of an endless spinner. AVPlayer's steady-state buffer is coupled to the remux producer's byte budget. Producer-lead parking has byte-level hysteresis, local-remux startup uses an 8-second buffer with a 12-second readiness floor, and a seek-nudge tier plus buffered-retirement gate run before an engine demote. A single same-engine playlist reload can recover a mid-play CoreMedia -1008, and a proactive read-liveness interrupt keeps the remux input moving. These paths are bounded and record their decisions in diagnostics.

Large files fill more gently. The disk-backed read-ahead ramp grows only while presentation keeps up, backs off after a real drop burst, and caps its ceiling using the live stream bitrate. A user seek's short decoder burst is not mistaken for fill pressure, so a seek does not shrink the buffer exactly when it needs to refill. The producer preserves a time-based rewind window while pacing far-ahead reads.

A far seek shows progress and recovers a wedged refill. The player displays buffering while a cold mid-file read rebuilds, play and pause remain responsive, and a progress-aware refill watchdog re-issues a stuck jump up to a bounded number of times. A healthy but slow refill is left alone. In-window seeks do not empty the forward cache unnecessarily.

Memory-pressure shedding is edge-triggered. Advisory tvOS warnings no longer repeatedly drop the cache and cause a metronomic stutter. A shed fires once on entry to the recoverable pressure band and stays latched until memory genuinely recovers or the title changes. Real low-memory pressure still takes the safety path, and a recovered device can grow its buffer again.

The streaming cache is a real, bounded disk cache. When enabled, large forward reads are stored on disk with a small in-memory index and a bounded viewing-time span. Local torrent playback keeps its smaller in-memory behavior because its server already buffers to disk. The setting remains off by default until the user chooses it, and the old oversized-memory failure mode is guarded.

The embedded server survives suspension and Dolby Vision teardown. A suspended local socket is re-established only after a real suspension and only when the port is genuinely refused, never by force-closing a busy stream. Server status no longer reports healthy while the socket is deaf. Dolby Vision cancellation interrupts reads quickly, releases its buffer, re-trims the server after a DV session, and records a scrubbed server-death event when one occurs.

Dolby Vision, HDR, Atmos, and the two player engines

Dolby Vision no longer loses a stream because of a sticky soft interrupt. A quiet remux read cannot leave the FFmpeg interrupt state poisoned for later reads. Cancellation remains an interrupt, while normal read retries start cleanly. This closes the proven build-231 failure where a true Dolby Vision stream later returned AVERROR_EXIT and fell back to HDR10.

The true-DV lane keeps its intended stream. The local playlist advertises only complete resident segments, uses their real sequence numbers, retains the initial bytes until AVPlayer is ready, and falls back only after a real error or a bounded no-progress condition. The player does not advertise a broken plain-HDR variant as if it were Dolby Vision. Display-mode changes occur only after a stream is confirmed Dolby Vision, and repeated identical requests are ignored so the HDMI link does not renegotiate repeatedly.

Dolby Vision resume and long playback are safer. The remux duration is synthesized for the open-ended HLS presentation, so resume, progress, skip segments, scrobbling, and watched-at-end work on the true-DV lane. Forward-only seeks are clamped at the produced edge, a resume floor is preserved through a demote, the consumed video window remains large enough for the current read, and an abandoned load cannot change the display mode after the player has closed.

Profile 7 and FEL handling is honest. The self-built MPVKit and libplacebo stack pairs separate base and enhancement tracks where the source proves the relationship. A normal multi-video-track file no longer produces a diagnostic claim that an enhancement layer was discarded unless dependent-layer evidence is actually present. Profile 7 files that interleave both layers in one track still need a splitter not included in this release and may play from the base layer alone.

Slow but alive Dolby Vision opens are given time. The startup gate counts source reads and real remux progress, not only finished output bytes or published segments. A slow 4K source is not demoted merely because its first frame takes time, while an actually dead source still fails soft within a bounded limit.

Dolby Vision conversion handles more audio. Hi-resolution 192 kHz and 176.4 kHz TrueHD or DTS-HD audio no longer causes a silent HDR10 fallback. Dolby Digital Plus with Atmos is carried through when the source and route support it. TrueHD-only Apple TV routes are converted to a supported surround representation and the badge says surround rather than claiming Atmos. The E-AC-3 encoder is built into the player stack instead of silently settling for AAC.

All usable audio tracks are offered. Seven English tracks no longer collapse to an empty alternate-track menu merely because they share a language. Audio selection follows the user's language preference, excludes commentary from an automatic language fallback, and enables a matching subtitle language when audio must fall back to English.

The built-in player and AVPlayer have parity where each can support it. Playback, seeking, progress, resume, watched-at-end, skip segments, trickplay, scrobbling, binge advance, chapters, speed, audio selection, subtitle selection, and the player engine switch are covered across the Apple surfaces. Controls that AVFoundation negotiates itself, such as manual Atmos or passthrough selection, audio delay, and hardware-decoder selection, are hidden on that engine rather than presented as broken controls.

The player stack is built from pinned sources. VortX builds MPVKit, libplacebo, and the required FFmpeg integration from pinned sources. The MPV line includes the Dolby Vision enhancement-layer work, libplacebo is built at the API level required for that support, the E-AC-3 encoder is included, and the Apple render surface handles resizing without tearing down the pipeline. FFmpeg remains pinned deliberately until the player package's own patch set is rebased and verified.

Subtitles and seek previews

Subtitle menus are grouped by language. The panel begins with Subtitle Settings and Off, then groups embedded, add-on, and community subtitles by language. Every available track in a language remains reachable without an unbounded flat list. The player remembers an external subtitle when it is turned off, so turning subtitles back on does not discard the selection.

External subtitle loading is bounded and hardened. Add-on and community subtitle downloads allow the larger files used by long films, wait within a bounded timeout, and report their real failure. The transport resolves a hostname once, connects only to the vetted numeric address, refuses redirects, and preserves framing safety: repeated harmless non-framing headers are accepted, while ambiguous duplicate Content-Length or Transfer-Encoding headers remain rejected.

A subtitle cannot block every later subtitle. In-flight subtitle state clears on engine changes, source switches, and episode changes. A completed load refreshes the panel immediately, a failed load is visible on Apple TV, and a subtitle that loaded into an engine that was torn down can be selected again.

Bitmap subtitles are more useful. PGS size presets now apply to built-in bitmap subtitles. The Dolby Vision OCR path has a larger, faster bounded track budget, and stable cue identities prevent the same cue from flashing two to four times across HLS segment boundaries.

Seek previews use the real capture data. The lookup searches resident captures first and then disk-backed captures off the presentation path, in either direction from the requested position. A forward drag into not-yet-watched territory can use the nearest captured frame, and the UI holds a loading state while the read is in flight instead of flashing unavailable.

Capture failures fail closed. Unsupported HDR or wide-gamut pixel formats no longer cause an endless retry storm. The capture path stops after repeated nil results, preserves the actual trickplay-unavailable reason in diagnostics, and keeps capture work off the critical frame-presentation path. Community trickplay remains optional and its unavailable reason is now retained rather than discarded.

Watch state, Continue Watching, and sync

Watched state is published from live membership. A count-only comparison cannot miss a changed episode with the same count, and a delayed disk read cannot overwrite the active snapshot. Membership updates are republished immediately and are fenced by generation and episode identity.

Continue Watching is deduplicated by canonical identity on Apple. Exact identifiers and known aliases for the same series collapse to one row without fuzzy title-only matching, so two genuinely different titles are not merged. A stale generation cannot resurrect an alias after the row has been removed. A broader Apple, Android, and web parity rewrite completed after the stable tag was sealed and is intentionally held for independent review in the next cut.

Last-stream memory stays on the device. An in-progress position held only as a local launch hint does not climb into account sync and overwrite another device's current position. Account progress still syncs through the normal profile-owned path.

Sync merges instead of clobbering. Account settings, profiles, library entries, watch history, and per-profile source preferences merge against the newest account state. A local change survives a pull until it is pushed, overlay-profile settings do not overwrite the owner, and pending changes survive token refresh. Deletions use durable tombstones and timestamps so an older device cannot resurrect a newer removal.

Offline and download state are honest. Offline launch routing waits for a confirmed connectivity verdict before choosing Downloads or Library, never routes after navigation, and does not land on a hidden tab. Download retries are bounded, locked-device saves complete on unlock, batch downloads report skipped episodes, and a failed save no longer restarts from scratch forever.

Sources, add-ons, TorBox, and trailers

TorBox failures are distinguished from client failures. The primary TorBox search hostname can be unavailable at the DNS or transport layer. VortX no longer tries the invalid account-host fallback that returns 404, preserves usable results from healthy sibling legs, enters a read-only cooldown after quota failures, and logs one suppression per episode. It reports failure only when no usable leg succeeds. This does not claim to repair a TorBox outage.

Sources rank by actual quality and availability. Cached debrid and usenet sources can win a race without waiting for a stale ranking snapshot. A remembered source is a soft preference that yields to a materially better resolution, cache hit, or source tier, while a same-episode manual failover remains sticky. Foreign-subtitle labels are not misread as foreign audio, words such as Instant in a title do not create a false cache badge, and trailers do not enter the quality picker.

Large source lists stay usable. Ranking caches now cover large titles, cached variants are memoized separately, debrid cache merges run off the main actor, language detection and source work are bounded, and malformed size or seeder values are clamped before scoring. A title with thousands of sources no longer freezes or crashes the interface from repeated cache rebuilds.

Re-find sources replaces stale links. The detail page and the stopped-player failure path can re-query stream add-ons instead of serving a cached empty list. It never interrupts a healthy mid-play session or a warmed next episode.

Add-on install paths are clearer and safer. A /configure page or a redirect to one no longer installs a valid-looking but empty manifest. The app asks for the personalized manifest link instead. Public HTTP manifests work again for community add-ons such as Comet and StreamFusion, while loopback, LAN, private-address, redirect-hop, size-limit, and manifest validation protections remain in place. Removing an add-on stays removed unless it is explicitly reinstalled, and reinstalling offers an update confirmation when the add-on already exists.

Community sources and ratings are usable. Singularity rows preserve resolution, size, seeders, source kind, and per-user resolution. Torrents, direct links, and usenet sources resolve through the current user's configured services, never another user's link. Community results merge with add-on sources without duplicate walls, and catalog-provided ratings are preserved.

Singularity contributions retry safely. A transient contribution failure no longer loses the descriptor before transport can retry it. Retries are bounded, cancellable, idempotent, and limited to transient transport conditions; authentication and validation failures are reported without retrying forever or blocking playback.

Debrid Cloud Search is where source discovery happens. The Cloud Search entry is available from Search and Play a link on supported platforms, including the TV surface, with clear no-key, loading, empty, and error states. It reuses the existing source-resolution and player handoff rather than creating a second playback path.

Trailers recover after backgrounding and play the requested language. The local helper releases and reacquires its port after suspension, advances by bytes actually delivered, selects the preferred audio language, and stays inside VortX. If an in-app trailer cannot play on Apple TV, the YouTube handoff preserves the language-preferred id.

What's new

Apple TV, iPhone, iPad, and Mac

VortX is the primary account. Sign-in leads with a VortX account on every platform. Stremio, Trakt, SIMKL, and Nuvio remain optional integrations. A fresh install restores owner add-ons, library, profiles, and progress at sign-in without waiting for a later background cycle, while tri-state and never-zero guards prevent a network blip from wiping populated data.

Profiles are private where they should be. The launch "Who's watching?" picker appears when there is a real profile choice, PINs are requested before switching, overlay profiles keep private local history, and the owner profile uses the synced account history. Profile switching updates track-language and subtitle-style preferences without leaking one profile into another.

Trakt and SIMKL are full integrations. Device-code sign-in, play/pause/stop scrobbling, ratings, watchlist and history import, personal lists, Trakt resume suggestions, SIMKL plan-to-watch, SIMKL ratings, and Upcoming rows are available. Imports begin when enabled, token refresh is single-flight and protected against self-sign-out, SIMKL requests use required parameters and rate limits, and provider-specific import, rating, and watchlist toggles sync per profile.

Nuvio add-on import is available. Paste Stremio-compatible Nuvio manifest links in Integrations and install them through the same SSRF-hardened add-on path. VortX does not run Nuvio's private provider plugins and does not require a Nuvio account.

Media servers join the catalog. Plex, Jellyfin, and Emby can contribute libraries and direct-play sources. Pairing uses the supported PIN, Quick Connect, or password flow, credentials stay in Keychain and encrypted sync, matching is conservative and id-based with a guarded title-and-year fallback, and the feature stays invisible when no server is connected. Transcoding negotiation is not included; the current lane is direct play.

Live TV is built in. M3U and Xtream playlists, XMLTV guide data, channel navigation, and source removal are available through the Live tab. Playlist registration validates the source first and revokes it across devices when removed.

Smart Source Selection is one place. Prefer words, Only words, Avoid words, hide or rank-down behavior, per-profile settings, Kids hard-hide, live source-list preview, and optional automatic best-match selection are collected under Streams settings.

The Home and Discover surfaces are richer. Streaming services use regional catalog families, support subscription, ad-supported, and free tiers while excluding rent and buy, and can be selected and reordered. Decade shelves carry cover art, curated rows rotate, Home pages load the complete catalog board, and the poster-wall layout is available on Apple TV. Home, Discover, and detail pages carry cross-provider ratings, Where to Watch, More Like This, cast and crew pages, upcoming rows, and profile-aware watched badges. Add-on-provided poster art and ratings pass through without being overwritten, while the optional richer renderer fails back to the original artwork.

Localization is more accurate. Home and Discover headers are present in all supported app languages, French catalog headings use whole phrases rather than English word order, and French Discover labels cover popular, trending, upcoming, new, decade, theater, and television rows.

The Mac app has a native shell. macOS uses a NavigationSplitView sidebar, a real Settings scene with General, Playback, Subtitles, and Sources categories, a Go menu and Command-key tab shortcuts, a centered resizable window, pinned detail artwork, independent episode and source scrolling, an in-app edge-to-edge fullscreen mode, and Mac-sized profile and hero layouts. Tabs that are not visible unmount, poster rails load lazily, artwork decodes once, download progress redraws at a sane cadence, and watch-history persistence no longer rewrites constantly.

System playback controls are complete. Apple TV Now Playing and the iPhone, iPad, and Mac media cards show the correct title, show, episode, artwork, position, and transport state. An explicit Play command no longer toggles a playing item into pause. The first-frame position is reported correctly.

Appearance and accessibility are safer. Shared VortX glass chrome uses a warm translucent material, an ember active state, and an opaque legible fallback under Reduce Transparency. Liquid Glass is used only on supported systems and only for floating chrome. Focus treatment, card shadows, landscape rating badges, narrow-phone source rows, profile picker centering, subtitle style controls, and screen-reader descriptions are aligned across Apple surfaces.

Android phone, tablet, Android TV, and Fire TV

Android is a real two-distribution release. The Full APK contains the VortX mpv engine and is intended for sideloading. The Play APK and Play AAB use the Media3 engine and keep the Play GPL native-player boundary clean. The universal artifacts include arm64-v8a, armeabi-v7a, and x86_64; the ARMv7 slice supports compatible 32-bit Fire TV devices running Android 8 / API 26 or newer.

Production signing is established. The Full APK, Play APK, and Play AAB are bound to the stable tag and source commit, checked against the pinned production certificate, and published with checksums and signing provenance. Beta 1, Beta 6, Beta 10, and Beta 12 preview APKs used earlier preview or debug signing identities and must be uninstalled before installing this stable Android build. Future production-signed updates use the stable identity.

Android playback is nearly complete in the source tree. The VortX mpv lane and the Media3 lane provide source ranking, direct streams, HLS, debrid, raw torrents through the in-process server, progress writeback, episode switching, next-episode preparation, seek and aspect controls, chapters, playback information, sleep timer, hardware or software decode selection on the VortX lane, audio and subtitle selection, subtitle delay and track controls, player switching where compatible, system media integration, Picture-in-Picture where supported, and Google Cast for receiver-reachable direct, HLS, and debrid streams. Torrents remain local because a Cast receiver cannot reach the in-process torrent server.

Android series and source controls match the Apple intent. The player has an episode picker, a Quality-first then Audio-language source selector, matching sources below the filters, source ranking and pinning, a player choice on the detail page, a best-source Watch Now row, and per-source player selection where compatible. Android TV gets D-pad reachable source groups, sort and filter, Quality submenus, cached-source badges, and long-press pin or offline actions.

Android TV is a real 10-foot surface. It has Home, Discover, Search, Library, Live TV, Add-ons, Downloads, and Settings navigation; a launch profile picker with PIN entry; account QR sign-in; series season and episode browsing; watched and unwatched controls; Cast and Crew and related title pages; a cinematic focus hero with artwork, metadata, motion, and optional muted trailers; Continue Watching in the Play Next row; and D-pad access to player actions such as Skip Intro, source filters, audio, subtitles, and stream-link sharing.

Android downloads are manageable. A bounded queue groups Downloading, Up next, Paused, and Failed items. Users can move pending work, pause, resume, retry, change concurrency, see storage usage, and play finished files offline. Auto-delete watched downloads remains opt-in. A stricter transactional deletion repair was withheld from this stable cut after review found that a persistence failure could otherwise leave an index row pointing at deleted media.

Android trickplay is consent-aware. Community scrub-preview fetching and on-device capture follow an explicit user consent setting. The setting is visible in Android settings, applies consistently to phone and TV, cancels active capture, upload, and fetch work when disabled, and keeps the player usable without previews. No preview contribution is made after consent is withdrawn.

Android add-ons and integrations are broad. Add-ons can be installed, reordered, updated with confirmation, health-checked as Online, Slow, or Unreachable, removed with durable tombstones, imported from Stremio or Nuvio, and managed from Android TV's top-level Add-ons tab. Public Letterboxd, MDBList, and Trakt lists can become local Home rows. Stremio add-on, library, and Continue Watching mirrors are independently controlled and never remove VortX data when signed out.

Android settings and profile behavior match the shared model. The app has VortX account sign-in, profile creation and deletion, per-profile colors, backgrounds, avatars, PINs, Kids mode, source preferences, app language on pre- and post-Android 13 devices, subtitle and audio language preferences, track reject terms, trailer preferences, Home and Discover controls, metadata keys, provider-specific Trakt and SIMKL sync, backups, Watch Stats, tab visibility, and a signed fleet-config layer with baked-in safe defaults.

Android notifications and accessibility are included. Followed series can schedule a local next-episode notification, launch and Settings update notices explain when a newer sideloaded build exists, TalkBack receives descriptions for player controls and the scrubber, and Android TV actions stay reachable by remote focus.

Usenet and offline playback

Use your own usenet provider without debrid. Full Apple builds can store a provider host, port, username, password, connection count, and SSL choice in the device Keychain. Credentials never enter preferences, backups, or encrypted account sync, and are sent only to VortX's on-device server at 127.0.0.1. Missing or incomplete articles fail with a clear message. TorBox usenet remains the automatic fallback, and the Lite Apple TV build remains debrid-only.

Backups and offline mode are device-safe. Apple TV QR backup uses a short-lived pairing handle rather than embedding data in the code. Android backup imports merge syncable settings without deleting device-only values. Downloads are per device, never part of the library, and finished downloads play without a network.

Web, backend, and update behavior

Remote behavior is safer and more useful. Signed fleet configuration is cached and fail-safe, applies bounded values only, and can disable or tune a feature without forcing an app update. A bad startup configuration is discarded after repeated failed launches. Settings deltas merge onto the latest account state, overlay settings remain isolated, and pending changes survive token refresh.

Updates are numerically correct and quiet. Apple and Android sideloaded apps compare versions numerically, check published releases at most once daily automatically, offer a manual check where appropriate, and show dismissible notices. Failed probes remain silent. Release feeds answer HEAD, honor If-None-Match with 304, use build-number ordering, and publish the split Apple and Android schema without promoting a prerelease into the stable channel.

Release lineage

This stable release includes the complete 0.3.14 test line. The records below distinguish downloadable releases from tags, drafts, and hardware test builds so the history is not rewritten after the fact.

  • Beta 1: the first public 0.3.14 build. VortX became the primary account, Trakt and SIMKL integrations went live, Nuvio import, media servers, cast and crew pages, QR backup, Smart Source Selection, Live TV playlists, decade art, watched badges, the glass redesign, Mac surface work, AVPlayer parity, and the first Android Phase A client landed. Profile hydration, episode source identity, Dolby Vision startup, trailers, background server recovery, source ranking safety, and Mac refinements were fixed in the same wave.
  • Beta 2: Dolby Vision and Atmos handoff corrections, Mac layout and fullscreen corrections, Apple TV focus fixes, watched-series rules for aired regular episodes, localized synopsis, add-on removal persistence, batch downloads, language filtering, Trakt watched marks, and the build-182 Apple playback fixes.
  • Beta 3: Apple TV Top Shelf, Trakt check-in, ratings and resume suggestions, Trakt lists, SIMKL plan-to-watch, Match Frame Rate, auto-delete watched downloads, Android trickplay capture, Android settings, and library transfer. Account sync changed from wholesale replacement to merge semantics.
  • Beta 4: an intermediate exact-source tag and release record for the episode-identity, finale-resume, glass, and Android wave. Its tag predated the final build-tooling commit and did not carry a valid final downloadable set; the completed work was recut under the following release records rather than being treated as a separate stable artifact.
  • Beta 5: the identity-aligned recut of the Beta 4 feature work. It made episode selection, season-pack matching, debrid file binding, progress attribution, binge publication, and finale resume authoritative. It also shipped Android sign-in, torrents, Android TV, profiles, downloads, IPTV, PiP, gestures, MediaSession, Apple player lock, Continue Watching clear, glass coverage, and the webOS/Tizen preview source. Its release record was later superseded by the corrected Apple TV launch-safe line.
  • Beta 6: the Apple TV launch-safe recut. Settings type erasure stopped the tvOS launch crash, release CI gained pinned toolchain and launch-smoke checks, and the complete Beta 5 feature set was carried forward. Android debug artifacts and the early technical preview remained available in the corresponding lane.
  • Beta 7: the first broad Dolby Vision and account-integrations wave. It added true-DV track selection, built-in text subtitles on the DV lane, QR add-on installation, Apple TV add-on reorder, immediate Trakt and SIMKL watched imports, SIMKL ratings, grey subtitle color and brightness, and fixed community contribution and retrieval, diagnostic privacy and one-time export access, QR sign-in, ratings, regional catalogs, hi-res audio conversion, caching, PiP routing, and binge tracking.
  • Beta 8: the Dolby Vision hotfix. It fixed the startup floor, resume timestamps, memory-spool exhaustion, alternate-track failure, mixed-codec audio playlists, silent failure paths, track labels, community-source metadata and merging, all-four-score artwork, ERDB fail-soft behavior, and first-open diagnostic QR display.
  • Beta 9: the Mac engine and player-stack release. A Mac could act as the engine for an Apple TV, the self-built MPVKit and libplacebo lane paired Dolby Vision enhancement layers, Dolby Vision and Atmos held longer, Blu-ray subtitles were introduced, all embedded subtitle tracks and audio tracks were listed, the backend-first configuration direction expanded, Now Playing was wired, external subtitle retention was corrected, Stremio Continue Watching mirroring was wired, rewind history was retained, QR sign-in was fixed, and phone rotation or Mac window resizing no longer rebuilt the player.
  • Beta 10: playback and sync hardening, including fresh-start zero timelines, remux and seek corrections, on-demand diagnostic sharing, owner-profile deletion protection, bounded watch counters, pooled subtitle and debrid-form parsing, signed-out sync behavior, Android's first technical preview, and web settings merge behavior. It also introduced the known signed-in launch freeze and over-strict media-TLS regression that the next hotfix replaced.
  • Beta 11: the launch-freeze correction. Keychain locking was narrowed so signed-in Home no longer deadlocked the main thread. The Beta 10 playback, web, security, and Android work was carried forward.
  • Beta 12: the hotfix that replaced Beta 10. It removed the client-side TLS enforcement that could not work with the bundled media engine's trust store, restoring external debrid playback, while retaining the launch fix and zero-based timelines. Its public record also called out the frame-drop and Dolby Vision device-validation limits rather than claiming them closed.
  • Beta 13: an Apple TV test-only build attached outside the normal CI artifact lane. It targeted frame drops, jetsam pressure, pause-hold behavior, disk-backed streaming cache, Dolby Vision cache pressure, and local torrent, Live TV, and trailer regressions. It was a hardware test record, not a separate stable artifact.
  • Beta 14: the large stability, playback, account-security, and diagnostics wave. It added process-aware cache pressure, stale-link recovery, dead-source hops, source preference persistence, pause-hold, seeking feedback, rewind depth, disk cache, frame-drop mitigation, huge-series list bounds, Mac hero performance, Dolby Vision setting truth, safe fallback color, realized audio-route handling, subtitle timing, and the account and credential hardening line.
  • Beta 15: the audited never-recovers-stall and watch-history wave. Buffering freezes gained recovery, watched marks republished immediately, dead sources were skipped quickly, rewind history was retained, Dolby Vision fallback color became signal-driven, seek presentation stopped jumping backward, thumbnail capture stopped polluting drop counts, and failing providers entered a cooldown.
  • Beta 16: resume recovery and large-file buffering. Resume waited for a first frame, applied bounded fallback when necessary, the Still Watching prompt paused playback and became configurable, and large-file read-ahead was shortened and made tunable.
  • Beta 17: the source-picker and scrub-preview format release. Remembered source choices yielded to materially better cached or higher-quality sources, local and community preview lookup searched both directions, configuration-page add-on links were rejected as incomplete, on-device usenet was introduced, next-episode preparation improved, cold scrub refills gained a bounded watchdog, and user-seek frame bursts stopped shrinking the read-ahead ramp.
  • Beta 18: Re-find sources and the 4K HDR seek-stutter correction. Stale links could be re-queried from the detail page or after playback stopped, and a seek's decoder burst was separated from genuine fill pressure.
  • Beta 19: the tagged follow-up that carried the usenet, Android notification and update, Android TV, Android add-on, Watch Stats, import, player-control, Cast, buffering, and settings-parity wave into the next release line. It was retained as an engineering tag rather than a separate final public asset set.
  • Beta 20: the tagged Apple source-picker and subtitle-transport continuation, including the session audio-language filter and pinned external subtitle transport. It was not a separate downloadable public release.
  • Beta 21: the tagged release-orchestration and Apple continuation checkpoint. It was retained for exact-source history and was not promoted as a separate public release.
  • Beta 22: the tagged release and source-resolution checkpoint that carried the verified Apple and Android continuation work. It was not promoted as a separate public release.
  • Beta 23: the tagged Android and Apple release-feed continuation checkpoint. It was not promoted as a separate public release.
  • Beta 24: the tagged release-feed and artifact-validation continuation checkpoint before the zero-stall lane. It was not promoted as a separate public release.
  • Beta 25: the zero-stall remux producer-gate wave. AVPlayer buffer coupling, producer byte hysteresis, startup readiness, seek-nudge, buffered retirement, same-engine reload, and read-liveness work were assembled and verified for the next published line.
  • Beta 26: build 228 and its publication-repair records. Memory-pressure shedding became edge-triggered, the zero-stall lane completed, prepared next episodes survived an engine demote, cached sources ranked faster, last-stream memory stayed local, TorBox cooldowns became quiet, feed HEAD and 304 behavior landed, MetricKit termination evidence was captured, and Android JavaScript and usenet stacks were wired. The .26.1 and .26.2 records corrected target guards and publication receipts; diagnostic replay tags were internal repair records.
  • Beta 27: build 229 and the subtitle and resume wave. Subtitle rows were grouped by language, PGS sizing worked, Dolby Vision OCR capacity increased, large subtitle downloads were bounded, cue identities stopped duplicate flashes, resume watchdog loops ended, Apple TV source-list Up moved one row at a time, and in-player subtitle and output controls were aligned.
  • Beta 28: build 230 and the Mac shell plus completed Android parity checkpoint. It was a tagged continuation record later consolidated into the Beta 29 history rather than treated as a separate public stable line.
  • Beta 29: build 231, the Mac shell, add-on HTTP restoration, and update notices. It remained a draft record during the split prerelease operation; its verified work is included here, but its draft artifact names are not reused for stable.
  • Beta 30: Apple build 232. It fixed the sticky Dolby Vision interrupt, resume watchdog, pause and episode auto-advance family, stale detail episode state, Previous and Next Episode actions, Quality-first source filters, pre-play player choice, watched-state publication, Continue Watching dedupe, subtitle framing acceptance, HDR capture failures, crash-marker classification, Dolby Vision diagnostic honesty, and the dead TorBox account-host fallback. It was Apple-only.
  • Beta 31: Android versionCode 189. It established production signing, Full/mpv and Play/Media3 distributions, the three-ABI universal APK lane, the Play GPL boundary, signer and provenance checks, and the public Android artifact chain. No physical Android or Fire TV device was connected for its release validation.

Android status and engine choice

Android is now included in the stable release, but the engine distinction matters:

  • Full APK: VortX mpv engine, GPL-capable native player lane, intended for sideloading and the broadest VortX playback behavior.
  • Play APK and Play AAB: Media3 engine, distributed for the Play-compatible boundary, with forbidden GPL player libraries excluded and verified absent.
  • Both APKs: universal arm64-v8a, armeabi-v7a, and x86_64 native slices, including the Rust engine, native player seams, and community-provider JNI library where applicable.
  • Production identity: stable artifacts are checked against the pinned production certificate and accompanied by checksums and SIGNING_PROVENANCE.txt.

Android is nearly complete in source and release infrastructure. Only a handful of follow-ups remain: physical install and production-signed upgrade checks on representative phone, Android TV, and Fire TV hardware; remote-focus, HDR, Dolby Vision, torrent resume and restart, sustained-playback, PiP, Cast, and subtitle checks on those devices; the stricter transactional Auto-delete repair that was withheld after independent review; and the broader cross-platform Continue Watching parity review. No physical Android or Fire TV device was connected to the release machine, so those are not presented as completed hardware claims.

Known limitations and honest boundaries

  • The latest attached Apple TV diagnostic session reported two stalls and one transition to HDR10 during a six-to-seven-minute play. The release does not claim that every Dolby Vision or presentation-path cause is closed. Reproduce on the exact stable build with Dolby Vision remux enabled, and include the exported diagnostic if the transition or stalls remain.
  • The attached diagnostic session used dvRemux=off(user) for its configuration. It cannot by itself prove the true-Dolby-Vision remux result. The prior build-231 diagnostic established the sticky-interrupt failure that the repair addresses; a post-fix long physical soak is still the meaningful DV gate.
  • A later 9-minute diagnostic recorded 276 output-frame drops. That burst was not the diagnostic's true-HDR10 interval: the affected 3840x2160 HEVC session reported SDR (bt.1886, signal peak 0) and hwdec=no, while the true HDR10 interval used VideoToolbox and recorded no sampled drop burst. Cache stayed full, decoder drops and delayed-VO frames stayed at zero, and drawable acquisition reached 67.01 ms. This release now records the requested decoder, active decoder, fallback state, codec, and dimensions and shows a truthful software-fallback message. It does not force VideoToolbox or alter renderer timing without the missing codec-profile rejection evidence. Visible frame pacing remains a physical Apple TV check.
  • Profile 7 Dolby Vision files that interleave both picture layers in one track still need a splitter not shipped here and may use the base layer. Separate base and enhancement tracks are the supported FEL path.
  • Blu-ray image subtitles are OCR-based and bounded so they cannot stall playback. Stylized or non-Latin text can be imperfect, long films can exhaust the recognition budget, recognized image subtitles on the Dolby Vision lane remain subject to its track cap, and image subtitles do not yet support the same time-shift behavior as text subtitles.
  • On-device usenet does not repair missing articles. A source with incomplete segments is skipped with a clear message. The Lite Apple TV build remains debrid-only.
  • Media-server playback is direct play only. Transcoding negotiation is a later phase.
  • Android hardware, Fire TV hardware, and the differences between the Full/mpv and Play/Media3 distributions require device-specific validation. A green build or APK inspection is not a physical playback receipt.
  • Google Cast cannot reach a device-local torrent server, so torrent casting stays local. Player-switch choices are hidden where the selected engine cannot safely consume the source.
  • Re-find sources runs only from the detail page or after playback has stopped. It does not interrupt a healthy mid-play session.
  • TorBox availability is an external service condition. VortX no longer uses the invalid account-host fallback and preserves healthy partial search results, but it cannot restore a TorBox hostname that is down.
  • Some GitHub issues remain open or require reporter and hardware confirmation. This stable note describes source fixes and verified behavior; it does not relabel every open issue as closed.

Please test

If a test fails, export Diagnostics immediately after the failure. On Apple TV use Settings > Diagnostics and the QR flow. On iPhone, iPad, and Mac use Save or Share Log. On Android include the flavor, device model, Android version, and whether the artifact was Full/mpv or Play/Media3.

  • Dolby Vision: with Dolby Vision remux enabled, play a Profile 7 or Profile 8 title for more than ten minutes, including a title with Atmos or hi-res audio. Confirm the display remains Dolby Vision, the receiver reports the supported audio format, and no HDR10 transition occurs. Also test a true-DV resume, a manual backward seek after resume, a source switch, and an engine demote.
  • Stalls and frame pacing: play a large 4K HDR title for at least twenty minutes, seek forward and backward repeatedly, and leave and re-enter the app. Confirm a healthy stream does not enter a repeated spinner cycle and that a real stall recovers. Record whether the visible issue is a decoder drop, a drawable wait, or a network/source failure.
  • Pause: pause a Dolby Vision or HLS title for several minutes and confirm it remains on the same frame. Pause a series episode and confirm it never advances to the next episode. Resume manually and confirm only the Play action resumes it.
  • Series navigation: open a late episode, use Previous Episode and Next Episode several times, press Back, return to the detail page, and use Watch Now. Confirm the same episode, subtitle, source, progress, and watched mark stay aligned.
  • Sources: from the detail page and the player, confirm Quality appears before Audio language and the matching source list. Choose a player before playback, long-press or select a per-launch player where available, and confirm incompatible choices fall back honestly.
  • Watched state: mark a movie, episode, and full aired season watched and unwatched from detail, player, Android TV remote, and Android phone. Restart the app and confirm the mark remains. Confirm two devices do not resurrect an older position or removal.
  • Continue Watching: play a download, a pasted direct link, a torrent or debrid source, and a series binge. Exit and reopen immediately, then restart the app. Confirm one canonical series row appears and the exact current episode and position are used.
  • Seek previews: drag through a fresh title, watched territory, a forward not-yet-watched position, and a gap between captures. Confirm the nearest frame appears or a real unavailable reason is retained, without capture retry storms.
  • Subtitles: test embedded text, PGS, add-on, community, external ASS, and a large subtitle file. Switch engine, source, episode, language, size, color, brightness, and delay. Confirm failure is visible and does not block later subtitle selections.
  • TorBox and source fallback: test a working TorBox search, a quota cooldown, and a temporarily unavailable search leg. Confirm healthy sibling results remain usable and the invalid account-host search route is not attempted.
  • Add-ons: install a normal manifest, a public HTTP manifest, a /configure page, and a redirecting configuration page. Confirm configuration pages do not create empty installs, private destinations remain refused, and removal persists until explicit reinstall.
  • Mac: test sidebar navigation, Settings categories, Command-key shortcuts, profile picker sizing, detail-page scroll, poster loading, trailer playback after backgrounding, fullscreen, and window resizing.
  • Android install: verify the Full APK, Play APK, and Play AAB checksums and signer provenance. Test upgrade from the stable production identity. If upgrading from an old Beta 1, Beta 6, Beta 10, or Beta 12 preview APK, uninstall that preview first.
  • Android playback: test mpv Full and Media3 Play artifacts separately on phone, tablet, Android TV, and Fire TV where available. Cover source selection, direct links, HLS, debrid, torrents, subtitles, HDR, Dolby Vision, seek, resume, pause, next episode, PiP, Cast, remote focus, and restart.
  • Android downloads and profiles: test queue ordering, retry, pause and resume, locked-device completion, Auto-delete watched downloads, profile switching, Kids filtering, Watch Stats, backup import, and cross-device settings merge.
  • Android TV: test launch profile selection, PIN entry, account QR sign-in, Play Next, Add-ons, Downloads, Live TV, source groups, player filters, skip controls, stream-link QR, ambient hero, and tab visibility.

Install

Apple

Mac (.dmg, easiest, never expires). Download the stable VortX-macOS-v0.3.15-ci.dmg, drag VortX into Applications, then clear Apple's one-time quarantine by opening it once and choosing Open Anyway in System Settings > Privacy & Security, or by running xattr -dr com.apple.quarantine /Applications/VortX.app. Full guide: Install on Mac.

iPhone, iPad, and Apple TV (sideload the IPA). Download the platform IPA, then re-sign it with Sideloadly, AltStore / SideStore, or Signulous. No jailbreak is required. The AltStore / SideStore source is https://raw.githubusercontent.com/VortXTV/VortX/main/altstore/source.json. Full guide: Installing on iPhone, iPad, and Apple TV.

Stable Apple artifacts:

  • VortX-tvOS-v0.3.15-ci.ipa
  • VortX-tvOS-lite-v0.3.15-ci.ipa
  • VortX-iOS-v0.3.15-ci.ipa
  • VortX-macOS-v0.3.15-ci.dmg

Android

Stable Android artifacts:

  • VortX-0.3.15-full-mpv-universal.apk - Full sideload APK with the VortX mpv engine.
  • VortX-0.3.15-play-media3-universal.apk - Play-compatible APK with the Media3 engine.
  • VortX-0.3.15-play-media3.aab - Play-compatible App Bundle with the Media3 engine.

The universal APKs contain arm64-v8a, armeabi-v7a, and x86_64. Before installing, verify the selected artifact against SHA256SUMS and read SIGNING_PROVENANCE.txt. The Play APK and AAB are deliberately GPL-clean; the Full APK is the mpv distribution.

Preview migration: Android Beta 1, Beta 6, Beta 10, and Beta 12 preview or debug APKs used an older signing identity. Android cannot install the production-signed stable build over those previews. Uninstall the old preview, then install the stable artifact. This is a one-time migration; later production-signed updates can install in place.

Checksums and provenance

Every stable asset must be checked against the checksum file attached to this release. The final provenance receipt binds the assets to the stable tag, exact source commit, workflow run, signer, platform, engine flavor, and ABI set.

  • Apple checksum receipt from protected run 33277064862: 7e4aad49f59db588f7f612795ca5602c6fee8974bd654f2377e73ecd25120628 VortX-tvOS-v0.3.15-ci.ipa; 05832a1a6fd4df3a040644ac0a347b16444a0bbe250e2fbbb5926a03de8cb78a VortX-tvOS-lite-v0.3.15-ci.ipa; 3345a872e545bf40ec9801ef0a2980c5ee481cfdefd21ab28c55e2831f15d026 VortX-iOS-v0.3.15-ci.ipa; 1e64c0ac5b50770d05ed9ea1abf1f974ba176c5b4f0ad8fb0dbdb22cafe79148 VortX-macOS-v0.3.15-ci.dmg.
  • Android checksum receipt from protected run 33275205981: b8664be0b09ce710318810158c0283bf87ad47c0748a6c09dac5c1b058a5a5a2 VortX-0.3.15-full-mpv-universal.apk; 6d1a618b1a4cf9e031800ceed5866f9a2fae1089a5cb98df66adf73ae962e95f VortX-0.3.15-play-media3-universal.apk; c35634ec3004ee0209d9f2d161ae4a438e1d2ad9f095d027f49ccf07fa3d8716 VortX-0.3.15-play-media3.aab.
  • Android signing provenance: tag v0.3.15; source commit 57f0bd2b68c79cddc5d784187c7079029047ce01; protected run 33275205981, attempt 1; signer certificate SHA-256 FC:22:B8:7E:CD:9E:4F:A2:69:30:A1:C3:E2:27:D8:F7:D9:18:C6:46:B2:16:03:2B:5D:A8:20:EF:1A:C2:18:CA.
  • Release-feed provenance: protected Apple run 33277064862 generated a content-addressed feed from tag v0.3.15, build 233, source commit 57f0bd2b68c79cddc5d784187c7079029047ce01, and draft release ID 379101562. Its separate release-approval job refuses success unless the public GitHub release, appcast, and AltStore source resolve to that same tag, build, source commit, release ID, asset names, sizes, and SHA-256 values.