Skip to content

Reaper 2026.8.5

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Aug 16:25

Reaper is translated. Pick your language in Settings, General. The app, its error messages and its Discord posts all follow that one setting. English and Spanish ship today, and a right-to-left language mirrors the layout. Add a language, or fix a wording, on Hosted Weblate.

The manual moved to docs.scythelabs.dev. Rewritten, searchable, and no longer three copies of the same page.

Leaving Soon takes the names you give it. The Plex collection and the label are yours to name.

Worth knowing. The history sweep no longer stops on a play in progress, or on a row Tautulli cannot render. Six database columns retired in 2026.8.4 are dropped in this release.

What's Changed

🛡️ Security

  • build(deps): bump nanoid to 3.3.18 in the website lockfile by @samwiseg0 in #841

🚀 Features

  • feat(i18n): translate the app, with Weblate as the platform by @samwiseg0 in #862
  • feat(i18n): the status chip sends a typed reason by @samwiseg0 in #872
  • feat(i18n): policy warnings send a typed reason by @samwiseg0 in #873
  • feat(i18n): seed the glossary terms into every target language by @samwiseg0 in #880
  • feat(i18n): every refusal carries a code, and the browser says the words by @samwiseg0 in #886
  • feat(i18n): the extraction gate covers every frontend file by @samwiseg0 in #888
  • feat(i18n): a backend catalog for Discord and the launcher by @samwiseg0 in #889
  • feat(i18n): job outcomes and scan steps carry a typed reason by @samwiseg0 in #894
  • feat(plex): let the operator name the Leaving Soon collection and label by @samwiseg0 in #895
  • feat(i18n): a language dropdown in Settings, General by @samwiseg0 in #896
  • feat(i18n): the run journal carries typed keys by @samwiseg0 in #899
  • feat(i18n): mirror the layout when the UI language reads right to left by @samwiseg0 in #902
  • feat(i18n): one language setting for the app and notifications by @samwiseg0 in #930

🐛 Bug fixes

  • fix(ci): sync the winget fork so a release submits unattended by @samwiseg0 in #833
  • fix(i18n): the bilingual glossary component carries no template by @samwiseg0 in #877
  • fix(i18n): the glossary component skips its own seed file by @samwiseg0 in #883
  • fix(history): skip plays in progress and rows Tautulli cannot render by @samwiseg0 in #884
  • fix(i18n): the component script reads add-ons from the repo root by @samwiseg0 in #890
  • fix(i18n): the eager bundle resolves catalog strings per render by @samwiseg0 in #900
  • fix(i18n): three more server-composed sentences send codes by @samwiseg0 in #904
  • fix(i18n): one media-typed key for the movie and season twins by @samwiseg0 in #909
  • fix(i18n): the scan delta line no longer shows raw template text by @samwiseg0 in #913
  • fix(api): a nested reason in a validation refusal is encoded by @samwiseg0 in #914
  • fix(i18n): dormancy and window spans read from the catalog by @samwiseg0 in #915
  • fix(i18n): rewatch keep clause says 'in total', not 'in all' by @samwiseg0 in #919
  • fix(i18n): the rewatch gate says "shows" on a TV policy by @samwiseg0 in #926

📖 Documentation

  • docs(deps): the floors comment is no longer stale on updates by @samwiseg0 in #839
  • docs(manual): rewrite the manual, deduplicate it, and make it searchable by @samwiseg0 in #842
  • docs(readme): plainer punctuation on the front page by @samwiseg0 in #843
  • docs(i18n): refresh the plan and add the execution model by @samwiseg0 in #844
  • docs(learnings): record what the split and the schema template measured by @samwiseg0 in #858
  • docs(status): Weblate reads dev now, so the open item leaves the file by @samwiseg0 in #863
  • docs(readme): say translations happen on Hosted Weblate by @samwiseg0 in #864
  • docs(i18n): shorten and plain-speak catalog strings by @samwiseg0 in #866
  • docs(site): the manual moves to docs.scythelabs.dev by @samwiseg0 in #871
  • docs(i18n): translator notes, a glossary, and the sync from git by @samwiseg0 in #876
  • docs(readme): show a real screenshot, and keep the mockup as the spare by @samwiseg0 in #881
  • docs(status): the milestone and open-work entries update by @samwiseg0 in #898
  • docs(review): record the refuted i18n wording-drift candidate by @samwiseg0 in #911
  • docs(refusal): the count-pinning comment cites the test that exists by @samwiseg0 in #910
  • docs(site): link Issues, Discussions and Translate in the navbar by @samwiseg0 in #925
  • docs(review): issue bodies are written in plain English by @samwiseg0 in #929
  • docs(auth): say why an API key refusal keeps its list in English by @samwiseg0 in #928

⚙️ Everything else

  • chore(release): promote dev to main for 2026.8.4 by @samwiseg0 in #831
  • ci(deps): bump the actions group, 2 updates by @dependabot[bot] in #837
  • build(deps-dev): bump the frontend group, 7 updates by @dependabot[bot] in #834
  • build(deps): bump the python group, 3 updates by @dependabot[bot] in #835
  • build(deps): raise the uvicorn floor to 0.52.1 by @dependabot[bot] in #836
  • ci(binaries): take the pinned checkout ref from github.sha by @samwiseg0 in #840
  • test: cut a fifth off both suites with a scheduler, a pool, and a regex by @samwiseg0 in #853
  • test(frontend): split the suite's slowest file in two by @samwiseg0 in #854
  • test: build the schema once per worker and copy it per test by @samwiseg0 in #855
  • test: close the two sqlite handles the suite left open by @samwiseg0 in #857
  • refactor(i18n): one catalog key per shared string by @samwiseg0 in #865
  • refactor(i18n): compose reasons under any catalog namespace by @samwiseg0 in #870
  • refactor(i18n): the rule vocabulary ships keys, not English by @samwiseg0 in #874
  • refactor(i18n): the last one-off server sentences become typed reasons by @samwiseg0 in #875
  • chore(l10n): update translations by @weblate in #879
  • fix(tests): raise Testing Library's own wait budget by @samwiseg0 in #892
  • docs(tests): the module comment names a constant, not a count by @samwiseg0 in #893
  • chore(l10n): update translations by @weblate in #891
  • chore(i18n): delete the last legacy typed-reason layer by @samwiseg0 in #903
  • chore(i18n): consolidate duplicate catalog strings by @samwiseg0 in #907
  • chore(frontend): the Discord test result composes through one helper by @samwiseg0 in #916
  • chore(scripts): the three Weblate scripts share one HTTP helper by @samwiseg0 in #917
  • refactor: apply the whole-repo ponytail audit's verified cuts by @samwiseg0 in #918
  • ci(deps): bump the actions group, 2 updates by @dependabot[bot] in #923
  • build(deps): bump the python group, 7 updates by @dependabot[bot] in #922
  • build(deps-dev): bump the frontend group, 6 updates by @dependabot[bot] in #921
  • build(deps-dev): bump typescript-eslint to 8.66.0 by @dependabot[bot] in #920
  • test(i18n): pin which password refusals carry their own consequence by @samwiseg0 in #924
  • chore(api): drop the show detail's collections field, which nothing read by @samwiseg0 in #927
  • chore(db): drop six columns retired in v2026.8.4 by @samwiseg0 in #932

New Contributors

Full Changelog: v2026.8.4...v2026.8.5

🛡 VirusTotal GitHub Action analysis: