Skip to content

Latest commit

 

History

History
757 lines (438 loc) · 55 KB

File metadata and controls

757 lines (438 loc) · 55 KB

Changelog

0.27.1

Patch Changes

  • ef8f7cc: Make blocked Usenet searches actionable with editable Newznab and SABnzbd settings, clearer route diagnostics, and credential-safe configuration updates.

0.27.0

Minor Changes

  • 86da2af: The dashboard now surfaces what needs your attention, not just whether the machinery is up. Below the health band it lists the same needs-attention groups the Activity Center already knows about — the series, the reason in plain language, and the actions that clear them — and when nothing is waiting it says so with a single quiet line: Nothing needs you.

    That sentence is only trustworthy next to the health band's last-successful-search line. Together they close the gap that let downloads stay broken for weeks while the dashboard looked fine: the health band catches a stalled pipeline, and this one catches the specific releases that already need a human decision. Actions taken here (retry, search again, import, stop wanting) are the same exits as on the full triage route, and the count updates as soon as they land — no manual refresh.

  • 0d1105c: The dashboard now reads top to bottom in the order the questions actually matter: is the automation healthy, what needs you, what is happening, and only then what your library is. Health leads the page, needs-attention and in-flight sit together on the row beneath it, and recent activity and this week's releases follow. On a narrow window those two stack in the same order rather than reshuffling.

    Library statistics are no longer the hero of the page. The three large tiles at the top are gone, replaced by a single line of numbers below the timeline — series, issues held, and completion, now labelled of known issues held and marked not a health metric. Completion counts what is on disk against what Comicarr knows exists; it says nothing about whether downloading works, and it no longer sits next to the health band where it looked like it did.

    Ask moves to the bottom of the page and loses its suggestion chips. It is a way into chat, not an answer to any of the questions above it, and chips like "Anything stuck in the queue?" were making health claims that the health band now reports properly. The recent-chats card that sat beside "This week" goes with it; chat is reachable from the sidebar and the Ask bar.

  • 38eda3c: The dashboard now says how much work is moving right now, across every download route — one line reading "12 in flight", and "12 in flight (3 recovered from a restart)" when some of that work has already survived a restart. The two figures are never added together: the recovered ones are part of the total, not extra.

    The Queue tile is gone. It counted direct downloads only, so an operator running SABnzbd saw "0 queued" while SABnzbd was actively downloading — a claim the dashboard could not back. The in-flight line answers the same question honestly for every route, and it reads the same source as the status indicator in the footer, so the two can never disagree. If that source cannot be read, the line says so instead of reporting a quiet system.

  • 1445a9a: The dashboard's Recent activity panel now reads the same narrative stream as the Activity Center, so a failed grab or blocked download appears in the timeline instead of vanishing because it never reached the snatched table. That is the failure mode that let a broken downloader look like a quiet week: the old panel could only list things that had already been snatched.

    Each row uses the same sentence voice and deep-links as the Activity Center — failures read "Couldn't grab…", successes read "Grabbed…", and the subject links through to the issue or series. When nothing has happened, the empty state says No activity in the last 30 days and links into the full activity view, not the download-history table.

Patch Changes

  • 35415e3: The dashboard now opens with a health band that answers the only question worth opening it for: is anything broken right now? It reports whether a download route is usable, how many indexers are responding, and whether the workers are running — one quiet line when everything is fine, amber naming the specific component when it is not, and red with a link straight to the settings page that fixes it when nothing can get through.

    Alongside those it carries a last successful search line, which is the one that matters most. Every other signal reports the state of a component; this one reports whether searching has actually produced anything lately, and it goes amber once nothing has run for twice your search interval. That is the reading that catches the failure the rest of the page cannot: for weeks, downloads could be completely broken while every component reported itself fine and the dashboard looked like a quiet week. This line would have read "11 days ago".

    The band never guesses in your favour. If the health check itself cannot be reached, it says "Cannot determine health" rather than going quiet — an unanswered question is not good news. And the last-successful-search line is never hidden, at any age, including when nothing has ever run.

  • ebef755: The dashboard no longer goes blank when one thing behind it breaks. Every panel — the library figures, the queue, recent activity, this week's releases, recent chats — now loads on its own. If one of them cannot be answered, that panel alone says "unavailable" and offers a retry next to it, and everything else on the page still works. Previously the whole page was built from a single request, so one failure took the page down entirely, and a failure that was quietly swallowed showed up as an empty panel — indistinguishable from a genuinely quiet week.

    That distinction is the point: an empty panel now means the answer really was nothing, and a broken one says so out loud. The panels also reserve their space while loading, so a slow one no longer shifts the page around as it arrives.

    The dashboard reads the same information in the same order as before, with one correction: the count above each panel now matches the rows beneath it. "Recent activity" could previously say ten events above a list of five.

0.26.4

Patch Changes

  • ff69928: Fixed usenet downloads never reaching SABnzbd. Instead of sending the NZB, Comicarr sent SAB a link pointing back at itself and expected SAB to come and fetch the file — from an address Comicarr had to guess (a network probe, a STUN lookup, or the host_return setting when both guessed wrong), at an endpoint that did not exist. Inside Docker the guessed address was the container's own short-lived IP, and the missing endpoint answered with a web page rather than an error, so nothing anywhere reported a problem: the snatch looked successful and the download simply never happened. Comicarr now uploads the .nzb to SABnzbd directly, the same way it already does for NZBGet, so the handoff finishes in one step and SAB's own reply confirms it. Your SAB category, priority, and certificate-verification settings are unchanged.

    Because no download client is ever handed a Comicarr address any more, the host_return setting has no purpose and is removed from config.ini automatically on first start after upgrading. Comicarr also no longer probes the network at startup to work out its own address.

  • 455dafb: Fixed the "in flight" count reporting work that stopped happening long ago. When Comicarr restarted, it restored every unfinished search and refresh — correct for something a restart interrupted, but it also restored obligations that could never make progress, over and over, with nothing ever giving up on them. On a long-running install those accumulated into hundreds of entries the health count reported as active work, so the number told you nothing. Comicarr now gives up on an item that has come back from three restarts without ever finishing, records it as quarantined, and stops counting it. The bound is restarts rather than elapsed time, so an item that is simply queued behind a long backlog is never abandoned. Entries stranded before this shipped are cleared once on the first start after upgrading; nothing is lost, because whether an issue is wanted lives on the issue itself and anything still wanted is picked up by the next search.

    The status endpoint also reports recovery_pending alongside in_flight, so a surface can say "N in flight (K recovered from a restart)" instead of one number that hides the difference.

0.26.3

Patch Changes

  • b672dfc: Fixed a failed torrent download landing in manual review — and permanently blocking that issue from that provider — when the .torrent file simply could not be fetched. If the tracker was unreachable, timed out, or returned something unusable, Comicarr crashed inside the send step instead of reporting a clean failure. Because a crash there means "we do not know whether the download client got this", the attempt was filed for manual review, which is terminal: every later attempt on the same issue and provider was then refused before it even reached the client, so the 6-hourly search retried into the same wall forever while telling you nothing useful. A fetch that never reaches the download client is now reported as an ordinary failure and goes to Failed Download Handling, so the release can be retried normally. This affects all five torrent clients (rTorrent, Deluge, qBittorrent, Transmission, uTorrent).
  • 6bfa938: Fixed Retry and Search again doing nothing for an issue that had landed in needs-attention. Once an attempt ended in manual review, that issue was permanently blocked from that provider: the retry re-wanted the issue and started a search, and the search then refused to hand anything to the download client — so the item quietly bounced back into needs-attention on the next cycle, forever, with nothing in the log to say why. Resolving a needs-attention item now genuinely releases it, so the next search can grab it again, however many times you need. An item you have not resolved yet still blocks — it may be something your download client already has, and clearing it automatically would both hide it from you and download it twice — but the log now names the item and its reason instead of reporting an unexplained handoff failure.
  • e652bfe: Fixed series refresh failing outright whenever it had issue or location changes to write. Refreshing a series looked up its database table under the wrong name, so the moment a refresh found something to update — a new issue, a changed status, a relocated series folder — the write raised Unknown table for upsert and the whole run was recorded as failed. Refreshes that happened to find nothing to change appeared to succeed, which is why this could go unnoticed while every real update was being dropped. The same defect affected annuals, the bulk series-location update after a config change, and the dynamic-name maintenance pass. All of them now write correctly, so a refresh actually persists what it finds.

0.26.2

Patch Changes

  • 99d0178: Fixed searches aborting and providers going dark for an hour whenever an indexer returned any error at all. A rate-limit response — Prowlarr's plain HTTP 429, the most common thing an indexer says when you search too often — was treated identically to the indexer being unreachable: Comicarr blocklisted the provider and abandoned the search. The check meant to distinguish the two cases had been written so that it always fired, so in practice every transient hiccup cost you the whole search cycle, and the next one 6 hours later. Comicarr now inspects the actual failure: if the provider answered at all, it is left enabled and only that one search is skipped, and only a genuine connection failure (refused, timed out, host or network unreachable) blocklists it. The same fix applies to the GetComics DDL provider. These failures also no longer dump a 130-entry table of system error codes into your logs on every occurrence.

0.26.1

Patch Changes

  • 0376408: Comicarr images are now published to Docker Hub as comicarr/comicarr, mirroring the existing GHCR images tag for tag from the same build. docker pull comicarr/comicarr:latest works, matching what the website has been advertising. Nothing changes for existing installs — ghcr.io/frankieramirez/comicarr remains the canonical reference and is still what the update instructions point at, since GHCR does not rate-limit anonymous pulls.
  • 5dc0876: Fixed the docker pull command in the update-available popover, which pointed at an image tag that does not exist. Comicarr publishes bare-semver tags (0.26.0), but the popover copied a v-prefixed reference (ghcr.io/frankieramirez/comicarr:v0.26.0) that fails with a manifest-not-found error. The surrounding advice was also incomplete: pulling an image never moves a running container onto it, but the popover implied a plain pull was enough. Both paths are now spelled out — set the pinned tag in your compose file and up -d, or stop and remove the container and re-run it. The README says the same.

0.26.0

Minor Changes

  • 2999227: Needs attention now has a "select all" checkbox in the filter bar, so every visible issue can be selected at once instead of checking cards one by one. It follows the active filters — narrow to Failed or the last 7 days first and only those issues are grabbed — and it shows a dash when only some are picked.

  • a85a8bc: The needs-attention band no longer asks you to babysit failures Comicarr can handle itself. After a restart, downloads that vanished from the client, bad DDL links, and similar dead ends are returned to the acquisition cycle automatically — blocklisted when the release is gone, re-wanted so the next sweep can find a different source — instead of stacking up as hundreds of red cards you can only "retry" by hand.

    What still needs you stays on the band: files that downloaded but never made it into the library, downloads waiting on a decision only you can make, and failures where you turned auto-handling off. Those still group by series and cause, still open the Needs attention page, and still clear only when you act.

    Under the hood every failure reason is classified once, in code. New reasons have to declare whether they belong on the band before they can merge, so the next bulk failure can't recreate the old pile.

0.25.0

Minor Changes

  • 9a629c7: The needs-attention band no longer buries the Activity timeline. Instead of one red row per failure — several hundred of them on a busy install, pushing the feed off the bottom of the page — the band now shows at most five cards in a single fixed-height row, and the timeline sits directly beneath it no matter how much has gone wrong.

    Failures are grouped by series and cause, so a restart that stranded 47 issues of one title reads as one card marked ×47 rather than 47 identical lines. Each card names the series, says what went wrong in plain language instead of downloaded_invalid_artifact_command:PostProcessCommandError, and is colour-coded by what it wants from you: red when Comicarr couldn't finish, amber when it's waiting on your decision. Newest trouble ranks first.

    A new Needs attention page at /activity/attention is where you actually work through them. It lists every group, filters by stage and age, searches by series or reason, and lets you select several at once. The ⚠ N need attention count in the status bar now counts distinct problems rather than rows, and clicking it lands here. Activity keeps its three tabs — Timeline, Direct Downloads, Download History — unchanged.

    Group and bulk actions fan out over every issue behind a card in one click. Failures are per-issue: if one of sixteen can't be retried, the other fifteen still clear and you get told which one didn't, rather than losing the whole batch. Comicarr processes 25 issues per action and says how many it left for the next click.

    Ignore is now Stop wanting, everywhere. It always meant "mark this ignored in the library and stop searching for it" — not "dismiss this alert" — and the old name invited the wrong reading. Stopping two or more issues at once now asks you to confirm, naming the series, the count, and what happens.

0.24.1

Patch Changes

  • ea4f1b2: Open Activity surfaces now refresh the moment work happens instead of waiting out the 30s poll, and they catch up immediately after a dropped connection. Bursty work — a search run grabbing dozens of issues — costs one refresh, not one per issue.

    Toasts are quieter and more useful: Comicarr interrupts you once when something starts needing attention, then stays silent until the needs-attention count clears. Routine progress no longer toasts at all. The noisy "Search Complete", "Task Complete", and duplicate "Series Added" pop-ups are gone; the Activity timeline carries that history instead. A server restart now says so, and the status bar reports unreachable when the connection has been down long enough to matter rather than only after the next health check.

  • 3e18796: Pagination controls on Library, Search, Wanted, and Activity now stay on the bottom edge of the window. The rows scroll inside the table while the page header, filters, and the pager stay in place, so moving to the next page no longer means scrolling to the end of the list first.

    Every table now shares one footer: it reads 21–40 of 143 so you can see where you are in the results rather than just how many there are, and single-page tables drop the pager instead of showing prev and next greyed out.

0.24.0

Minor Changes

  • 9301ee5: The Activity timeline now records real library work as it happens — grabs, downloads, imports, series adds and refreshes, metatagging, and search run summaries — instead of the old unused global message slots. Failed downloads and completed search runs show up as plain-language rows with distinct reasons.

0.23.0

Minor Changes

  • cc88c15: Activity now opens on a Timeline tab (with Direct Downloads and Download History beside it). A pinned needs-attention band shows actionable failures above a ledger-style feed of plain-language stories, and series/issue detail pages deep-link into a scoped Activity view.
  • e6e12af: The bottom status bar now shows quiet activity counts (M in flight, optional ⚠ K need attention, or idle) instead of the old DDL queue: N active line. Click the activity text to open Activity.
  • 690acb9: After an upgrade, Comicarr shows a What's New modal once until you acknowledge it, and keeps a permanent What's new history under Settings → About.

0.22.0

Minor Changes

  • de44564: Comicarr now runs a daily Ledger Retention job that prunes old acquisition, pipeline journal, maintenance, and AI activity ledger rows under fixed age and count rules, so those tables stop growing without bound.
  • 8c86384: Failed and manual-review downloads on the needs-attention work queue can be cleared with retry, search again, ignore, or import — without rewriting pipeline stage history.
  • 60a8c70: When release announcements are enabled (announce_releases = True under [Git] in config.ini; default off), Comicarr sends one outbound message through every enabled notifier after a check finds the install behind — body is {current} → {latest} plus the GitHub release URL. The same remote version is not re-announced every check interval. Snatch/grab notifier flags are not reused.
  • c58a06a: Settings → About now has an Updates group: turn automatic release checks on or off, choose whether to announce releases through enabled notifiers, see why update status looks quiet (including air-gapped or rate-limited installs), and run Check now even when automatic checks are off.
  • 4bd5691: When an update is available, the sidebar version pill shows a quiet status dot. Opening it compares your install to the latest release, loads What’s new from the shared notes pipeline, and offers install-type How to update steps plus a Release link — without applying the update in-app.

0.21.0

Minor Changes

  • fca4d33: Update checks now compare the Changesets release version against GitHub releases/latest (semver behind / current / unknown) instead of counting commits. GET /api/system/version exposes update_state, update_reason, release_version, and a v-stripped latest_version; commits_behind is gone. Automatic release checks default on for new and existing installs (config version 16 rewrites a still-False CHECK_GITHUB to True). Comicarr contacts GitHub every 6 hours when checking is enabled — set check_github = False under [Git] in config.ini to opt out. The dead update toast path and AUTO_UPDATE self-apply are retired.
  • 9522693: Wanted rows now show a live-sticky search annotation (searching…, no match · N tries, never searched) from the latest acquisition run item, without changing when an issue leaves Wanted.

Patch Changes

  • 0d586ab: Default GIT_USER now points at the Comicarr project owner so update checks hit the real repository instead of an unrelated third-party one.
  • 32b9084: Failed downloads now terminalize pipeline_journal so needs-attention and in-flight counts stay honest when a download fails or auto-retry re-searches.

0.20.12

Patch Changes

  • e1601bf: Show one release version across the sidebar, Settings, and About instead of mixing the package badge with a git SHA or stale install metadata.
  • b7c8c6d: Render unknown series issue dates as a placeholder instead of the 0000-00-00 storage sentinel.
  • 5ec70d4: Wanted filtering now searches the full queue, not only the currently loaded page. Typing a filter term sends it to /api/wanted so match count, pagination total, and Next/Previous all describe the same filtered result set — matches that used to sit on page 2 are no longer invisible from page 1.

0.20.11

Patch Changes

  • ad7a747: Fix the AI chat thread list returning HTTP 500 on ordinary page loads after upgrading past pre-library-chat installs. Schema validation now requires the complete schema for the stamped Alembic revision rather than the migration head, so 0002 databases missing ai_chat_* tables can reach 0003_library_chat and the recent-chats endpoint can return an empty or populated list.
  • 14b0403: Keep Library list series titles readable at phone widths by adapting the list row to a title-first three-column layout below the md breakpoint.
  • d9970c1: Fix series issue title links so they open the issue detail page instead of redirecting to the Dashboard
  • 88832e9: Fix Story Arcs search so Enter, the Search button, and the empty-state action submit the query and render provider results or clear empty/error states

0.20.10

Patch Changes

  • d1b93d0: Opening the Library with an out-of-range page in the URL (e.g. ?page=99) still shows the last real page, but the URL is no longer rewritten to that page — it stays exactly as entered. The rewrite could not tell "rows have not loaded yet" from "genuinely past the end", which is what used to strip the page from cold deep links.

0.20.9

Patch Changes

  • 923ad54: Clearing an AI number field (timeout, requests per minute, daily token limit) no longer fails the whole settings save with "Failed to save configuration" — the field now falls back to its default (30 / 20 / 100000) like the other numeric settings.
  • 12916e8: The Metron Password field in Settings → API now actually saves. METRON_PASSWORD was never registered as writable, so every save silently dropped it — the "Password saved" indicator could only ever reflect a value set outside the UI. The password is stored encrypted like the other secrets, and an empty field leaves a previously saved password unchanged.
  • 2617227: Fix the Library table keeping a filtered-out series selected. Selecting a series and then filtering it out of view left it selected: the bulk bar still read "1 selected" and Delete, Pause, and Resume would still act on a series you could no longer see. The selection now follows the view — a series the filters remove is dropped from the selection, and comes back deselected when the filter is cleared. Selections still survive paging, since a series on another page is only out of sight, not filtered out.

0.20.8

Patch Changes

  • 6a4b634: Remove the unreachable IssuesTable component and the code that existed only to support it. The component was dropped from the series detail page during the frontend redesign and has had no caller since, along with its bulk-metatag hook, progress-bar cell and two supporting types. No user-visible behaviour changes.

0.20.7

