Releases / v0.3.0 · staged (not published)
Kunai 0.3.0
[`15cac9e`](https://github.com/KitsuneKode/kunai/commit/15cac9e0c1dbc91c957d0b2133a515b7585803e6) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Keep the anime auto-skip and provider-relay paths working after upstream rotations.
- AniSkip now resolves a MAL id for AniDB titles, so opening and ending skips work on the default anime provider instead of silently never firing. The lookup shares the provider package's Cloudflare-aware transport and overlaps stream resolution, so it adds no serial request to playback start. - AllAnime tracks the upstream `mkissa` rotation to build 119 and 7-day epochs; the previous constants failed every stream request with `AA_CRYPTO_MISSING_BUILD`. - A relay no longer strips the provider-auth headers (`x-build-id`, `x-aa-boot`, `x-obfuscated`, `x-session-token`) that AllAnime bootstrap and Miruro decoding depend on, which previously made every bootstrap through a relay fail with `invalid_boot_token`. - A Miruro request blocked by Cloudflare now names the user-owned relay workaround rather than reporting an unexplained failure.
Show posters on every terminal, including Windows.
- New half-block renderer decodes JPEG/PNG in process and paints two pixels per cell with truecolour SGR, so posters no longer require `chafa` — which is effectively never installed on Windows, where posters previously never appeared at all. - Windows Terminal no longer auto-selects sixel: support only landed in 1.22 and the environment reports no version, so an older build rendered raw escape bytes. `KUNAI_IMAGE_PROTOCOL=sixel` still forces it. - Poster cache moved onto the shared OS cache root (`getKunaiPaths`) instead of a hand-rolled `$HOME/.cache`, which is not a location Windows has. - `KUNAI_IMAGE_PROTOCOL=half-block` forces the new renderer anywhere.
Playback reliability, calendar navigation, and shell responsiveness.
- Startup source failover walks the ordered source list before hopping providers, so a dead stream retries the next source instead of looping the same one. - Resolve cancellation is honest end to end: abort reasons ride on the signal, late feedback from a cancelled resolve is dropped, and a stream that arrives after cancellation is never handed to mpv. - Every exit routes through one phased shutdown coordinator with conventional exit codes (130/143/129), quiescing services and preserving playback, config, queue, and download state before disposal. - Calendar navigation scrolls minimally instead of re-anchoring on every keypress, fixing the sliding rows and laggy arrows. - The title-control menu (`m`) opens during playback instead of rendering underneath it, and cancel stays live across the whole bootstrap and failure window. - The episode picker no longer collapses to a single entry when a provider listing fails or when continuing from history. - Miruro resolves against the working mirrors only; Videasy reorders its first-phase servers and segment-probes HLS before attesting reachability. - Search shows a query-aware loading skeleton, post-play artwork retries after a transient fetch failure, and quitting no longer pauses autoplay. - Provider fallback moves to a deliberate `Shift+F` chord so a stray keypress cannot switch providers mid-session.
The 0.2.6 development cycle was versioned but never published, so its work reaches users for the first time in 0.3.0:
- **YouTube lane.** Search, playlists and channels play through the same shell as everything else, with live/upcoming handling, SponsorBlock and cookie settings, and video watch history counted in your stats. - **Playback that recovers.** Persistent mpv sessions, provider fallback with endpoint-health diagnostics, and honest cancellation — a dead source retries the next one instead of looping. - **Share links.** `kunai://` round trips, so a title (and timestamp) can be handed to someone else or reopened later. - **Offline and downloads.** Downloaded episodes play through the same path as streamed ones, so resume, subtitles and history behave identically. - **New surfaces.** Up Next queue, playlists, notifications, release calendar and a details sheet, plus a reworked settings shell. - **Native installer.** Self-contained binaries with a versioned layout and channel-aware `kunai upgrade` / `kunai uninstall`.
[`135517c`](https://github.com/KitsuneKode/kunai/commit/135517c2e1fe8225c501f4246fec41884233ce43) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - AllAnime now reports a captcha-gated stream request as a blocked, non-retryable failure naming the relay workaround, instead of silently returning no streams next to a full episode list. It is also demoted out of the automatic anime fallback lane while staying manually selectable.
[`4186bf2`](https://github.com/KitsuneKode/kunai/commit/4186bf2d85a6b3e70cba03ad404b62a9b588af2f) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Keep anime films in the anime profile while preserving their movie structure through history, downloads, and offline playback. Unknown one-shot anime formats now stay episodic until their episode count is known, and HTML cleanup cannot turn encoded markup back into tags.
[`0fc67a3`](https://github.com/KitsuneKode/kunai/commit/0fc67a37bdb1536039e80e68df8b884e9038bf6e) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Repair the default AniDB anime route across current browse parsing, provider-native identity, season and absolute-episode routing, and production-derived release signoff.
[`0c3c735`](https://github.com/KitsuneKode/kunai/commit/0c3c7357d85b640f4c962035a2f04bff544f940b) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Report `curl` in `kunai doctor` and setup. AniDB is the default anime provider and needs a curl (plain or curl-impersonate) to get past Cloudflare, so its absence could previously make anime search return nothing with no diagnostic anywhere.
[`0f20cf4`](https://github.com/KitsuneKode/kunai/commit/0f20cf463940aac27821da836d3a11b3358da336) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Present movie, series, anime, and video positions consistently; persist movie downloads as title-level jobs; and keep download and calendar surfaces responsive through width, poster, loading, retry, and cancellation changes.
[`4186bf2`](https://github.com/KitsuneKode/kunai/commit/4186bf2d85a6b3e70cba03ad404b62a9b588af2f) Thanks [@KitsuneKode](https://github.com/KitsuneKode)! - Make anonymous usage analytics explicit opt-in. Setup now defaults to off, Settings can enable or disable collection, and disabling removes the local install identifier.
Canonical install
Linux / macOS
curl -fsSL https://raw.githubusercontent.com/KitsuneKode/kunai/main/install.sh | bashWindows (PowerShell)
irm https://raw.githubusercontent.com/KitsuneKode/kunai/main/install.ps1 | iexkunai --setupPrivacy
- Do not send analytics before consent, without an interactive terminal, or when DNT or CI blocks it.
- Leave the production endpoint disabled until an operator configures and verifies one.
- `/analytics` and `/presence` answered "no matching commands" from the resume and starting-point pickers while the footer still advertised `[/] commands`. Both govern data leaving the machine, so being told they do not exist was the wrong answer. Picker command sets now come from one registry context instead of three hand-written arrays that had drifted apart.
- The Settings section tabs were unreadable at 80 columns: twelve names were squeezed into two-character stumps that wrapped onto a second line, hiding which sections exist. The strip now scrolls around the active section, which is always shown in full, with `‹`/`›` marking what is off-screen.
- `install.sh` / `install.ps1` `--dry-run` / `-DryRun` compute paths without creating directories.
- Empty or incomplete release assets fail with specific messages and npm / Bun / source / pinned-version recovery guidance.
- GitHub Releases require all eight binaries plus `SHA256SUMS` (`fail_on_unmatched_files`, post-upload contract assertion).