github dannyvfilms/Floppy v26.8.20

2 hours ago
ChatGPT Image Aug 20, 2026 at 07_39_31 PM

Changes since last release:

  • SQLite recovery became an operator-facing recovery system - SQLite relationship checks are bounded and controllable, verified backups are preserved, recovery can protect user-owned tracking data, affected WAL configurations are guarded, and startup now explains what is happening instead of communicating exclusively through an unhealthy container and a log file. The new floppy_preflight diagnostic, recovery page, heartbeat/status sidecar, timeout page, and configurable public port give operators actual inspection points. The database is still allowed to be serious; it is no longer required to be mysterious.
  • The API and automation surfaces now have explicit contracts - Floppy publishes verified domain vocabulary, deterministic OpenAPI consumer contracts, JSON-LD context, AsyncAPI 3.0 channels, structured MCP failures, delivery receipts, and an accessible schema viewer. Public-list RSS now exposes matchable external metadata, while media, podcast, episode-history, tracked-season, cast/crew, score-sorting, and metadata-sync endpoints expose the data their clients were already forced to reconstruct by hand.
  • Imports and exports expanded substantially - Added PlayStation Network game imports, Jellyfin Playback Reporting imports, Letterboxd-ready watched-movie CSV export, richer and safer Grouvee imports with tags/notes/ZIP support, custom MusicBrainz-compatible endpoints, IMDb public ratings, TVDB people and filmography, complete AniList schedules, and more reliable Pocket Casts and GPodder handling. Barcode scanning now uses a pinned local ZXing asset instead of a runtime @latest fetch.
  • Playback, history, and rewatches are more precise - Users can optionally see each play instead of grouped totals, seasons and shows support explicit rewatch passes, Stremio playback completion is verified against live state, Stremio watchlists are available as catalogs, Plex webhook profiles and feedback improved, Kodi’s documented 80% threshold is honored, episode history carries watched status and parent-show context, and podcast progress uses consistent units.
  • Lists, filters, and large-library browsing received a serious performance pass - Provider-aware Smart Lists stay synchronized after tracking and backfills, manual lists can feed Smart List rules, streaming services can be pinned across regions, pagination triggers no longer repeat pages or leave black overlays, episode-list scroll state returns after navigation, and compact media-list ordering avoids hydrating an entire library just to serve page two. Mixed-media Collections, public list notes, completed-date filtering, episode navigation, and lazy-loaded list editing add useful surface area without requiring a ceremonial reload.
  • Metadata and provider correctness improved across the edges - MDBList now prefers explicit episode evidence, malformed Cinemeta responses no longer abort full imports, grouped-anime migration is atomic and retry-safe, TVDB/AniList calendar paths avoid inventing facts from incomplete data, provider images can remain local and long-form, Pocket Casts duplicate matching is more conservative, and custom-item deletion, podcast artwork, season sorting, and TVDB-backed people pages received targeted repairs.
  • Deployment, security, and CI are less theatrical - Container bootstrap now isolates its virtualenv and preserves secret-file configuration, PostgreSQL image-placeholder upgrades are migration-safe, runtime logs redact secrets and fail closed when they cannot render safely, pull requests no longer publish container images, CodeQL/workflow permissions received attention, config/API apps run in CI, and preferences/test state no longer reports failures before anyone has touched the page.
  • The project’s support and contribution paths are clearer - The README and issue templates now expose Discord and bug-report links, contributor guidance and engineering standards are more prominent, the contributors wall is available, and bug reports use a structured YAML template. This is not a second maintainer, but it is at least a better sign pointing toward the first one.