Patch Changes

  • 3ca42aa: Re-raise SystemExit after config transaction rollback instead of swallowing it as a failed save
  • f12c991: Fix the Library page dropping a deep-linked page number. Opening or reloading /library?page=2 rendered the first page and stripped page from the URL, so bookmarks and shared links always landed on page one. Two independent causes had to be addressed: the page-clamp effect ran while the series list was still empty, and TanStack Table's automatic page reset fired after the first render that had rows, undoing the page the URL asked for. A page number that is genuinely out of range still settles onto the last page, and changing the row set still returns you to the first page.

0.20.6

Patch Changes

  • 979d94c: Upgrade nuqs to 2.9.2, which fixes an upstream bug where URL-backed state could permanently desync from the URL after React discarded a render (nuqs#1501). The library's React Router adapter on React 19 was affected, and the Library page's sorting, filtering and pagination are the state this repo keeps in the URL.

0.20.5

Patch Changes

  • 1876c6f: Fix Mylar3 config migration discarding every setting when the source config used NZBsu or DOGnzb

    _BAD_DEFINITIONS carried seven remapping entries for NZBsu and DOGnzb — providers Mylar3 shipped built in and Comicarr no longer defines. migrate_mylar3_config reads that table independently of _CONFIG_DEFINITIONS, so a config.ini with an [NZBsu] or [DOGnzb] section produced keys nothing could define. process_kwargs then raised KeyError inside writeconfig, and the caller swallowed it as "config migration failed (data migration succeeded)" — so all 400+ settings were dropped and the install came up on defaults, with one log line as the only trace.

    The seven entries are removed, and the migration now skips any undefined key with a warning instead of losing the whole batch to it.

0.20.4

Patch Changes

  • ecc6cd8: Honour the file operation setting when finalizing a manual import. Confirming an import always moved files into the series folder regardless of whether File Operations was set to copy, hardlink, or softlink — so operators using a link mode to keep their download folder intact lost the source file on every manual import. Finalization now copies, hardlinks, or symlinks to match the setting, and only consumes the source under move.
  • 85d1830: Route manga post-processing through the shared file placement stage. Sixty-five lines of replace-what-is-there policy — recognising a chapter an earlier pass already placed, moving an existing chapter aside rather than deleting it, putting it back when placement fails — move out of the post-processor and into the one module that owns placement.
  • 3462841: Route the remaining post-processor file placements through the shared placement stage, so every one of them reads the file operation setting at the moment it runs rather than from a value passed in earlier.
  • 0ab31e2: Route story-arc directory placement through the shared placement stage and remove the two legacy file-operation helpers it was the last caller of. Every file Comicarr places now goes through one module that reads the file operation setting at the moment it runs, and an architecture test keeps it that way.

0.20.3

Patch Changes

  • 5eab8db: Surface the actual reason a search is blocked instead of a generic placeholder.

    When no acquisition route was handoff-ready, the search-missing preview and the Wanted force-search both read a reason key that get_search_health() never returns, so every blocked search reported no_viable_acquisition_route no matter the cause. Route readiness already computes a specific blocker per route (path_not_ready, client_not_ready, disabled, providers_temporarily_blocked, a maintenance hold); the blocked response now reports the one closest to ready, and the series search dialog explains it in plain language while keeping the raw code visible for support.

  • f01a1f7: Add a single file placement stage that reads the file operation setting at call time. Callers pass intent — what the file is for, and what to do if the destination is occupied — instead of a resolved mode, so no caller can bind a stale setting and place a file the wrong way. Nothing routes through it yet.

0.20.2

Patch Changes

  • 1ff6148: Record API key regeneration as an audit log event with the user and originating IP. Rotation revokes every outstanding API credential, so integrations start failing immediately — previously nothing in the log explained why.

0.20.1

Patch Changes

  • 8c6a834: Route every "is this manga, and which provider owns it?" decision through a single series_kind module instead of 23 copied ID-prefix checks.

0.20.0

Minor Changes

  • ea4b9e9: Add a dedicated saved Library Chat workspace with image attachments.
  • ea4b9e9: Redesign the chat workspace and move its entry point out of the sidebar navigation. Chat now opens from a pinned "Ask Comicarr" launcher above the account menu (or ⌘⇧K), the workspace gains a grouped and searchable thread rail, a thread header with the answering model, and a calmer transcript, and the dashboard gets an ask bar plus a recent-chats list in place of the command hint card.

Patch Changes

  • ea4b9e9: Report a pull-list outage in plain language instead of dumping raw response headers into the log. When the pull-list host is unhealthy, Cloudflare answers on its behalf; only one of those replies was recognised, so the rest were logged as an unreadable header dump. All of them now explain that the source is temporarily unreachable and that the data shown may be stale, including how long upstream asked us to wait when it says so.

0.19.14

Patch Changes

  • 1f58860: Fix torrents snatched through qBittorrent, Transmission or uTorrent never being monitored. They were sent to the client successfully and then left in Snatched forever: nothing polled them, post-processing never ran, and a restart could not pick them back up. All five torrent clients are now polled through one code path, and a client being unreachable is kept distinct from a torrent genuinely being gone, so an outage no longer looks like a lost download.

    The auto-snatch worker now also starts for uTorrent, Transmission and qBittorrent — and for a local-post-processing-only setup — so the releases those clients queue are actually consumed instead of piling up unread. Torrents paused for the local post-processing copy are resumed even when the copy fails, the on-snatch script keeps firing for the three newly monitored clients, and every qBittorrent and uTorrent WebUI call now has a timeout so one hung client can no longer stall monitoring for every download.

  • b5ec0d4: Fix saving settings failing whenever the RSS check interval or database update interval was changed. Both fields were sent under names the configuration did not recognise, which rolled back the entire save — every other setting changed at the same time was discarded without a visible error.

    Interval changes now also reach the running scheduler, which they never did, so a new search or RSS cadence takes effect without a restart. The database update interval is a real setting now and survives a restart instead of resetting to 24 hours.

    Setting an interval to zero and then correcting it no longer leaves that background job switched off. Jobs paused deliberately — from the jobs page, or by turning RSS off — still stay paused. A database update interval below an hour is raised to an hour, the way the search and RSS intervals already were, so a negative value can no longer schedule the updater to run without pause.

  • 332bab6: Fix MyAnimeList cover art being blocked by the browser security policy. The list of hosts trusted to serve cover images and the Content-Security-Policy that permits the browser to load them are now derived from one source, so they cannot drift apart again.

  • 95fba47: Fix MyAnimeList manga series being treated as comics in two places: downloads were post-processed down the ComicVine path instead of the manga path, and the scheduled chapter check skipped them entirely, so they never picked up new chapters. MangaDex-added series now also record their MangaDex id, which the "already in library" check on search results depends on.

  • 159f47e: Fix bulk actions on the Wanted and Upcoming lists doing nothing. Selecting rows never registered, so the action bar reported no selection and Search or Skip ran against an empty set.

    Clearing the selection, changing page, or a row disappearing now also unchecks the rows, so a later bulk action cannot skip issues you already cleared or that are no longer on screen. A bulk Skip or Mark Wanted that fails partway through now reports how many issues were applied and keeps only the failures selected, instead of reporting a total failure and retrying the ones that succeeded.

  • 98cb480: Fix manga post-processing deleting the downloaded file when the file operation is set to hardlink or softlink. Both modes are meant to leave the download in place; the manga path moved it regardless, so the original was destroyed. It now uses the same mode-aware file placement as the rest of post-processing.

    Manga chapters that are already in the library also import correctly again. A repack, a manual re-run, or a post-crash retry now replaces the existing file under every file operation mode, instead of failing on the hardlink and softlink modes and leaving the chapter unimported.

  • 117321b: Fix the version and update-available information never changing after startup. The scheduled version check wrote to a copy of the state that the API does not read, so a new release was never reported once the process was running. The branch name, which nothing ever set, is now reported too. A version check that fails to reach GitHub now keeps the last known result instead of reporting "up to date".

0.19.13

Patch Changes

  • 544eb20: Fix MAL manga series: rescan no longer crashes on chapters without dates, Refresh routes mal- IDs through the MAL importer instead of ComicVine, and MAL cover images now display (CSP allowlist plus local cover caching).

0.19.12

Patch Changes

  • d692778: Prevent manual imports from overwriting files created during finalization.

0.19.11

Patch Changes

  • 7d1c77a: Fix Library pagination controls resetting to the first page.

0.19.10

Patch Changes

  • ecf8b0c: Fix Library filters (empty dropdowns, double chevrons, broken search) and unify view toggle, search, and filter chips into one action bar.

0.19.9

Patch Changes

  • ad8a35a: Restore legacy MyAnimeList manga covers by normalizing provider image URLs to the MAL CDN.

0.19.8

Patch Changes

  • b56f7dc: Restore manga covers and chapter rows when adding MAL series, and fix library inbox matching so scanned manga files can be processed.

0.19.7

Patch Changes

  • fd4af61: Show live library, API, and download queue status in the application top bar.

0.19.6

Patch Changes

  • ac143fa: Improve the application error recovery screen with clearer guidance and reload controls.

0.19.5

Patch Changes

  • 3d626f0: Revoke all active UI sessions durably on logout while preserving the current session when secure key rotation fails.
  • 2f59687: Persist additional Newznab and Torznab credentials transactionally with encrypted API keys and truthful save failures, while scrubbing provider secrets from diagnostics and retained config backups.
  • 64aea8c: Keep clients, database connections, and runtime context open for terminal process exit when a scheduler job or worker remains alive after its bounded shutdown drain.
  • 61249df: Harden bundled downloader integrations and package vendor clients under Comicarr's supported namespace.
  • 5bd9fdf: Fix modern backend correctness hazards and enforce a strict lint ratchet for active application code.
  • 0433c04: Reject empty, multiple, partial, unknown, and structurally spoofed Alembic revision states before schema mutation, and verify legacy adoption across every supported database dialect.

0.19.4

Patch Changes

  • 2e0b8da: Fix library scan reconciliation so detected files are recorded on their issues, and sort matched scan results before unmatched folders.

0.19.3

Patch Changes

  • 743a908: Fix library scans so existing comic series are reconciled instead of reported as unmatched.

0.19.2

Patch Changes

  • 59fd790: Make library scan progress and import confirmation visible across the Dashboard and Import pages.
  • d5d338f: Keep search route loading visible, harden health diagnostics, and allow a single Wanted issue to be searched without forcing the backlog.
  • 0f19c09: Reconcile scanned comic folders with existing series and show the outcome in Import.

0.19.1

Patch Changes

  • 5816867: Prioritize operator-requested searches over restart recovery, ensure configured Torznab providers are searched, and expose safe provider-attempt diagnostics.

0.19.0

Minor Changes

  • b95001e: Restore reliable comic acquisition and recovery: durable search/refresh workers, reservation-before-submit handoffs, acquisition run ledgers, route health, evidence-driven repair, and server-side Search all missing. Add an operator recovery runbook; the current canary permit authorizes or cancels one exact handoff, while a future persisted-candidate executor is required before it can prove a full production canary.

0.18.9

Patch Changes

  • 7157998: Restore current operational dashboard data and add a safe, observable weekly release refresh.

0.18.8

Patch Changes

  • 476e5bd: Fix scheduled updates for manga libraries, rebuild Activity with searchable sortable paginated tables, show accurate live queue counts and relative activity times, and add a dashboard library-scan action.

0.18.7

Patch Changes

  • 860faea: Show the real app version in the sidebar, login screen, and onboarding welcome step instead of a hardcoded 0.15 / v0.15.1 badge.

0.18.6

Patch Changes

  • 0450b4a: Keep server-sent event streams responsive under burst traffic by replacing stale queued updates without emitting event-loop errors.
  • 2de9e62: Deduplicate legacy database rows across migration batches and report target constraint conflicts as failed migrations.
  • a9df84e: Fix AI library completion filters so percentage queries work on SQLite and preserve inclusive bounds, ordering, and limits.
  • 8f8fd4e: Validate and persist reconstructable direct-download jobs, keep malformed jobs from stopping the worker, and hold the GetComics download lock through archive publication.
  • cd53fb6: Keep provider downloads inside Comicarr's configured directories, publish completed files atomically, and reject remote ZIP archives that would expand beyond safe resource limits.
  • d8a05f1: Validate series directories against configured library roots and preserve database records when directory removal fails.
  • e1cbccf: Repair atomic upserts on legacy SQLite databases with an isolated safety snapshot and transactional unique indexes that preserve historical null or empty-key rows.
  • ee651ca: Persist config changes through a shared transaction boundary, encrypt secrets before disk writes, preserve private file permissions, and report storage failures without committing runtime config state.
  • 7298807: Stop logging 32P runtime credentials and scrub previously written credential lines from support carepackages.

0.18.5

Patch Changes

  • 027d784: Harden artwork cache paths and cover image fetches against path traversal and SSRF (allowlisted hosts, no redirects, size and content-type caps).
  • 37ff1f7: Fix Discord and sibling webhook notifiers so successful deliveries are reported correctly and network errors return false instead of raising.

0.18.4

Patch Changes

  • 2ef88d3: Fix API key regeneration persistence, secret redaction handling, dependency floors, and E2E regression coverage.

0.18.3

Patch Changes

  • 2a6b0db: Fix manual import matching so selected files are finalized before pending import rows are marked imported.

0.18.2

Patch Changes

  • b29dad4: Fix manual import matching so selected manga imports are finalized and stale pending import records can be ignored or deleted from the review table.

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

0.18.1 (2026-06-09)

Bug Fixes

0.18.0 (2026-05-17)

Features

  • Restart-durable download/post-process pipeline (#156) (49b569f)

0.17.1 (2026-04-20)

Bug Fixes

  • Render issue rows on series detail page (#141) (ba24726)

0.17.0 (2026-04-19)

Features

  • Align library, releases, and wanted tables with redesign (#139) (4993293)

0.16.0 (2026-04-19)

Features

0.15.1 (2026-04-15)

Bug Fixes

  • Resolve library pagination not responding to clicks (#135) (db39a8b)

0.15.0 (2026-04-14)

Features

  • Add list/grid view toggle to library page (#133) (7c76e2b)

0.14.0 (2026-04-14)

Features

  • Restructure information architecture for modern UX (#131) (896c788)

0.13.0 (2026-04-14)

Features

  • Persist Series page table state in URL via nuqs (#129) (80c1777)

0.12.2 (2026-04-07)

Code Refactoring

  • Redesign Import Management into Library Scan + Import Inbox (#117) (a2533ef)

0.12.1 (2026-04-07)

Bug Fixes

  • Manga import chapter population, cover caching, and series bulk actions (#115) (39636de)

0.12.0 (2026-04-07)

Features

  • Add MyAnimeList as primary manga metadata provider (#113) (5a68333)

0.11.1 (2026-04-07)

Bug Fixes

  • Make Import page scan cards symmetrical (Comic + Manga side-by-side) (#111) (4fedd0b)

0.11.0 (2026-04-06)

Features

  • Elevate manga to first-class citizen with full parity (#110) (ec68bbb)

Bug Fixes

  • Add error fallback for broken images in Recent Downloads (#108) (8c63f74)

0.10.4 (2026-04-06)

Bug Fixes

  • Resolve broken dashboard images and AI banner issues (#106) (8010da1)

0.10.3 (2026-04-06)

Bug Fixes

  • Clean up 9 frontend ESLint warnings for zero-warning baseline (#96) (a547170)

0.10.2 (2026-04-06)

Bug Fixes

  • Resolve startup errors in git detection and job scheduler (#103) (c5dcb6b)

0.10.1 (2026-04-06)

Bug Fixes

  • Replace MySQL-only right/concat with SQLite-compatible substr (#101) (4cd03a5)

0.10.0 (2026-04-06)

Features

  • BYOK AI Suite — LLM-Powered Intelligence Layer (#99) (1e8e501)

0.9.8 (2026-04-05)

Bug Fixes

  • Remove deprecated Vitest 4 poolOptions config (#95) (ed5b56d)

0.9.7 (2026-03-25)

Bug Fixes

  • Resolve settings page showing empty pre-filled values (#84) (cabc4bc)

0.9.6 (2026-03-25)

Bug Fixes

  • Constrain search result hover cards to prevent viewport overflow (#81) (b8e0362)

0.9.5 (2026-03-25)

Bug Fixes

  • Skip unexpanded git export-subst placeholders in version display (#79) (4322e01)

0.9.4 (2026-03-25)

Bug Fixes

  • Resolve asyncio.get_event_loop() errors in all system router endpoints (#77) (5965606)

0.9.3 (2026-03-25)

Bug Fixes

  • Resolve UnboundLocalError in job_management and KeyError in DDL health check (#75) (a649d50)

0.9.2 (2026-03-25)

Bug Fixes

  • Remove leftover CherryPy dependencies blocking Docker startup (#73) (c51526e)

0.9.1 (2026-03-25)

Bug Fixes

  • Include version in settings page config response (#69) (f59c89b)

0.9.0 (2026-03-25)

Features

  • FastAPI migration with vertical domain decomposition (07f79ad)

0.8.0 (2026-03-24)

Features

  • Enrich search results with additional API metadata (#65) (e7fd739)

0.7.0 (2026-03-24)

Features

  • Add content source toggles for comic-only or manga-only experience (#63) (d214139)

0.6.0 (2026-03-24)

Features

  • Migrate all tables to DataTable component with OpenStatus data-table (#62) (f92ee50)

Bug Fixes

  • resolve weekly table KeyError and add version display to Settings (#60) (5662361)

0.5.0 (2026-03-24)

Features

  • Build complete Story Arcs frontend and fix backend gaps (#58) (6868e74)

0.4.4 (2026-03-24)

Bug Fixes

  • replace broken db.rawdb calls with direct raw_select_all/raw_select_one (#56) (d1a7429)

0.4.3 (2026-03-23)

Bug Fixes

  • dark mode issues in settings and remove placeholder UI (#54) (069f57e)

0.4.2 (2026-03-23)

Bug Fixes

  • run uv lock in Docker build to handle version bumps (27b610d)

0.4.1 (2026-03-23)

Bug Fixes

  • sync uv.lock and prevent stale lockfile on release (#51) (0efcc3e)

0.4.0 (2026-03-23)

Features

  • Automate releases with release-please (#47) (12adb79)

Bug Fixes

  • Metron search missing cover images + API hardening (#48) (639c9d3)

[0.1.0] - 2026-03-21

Added

  • Modern React 19 frontend with Tailwind CSS 4, replacing the legacy jQuery/Bootstrap UI
  • Real-time updates via Server-Sent Events (SSE)
  • Dark and light theme support with system preference detection
  • Smart search with parallel pagination and result caching
  • Server-side search sorting with mode-aware controls
  • Weekly pull list tracking up to 4 weeks ahead
  • Story arc management with lazy loading
  • Direct download support for Mega, MediaFire, and Pixeldrain
  • Multi-stage Docker build with non-root user and dynamic PUID/PGID support
  • GitHub Actions CI/CD: linting, testing (Python 3.10-3.12 matrix), and automated releases to GHCR
  • Multi-architecture Docker images (amd64, arm64)
  • Comprehensive test suite with unit, integration, and E2E tests

Changed

  • Rebranded from Mylar3 to Comicarr throughout the codebase
  • Switched to uv for Python dependency management
  • Upgraded to Python 3.12 runtime in Docker
  • Upgraded to Node.js 22 for frontend builds
  • Improved search performance with parallel provider queries
  • Enhanced API key and credential handling — secrets are redacted in logs and CarePackage exports

Fixed

  • API key plaintext logging vulnerability
  • SABnzbd integration regression
  • ComicVine result display when MangaDex is disabled
  • Various startup and configuration issues

Attribution

Comicarr is built on the foundation of Mylar3, created by the Mylar3 team. The original project provided the robust backend for comic management, downloading, and post-processing.