April 2026 Updates
Here's a summary of everything that landed in Metron since the beginning of April 2026.
Here's a summary of everything that landed in Metron since the beginning of April 2026.
During March the Metron Project added the following to its database:
Thanks to everyone that contributed!
Early in March, we reduced the API rate limits due to increased server load from growing API usage. The new limits are:
Updated releases of Mokkari and Metron-Tagger were published to reflect these changes. If you consume the API directly, make sure your code handles HTTP 429 responses and respects the Retry-After header. If we receive enough donations to cover a server upgrade, we would look at restoring the daily limit to 10,000 requests per day.
Here's a summary of everything that landed in the website since the start of March, covering API improvements, reading list enhancements, collection stats, and a handful of performance and bug fixes.
The API rate limit was adjusted to 20 requests/minute and 5,000 requests/day. To make this more transparent, the API now returns rate limit response headers on every response, so clients can see exactly how many requests they have remaining. Users can also see their current daily API usage — requests used, remaining, and a color-coded progress bar — directly in their profile's Account Settings section.
Two more endpoints now support conditional requests (ETags / If-None-Match):
modified timestamp, so clients can detect item changes without polling /items/./issue_list/ endpoints — thanks to Jonas Stendahl for this contribution.This means clients can avoid re-downloading unchanged data, saving bandwidth for both users and the server.
The ReadingList model and API received several new additions:
list_type field — exposed in both the list and detail serializers, with human-readable display values.image field — reading lists can now have a cover image. When set, the reading list detail page displays a semi-transparent hero header using the image; it falls back to the plain header when none is present.PATCH request to SeriesViewSet that was silently clearing the imprint field when it was omitted from the request body.ReadingList unique constraint to include attribution_source, allowing a user to have multiple lists with the same name as long as they come from different sources.ReadingListListView.2by3 aspect ratio with a center crop, the template detects the aspect ratio of the generated thumbnail and uses is-3by2 for landscape images and is-2by3 for portrait.prefetch_related with select_related in HomePageView for recently edited issues, reducing two extra queries to a single JOIN.PublisherSeriesList and ImprintSeriesList card grids.SafeAutocompleteWidget subclass now normalises empty string and empty list values to None before the upstream widget tries to filter on them.Thanks to Jonas Stendahl for his contributions this month.
Here's a summary of everything that landed in Mokkari during March, covering rate-limiting overhaul, new schema fields, and dependency refreshes.
The per-session rate limits were updated to match the current Metron website limits:
| Limit | Old | New |
|---|---|---|
| Per minute | 30 | 20 |
| Per day | 10,000 | 5,000 |
Session and the top-level api() function now accept an optional bucket parameter typed as AbstractBucket from pyrate_limiter. This lets you plug in any compatible backend — Redis, a database, or a plain in-memory store — to share rate-limit state across multiple workers or processes.
The default behaviour is unchanged: a SQLite-backed bucket is created lazily and shared across all sessions in the same process. A DEFAULT_RATES constant is now exported from mokkari.session so you can construct custom buckets with the same rate definitions:
from pyrate_limiter import RedisBucket
import redis
import mokkari
pool = redis.ConnectionPool.from_url("redis://localhost:6379")
bucket = RedisBucket.init(mokkari.session.DEFAULT_RATES, redis.Redis(connection_pool=pool), "mokkari")
m = mokkari.api("username", "password", bucket=bucket)
Thanks to Myers Carpenter for his initial work on the pluggable rate-limit buckets this month.
Two new fields were added to the reading list schemas:
image — an image URL field on ReadingListRead, surfacing the cover image for a reading list.list_type — a new field on the reading list schemas that exposes the list's type classification.Here's a summary of everything that landed in Metron-Tagger during March, covering rate limit improvements, bug fixes, and dependency updates.
The tagger's handling of Metron API rate limits was improved:
RATE_LIMIT_RETRY_BUFFER constant (2 seconds) is now added to every retry_after wait to account for small differences between the client clock and the server clock, reducing the chance of hitting the limit again immediately after waking up.These changes result in fewer spurious rate-limit errors when tagging large batches of comics (#238).
info_source field. Previously, iterating over md.info_source without checking for its existence would raise an exception. The fix adds an early None guard in get_id_from_metron_info so files without a source are silently skipped rather than crashing the tagger.Thanks to @bearinfo for his contributions this month.
During March several new features around content discovery, reading list management, and library gap tracking were made.
Creators now have their own browsable pages. A new Creators section in the navigation gives access to a full creator list and individual detail pages showing a creator's roles across your library. A dedicated Creator Series/Issues view lets you drill down into their work by series.
You can now bookmark series and issues directly from the list views. A bookmark icon overlays the cover image; clicking it toggles the bookmark state inline via HTMX without a page reload. A new Bookmarks page collects all your saved items in one place, with inline unbookmark support.
The Series and Issue list views gained advanced filtering capabilities. You can now filter by multiple criteria simultaneously, making it much easier to navigate large libraries.
Reading lists sourced from Metron can now be refreshed. Desaad stores the modified datetime returned by Metron and uses it on subsequent refresh requests via If-Modified-Since. If Metron returns 304 Not Modified, you'll see an "already up to date" message. Otherwise, existing items are cleared and a background re-import is enqueued. A Refresh button appears on the detail page for any Metron-sourced list with a completed import.
Desaad can now check your local library against Metron to identify issues in a series that you don't yet have. A new MissingSeriesIssue model tracks these gaps, and a Check Missing Issues button on the series detail page triggers the check inline via HTMX. Like reading list refresh, subsequent checks use conditional requests — if nothing has changed on Metron's side, you'll see an "already up to date" response.
A dedicated Missing Issues list view provides an overview of all tracked gaps across your library, and a background task automatically cleans up missing issue records when you import a previously absent issue.
Reading list search results and detail pages now show human-readable attribution source labels. Issue type display and filtering were added to reading list items, and attribution source tags appear on reading list cards for quicker at-a-glance identification.
A huge thank you to everyone who has contributed to our Open Collective! Your support makes a real difference in keeping the Metron Project running and growing.
Funds from Open Collective go directly toward:
All expenses are transparent and publicly viewable on our Open Collective page, so you can see exactly where every dollar goes.
If you'd like to help keep the lights on and support continued development, contributions of any size are appreciated and help ensure Metron remains a free resource for the comic book community.
Anyway, that's everything for this month! Take care.