Files
ani-cli-web/CHANGELOG.md
T

31 KiB

Changelog

0.32.0 - 2026-05-17

  • Changed bulk Refresh All processing to pace requests with a configurable delay between shows, reducing the chance of flooding upstream episode sources on large watchlists.
  • Added a Config page setting for the per-show bulk refresh delay and expanded regression coverage for the new config field and pacing behavior.

0.31.1 - 2026-05-17

  • Added stdout lifecycle logging for scheduled watchlist refresh jobs so container logs now show when a scheduled run is queued, starts, finishes successfully, finishes with errors, gets interrupted, or fails.

0.31.0 - 2026-05-17

  • Added scheduled background watchlist refresh support so the app can periodically recheck episode counts for tracked anime.
  • Added Config page controls for enabling or disabling the scheduled refresh and setting the refresh period in minutes.
  • Reused the existing background Refresh All worker for scheduled runs and expanded regression coverage for the new config fields and scheduler timing behavior.

0.30.4 - 2026-05-17

  • Added browser-friendly remote auth bootstrap: remote users can open the app once with ?token=..., the server stores the token in an HTTP-only cookie, and then strips the token back out of the URL with a redirect.
  • Kept existing remote header auth support for API clients while extending regression coverage for cookie, query-token, and bootstrap redirect access.

0.30.3 - 2026-05-17

  • Fixed container startup under docker-compose and custom USER_UID/USER_GID mappings by launching the web app with python3 /app/app.py directly instead of relying on the ./ani-cli-web launcher file being executable inside the container.

0.30.2 - 2026-05-17

  • Added container runtime support for USER_UID and USER_GID, letting ani-cli-web run under a chosen numeric host user/group so files created in mounted folders are not owned by root.
  • Updated the Docker and Compose documentation to show how to pass host UID/GID values into the container.

0.30.1 - 2026-05-17

  • Added a docker-compose.yaml file that builds the bundled Docker image, mounts ./downloads and ./.ani-cli-web, and exposes the ani-cli git remotes, branch, and startup flags through Compose environment defaults.
  • Documented the Compose workflow alongside the existing Docker build and docker run setup.

0.30.0 - 2026-05-17

  • Added a Docker image build that clones ani-cli and ani-cli-web from configurable git remotes, installs ani-cli system-wide, and starts ani-cli-web from /app.
  • Added container startup support for UPDATE_ON_START=true, which runs sudo ani-cli --update before launching the web app.
  • Documented the Docker build arguments, runtime mounts for ./downloads and ./.ani-cli-web, and the default container networking and storage layout.

0.29.5 - 2026-05-16

  • Fixed /api/config malformed-body handling so non-object JSON payloads now return 400 Bad Request instead of silently resetting saved settings to defaults.
  • Expanded regression coverage for invalid config payload shapes.

0.29.4 - 2026-05-16

  • Fixed /api/watchlist/add malformed-body handling so non-object JSON payloads now return 400 Bad Request instead of surfacing as an internal server error.
  • Expanded regression coverage for invalid watchlist add payload shapes.

0.29.3 - 2026-05-16

  • Fixed duplicate watchlist add responses so already-tracked shows now return 200 OK with created: false instead of the misleading 201 Created.
  • Tightened /api/watchlist/ensure-thumbnails request validation so show_ids must be a JSON array and force is parsed as a real boolean value instead of relying on Python truthiness.
  • Expanded regression coverage for duplicate watchlist add status handling and thumbnail warm-up payload validation.

0.29.2 - 2026-05-16

  • Hardened the download queue again so unexpected post-launch worker exceptions now fail the active job cleanly instead of killing the worker thread and leaving the job stuck in running.
  • Fixed malformed JSON POST handling for watchlist action routes so missing required fields such as show_id and data_url now return 400 Bad Request instead of surfacing as misleading 404 Not Found errors.
  • Expanded regression coverage for post-launch queue worker failures and required-field validation on watchlist POST endpoints.

0.29.1 - 2026-05-16

  • Hardened download queue startup so a failed ani-cli process launch now marks the job as failed instead of crashing the background queue worker thread.
  • Cleaned up per-job staging directories after canceled and failed download runs, preventing partial artifacts from piling up under .ani-cli-web/staging/.
  • Fixed thumbnail refresh fallback flow so stale stored AnimeSchedule routes and AniDB IDs now continue on to title-based lookups instead of aborting the whole cover refresh attempt early.
  • Expanded regression coverage for queue startup failures, failed-download staging cleanup, and stale thumbnail source fallback behavior.

0.29.0 - 2026-05-16

  • Fixed watchlist thumbnail retry backoff so failed automatic cover lookups now record a retry timestamp and stop hammering AnimeSchedule or AniDB on every later warm-up pass.
  • Hardened queued-download fallback matching to keep season and part identity intact while still accepting equivalent season notation such as 2nd Season and Season 2.
  • Made paged watchlist responses clamp out-of-range page requests before fetching rows, keeping the reported page value aligned with the returned items.
  • Expanded regression coverage for thumbnail backoff persistence, season-aware fallback matching, and out-of-range watchlist pagination.

0.28.0 - 2026-05-16

  • Bounded watchlist refresh network calls with a shorter dedicated timeout and matched worker-shutdown grace period, making per-show and bulk watchlist teardown behavior more predictable when upstream services are slow.
  • Improved completed-download watchlist sync failures by preserving the fallback resolution reason and surfacing it in logs and raised errors instead of collapsing everything into one generic unresolved show_id message.
  • Continued the backend split by moving shared title-normalization and title-query helpers into a dedicated title_matching.py module.
  • Tightened the shared browser polling helper so it uses serial setTimeout scheduling plus unload cleanup.
  • Expanded regression coverage for bounded watchlist refresh timeouts, clearer fallback-match failures, and the updated poll-helper cleanup behavior.

0.27.0 - 2026-05-15

  • Made runtime reset stricter by refusing to clear the global runtime state when background workers do not stop cleanly, preventing stale workers from outliving the runtime instance they came from.
  • Taught per-show watchlist refreshes to stop earlier during shutdown by checking the refresh stop flag before committing later update stages.
  • Marked bulk watchlist refresh jobs as interrupted when shutdown interrupts them instead of letting them look like a normal successful completion.
  • Hardened the completed-download watchlist sync fallback so it only trusts a fallback search result when the queued title still matches confidently, failing safe instead of risking the wrong anime being marked downloaded.
  • Reworked the shared browser polling helper to use serial setTimeout polling with unload cleanup instead of a bare repeating interval.
  • Continued the backend split by moving queued-download watchlist identity resolution into a dedicated watchlist_identity.py helper module.
  • Expanded regression coverage for interrupted resets, interrupted bulk watchlist refresh jobs, safer watchlist identity fallback behavior, and browser poll helper cleanup.

0.26.0 - 2026-05-15

  • Made controlled runtime shutdown stricter by canceling active download workers during blocking teardown paths such as app exit and runtime reset, reducing the chance of orphaned background work outliving the server.
  • Hardened watchlist thumbnail warm-up batches so shows removed mid-request are skipped cleanly instead of bubbling a stale lookup back as a route error.
  • Added shared serial browser polling helpers and switched the Search and Watchlist pages to use them, preventing overlapping queue and watchlist poll requests from stacking up when the server responds slowly.
  • Improved background refresh diagnostics by logging per-show worker failures and preserving the last bulk-refresh item error in refresh-job state.
  • Expanded regression coverage for deterministic download-queue shutdown, removed-entry thumbnail warm-up handling, shutdown-on-exit behavior, and shared serial polling usage in page templates.

0.25.0 - 2026-05-15

  • Stopped the watchlist page from repeatedly rewarming the same unresolved thumbnails during silent queued-refresh polling by caching per-show warm-up attempts in the browser until thumbnail state changes.
  • Made background Refresh All lighter and faster by skipping inline thumbnail downloads during bulk refreshes and refreshing multiple watchlist shows in parallel.
  • Taught per-show refreshes to bail out quietly when a show disappears mid-refresh, avoiding stale watchlist writes and extra thumbnail work after removal.
  • Woke waiting thumbnail resolvers immediately when a show is removed, so stale in-flight cover waits no longer sit on the timeout path.
  • Expanded regression coverage for thumbnail warm-up deduplication, bulk refresh thumbnail skipping, thumbnail wait cleanup, and removed-entry handling during background refresh jobs.

0.24.0 - 2026-05-15

  • Moved single-item watchlist refresh requests onto the existing per-show background refresh queue instead of doing episode, AnimeSchedule, and thumbnail work synchronously in the request handler.
  • Added queued-item counts to watchlist listing responses and taught the watchlist page to silently refresh itself while queued per-show refresh work is still draining.
  • Cleared removed shows out of the in-memory per-show refresh queue and in-flight tracking sets so deleted entries no longer consume stale queued refresh work.
  • Expanded regression coverage for queued watchlist counts, queued single-item refreshes, queued refresh removal cleanup, and watchlist-page queued polling behavior.

0.23.0 - 2026-05-15

  • Fixed the per-show watchlist refresh queue so a show already being refreshed is no longer re-enqueued while its refresh is still in flight.
  • Added regression coverage for in-flight watchlist refresh deduplication and cleanup of the in-flight marker after refresh completion.

0.22.0 - 2026-05-15

  • Added explicit runtime shutdown and reset hooks so shared globals and background workers can be torn down cleanly between in-process runs and tests.
  • Fixed deferred worker startup to keep respecting ANI_CLI_WEB_DISABLE_WORKER, preventing runtime-backed handler calls from silently enabling background workers in worker-disabled environments.
  • Split download-queue persistence into structured SQLite columns plus a separate log column, leaving JSON payload storage only for extra fields instead of rewriting the whole job record on routine state changes.
  • Reduced server-side exception noise by only printing full tracebacks in debug mode.
  • Centralized the shared browser api() fetch helper used by the Search, Config, and Watchlist pages.
  • Expanded regression coverage for runtime reset, worker-disable behavior, structured queue persistence, and the quieter exception path.

0.21.0 - 2026-05-15

  • Persisted the per-show watchlist refresh queue across restarts by rebuilding pending refresh work from watchlist rows still marked queued during runtime startup.
  • Preserved queued refresh ordering during restart recovery so older queued watchlist items resume before newer ones.
  • Added regression coverage for queued watchlist refresh restoration after restart.

0.20.0 - 2026-05-15

  • Replaced the HTTP handler's old mutable string-key service locator with an explicit configured handler context, making route dependencies clearer and surfacing wiring issues at startup time instead of during later requests.
  • Moved watchlist add and successful-download sync off the hot request path by queueing per-show background refresh work instead of doing episode, AnimeSchedule, and thumbnail fetches synchronously before the request returns.
  • Ensured runtime-backed HTTP requests start background workers when allowed, while still respecting ANI_CLI_WEB_DISABLE_WORKER in tests and intentionally worker-free runs.
  • Expanded regression coverage for the new non-blocking watchlist add/download-sync flow.

0.19.0 - 2026-05-15

  • Guarded Search-page queue polling against stale out-of-order responses so an older refresh result no longer overwrites a newer queue state.
  • Added get_cached_anidb_titles() and switched AniDB lookup to reuse the cached parsed title list directly instead of rebuilding a duplicate list on every fallback lookup.
  • Expanded regression coverage for the queue freshness guard and AniDB cache reuse path.

0.18.0 - 2026-05-15

  • Removed the eager runtime bootstrap from main(), so server startup no longer forces migrations, DB setup, worker startup, and config writes before the first runtime-backed request.
  • Batched queue log persistence so running downloads no longer rewrite the entire job payload into SQLite on every single output line.
  • Added regression coverage for lazy startup and queue log batching.

