Released on January 24, 2026.
-
Implemented advanced search query operators for the
/api/v2/searchendpoint, enabling Mastodon-compatible search filtering. Supported operators include:has:media/has:poll— Filter by attachmentsis:reply/is:sensitive— Filter by post characteristicslanguage:xx— Filter by ISO 639-1 language codefrom:username— Filter by author (supports@user,user@domain)mentions:username— Filter by mentioned userbefore:YYYY-MM-DD/after:YYYY-MM-DD— Filter by date range- Negation with
-prefix (e.g.,-has:media) ORoperator for alternative matches- Parentheses for grouping (e.g.,
(from:alice OR from:bob) has:poll)
-
Significantly improved
/api/v1/notificationsendpoint performance by implementing a materialized notifications system. The endpoint now uses dedicatednotificationsandnotification_groupstables instead of generating notifications on-demand via complex SQL queries, resulting in approximately 24% improvement (2.5s → 1.9s). Key changes include:- Added
notificationstable to store notification events as they occur during federation activities (follows, likes, mentions, shares, etc). - Added
notification_groupstable for Mastodon-compatible notification grouping and aggregation metadata. - Implemented automatic notification creation in federation inbox handlers for all notification types.
- Backfilled recent notifications (100 per type) during migration to prevent empty notification lists after upgrade.
- Poll expiry notifications are queried dynamically on-demand since they cannot be pre-generated without background job scheduling.
- Added
-
Enabled gzip/deflate compression for all API responses, reducing response sizes by 70–92% and improving overall API performance. For example,
/api/v1/notificationsresponses are now compressed from 767KB to 58KB,/api/v1/timelines/homefrom 91KB to 14KB, resulting in faster load times and reduced bandwidth usage. -
Implemented Mastodon v2 grouped notifications API (
/api/v2/notifications), which provides server-side notification grouping to reduce client complexity and improve performance. The API groups notifications of typesfavourite,follow,reblog,admin.sign_up, andemoji_reactiontogether when they target the same post or account. New endpoints include:GET /api/v2/notifications: Get paginated grouped notifications with deduplicated accounts and statusesGET /api/v2/notifications/:group_key: Get a specific notification groupGET /api/v2/notifications/:group_key/accounts: Get all accounts in a notification groupPOST /api/v2/notifications/:group_key/dismiss: Dismiss a notification groupGET /api/v2/notifications/unread_count: Get unread notification count
-
Fixed
POST /api/v1/statusesandPUT /api/v1/statuses/:idendpoints rejecting FormData requests. These endpoints now properly accept both JSON and FormData content types, improving compatibility with Mastodon clients that sendmultipart/form-datarequests. [#170, #171 by Emelia Smith] -
Fixed a bug where multiple JSON objects were written on a single line in log files when
LOG_FILEenvironment variable was set. Upgraded LogTape to 2.0.0 and now usesjsonLinesFormatterto ensure proper JSON Lines format with one JSON object per line. [#174] -
Fixed
POST /api/v1/statusesendpoint rejecting requests withnullvalues in optional fields. The endpoint now properly acceptsnullvalues for fields likemedia_ids,poll,spoiler_text,in_reply_to_id, and other optional parameters, improving compatibility with Mastodon clients. [#177, #179 by Lee ByeongJun] -
Implemented asynchronous import job processing with a background worker to improve the reliability and performance of account data imports (following accounts, lists, muted/blocked accounts, bookmarks). Large imports no longer block the HTTP request, and users can see real-time progress of their imports. [#94, #295 by Juyoung Jung]
-
Improved instance API responses for better third-party client compatibility. [#296 by Juyoung Jung]
GET /api/v1/instance: Addedconfiguration.accounts.max_featured_tagsfield,thumbnailfield with Hollo logo, and implemented actualstatsvalues (user_count,status_count,domain_count) from the database.GET /api/v2/instance: Addedthumbnailobject withurl,blurhash, andversionsfields,iconarray, and updatedmax_featured_tagsandmax_pinned_statusesvalues from 0 to 10.
-
Fixed OAuth token endpoint rejecting requests from clients that send credentials via both HTTP Basic authentication and request body simultaneously. The endpoint now accepts such requests if the credentials are identical, improving compatibility with clients like tooot. [#296 by Juyoung Jung]
-
Upgraded Fedify to 1.10.0.
-
Added
prevlink to theLinkheader in/api/v1/notificationsAPI responses for Mastodon-compatible pagination. This allows clients to efficiently fetch new notifications since the last received notification, improving caching capabilities and reducing server load. [#312] -
Fixed OAuth token endpoint failing to parse request body when HTTP clients don't send
Content-Typeheader. Some clients like Lobsters' Sponge HTTP client don't setContent-Typefor POST requests with form data, causing authentication failures. The endpoint now correctly parses URL-encoded form data even whenContent-Typeis missing or set totext/plain. -
Implemented Mastodon 4.5.0 quote notification types (
quoteandquoted_update) for improved quote post interaction tracking. Users now receive notifications when their posts are quoted by others and when posts they've quoted are edited by the original authors. Key features include:- Added
quotenotification type that triggers when someone quotes your post, with the notification showing the quote post itself. - Added
quoted_updatenotification type that triggers when a post you quoted is edited, with the notification showing your quote post to provide context. - Both notification types are non-groupable, meaning each quote or edit generates an individual notification for better visibility.
- Self-quotes (quoting your own posts) do not generate notifications to avoid unnecessary noise.
- Existing quote posts are automatically backfilled with notifications during migration to ensure consistent notification history.
- Added database index on
posts.quote_target_idfor improved query performance when looking up quote relationships.
- Added
-
Removed dependency on deprecated fluent-ffmpeg package and now invoke ffmpeg binary directly for video screenshot generation. This change improves reliability by preventing request failures when video screenshot generation encounters errors. On failure, a default screenshot (Hollo logo) is now returned instead of aborting the entire upload request, and ffmpeg error output is logged for debugging. [#333 by Peter Jeschke]
-
Fixed a bug where querying the
/api/v1/notificationsand/api/v2/notificationsendpoints with unknown notification types (e.g.,types[]=reactionfrom clients like Moshidon) resulted in500 Internal Server Errorresponses due to database enum validation failures. The endpoints now filter out unknown notification types before passing them to the database layer, returning an empty result instead of an error. [#334 by Peter Jeschke] -
Fixed a bug where the
/api/v2/searchendpoint did not properly enforce thelimitparameter on search results. The endpoint now correctly limits the number of returned accounts and statuses to the requested limit (default 20, maximum 40), improving Mastodon API compatibility and preventing potential performance issues with large result sets. [#210] -
Significantly improved
/api/v2/searchendpoint performance when searching by URL or handle. The endpoint now responds in approximately 1.4 seconds for URL searches, down from 8–10 seconds previously (approximately 85% improvement). Key optimizations include:- Skip unnecessary
lookupObjectcalls for non-URL/non-handle queries, reducing remote federation lookups by 2–3 seconds. - Skip full-text search on
posts.content_htmlcolumn when the query is a URL and the post is found in cache lookup (by IRI or URL), eliminating expensive table scans that took ~8 seconds. - Added shared
HANDLE_PATTERNregex in src/patterns.ts for consistent WebFinger handle validation across v1 and v2 APIs.
- Skip unnecessary