Repository navigation
Install
Mac (Apple silicon, macOS 15 or later): download AniBeam-2.4.0-macos-arm64.dmg, open it and drag AniBeam into Applications. The first launch is blocked because the build is not notarized. Go to System Settings > Privacy & Security and click Open Anyway.
Linux, any distribution: download AniBeam-2.4.0-x86_64.AppImage, then chmod +x it and run it. It needs glibc 2.39 or newer, which covers Ubuntu 24.04, Debian 13 and Fedora 40 and later.
Windows (64-bit, Windows 10 or later): download AniBeam-2.4.0-windows-x64-setup.exe and run it. It installs for you alone, with no administrator prompt, and adds AniBeam to the Start menu. The installer is not signed, so SmartScreen may say it protects your PC: click More info, then Run anyway. AniBeam-2.4.0-windows-x64.zip is the same app without an installer.
Arch: yay -S anibeam (or paru -S anibeam) builds this tag from the AUR.
Downloads page: nothing to install. AniBeam brings its own anirss, and the first time the page opens it uses your qBittorrent if its Web UI answers, or sets up its own if not. The README walks through the rest: https://github.com/marcusbandit/AniBeam#first-steps
What's Changed
- feat(core,shell): Downloaded lists everything on disk, deletes from a right-click, and shows watched against unwatched space by @marcusbandit in #271
- fix(core): episodes got for a library show are saved straight into its folder by @marcusbandit in #272
- chore: main is 2.4.0 now that release/2.3 is cut by @marcusbandit in #273
- docs(contributing,readme): AniBeam ships no sources; new ones go to an endpoint repo by @marcusbandit in #276
- feat(ci,shell): nightly, stable and PR test builds all ship from main by @marcusbandit in #281
- feat(core,series): a TVmaze show takes a hand-set episode count, and Fixes holds every fix by @marcusbandit in #285
- feat(core,shell): Update installs the new version and restarts, per install type by @marcusbandit in #284
- docs(contributing,agents): every issue sits on the AniBeam project board by @marcusbandit in #294
- docs(contributing,agents): a collaborator gets board access and the gh project scope first by @marcusbandit in #296
- feat(core,shell): developer options time every page and turn images off; the activity log speaks plainly by @marcusbandit in #288
- perf(shell): poster grids build the cards in view, and a card builds a third of what it did by @marcusbandit in #290
- feat(shell,core): the quality of life update, about a hundred small fixes, and releases can carry a title by @marcusbandit in #298
- feat(core,player): Liam's json and torznab kinds, Discord presence, native engine seam and player delays by @marcusbandit in #302
- feat(shell,settings): Settings opens on an index of sections with live status and search by @marcusbandit in #300
- fix(linux): each checkout builds into its own target dir by @marcusbandit in #262
- fix(core): the phone connection check keeps home-network names off public DNS by @marcusbandit in #252
- fix(core): every endpoint fetch is paced per host with a one-second floor, as the spec now says by @LiamPalmqvist in #303
- feat(core): magnet-only search results get seeder and leecher counts through their info-hash by @LiamPalmqvist in #304
- feat(core): on the core's own engine, subscriptions and downloads go to qBittorrent without anirss by @LiamPalmqvist in #305
- feat(core,android): the phone plays and casts the computer's episodes over Tailscale by @marcusbandit in #310
- fix(android): the twelve phone fixes, a player lock, swipes and hold for 2x by @marcusbandit in #311
- feat(android): More opens on an index of settings sections with live status and search by @marcusbandit in #315
- feat(core,android): sites added by hand open for editing with a tap by @marcusbandit in #316
- feat(android): the phone lays out for folded, open and half folded, with a Calendar tab by @marcusbandit in #320
- fix(library): every franchise gets its own section again by @marcusbandit in #329
- fix(core,shell): a show watched to its end leaves Catch up by @marcusbandit in #331
- feat(android,shell): the app icon can be changed: default, dark and Material You line art by @marcusbandit in #333
- fix(android): line art icon gets a simpler glyph with two speed lines by @marcusbandit in #341
- feat(series): two files of one episode share a row with a versions menu by @marcusbandit in #335
- fix(core): a Prologue chapter is no longer taken for the opening by @marcusbandit in #330
- feat(home): This week answers what is out now and what comes next by @marcusbandit in #340
- feat(library): sort and group from two menus, the order said in words by @marcusbandit in #334
- fix(player): a double-click into fullscreen never holds 2x by @marcusbandit in #345
- feat(android): postures glide, sideways keeps the open layout, Airing now syncs Not interested by @marcusbandit in #344
- fix(android): chip rows show whole, grids glide on a bend, the stood-up picture keeps its shape by @marcusbandit in #347
- fix(android): the outer screen never splits, stood-up controls all sit below the crease, batches look like batches by @marcusbandit in #350
- fix(android): unfolded, series slide in and out, the calendar makes room, Airing now uses its side pane by @marcusbandit in #354
- fix(home): This week is a calendar, a column a day, the next episode counting down by @marcusbandit in #353
- fix(android): the line art icon is bare lines, no tile behind them by @marcusbandit in #357
- chore(android): build 41 for the bare line art icon by @marcusbandit in #358
- fix(home): This week follows the title language by @marcusbandit in #356
- fix(metadata): a streaming title's number after "Episode" wins over a season number by @marcusbandit in #368
- fix(cli): follow every started job to its end, exit 1 when it fails by @marcusbandit in #369
- fix(player): Next and Previous walk the seasons in order by @marcusbandit in #371
- fix(downloads): a qBittorrent login that fails with a 5xx retries, not a wrong password by @marcusbandit in #382
- fix(transfer): a view of an extra round trips by its file, not as episode 0 by @marcusbandit in #384
- fix(core): a tracker scrape keeps the announce's query and adds info_hash with & by @marcusbandit in #374
- fix(downloads): a password or any common key in a hand-added address goes to the secret store by @marcusbandit in #385
- fix(downloads): a web page answering the qBittorrent login is named as not its Web UI by @LiamPalmqvist in #390
- fix(core): a failed scrape logs the tracker by scheme and host only by @LiamPalmqvist in #391
- test(core): tracker examples use t.example instead of a real tracker host by @LiamPalmqvist in #392
- refactor(shell): one Fmt.baseName replaces the QML basename copies by @LiamPalmqvist in #387
- refactor(core,shell): series cards carry a film flag the pages read by @LiamPalmqvist in #388
- ci(core): check the phone and cast features on every PR by @LiamPalmqvist in #359
- fix(android): phone builds carry arm64 code (#362) by @marcusbandit in #367
- fix(core): a search whose picked endpoint fails says why when nothing was found by @LiamPalmqvist in #394
- test(shell): keys.json walks Down past Recently downloaded to the week by @LiamPalmqvist in #393
- fix(core): an endpoint at an IPv6 address keeps its host by @LiamPalmqvist in #361
- fix(core): a source added by hand before #385 moves its secret to the secret store by @LiamPalmqvist in #389
- fix(core): an episode folder beside Specials or a sample joins its show by @LiamPalmqvist in #377
- fix(core): tell a second OVA run apart and find a first film by @LiamPalmqvist in #360
- feat(shell): anibeam serve runs the host with no window by @marcusbandit in #408
- fix(core): a trusted-only source that finds nothing asks again for every upload by @LiamPalmqvist in #405
- refactor(library): Library rows read the core's film flag by @LiamPalmqvist in #406
- refactor(core): one text cut helper, no unused presence start, and a bound on the Discord connect by @LiamPalmqvist in #409
- fix(core): a json source reads HTTPS in any case, magnets with a hash, and sizes with units by @LiamPalmqvist in #407
- docs(contributing): every PR attaches to an issue through a closing keyword by @marcusbandit in #414
- feat(shell,core): Airing reworks Out now, picks any season, and hides your lists or library by @marcusbandit in #416
- feat(shell): Out now as small poster cards, and a sort for Airing by @marcusbandit in #417
- ci: a PR that closes no issue fails a check that says how to fix it by @marcusbandit in #421
- feat(core,shell): change a show's list status from its pill or right-click menu by @LiamPalmqvist in #402
- docs(agents): a weekly backlog review keeps the board true and fills Up next by @marcusbandit in #424
- ci: a PR that only changes docs skips the cargo checks by @marcusbandit in #429
- docs(readme): a newcomer gets from GitHub to a running AniBeam in a minute by @marcusbandit in #427
- feat(shell): Out now can be the list of posters and titles again, picked in Settings by @marcusbandit in #431
- feat(core,shell): a show's schedule takes pasted notes, and a TBC stops the guess by @marcusbandit in #422
- ci(issues): issues show their state on their own, and schedules keep them true by @marcusbandit in #438
- fix(ci): issue-state queues per branch, so a burst of events drops none by @marcusbandit in #440
- refactor(core): the core groups an episode's files into labelled versions by @LiamPalmqvist in #398
- feat(core,shell): airing times of your shows go to a calendar file by @LiamPalmqvist in #403
- feat(core): exports carry quick fixes and an import applies them by @LiamPalmqvist in #400
- refactor(shell): one clipboard helper, one subtitle draft, and Panel draws its dividers by @LiamPalmqvist in #412
- fix(core): Spy x Family episodes are episodes, not specials by @marcusbandit in #441
- fix(android): a show's synopsis reads as paragraphs, not
tags by @marcusbandit in #445 - fix(core): with the native engine, no endpoint is left out for its kind by @LiamPalmqvist in #411
- fix(core): a failed .torrent download logs its link by scheme and host only by @marcusbandit in #448
- fix(android): an episode code like S03E01 fits its column by @marcusbandit in #453
- fix(core): a qBittorrent address with a backslash before @ is not this machine by @marcusbandit in #444
- fix(core): a phone subscription keeps its endpoint's token out of the rules file by @marcusbandit in #447
- test(core): the OAuth tests let the system pick their ports, so a busy box cannot take one by @marcusbandit in #454
- fix(core): phone sources get the kind and {query} checks endpoints get by @marcusbandit in #459
- fix(core): an NVENC conversion cuts a piece every six seconds, so a seek finds its piece by @marcusbandit in #455
- fix(core): the phone looks up home-network names with the system DNS, never a public resolver by @marcusbandit in #457
- fix(android): the phone's tests and clippy pass again, and CI runs them by @marcusbandit in #460
- fix(core): a series title that is a marker word reads as its episodes by @marcusbandit in #461
- fix(core): a busy sign-in port says to try again instead of blaming another AniBeam by @marcusbandit in #473
- docs(core): the feed host example names no download site by @marcusbandit in #469
- fix(core,shell): a subscription for a library show saves into that show's folder by @marcusbandit in #462
- fix(core): a qBittorrent name that only starts like this machine's is not it by @marcusbandit in #464
- docs(changelog): three phone fixes from today move under 2.4.3 by @marcusbandit in #481
- feat(packaging): the AppImage, the dmg and AUR bring anirss 0.6, so repo endpoints are searched by @marcusbandit in #474
- fix(core): a name with no public record goes to the system DNS alone, DoH stays on for the rest by @marcusbandit in #477
- ci: a patch note added under a shipped version heading fails the pull request by @marcusbandit in #484
- fix(core): feed and tracker addresses reach logs and errors by host only by @marcusbandit in #470
- fix(core): a feed event never names the feed, so its login and key stay out of the log by @marcusbandit in #483
- fix(core): an extra with a revision after its number stays that extra by @marcusbandit in #467
- fix(core): phone subscriptions saved before #447 drop their token on the next launch by @marcusbandit in #482
- ci: pull requests run clippy for the Qt shell crate by @marcusbandit in #486
- fix(core): Discord shows a series whose title is a single letter by @marcusbandit in #496
- feat(core,shell): imported quick fixes apply in the import itself and are counted by @marcusbandit in #475
- fix(android): the phone asks for the notification permission (#130) by @marcusbandit in #505
- fix(core): a tracker announce written with backslashes is scraped at the path the client reads by @marcusbandit in #485
- feat(core,shell): Settings shows whether Discord is connected, and keeps it current by @marcusbandit in #500
- fix(core): a subscription for a library show behind anirss is written into its folder once by @marcusbandit in #502
- fix(android): the phone's player takes audio focus (#131) by @marcusbandit in #514
- fix(core): the native engine stops re-reading json and tosho endpoints as RSS after a search by @marcusbandit in #511
- fix(core,shell): a new subscription's event never names its feed, so its login and key stay out of the log by @marcusbandit in #508
- fix(android): the phone closes the playback session when Android ends the activity (#132) by @marcusbandit in #521
- fix(core): the desktop syncs endpoints into anirss when it lists endpoint_writes by @marcusbandit in #498
- fix(core): saving downloads settings keeps an engine this build does not know by @marcusbandit in #515
- fix(core): a refine or subscribe on an endpoint gone since the search says so by @marcusbandit in #512
- chore(android): the phone workspace is rustfmt-clean and CI checks it by @marcusbandit in #525
- fix(core): a tracker that announces at announce.php is scraped at scrape.php, so its releases show seeders by @marcusbandit in #516
- ci: a new push to a PR cancels its older Linux, macOS and Windows builds by @marcusbandit in #530
- fix(core): every shell gets a series synopsis as plain text from the core by @marcusbandit in #501
- ci(changelog): patch notes go in change files, so one merge no longer conflicts every open PR by @marcusbandit in #524
- style(android): notes.rs is rustfmt-clean again, so the phone's fmt check passes on main by @marcusbandit in #570
- fix(core): no stored event keeps a feed's login or key, whichever event carries it by @marcusbandit in #532
- fix(core): a marker word in an episode title after its number keeps the file an episode by @marcusbandit in #495
- fix(core): following a show on a source whose search answers JSON is refused with a line saying so by @marcusbandit in #533
- fix(core): a downloads settings save while anirss is read keeps the old anirss out of the state by @marcusbandit in #531
- feat(core,library): pick several series in Library and hide, rate, list, rescan or match them at once by @marcusbandit in #572
- fix(core): a marker word in an episode title stays a word with no dash before the number, or a dashed series title by @marcusbandit in #519
- docs(contributing): security reports have a private way in by @marcusbandit in #592
- feat(packaging): the bundles bring anirss 0.7.1, so a subscription saves straight into a show's folder by @marcusbandit in #534
- fix(player): on a narrow window the player's buttons no longer cover the volume by @marcusbandit in #517
- fix(core): a tracker and a torrent link written with backslashes are read by the host the client reads by @marcusbandit in #513
- fix(shell): the app speaks plain words instead of developer terms by @marcusbandit in #573
- feat(core,shell): start and finish dates, rewatches and notes reach the tracker by @marcusbandit in #576
- feat(home): home shows the season before there is a library by @marcusbandit in #585
- feat(core,watching): a Planning tab on Watching lists what you planned and starts or gets it by @marcusbandit in #586
- feat(core): a TV over DLNA plays the computer's episodes the phone casts by @marcusbandit in #589
- feat(shell): a first-run setup walks a new user through AniBeam by @marcusbandit in #578
- refactor(core): one atomic file write helper instead of seven copies by @marcusbandit in #581
- fix(core,shell): a subscription on a source that answers JSON says it cannot fetch new episodes by @marcusbandit in #584
- feat(core): with the native engine, best fit follows the preferences saved in anirss's config by @marcusbandit in #609
- ci: every workflow reads the Rust toolchain from one rust-toolchain.toml by @marcusbandit in #571
- feat(player): on a very narrow window the right-hand buttons fold into a More menu by @marcusbandit in #535
- fix(core,shell): two revisions of one extra, like SP01 and SP01v2, share one history and one row by @marcusbandit in #528
- feat(core,shell): the computer serves only the tailnet devices the person has not switched off by @marcusbandit in #595
- fix(core): an endpoint behind an anirss the person runs says to add it to that anirss's config by @marcusbandit in #522
- feat(library): a first scan ends with a plain summary and walks through what did not match by @marcusbandit in #597
- feat(core,shell): a Stats page shows hours watched, genres and seasons, with a year recap to save by @marcusbandit in #588
- fix(downloads): downloads says plainly why it cannot start, with one button that fixes it by @marcusbandit in #591
- feat(core,android): the phone plays converted when its tailnet path to the computer runs through a relay by @marcusbandit in #616
- feat(core): the core records which torrent each downloaded file came from, and On disk goes by it by @marcusbandit in #624
- perf(metadata): the Metadata page builds a third fewer items and only the tiles near the view by @marcusbandit in #626
- chore(shell): a fresh worktree's capture build reuses the crates another checkout compiled by @marcusbandit in #621
- feat(packaging): anibeam-bin on the AUR installs the release build in seconds by @marcusbandit in #618
- feat(shell): errors arrive in plain words with a next step and a button that does it by @marcusbandit in #583
- feat(shell): screen readers can name every control by @marcusbandit in #608
- fix(core): a source with an empty category or filter, or its own address parameters, searches as anirss does by @marcusbandit in #617
- feat(settings): Settings, Downloads picks whether AniBeam or anirss runs searches by @marcusbandit in #625
- feat(core,android): the desktop hands the phone every AniBeam it sees on the tailnet by @marcusbandit in #611
- feat(core): endpoint kinds are named filtered-rss and json-feed, and installed endpoints move over once by @marcusbandit in #629
- feat(core,shell): a desktop notification says when an episode of a show you watch is out by @marcusbandit in #587
- feat(core,downloads): on the native engine the Downloads page lists the core's sources and never starts anirss by @marcusbandit in #628
- feat(settings): text size can be changed inside the app by @marcusbandit in #622
- test(core): the native engine's seeder lookups are pinned to give up when anirss's do by @marcusbandit in #623
- feat(core): a followed show's next episode is looked for when it airs, with one line if it never comes by @marcusbandit in #634
- feat(settings): a Help section answers the common questions inside the app by @marcusbandit in #636
- fix(core): three tests that landed beside the kind rename use the filtered-rss kind by @marcusbandit in #642
- ci: the Windows toolchain step clears an untracked clippy the runner image left in the pinned toolchain by @marcusbandit in #652
- feat(core,shell): a status and a score work with no tracker account, kept on this device by @marcusbandit in #590
- feat(core,shell): streaming episodes from this computer has its own switch in Settings by @marcusbandit in #601
- fix(downloads): every Downloads error says what to do next and has the button that does it by @marcusbandit in #662
- feat(core,android): each AniBeam has its own key, and a request can carry proof of it by @marcusbandit in #639
- feat(core): fronting and best fit's trusted groups come from the endpoint definition, not from site names by @marcusbandit in #640
- feat(android): onboarding explains the download notification before Android asks, and a no has a way back by @marcusbandit in #643
- feat(core): Stats keeps every finish of an episode, so a rewatch counts in its own year by @marcusbandit in #646
- feat(downloads): the phone stops following a show, keeping or deleting its episodes by @marcusbandit in #649
- feat(core,android): the phone lists one row per episode and picks between its versions by @marcusbandit in #656
- fix(core): a --root run keeps anirss and qBittorrent inside its root by @marcusbandit in #657
- fix(android): the layout reads the real crease, so a clamshell folds across by @marcusbandit in #658
- fix(settings): every Settings error says what to do next and has the button that does it by @marcusbandit in #666
- feat(core,shell): the coding agent on your computer looks a show's schedule up by @marcusbandit in #669
- fix(core): two saves of one file take turns, so the last save always lands whole by @marcusbandit in #670
- fix(shell): an empty or failed browsing page says why and has the button that fills it by @marcusbandit in #671
- ci: every toolchain step repairs a runner's partial toolchain, so builds stop failing before they start by @marcusbandit in #675
- feat(core): the desktop searches and follows on AniBeam's own engine by default by @marcusbandit in #659
- feat(core): history, resume points and tracker accounts belong to a profile, and today's rows are the owner's by @marcusbandit in #653
- feat(core,shell): connecting a tracker offers to move the list kept here, after a preview by @marcusbandit in #599
- feat(core): an RSS source's search quirks and per-show feed come from its definition by @marcusbandit in #655
- ci: a check fails when a download site's name lands in the repo by @marcusbandit in #667
- feat(core): watch history, resume points and matches merge between trusted AniBeam computers by @marcusbandit in #648
- fix(core): the history path test expects the separator of the system it runs on by @marcusbandit in #701
- feat(shell): a folder in the Downloads grid takes a full card's size by @marcusbandit in #698
- fix(shell): picking cards keeps each show's list and library tag by @marcusbandit in #711
- fix(shell): hovering a selected menu entry brightens it (#693) by @marcusbandit in #704
- fix(shell): a press and hold picks without grabbing the page, and moving it paints picks by @marcusbandit in #700
- fix(series): recommendations round like every card, fill the width 4x2, and sit last by @marcusbandit in #697
- feat(shell): Airing sorts the season grid by any field AniList gives by @marcusbandit in #710
- fix(downloads): grids fill the page width, four across on the show tabs by @marcusbandit in #707
- feat(shell): Home's week board can hide the days with nothing on by @marcusbandit in #708
- feat(home): Next up card puts the poster on the right, fading into the show colour by @marcusbandit in #705
- fix(library): the poster grid's last column ends on the head's right edge by @marcusbandit in #703
- fix(library): Group lists Nothing first behind a divider, and a fresh install groups by it by @marcusbandit in #706
- fix(airing): Out now fills the width in the chosen grid and shows the last 24 hours by @marcusbandit in #709
- fix(shell): grids size from the capped column, so a wide window keeps every column by @marcusbandit in #714
- fix(home): Today keeps the episodes that already aired, counting up from when they came out (#715) by @marcusbandit in #716
- feat(home): Continue includes the Up next series as its first card (#719) by @marcusbandit in #720
- feat(shell): the right-click menu puts a line between its groups (#717) by @marcusbandit in #718
- ci(windows): the untracked-clippy cleanup removes the .pdb files and docs too (#721) by @marcusbandit in #722
- ci(release): a nightly whose workflow files differ from main stops before the builds (#723) by @marcusbandit in #724
- feat(core): a not interested mark drops off once its show is off the air by @marcusbandit in #726
- fix(player): a show reopens on the subtitle track you picked, not its same-named twin by @marcusbandit in #729
- fix(packaging): the Mac bundle can sign with a stable identity so the keychain stops asking after every build by @LiamPalmqvist in #731
- feat(android): Get can download to the connected computer instead of the phone by @marcusbandit in #737
- ci(nightly): a nightly is cut on demand instead of every few hours by @marcusbandit in #739
- feat(player): desktop parity: cast to a TV, list opens Get, nothing downloaded is not missing by @marcusbandit in #757
- feat(android): a Your list lens in Downloads, Plan to watch from a show, and no missing on unstarted shows (#734, #735) by @marcusbandit in #758
Full Changelog: v2.3.1...v2.4.0