0.17.0 - 2026-05-15

  • Tightened the remote-access guard so loopback reverse-proxy traffic with forwarded external client IPs no longer bypasses the non-local token requirement.
  • Stopped mutating the shared runtime config dict in place; queue creation now reads a stable config snapshot and config saves replace the runtime config atomically.
  • Reduced cheap-route startup overhead by serving page shells, /api/version, /api/dependencies, and /api/config without forcing a full runtime bootstrap first.
  • Added request-order guards on the Search and Watchlist pages so slower stale responses no longer overwrite newer searches, result selections, or category/page switches.
  • Added AniDB title lookup caching and indexed candidate narrowing, while preserving a full-scan fallback when narrowed candidates miss.
  • Expanded regression coverage for forwarded-client access checks and config snapshot behavior.

0.16.0 - 2026-05-15

  • Hardened non-local access so ANI_CLI_WEB_ALLOW_REMOTE=1 now also requires ANI_CLI_WEB_REMOTE_TOKEN, accepted through Authorization: Bearer ... or X-AniCli-Web-Token, before remote clients can use the web UI or JSON APIs.
  • Removed import-time state migration side effects from app_support.py; legacy state migration now runs during runtime bootstrap instead of plain module import.
  • Narrowed watchlist persistence updates so refreshes, category changes, and download-sync writes stop rewriting the full row and are less likely to clobber unrelated fields.
  • Resolve missing queue show_id values when jobs are queued, making completed-download watchlist sync stable even if upstream search ordering changes later.
  • Continued the backend split by moving queue workers into queue_jobs.py, HTTP routing into http_handler.py, and page bodies into search_page.py, config_page.py, and watchlist_page.py, while keeping app.py and web_templates.py as stable aggregation entrypoints.
  • Hardened the shared frontend api() helpers so page scripts handle non-JSON error responses more gracefully and only send JSON content headers when a request body is present.
  • Expanded regression coverage for the new remote token gate and queue identity enrichment path.

0.15.0 - 2026-05-15

  • Started the backend/module split by moving shared runtime, state-path, config, and queue/file helper logic out of app.py into app_support.py.
  • Split shared page-shell helpers out of web_templates.py into template_helpers.py, so page templates no longer carry their own navigation/branding helpers inline.
  • Kept app.py and web_templates.py as stable aggregation points so the current tests and imports continue to work while the rest of the modularization can happen in smaller follow-up steps.

0.14.0 - 2026-05-15

  • Added watchlist categories with separate Watching, Planned, Finished, and Dropped tabs, category-aware add forms, and in-card category editing for existing entries.
  • Migrated existing watchlist rows into the Watching category by default so older tracked shows keep working without manual cleanup.
  • Added finished-state check badges: finished anime that were downloaded now show a green check, while anime moved into Finished manually show a gray check.
  • Automatically sync successful downloads into the watchlist by flagging tracked shows as downloaded and creating a new Finished entry when the show was not already tracked.

0.13.0 - 2026-05-15

  • Added AnimeSchedule-backed watchlist metadata refresh so tracked shows now store the expected total episode count and upstream airing status alongside the live AllAnime sub and dub availability counts.
  • Marked watchlist episode pills with current / total progress when the total is known, and highlight Sub or Dub in green when that release track has fully finished airing and is ready for download.
  • Added compact watchlist status tags such as Finished, Sub ready, and Dub ready, plus regression coverage for the new completion-state persistence and messaging.

0.12.0 - 2026-05-13

  • Deferred runtime initialization until the server starts or a runtime-backed API/helper is first used, removing the earlier worker/thread startup and state writes from plain module import.
  • Persisted watchlist refresh history in SQLite, restore interrupted pending and running refresh jobs as interrupted after restart, and block duplicate queued refresh submissions.
  • Hardened thumbnail in-flight event cleanup so unexpected errors during cache updates do not leave later requests waiting on a stuck per-show event.
  • Return 400 Bad Request for non-UTF-8 JSON payloads instead of surfacing them as internal server errors.
  • Expanded regression coverage for deferred bootstrap, duplicate refresh protection, interrupted refresh recovery, UTF-8 body validation, and thumbnail event cleanup.

