Skip to content

v0.3.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Nov 18:27
Immutable release. Only release title and notes can be modified.
3233162

Smoother Windows app, dialogs you can't get stuck in, and Watch together fixes

The Windows app feels much smoother. Scrolling Home glides over the shelves as it does between them, pages and settings change in place instead of redrawing, and Back returns you to where you were. Pages left alone no longer redraw while sync and downloads run, and covers fade in as they arrive. The app's own colours now reach every control and dialog.

On Windows, no dialog can trap you any more: every dialog closes with Escape, the keyboard stays inside the dialog that is up, and the cloud sync sign-in no longer leaves you with only a greyed-out Cancel. Buttons that waited silently now show progress, and the title bar shows running jobs and sync, with a Messages list (Ctrl+Shift+L). Settings opens at once, starts with a General pane, can be searched with Ctrl+F, and shows sync conflicts to review. The player redraws far less, fades in, and its controls no longer shift.

Watch together works across devices on a real server: joining by code or link finds the episode, the room moves on to the next episode together, and rejoining under the same name works. Invite links and Rejoin show the room first and wait for Join. On every app, removing a device from sync no longer leaves it showing a key error, download progress moves while episodes download, and Trending over a month loads again.

Train

Version 0.3.3, a patch release: nothing breaks plugins, config, data or the store protocol. The engine changes are fixes that every app picks up; everything else is in desktop/windows.

First wave (already on this PR at the last review):

  • fix/win-pages, fix/win-browse, fix/win-shell, fix/win-player: pages update in place, the Home wheel reaches the page's scroller, cached pages keep their place on Back, shell dialogs show progress, and player bar, scrub, volume and party routing fixes.
  • fix/engine-live: download progress is published as bytes arrive, and monthly trending asks each title's trends(sort: DATE_DESC, perPage: 31).
  • Own commits: hover previews wait for the wheel to rest, Settings is cached, Kaeri.Drive tooling and a testing-only KAERI_PROFILE_ROOT.

