github superuser404notfound/Sodalite 1.0.0
1.0.0 - Out of beta, on every Apple screen

3 months ago

Sodalite 1.0 leaves public beta. Your Jellyfin library, live TV and Seerr, together on Apple TV, iPhone and iPad. Built for tvOS 26 and iOS/iPadOS 26. Ships with AetherEngine 6.5.5.

Thank you to every beta tester who filed bugs, retested engine builds and helped shape this release.

New

  • Picture in Picture, now on Apple TV too. A dedicated transport-bar button shrinks video or live TV into a corner so you can keep browsing, or leave the app entirely. On iPhone and iPad it also engages when you swipe home, works for software-decoded titles (AV1 without hardware decode, VP9) with the window's own controls driving the engine, and auto-advances to the next episode inside the window. Text subtitles render in the PiP window on the native path and survive seeking in both directions.
  • Themes and backgrounds. Pick an accent colour and a background, from Graphite Glass to OLED Black. The optional Supporter Pack adds curated Pastel, Bold, Electric and Cinematic palettes plus animated Aurora and Noir backgrounds.
  • Spoiler protection. Episode stills and descriptions stay blurred until you have watched or started a title, with a two-step reveal so one press does not spoil the page. Off by default, with separate switches for episodes and movies in Settings > Appearance, and both the settings and the reveals travel over iCloud (Sodalite#50).
  • Forced subtitles while your subtitles are off. Signs and translated foreign dialogue still show, the way a disc player would. A dedicated forced track matching the audio language is used when the release has one; otherwise the forced-flagged cues inside the full PGS or DVD track are rendered on their own. Fully automatic, and the subtitle menu keeps showing "Off".
  • Remembered track selection. The audio and subtitle track you pick comes back the next time you play that title, including an explicit "off". Movies remember their own choice, episodes share one per series, and because the pick is matched by language and role rather than by track number it survives the differing track layouts between episodes. Syncs over iCloud (Sodalite#46).
  • Child lock. One tap in the player locks every touch on iPhone and iPad, so a child can watch without skipping, pausing or leaving; press and hold the on-screen pill to unlock.
  • iCloud Sync. Servers, logins and settings stay in sync across every device signed into the same iCloud account. Secrets (tokens, passwords, Seerr sessions, the Guardian PIN) travel end-to-end encrypted through your private iCloud, so only your devices can read them. A fresh install sets itself up from the cloud: open the app, pick a profile and you are watching, no address, no password. On by default; Settings > iCloud Sync has a live status, a manual "push this device's settings" action and a delete-my-cloud-data option.
  • Internal and external server addresses. Give each server a home address and a public one; Sodalite probes both and connects through whichever answers, at home, on cellular, or over VPN, with no manual switching. Editable per server on iPhone and iPad, with a badge showing the active route; Apple TV picks the right route at launch and follows URL edits synced from your other devices.
  • Scan-first server discovery. Sodalite finds Jellyfin servers on your local network automatically, so first-run setup no longer means typing an address by hand (Sodalite#36).
  • Film collections in the Catalog. A movie that is part of a series of films links straight to its collection: every part with its availability, and one action to request all the ones your library is missing. The bulk request skips whatever is already available or already in the pipeline, and a title Radarr cannot take does not strand the rest (Sodalite#52).
  • Search finds people. Looking up an actor or director returns the person, not just titles that carry their name. Their page leads with what your own library holds for them, movies, series and the single episodes they guest in, above the photo, biography and full filmography, and every title in it opens in your library or in the Catalog. Without Jellyseerr the library half stays instead of the page turning into an error (Sodalite#56, Sodalite#57).
  • Favorite single episodes. The heart works on a single episode as well as on a movie, series or collection, and favorited episodes get their own Home row next to Favorites for everything else.
  • Play from the start. A From Start control in the player jumps a movie or episode back to the beginning without leaving playback, for when you resumed by mistake. Your resume point follows immediately, so closing the player right after keeps the restart.
  • Click to pause. An optional Apple TV setting for TV remotes that drive the box over HDMI-CEC, where Select is often the only key that gets through: a click pauses or resumes straight away instead of first waking the transport bar, which Up or Down still does. Off by default, so the Siri Remote flow stays as it is (Sodalite#58).
  • A Top Shelf that carries its weight. Continue Watching and Next Up on the Apple TV home screen draw your resume progress in the app's accent colour, selecting a row item starts playback instead of only opening the app, and a failed refresh keeps the last good shelf rather than emptying it.
  • Diagnostic Log. Settings > Diagnostic Log shows the last 300 diagnostic lines from the current app session, so a bug report can carry the actual error instead of a description of it. Kept in memory only, nothing is written to disk or uploaded.
  • Light, dark and tinted app icons. The iOS icon ships as an Icon Composer package, so it follows Settings > Display & Brightness > App Icons instead of showing the dark artwork in every mode.

Improved

  • Steadier, smoother playback. The engine went from 5.0 to 6.5 over this release: exact-frame VOD resume, seek recovery on slow network mounts that no longer snaps the playhead backwards, faster live channel switching, Dolby Atmos detection on files whose audio starts late, and a rebuilt subtitle path that survives seek resets.
  • Detail pages that show their depth. Detail pages on Apple TV mark the fold with a floating chevron, so nothing below it goes unnoticed. Collections and playlists open right on their item list, and Play starts the first title you have not finished (Sodalite#53).
  • Cast and crew on Apple TV. Portraits are much larger, names and roles fit instead of being cut after a few characters, the focused portrait is no longer clipped by the scroll view, and opening a cast member goes straight to their page while it loads (Sodalite#55).
  • Season synopses. The Jellyfin season overview shows on the series detail page and opens in the full-text box in the Catalog, and it respects spoiler protection.
  • Collections and profiles. Collection rows got room to breathe, a library grid follows your server's "Group movies into collections" setting with a per-server override, and the launch profile picker opens on your active profile with an optional reprompt after the app has spent a while in the background.
  • Live TV details. The programme popover shows the episode title and overview, and channel switching joins the stream noticeably faster.
  • Deeper network buffer. Settings > Playback lets you pick how far ahead playback reads. Beyond the one, five and ten minute steps, Unlimited keeps pre-buffering the title for as long as the device's free space safely allows, so a flaky connection can drop out for minutes without the picture stalling.
  • Refined on every screen. Layout and audio-picker polish across iPhone and iPad, matched home defaults on a fresh install, and a fix for the iOS volume HUD icon flash.
  • Cache-first scrub thumbnails. Scrubbing pulls preview frames from the engine's resident segment cache first, so the timeline fills in faster.

Fixed

  • iCloud Sync now fetches on a device that did not write. Three separate causes: the remote-notification entitlement was missing, a cold-launch race skipped the first fetch, and signing out left the engine in a dead end (Sodalite#45).
  • Your Jellyfin password is remembered per profile, not per server. Signing in as a second user on the same server no longer overwrites the first user's saved password, and re-picking your own profile keeps it.
  • Jellyseerr state hygiene. Deleting media from the app clears the request it leaves behind, the request lists refresh afterwards, season request status is read on the request axis instead of the media axis, and a download the client cannot see is no longer reported as in progress.
  • Home rows reload on a config change without waiting for an onAppear, and a row that just became empty drops out instead of lingering.
  • No more background-launch crash on iOS. Background app-refresh registration is isolation-safe, closing a startup SIGTRAP.
  • Collection metadata stays put on iPhone. Row metadata no longer wraps mid-line on collection detail pages.
  • Episode "Show Details" is reachable on iPhone, and subtitles are drawn on the external screen when the player owns it.

Under the hood (AetherEngine 5.0 to 6.5)

  • Subtitles were rebuilt around a packet tap and drainer, ending the backward-seek wedge and the side-reader starvation (#93, #96, #112, #125), with PGS landing fixes on top (#143, #204). Text formats then moved onto a single ASS override parser, so SRT, WebVTT, teletext and ASS all reach the screen through one styling and placement path, and an external subtitle file can address a specific stream inside its container. Cue publication now costs one array walk per drain tick instead of one per decoded packet, which a dense typeset track used to pay 104 times a second.
  • Seeking: sourceTime holds the rendered frame during a buffering chase (#123), bounded seeks over a sparse cache (#129), exact-IRAP VOD resume (#191), and seek recovery on high-latency sources that reconciles forward instead of reverting the clock (#216).
  • Live TV: fast channel join (#195), realtime first-manifest holdback (#208), a three-layer fix for reroute recovery cycling (#199), a backpressure and blocking-reload deadlock closed under load (#280), and a DVR window that retains the depth it advertises.
  • Cold start: the open no longer re-fetches what it already holds, the tail fetch is awaited so it can pay for itself, the retained head serves playback's first read, and the segment pump steps down when nothing is waiting on it (#281, #286).
  • Audio: EAC3+JOC Atmos detection on late-starting audio (#214), opt-in AVAudioSession deactivation so passthrough routes release cleanly (#215), and interruption handling that resumes only when the system says so.
  • Memory and stability: the software host's autorelease leak (#205), off-thread DVR ring close (#136), and off-main telemetry (#134).
  • Buffering: an opt-in whole-source prefetch that is bounded in bytes rather than segments, so it fills what the volume can safely hold (#207), with range requests and the chunk fetcher's own body bounded on the way.
  • HLS VOD: finite HEVC carried in MPEG-TS plays instead of mounting a black picture with working audio, and a container whose timeline starts away from zero publishes its playhead on the same 0-based axis its duration is measured on, so the scrubber no longer opens minutes into a title.
  • Presentation: a panel already in HDR is no longer read as SDR, and terminal engine errors render the reason the engine had already computed instead of a generic failure.
  • AirPlay: native subtitles survive the wireless hop to an Apple TV.
  • The engine crossed to 6.0 for visionOS support, which raised its platform floor; Sodalite's own targets are unchanged.

Localization

  • The in-app "What's New" for 1.0 ships fully translated in all 26 supported languages, as does the rest of the app.

Bundled engine

  • AetherEngine 6.5.5 (f4a907b).

Full AetherEngine notes: https://github.com/superuser404notfound/AetherEngine/releases/tag/6.5.5

Don't miss a new Sodalite release

NewReleases is sending notifications on new releases.