0.11.0 - 2026-05-13

  • Moved the large inline page templates and shared page-shell helpers into web_templates.py, reducing app.py to server and runtime logic.
  • Changed the shared SQLite file from queue.sqlite3 to state.sqlite3 and added automatic migration from the previous project-local database filename.
  • Made watchlist poster image routes cache-only so opening the watchlist no longer fans out synchronous remote cover lookups from the browser image tags.
  • Moved Refresh All onto a background watchlist-refresh worker with status polling so large watchlists no longer block a request thread until every show finishes updating.
  • Added an HTTP JSON body-size guard to reject oversized uploads before the server reads unbounded request bodies into memory.
  • Reworked the test harness to run against an isolated temporary state root and added handler-level coverage for thumbnail serving, background refresh status, and oversized POST rejection.

0.10.0 - 2026-05-13

  • Fixed running-job cancellation so the worker now consistently finishes canceled downloads as canceled instead of drifting into failed or completed final states.
  • Fixed watchlist Refresh All to iterate every tracked show instead of silently stopping at the paged list limit.
  • Added loopback-only request protection by default, with ANI_CLI_WEB_ALLOW_REMOTE=1 available when remote/LAN access is intentionally desired.
  • Extracted shared sidebar branding and page-link helpers to reduce repeated inline page chrome across Search, Config, and Watchlist.
  • Added focused regression tests for cancellation propagation, full watchlist refresh coverage, local-access helpers, and shared template helpers.

0.9.0 - 2026-05-13

  • Reworked Search, Config, and Watchlist with a Tsuki-inspired visual refresh using violet accents, glassy surfaces, softer gradients, and calmer card styling.
  • Kept the existing ani-cli-web behavior and routing intact while unifying the refreshed design language across the whole web UI.

0.8.16 - 2026-05-13

  • Unified the left sidebar layout across Search, Config, and Watchlist so the page chrome now uses the same panel width, spacing, and structure everywhere.
  • Kept the Config page compact by constraining its main settings content while restoring the shared sidebar pattern.

0.8.15 - 2026-05-13

  • Removed the dependency status panel from the Search page so the main route stays focused on search, episode selection, and queue management.
  • Reworked the Config page into a centered compact settings layout instead of the earlier stretched split-screen view.

0.8.14 - 2026-05-13

  • Added a standalone /config page for saved defaults.
  • Moved the Search page defaults section onto the new Config page and added Config navigation across Search and Watchlist.
  • Kept dependency status visible while moving saved folder, mode, and quality management into the dedicated settings view.

0.8.13 - 2026-05-12

  • Added a manual thumbnail upload button for watchlist cards that still have no poster, saving the selected image into the local thumbnail cache for that anime.

0.8.12 - 2026-05-12

  • Improved thumbnail lookup for season-labeled titles by retrying AnimeSchedule searches with simplified base-title queries before falling back to AniDB.
  • Stopped failed thumbnail fetch attempts from refreshing the retry window, so broken lookups do not get stuck in an immediate 404 state after one bad fetch.
  • Added extra request headers to AniDB page lookups to improve compatibility with cover-page fetches that were returning 403 Forbidden.

0.8.11 - 2026-05-12

  • Added a small per-anime thumbnail reload button on watchlist cards that forces a redownload of that show's cached cover image.

0.8.10 - 2026-05-12

  • Fixed watchlist source links to use AllManga's bangumi/<show_id> page format instead of the earlier incorrect route pattern.

0.8.9 - 2026-05-12

  • Changed watchlist anime titles into direct links to their AllManga source pages, using the tracked show ID plus a normalized title slug.

0.8.8 - 2026-05-11

  • Moved config.json into the project-local .ani-cli-web/ folder so app settings now live alongside the queue database, watchlist data, staging files, and thumbnail cache.
  • Added automatic migration from the legacy XDG config location so existing web app settings are preserved on first startup after the move.

0.8.7 - 2026-05-11

  • Moved all project runtime state that previously lived under ~/.local/state/ani-cli-web/ into the project-local .ani-cli-web/ folder.
  • Added one-time migration for the legacy queue database, queue JSON, watchlist JSON, AniDB title dump, staging directory, and thumbnails so existing local data is carried into the project folder automatically.