Second wave, merged in this order:

  • polish/player2: the player redraws only what changed, once per UI turn; fades for the player, alerts, Play on TV and reactions; clocks keep their width; invite links, codes and Rejoin look into the room before Join; Ready hidden when it cannot lead anywhere.
  • polish/dialogs: the "locked inside a dialog" report. The cloud sync wait had only a disabled Cancel and ignored Escape, and WinUI left the keyboard on the page under the dialog's shade. Dialogs now refocus when they open or the window returns, the app can force any dialog closed (so the close and leave-party questions always get through), stale queued dialogs are dropped, player dialogs go through the one-at-a-time helper, and dialogs leave the mini player first.
  • polish/shell2: Devices, About, Accounts, the update panel and the sidebar account item change in place; Settings cards keep one width; title bar status and jobs flyout, Messages, sync conflicts, General pane, download folder Browse and Open, settings search.
  • polish/visual: the palette is merged after Fluent's in App.xaml, so it wins (commit 026a22b moves every control's colour and reverts alone); dialogs get the palette; StateHost crossfades from placeholders to empty or failed states; ArtFade for covers; secondary links in silk.
  • polish/browse2: grids keep their cells; Home cards, spotlight and This week change only the words that changed; the calendar reuses its cells; Library tabs keep their width; Search updates as you type and loads past 30; seasons switch in place; the hover card grows in place; grid covers open a hover card again.
  • polish/multi, engine fixes found with two and three clients:
    • kaeri-party: a joiner on a real server never learned the episode, because the fake server sent the room in a different order from a real one (the fake now matches); a plain Syncplay member on the room's episode showed as playing another file; rejoining under the same name.
    • kaeri-engine party: moving on to the next episode on the public server stuck paused or skipped an episode.
    • kaeri-sync: a removed device showed a key error forever.
    • New tests: kaeri-ffi/tests/together.rs (two devices through FFI engines on the fake server; the public-server run and the peer for another app are #[ignore]), sync_two.rs, and a plugin store update reaching a member. Fixture engines on Windows listen on 127.0.0.1 for pairing.

Merges: Dialogs.cs conflicted between the dialogs branch's forced close and refocus and the visual branch's dialog palette; both kept. Kaeri.Drive/Program.cs scenario lists combined. HomeWeek.cs: the in-place View all link with the silk link style.

Train fixes:

  • The starting screen tests joined the "Strings" test collection; they reset the shared string resolver and failed a Home heading test about once in five runs.
  • The Windows lobby said "Everyone is ready" whenever the room played, even at 1 of 2 ready. It now uses the Mac's start line.
  • The calendar stayed blank on a real profile: cells kept from the last drawing were taken out of their old column through Parent, which is null once that column is off the page, so adding them again failed. Each cell's column is now kept beside it. The fixture never drew a week twice, so only the profile copy showed it.
  • kaeri-ffi's stats test failed once on macOS CI: before the picture starts, the session asks the player for cache-speed alone once a second, and on a slow runner that came before the test's first time report. The test now looks for the panel's own figures.
  • Kaeri.Drive opens Settings' Playback pane before the Auto-play switch; the pages check had been comparing nothing with nothing.

Measured on Windows 11, 240 Hz, fixture scene (Kaeri.Drive):

Check Result
Pages left alone 15 s (Home, Library, Seasonal, Calendar, Search, title) 0 frames changed, every element kept
Sidebar, tabs and filters first change 47 to 190 ms, one burst each
Spotlight Details 113 ms (one run of two gave 404 ms)
Poster and Back on Home, Library, Seasonal one burst each, place kept
Typing a search two bursts, by design
Player with controls up, 15 s missed frames 87 to 10, p95 5.8 to 4.4 ms
Downloads and Settings pages checks all pass
Escape on 12 rehearsed dialog states all close; on the old build the sync wait, recovery key and invite sheet stayed open

Two clients: Watch together (link, code, lobby, Ready, pause, seek, resume both ways, chat, reactions, closing and reopening the player) works on the fake server and on the public server, including with the Windows app driven through UI Automation against a second engine. Sync of watched, unwatched, list status, a shared setting and a change on both devices works.

Checked locally:

  • Rust: cargo fmt, cargo check --workspace --all-targets --locked, clippy on kaeri-engine, kaeri-party, kaeri-sync and kaeri-ffi.
  • Rust tests, per crate: kaeri-party 70, kaeri-sync 100, kaeri-engine lib 607 and plugin_stores 5, kaeri-ffi lib 62, together 4 and sync_two 3 (the first wave's runs of kaeri-meta, kaeri-testkit, kaeri, kaeri-tui, kaeri-model and kaeri-store stand; those crates did not change since).
  • Strings: the i18n check.
  • C#: the C# tests (9 engine, 303 app).
  • Driver: feel, wheel, idle and pages on the fixture; feel-real and scroll-real on a copy of the maintainer's profile (every page kept all its elements while left alone; first visits to Seasonal, Calendar and Library change twice as covers and the week arrive; scrolling misses 0 to 7% of frames at 240 Hz).

Not checked locally:

  • The Mac and Android builds. The engine fixes reach them; their own code is unchanged.
  • The Windows TV, cast and Devices screens with a second client; the end of an episode and the in-player party screens were checked in code only.
  • A removed device's sync on a real cloud folder.

🤖 Generated with Claude Code

Terminal

The installers are the .pkg on macOS, setup.exe on Windows and the .deb on Debian and
Ubuntu. Each one puts kaeri on your PATH and adds a launcher, so you can type it or click
it. The launcher opens your terminal, because Kaeri runs in one.

On any other Linux distribution, use the AppImage: chmod +x it and run it from a terminal.
Nothing is installed. Every Linux build needs glibc 2.28 or newer.

The .tar.gz and .zip archives hold only the binary, for putting on your PATH yourself.
Once it is installed, kaeri --update takes each new release.

These builds are not code-signed. macOS stops the .pkg the first time it opens: choose Done,
then Open Anyway in System Settings › Privacy & Security. Windows SmartScreen warns about the
installer: choose More info, then Run anyway.

mpv and ffmpeg are not bundled. Kaeri drives mpv for playback and runs ffmpeg to mux
subtitles into a finished download, so install both first; see the
requirements.

Check a download against its .sha256 before running it.

Every package carries the licences of what it is built from in a third-party folder, the Rust
crates' among them, and kaeri-0.3.3-rust-licences.txt has those for all four builds.

Kaeri doesn't host any shows. You add your own sources. See https://kaeri.app/legal/.

Apps

Kaeri for Android phones and TVs, the Mac, iPhone, iPad, Windows and Linux, on the same engine as the terminal app. Like
it, the apps host no content and supply no sources. You add the sources you are entitled to use.

Android

kaeri-0.3.3-android-arm64.apk, for Android 15 or later on a 64-bit ARM phone or tablet.

Open the APK on the device. Android asks once whether the app you opened it from, your browser or
file manager, may install apps: allow it, then choose Install. The APK is signed with Kaeri's
release key, so each release installs over the one before and keeps your data. It is not on
Google Play, and Play Protect may offer to scan it. Once it is installed, the app updates itself
when you choose Update in its notice or in Settings › About. The first time, Android asks you to
allow it for Kaeri too.

Android TV

kaeri-0.3.3-android-tv-arm64.apk or kaeri-0.3.3-android-tv-armv7.apk, for
Android TV and Google TV on Android 11 or later. Most TV boxes, including the Chromecast with
Google TV, run a 32-bit system and take the armv7 file; the Nvidia Shield and newer boxes take the
arm64 file. If the install says the app is not compatible, try the other file.

Install it with a sideloading app on the TV, or with adb install and the file's name
from a computer on the same network. It is signed with the same release key as the phone app and
installs beside it. It is not on Google Play. Pair it with your phone from the TV's first screen.

Mac

kaeri-0.3.3-macos.dmg, for macOS 26 or later on a Mac with Apple silicon.

Open the disk image and drag Kaeri to Applications. The app isn't signed with an Apple
developer account, and it is not notarized, so macOS stops it the first time it opens:

  1. Open Kaeri, and choose Done when macOS says it cannot verify it.
  2. In System Settings › Privacy & Security, under Security, choose Open Anyway beside the message
    about Kaeri, and confirm with your password or Touch ID.

That is once for each version you download. Right-click › Open no longer skips the check since
macOS 15. From a terminal, xattr -dr com.apple.quarantine /Applications/Kaeri.app does the
same. Once it is installed, the app updates itself when you choose Update in its notice or in
Settings › Integrations, and macOS does not ask again.

After an update macOS may ask again whether Kaeri can use what it keeps in your keychain.
Choose Always Allow.

iPhone and iPad

kaeri-0.3.3-ios-unsigned.ipa, for iOS or iPadOS 26 or later.

The .ipa is not signed for any device. Install it with AltStore or
SideStore, which sign it with your own Apple ID as they install it. Add
Kaeri's source to either, and they offer each new release:
https://github.com/bitknox/kaeri/releases/latest/download/sidestore.json. They
use two of your Apple ID's App IDs, one for the app and one for its widgets, and an App Group the
two share. With a free Apple ID that signature lasts 7 days: AltStore or SideStore has to refresh
the app within that time, or it will not open until they do. Your data stays either way.

Windows

kaeri-0.3.3-windows-x64-setup.exe, or kaeri-0.3.3-windows-arm64-setup.exe for
Windows on Arm, for Windows 10 version 2004 or later.

Run the installer. It installs for your account only, with no administrator prompt, adds Kaeri
to the Start menu and to Settings › Apps, where you can uninstall it, and lets the app open
kaeri:// links. The installer is not code-signed, so SmartScreen stops it the first time:
choose More info, then Run anyway. A new release installs over the one before and keeps your
library and settings.

Linux

kaeri-0.3.3-linux-x86_64.AppImage, or kaeri-0.3.3-linux-aarch64.AppImage on
64-bit ARM, for systems with glibc 2.41 or newer: Debian 13, Ubuntu 25.04, Fedora 42 and later. It
carries GTK 4, libadwaita and the player.

Make it executable with chmod +x kaeri-0.3.3-linux-x86_64.AppImage and open it. The first
run registers it for kaeri:// links. The app updates itself: it downloads each new version,
checks it, and puts it in place of the AppImage when you choose Restart to Update in its notice or
in Settings. AppImageUpdate, AppImageLauncher and Gear Lever can update it in place too, from the
release's .zsync file. Without FUSE, run it with --appimage-extract-and-run.

Checking a download

Each file has a .sha256 beside it. With both in one folder, run
shasum -a 256 -c kaeri-0.3.3-macos.dmg.sha256 (or sha256sum -c on Linux).

Third-party

The apps play video with libmpv and FFmpeg, which kaeri builds as LGPL, without their GPL
parts, and ships as dynamic libraries of their own:

  • Android phone and TV, built from source with NDK 30.0.16248370: abis arm64-v8a armeabi-v7a api 30 page-size 16384 vulkan 0, mbedtls 3.6.7, dav1d 1.5.3, libxml2 2.15.4, ffmpeg n9.0.2 (LGPL version 3 or later), freetype 2.15.0, fontconfig 2.18.3, fribidi 1.0.17, harfbuzz 14.6.0, unibreak 8.0, libass 0.17.5, mpv v0.41.0, libplacebo v7.360.1 (cee9b07).
  • Mac, iPhone and iPad: mpv v0.41.0 and libass 0.17.5, built from source with
    kaeri's patches, over MPVKit 1.1.0-n9.0.2's LGPL builds of FFmpeg n9.0.2 and the
    libraries beneath it.
  • Windows: mpv's own LGPL build of libmpv, v0.41.0-kaeri-9f2ab280214a.
  • Linux: mpv v0.41.0 and FFmpeg n9.0.2 (LGPL version 2.1 or later), built from source, with
    Debian 13's GTK 4, libadwaita and the libraries beneath them, whose sources are Debian's.

kaeri-0.3.3-apps-sources.tar is the source they were built from, every archive by its
SHA-256, with the scripts that built them and kaeri's patches. kaeri-0.3.3-apps-third-party.zip has every licence
and notice: the libraries', the engine's Rust crates', and the engine's upscaling shaders', one of
which, the AniSD model, is CC BY-NC 4.0, for non-commercial use only.

What's Changed

  • Smoother Windows app, dialogs you can't get stuck in, and Watch together fixes by @bitknox in #15

Full Changelog: v0.3.2...v0.3.3