What's Changed

  • Make grouped anime migration atomic by @ryan-winkler in #743
  • fix: make SQLite relationship recovery operator-controlled by @ryan-winkler in #741
  • fix(sqlite): keep the verified backup and single-source the timeout bound by @ryan-winkler in #744
  • refactor(sqlite): route operator output through one logging helper by @ryan-winkler in #745
  • feat: publish verified API grounding contracts by @ryan-winkler in #742
  • docs: add contributors wall and contributing CTA to README by @ryan-winkler in #755
  • Add exact grouped anime routing for Stremio by @lucamaia9 in #688
  • Show a recovery page while SQLite startup is paused by @ryan-winkler in #756
  • Optionally show each play when you have multiple watches/plays by @arijason in #753
  • Harden separate-entry media list handling from #753 by @ryan-winkler in #757
  • fix(lists): keep provider Smart Lists in sync after tracking and backfill by @underfear in #754
  • feat: self-host and pin the ZXing barcode library by @ryan-winkler in #758
  • fix(container): isolate virtualenv in /opt/venv and guarantee PATH in entrypoint by @ryan-winkler in #765
  • style: sort imports in urls.py, format model fields, and isolate secret in data path test by @ryan-winkler in #766
  • test: wait for home page load after login in Playwright integration test by @ryan-winkler in #768
  • feat(api): publish a JSON-LD domain context (W2) by @ryan-winkler in #769
  • test: wait for home page load after login in lists integration test by @ryan-winkler in #771
  • Fix light-theme contrast across reported UI controls by @ryan-winkler in #770
  • Remove unused LOGIN_REQUIRED_EXEMPT setting (#592) by @ryan-winkler in #774
  • Fix run-floppy browser launch and document the .env secret shadow by @ryan-winkler in #777
  • Preserve SECRET_FILE environment variable during container bootstrap by @ryan-winkler in #776
  • fix(db): holistic SQLite foreign-key self-healing, bounded logging, and zero-friction upgrades by @ryan-winkler in #780
  • Fix FURB171 lint failure blocking pushes to latest by @ryan-winkler in #781
  • 🔍 Scan GitHub Actions and simplify CodeQL by @ryan-winkler in #787
  • Limit export history to seven days by @srow90 in #783
  • Include Kodi's 80 percent watch threshold by @srow90 in #785
  • 🚫 Stop publishing container images from pull requests by @ryan-winkler in #793
  • docs: add Discord and bug report links to README and issue templates by @ryan-winkler in #798
  • ✨ Add dynamic dirty-state tracking to preferences save bar (#796) by @ryan-winkler in #799
  • Allow custom MusicBrainz instance URLs by @srow90 in #807
  • Prefer explicit MDBList episodes over season summaries by @srow90 in #805
  • Exclude midnight placeholders from time statistics by @srow90 in #803
  • Fix TMDB backdrop lookup calling base_params as an attribute by @Revisor01 in #800
  • 🧪 Run the config and api apps in CI by @ryan-winkler in #814
  • Handle malformed Cinemeta video entries by @srow90 in #790
  • 🔒 Redact secrets before runtime log output by @ryan-winkler in #786
  • Treat a scrobbled title as being near its end by @Revisor01 in #801
  • Show watched status for episode history by @srow90 in #792
  • fix: embed IMG_NONE placeholder as data URI instead of hotlinking TMDB by @NaNomicon in #831
  • Stabilize SQLite entrypoint parking test by @srow90 in #826
  • fix: relax image fields to TextField to support data URIs and long asset URLs by @ryan-winkler in #840
  • Make the public server port configurable across env, CLI, and UI by @ryan-winkler in #838
  • test(config): harden the parking test after the port fix by @ryan-winkler in #839
  • fix(cache): bound cache-status retries and offline polling by @ryan-winkler in #833
  • fix(podcasts): stop a show without artwork returning a server error by @ryan-winkler in #832
  • ✨ Add floppy_preflight, a startup diagnostic for operators by @ryan-winkler in #830
  • fix(events): collect complete AniList airing schedules by @ryan-winkler in #841
  • Add matchable metadata to public list RSS feed items by @dannyvfilms in #828
  • fix(podcasts): complete plays without an explicit date by @ryan-winkler in #829
  • docs: elevate contributor guidelines, engineering standards, and PR template by @ryan-winkler in #767
  • Close the disabled-Stremio and future-source gaps in Active Periodic Imports (#598) by @dannyvfilms in #843
  • fix: unblock PostgreSQL image-placeholder upgrades by @ryan-winkler in #849
  • Let users pin streaming services from other regions (#519) by @dannyvfilms in #844
  • feat(api): integrate W3 AsyncAPI 3.0, accessible schema viewer, and delivery receipts by @ryan-winkler in #845
  • Fix Pocket Casts duplicate episodes and inferred listening dates by @dannyvfilms in #852
  • Add Letterboxd-ready CSV export (#578) by @dannyvfilms in #853
  • Add PlayStation Network as an import source by @Revisor01 in #824
  • fix(sqlite): protect affected runtimes from WAL corruption by @ryan-winkler in #863
  • fix(sqlite): reopen unresolved recovery after keep-rows startup by @ryan-winkler in #870
  • Migrate bug report template from Markdown to YAML format by @dannyvfilms in #872
  • Add Stremio watchlist catalogs by @bcollier1 in #856
  • Improve Stremio playback completion verification by @bcollier1 in #855
  • fix(database): make provider text storage migration-safe by @ryan-winkler in #866
  • Add TVDB person profiles and filmography support by @dannyvfilms in #871
  • Sync IMDB public ratings for movies, shows, and episodes by @dannyvfilms in #873
  • Potential fix for code scanning alert no. 1167: Workflow does not contain permissions by @ryan-winkler in #880
  • fix(sqlite): preserve tracking data during relationship recovery by @ryan-winkler in #874
  • Potential fix for code scanning alert no. 1168: Workflow does not contain permissions by @ryan-winkler in #881
  • fix(ci): restore full-tree import ordering by @ryan-winkler in #882
  • Show server port status without widening admin access by @ryan-winkler in #885
  • test(sqlite): use fixed CI runtime and isolate provider traffic by @ryan-winkler in #884
  • Prevent duplicate list infinite-scroll pages by @srow90 in #897
  • Refresh compact episode controls after watch changes by @srow90 in #898
  • Prevent repeated media grid page loads by @srow90 in #899
  • Prefer provider episode titles in season API responses by @srow90 in #900
  • Refresh episode deletes without reloading the season page by @srow90 in #901
  • Fix multiword API list sorting by @srow90 in #902
  • Prevent black overlays during media pagination by @srow90 in #915
  • Support API sorting by user score by @srow90 in #903
  • Preserve tracked seasons in TV API details by @srow90 in #910
  • Expose podcast show metadata through API by @srow90 in #911
  • Expose provider cast and crew in media detail API by @srow90 in #912
  • Include parent show names in episode history by @srow90 in #913
  • Fix podcast progress units by @srow90 in #914
  • Restore scroll position when returning to episode list by @dannyvfilms in #919
  • Add list filter support to smart list rules by @dannyvfilms in #917
  • Extract metadata enrichment logic into reusable function by @dannyvfilms in #924
  • Cache compact media list order to fix page-2+ scroll perf by @dannyvfilms in #920
  • Add explicit rewatch tracking for seasons and shows by @daften in #925

New Contributors

A Note About Floppy

I'm still not a professional developer; I'm an enthusiastic maintainer using AI coding tools to build the media tracker I want to use. Floppy is a standalone project based on the incredible work of FuzzyGrim/Yamtrack, independently maintained and supported by @dannyvfilms. Yamtrack import and documented compatibility paths remain supported, but users install Floppy directly rather than treating an upstream container replacement as a migration plan.

Docker Updates: You can pull the canonical Floppy image at any time:

ghcr.io/dannyvfilms/floppy:latest

The legacy ghcr.io/dannyvfilms/yamtrack:latest image path remains available during the transition for existing Floppy installations. Please use the supported import path when moving data from upstream Yamtrack, preserve the original database, and test on a copy first. A container image swap is a one-way migration, so if you are coming from upstream Yamtrack test in parallel and import your data. Changing your container image runs migrations you cannot roll back.

Contributing: Floppy-specific bug reports, feature requests, integration ideas, and pull requests are welcome in this repository. Thanks to @arijason, @bcollier1, @daften, @NaNomicon, @Revisor01, @ryan-winkler, @srow90, @underfear, and to everyone who reported problems or suggested improvements during another unusually intense week.

If you have time to help answer questions in the new Discord, that would be appreciated. I’ll try to be active there, but GitHub is still keeping most of my attention, so additional support from contributors will help.

Thanks for understanding, and happy tracking!

Full Changelog: v26.8.13...v26.8.20

Don't miss a new Floppy release

NewReleases is sending notifications on new releases.