0.8.6 - 2026-05-11

  • Changed watchlist cards to append into the DOM before assigning poster image URLs, avoiding detached-image and lazy-load edge cases during poster rendering.
  • Added a per-page thumbnail nonce to the local poster URL so a fresh watchlist load always bypasses stale browser-cached misses for /api/watchlist/thumb/....

0.8.5 - 2026-05-11

  • Fixed watchlist poster rendering for browser-cached images by attaching thumbnail load and error handlers before setting img.src, then immediately showing already-complete images.
  • This resolves the case where posters existed on disk and the watchlist route was healthy, but cached images stayed hidden because the browser had already finished loading them before the old listener was attached.

0.8.4 - 2026-05-11

  • Fixed the watchlist thumbnail renderer to always request the local /api/watchlist/thumb/... image route instead of trusting stale thumbnail_ready state from older cached entries.
  • This lets already-downloaded project-local thumbnails render on the page even when the cached file exists but the watchlist row has not yet been refreshed to mark it ready.

0.8.3 - 2026-05-11

  • Migrated any legacy watchlist thumbnails from the old state-directory cache into the new project-local .ani-cli-web/thumbnails/ folder on access.
  • Fixed thumbnail retry gating so the app no longer skips refetch attempts when a thumbnail filename exists in the database but the actual cached file is missing on disk.
  • Expanded thumbnail debug logging to show whether the expected cached file actually exists before the retry-window decision is made.

0.8.2 - 2026-05-11

  • Moved watchlist thumbnail storage into the project-local .ani-cli-web/thumbnails/ folder so cached images can be inspected directly from the repository tree.
  • Added debug logs for the local /api/watchlist/thumb/... route and file-serving path so thumbnail cache hits, misses, and served files are visible in --debug output.

0.8.1 - 2026-05-11

  • Added a --debug runtime flag for ani-cli-web and ./ani-cli-web that logs thumbnail-source request flow, match decisions, responses, cache writes, and failures while fetching watchlist images.
  • Added support for the typo-tolerant ---debug form as well, so debugging still works if that form is used by mistake.

0.8.0 - 2026-05-11

  • Switched watchlist thumbnails to prefer AnimeSchedule metadata, which ani-cli already uses upstream for title-based metadata lookups.
  • Stored the resolved AnimeSchedule route and title on watchlist entries so future poster fetches can reuse that stable route instead of repeating a title search every time.
  • Restored only a one-shot watchlist thumbnail warm-up request for the visible page, avoiding the old repeated background refresh loop.

0.7.5 - 2026-05-11

  • Removed automatic watchlist thumbnail warm-up requests after page render so the watchlist no longer keeps making background refresh-style requests while the thumbnail issue is shelved.

0.7.4 - 2026-05-11

  • Added watchlist removal end-to-end with a new Remove button beside Refresh and Open on each watchlist card.
  • Added a watchlist remove API action and cleaned up a card's cached poster file when its watchlist entry is deleted.

0.7.3 - 2026-05-11

  • Handled browser/client disconnects gracefully in the shared HTTP response writer so abandoned watchlist requests no longer cascade into BrokenPipeError tracebacks.
  • Ignored disconnect exceptions in the request exception path to avoid attempting a second error response on an already closed socket.

0.7.2 - 2026-05-11

  • Fixed the AniDB poster extractor to handle relative /images/main/... image links in addition to fully qualified CDN URLs.
  • Normalized AniDB poster URLs through urljoin before downloading, which should unblock entries where AniDB serves the image link off the anime page first and redirects afterward.
  • Added an AniDB referer header to image downloads for better compatibility with direct cover fetches.

0.7.1 - 2026-05-11

  • Stored the matched AniDB aid and AniDB title on each watchlist entry so future thumbnail fetches reuse a stable AniDB identity instead of re-searching by name every time.
  • Added lightweight AniDB debug hints to watchlist cards via hover text so matched AniDB IDs and titles can be inspected without changing the compact card layout.
  • Allowed forced thumbnail retries to rematch by title when a previously stored AniDB ID fails to produce a cover.

