May 2026 Updates
Here's a summary of everything that landed in Metron since the beginning of May 2026.
Here's a summary of everything that landed in Metron since the beginning of May 2026.
The Metron API gives developers programmatic access to a comprehensive comic book database — publishers, series, issues, characters, creators, story arcs, and more. To keep it fast and available for everyone, a little care in how you use it goes a long way. This post covers the patterns that will make your integration both efficient and a good citizen on the platform.
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.
As mentioned in our February 2026 update, we have been dealing with increased server load due to the growth in API usage. We have made the decision to reduce the API rate limits effective immediately.
The new limits are:
We know this is not ideal, and we're sorry for any inconvenience this may cause. If we receive enough donations in the future to cover the cost of a server upgrade, we would look at restoring the daily limit back to 10,000 requests per day.
New releases of our client libraries have been published that reflect these updated rate limits:
If you use either of these tools, we recommend upgrading to the latest version.
If you have written software that directly consumes the Metron API, please ensure your code correctly handles HTTP 429 (Too Many Requests) responses. When this status code is returned, the response will include a Retry-After header indicating how many seconds to wait before retrying. Your application should respect this header and delay its next request accordingly, rather than continuing to hammer the server. Failing to handle this gracefully may result in your requests being blocked.
If you have any questions or suggestions, don't hesitate to e-mail me or ping me on Matrix.
During February the Metron Project added the following to its database:
Thanks to everyone that contributed!
Over the last 6 months, API usage has seen a significant increase — which is great! However, we are now at a point where our current server capacity is being strained.
Jonas Stendahl and I have landed some optimizations in the site's code, but they only go so far in relieving the pressure.
That leaves us with two options:
Option #1 is clearly preferable, but we currently don't receive enough donations to cover the extra cost. That means we will likely need to reduce the daily rate-limit in the very near future, and we'll post an announcement here when that happens.
If you have other ideas or suggestions, please reach out!
Several changes were made to improve API and database query performance.
select_related and prefetch_related.order_by() to SeriesViewSet and the publisher series-list action to resolve a UnorderedObjectListWarning that could surface during pagination.ETag and Last-Modified headers. Clients can send If-None-Match or If-Modified-Since headers to avoid re-downloading unchanged data, saving bandwidth. (jyggen)read_dates data, giving API consumers access to reading history information directly from the list view.The following changes made to Mokkari, the Python wrapper for the Metron API, over the past month:
if_modified_since parameter to detail endpointsAll the detail methods (arc, character, creator, imprint, issue, publisher, series, team, universe, reading_list, and collection) now accept an optional if_modified_since datetime parameter. When provided, the request includes an If-Modified-Since HTTP header (formatted per RFC 7231) and returns None on a 304 Not Modified response — useful for efficiently detecting whether a resource has changed since you last fetched it. Naive datetimes are treated as UTC, and non-UTC datetimes are automatically converted before the header is sent.
CollectionList schemaThe collection schemas have been updated to match the latest Metron API:
ReadDate model was added with id, read_date, and created_on fields.read_dates and read_count fields were added to CollectionList and CollectionRead.date_read field type in CollectionRead was changed from date to datetime to align with the API's date-time format.The rate-limiting implementation was updated for the breaking changes in pyrate-limiter 4.0:
BucketFullException and LimiterDelayException imports.Limiter construction._check_rate_limit() to use the boolean return value of try_acquire(blocking=False) instead of catching exceptions.Here's a roundup of changes shipped to Desaad over the past month.
The import_reading_status management command was upgraded: it now imports reading history dates from Metron, not just reading status. A new
ReadDate model was added to store the actual date an issue was read, and the UserStatsView was updated to use these dates for reading activity stats. Previously, stats reflected the import timestamp rather than when issues were actually read.
The comic importer was tightened up to require an external ID when creating characters, teams, universes, arcs, locations, genres, and creators. Previously, the importer would fall back to name-based lookups and create records without a verified external ID, leading to potential unverified duplicates. This change simplifies the importer significantly and ensures all entities can be reliably matched against a metadata source.
The comic reader's Prev Issue, Next Issue, and Close buttons now require a double-tap to activate. On the first tap, the button turns yellow and prompts "Tap again"; a second tap within 2 seconds proceeds with navigation. Otherwise, the button resets. This prevents accidental navigation away from your current reading position.
DB_* variables were also documented in the README.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.
During January the Metron Project added the following to its database:
Thanks to everyone that contributed!
Scrobble API Support
A new /scrobble endpoint allows users to quickly mark issues as read via the API with optional rating and timestamp. This enables integration with third-party reading apps and automated tracking workflows. The date_read field was migrated from a date to datetime for more precise tracking.
Reading History
Users can now view their reading history in a timeline layout with daily grouping. Recent reading activity also appears on user profile pages.
Multiple Read Dates
Collection items now support tracking multiple read dates, since comic issues are often re-read over time. The UI includes HTMX-powered controls for adding and removing read dates directly from the detail page.
Community View
User profiles now use username-based URLs (/accounts/username/) instead of numeric IDs. A new user list view with search functionality was added, making it easier to find and view other community members.
HTMX Migration
Significant portions of the frontend JavaScript have been replaced with HTMX:
Auto-Dismissing Notifications
Non-error notifications now automatically disappear after 5 seconds. Error messages remain visible until manually dismissed.
Issue Autocomplete Search
The issue autocomplete now supports more flexible searching:
Email Compatibility for Account Activation
Updated how Metron sends account activation emails to ensure they display correctly across all major email clients.
The changes include:
<head> sectionThese updates should ensure new users have a smooth onboarding experience, regardless of whether they use Gmail, Outlook, Apple Mail, or any other email client.
The following changes were made to Desaad.
Issue scrobbling was added this month, and more information on it can be found in this blog post.
The application has migrated from SQLite to PostgreSQL. This followed an initial attempt to improve SQLite concurrency with WAL mode and retry logic, but PostgreSQL proved to be a better fit for handling concurrent operations during comic imports while the web server is running.
The comic reader received several updates:
After testing both approaches, the reader reverted to using base64 image data instead of image URLs, as this provided a better reading experience.
The app now uses Django 6.0's Tasks framework with django-tasks[rq] for several operations:
A new import_reading_status management command allows users to sync their reading history from their Metron collection. This imports completion status and ratings for issues that match by Metron ID. Currently, it only imports the read status, but in the near future it will add the dates the issues were read on also.
Replaced JavaScript with HTMX in several places:
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.
During December the Metron Project added the following to its database:
Thanks to everyone that contributed!
This month I added a User Collections system that lets you track your personal comic book collection. You can manage your collection by adding or removing issues, mark things as read, and track comic condition using the CGC grading scale (0.5 to 10.0). The grading system supports professional grading companies like CGC, CBCS, and PGX, as well as user-assessed grades for raw comics.
There's also a star rating system (1-5 stars) for rating issues in your collection, format tracking for print and digital copies, and bulk operations to add entire series runs at once. If you're trying to complete runs, there's a missing issues tracker that shows you which issues you need and displays completion percentages for each series.
The feature includes collection statistics with visual charts, advanced filtering options to search by series, publisher, format, read status, grade, and more. There are also read-only API endpoints for accessing your collection data and statistics, along with documentation to help you get started.
Reading lists got some updates this month. You can now tag issues as Prologue, Core Issue, Tie-In, or Epilogue, with inline editing and visual badges to make it easier to see what's what. I also added a 5-star rating system for public reading lists, so you can see average ratings and filter lists by minimum rating.
There's also story arc integration that lets you add all issues from a story arc to a reading list in one go, which should save some time. I created a "reading list editor" group for managing Metron's curated lists - this allows trusted users to help curate without needing full staff privileges. If you're interested in being part of this group, just let me know.
The reading list API now supports browsing and retrieving lists with paginated results (50 items per page) and filtering options.
I spent some time improving the search functionality across the site. Series lists now support multi-word search with filters for type, publisher, imprint, year range, status, and volume. Issue lists have quick search with advanced filters for series info, dates, and IDs. Reading lists can be searched by name, creator, attribution source, and privacy status. User collections have quick search across series names and notes with multi-field filtering.
All the search interfaces now have collapsible advanced filter sections, preserve your filter state, show active filter indicators, and have better empty states. I tried to keep the UI patterns consistent across all of them.
Fixed a bug where WeekList, NextWeekList, and FutureList views were using class-level date calculations evaluated at import time. This meant the views would always show the same week (from when the server started) instead of updating dynamically. I moved the date calculations to per-request methods and switched to precise date range queries to fix this.