0.7.0 - 2026-05-11

  • Switched watchlist thumbnails from AniList to AniDB.
  • Added AniDB title-dump caching for local title-to-anime resolution and AniDB page poster extraction for one-at-a-time cover fetching.
  • Kept local thumbnail caching so each watchlist entry only needs its AniDB poster resolved once while it remains tracked.

0.6.2 - 2026-05-11

  • Changed watchlist thumbnail warm-up to force small sequential retry batches for the currently visible page so previously failed covers can recover immediately.
  • Removed the client-side CSS.escape dependency from thumbnail repaint logic for broader browser compatibility.
  • Kept thumbnail batching capped to avoid reintroducing external source rate-limit spikes.

0.6.1 - 2026-05-11

  • Changed watchlist thumbnail loading to a controlled batched warm-up flow so missing covers are not requested all at once.
  • Added per-show thumbnail request deduplication to avoid duplicate cover fetches while the same image is already being resolved.
  • Updated the watchlist client to repaint cards when newly cached thumbnails become available.

0.6.0 - 2026-05-11

  • Switched the watchlist to paged loading with 30 cards per page so the desktop view can target a 5 by 6 layout without leaving large blank areas.
  • Tightened the sidebar again so the main watchlist pane has more room for cards on wide screens.
  • Improved thumbnail loading by prefetching missing covers in the background and retrying failed card image requests with a forced refresh.

0.5.0 - 2026-05-11

  • Reworked the watchlist into a tighter multi-column poster grid that prioritizes title, sub and dub counts, last checked time, and refresh/open actions.
  • Added cached external cover lookups for watchlist entries under the app state directory.
  • Reduced the watchlist sidebar width so wider screens can fit roughly 4 to 5 anime cards per row.

0.4.0 - 2026-05-11

  • Reworked the standalone watchlist page to use the same split-panel layout and navigation language as the search page.
  • Added watchlist summary cards and richer tracked-show cards so status, episode totals, and search handoff all live in the same visual system.
  • Updated the search page navigation styling so both pages now feel like one consistent GUI.

0.3.1 - 2026-05-11

  • Split the watchlist out to its own standalone /watchlist page.
  • Kept the main / page focused on search, queue management, and downloads.
  • Added a watchlist-to-search handoff that pre-fills the search page query.

0.3.0 - 2026-05-11

  • Moved the watchlist into SQLite with automatic migration from the legacy watchlist.json file.
  • Changed the watchlist model to track one row per show with separate sub and dub episode counts.
  • Added manual refresh actions for one show or the entire watchlist.
  • Split the sidebar into switchable Search and Watchlist pages.
  • Added direct watchlist tracking from search results.

0.2.2 - 2026-05-11

  • Fixed a broken watchlist merge that caused app.py to fail during startup with an IndentationError.
  • Restored the web server entrypoint so ./ani-cli-web starts the local HTTP server again.
  • Repaired watchlist POST routes, storage lookups, and embedded page script placement so the watchlist UI can load and update cleanly.

0.2.1 - 2026-05-11

  • Padded season folder numbers to two digits, such as Season 01 and Season 02.

0.2.0 - 2026-05-11

  • Replaced JSON queue storage with SQLite-backed queue persistence.
  • Added automatic migration from the previous queue.json queue file.
  • Limited the queue view to 10 jobs per page with previous and next controls.
  • Added bulk queue actions to remove finished jobs and retry all failed jobs.

0.1.2 - 2026-05-11

  • Updated finalized download layout to save media under ANI_CLI_DOWNLOAD_DIR/anime_name/Season <season>/.

0.1.1 - 2026-05-11

  • Expanded .gitignore to ignore __pycache__ directories at every project depth.

0.1.0 - 2026-05-11

  • Split ani-cli-web into a standalone project that uses system-wide ani-cli.
  • Added project hygiene files: .gitignore, VERSION, and this changelog.
  • Documented runtime state handling and standalone project layout.