Releases: fedify-dev/fedify
Fedify 2.3.0
Released on June 25, 2026.
@fedify/fedify
-
Added
mapActorAlias()method toActorCallbackSettersinterface to support fixed-path actor dispatchers. This is useful for exposing a single, instance-level actor at a fixed path, such as/actorfor a relay or/botfor a bot, without leaking a sentinel identifier into the actor's URI. [#752, #753] -
Added optional
MessageQueue.getDepth()support, using the newMessageQueueDepthreturn type, for reporting queue backlog depth.InProcessMessageQueuecan now report queued messages, including ready and delayed counts, andParallelMessageQueuedelegates depth reporting to its wrapped queue when supported. [#735, #748] -
Added OpenTelemetry metrics for ActivityPub delivery attempts, permanent delivery failures, inbox listener processing duration, and HTTP Signature verification failures. Applications can pass the new
meterProvideroption tocreateFederation(), andContext.meterProviderexposes the provider available to request, inbox, and outbox code. [#316, #619, #755] -
Added the
activitypub.delivery.failedspan event to queued outbox delivery spans so retry and permanent-failure decisions include the remote host, attempt number, and HTTP status code when available. [#316, #619, #755] -
Breaking change: Changed the
activitypub.activity.sentspan event to record delivery metadata (activitypub.inbox.urlandactivitypub.activity.id) instead of the fullactivitypub.activity.jsonpayload.FedifySpanExporternow stores outbound records from those attributes, andTraceActivityRecord.activityJsonis present only when the span event includes full activity JSON. [#316, #619, #755] -
Added two OpenTelemetry histograms for signature verification:
activitypub.signature.verification.durationmeasures end-to-end verification time for HTTP Signatures, Linked Data Signatures, and Object Integrity Proofs (including local key lookup and remote key fetches), andactivitypub.signature.key_fetch.durationmeasures public key lookup duration separately so operators can isolate non-fetch verification work. Both instruments carryactivitypub.signature.kind(http,linked_data, orobject_integrity) and bounded result attributes; the verification histogram additionally carries spec-boundedhttp_signatures.algorithm,ld_signatures.type, orobject_integrity_proofs.cryptosuitewhen known, plushttp_signatures.failure_reasonon rejected HTTP rows. [#316, #737, #769] -
Added OpenTelemetry HTTP server metrics for inbound requests handled by
Federation.fetch():fedify.http.server.request.count(Counter) andfedify.http.server.request.duration(Histogram). Both instruments carryhttp.request.method,fedify.endpoint, optionalhttp.response.status_code, and optionalfedify.route.templateattributes so that operators can monitor aggregate request rate, latency, and status-code error rate even when traces are sampled. Attributes deliberately exclude raw URLs, query strings, and identifier values to keep cardinality bounded. [#316, #736, #757] -
Added OpenTelemetry metrics for ActivityPub collection requests handled by
Federation.fetch()and custom collection handlers:activitypub.collection.request(counter)activitypub.collection.dispatch.duration(histogram)activitypub.collection.page.items(histogram)activitypub.collection.total_items(histogram)
The metrics expose bounded collection dimensions:
activitypub.collection.kind,activitypub.collection.page,activitypub.collection.result,fedify.collection.dispatcher, and optionalhttp.response.status_code. Built-in collections are classified asinbox,outbox,following,followers,liked,featured, orfeatured_tags; application-defined collection routes are collapsed intocustom. Collection IDs, cursors, custom route names, actor identifiers, and full URLs are deliberately excluded so dashboards can aggregate collection rate, latency, item counts, andtotalItemsvalues without attacker-controlled cardinality. [#316, #741, #777] -
Added OpenTelemetry queue task metrics covering Fedify's enqueue and worker boundaries for inbox, outbox, and fanout work:
fedify.queue.task.enqueued(counter)fedify.queue.task.started(counter)fedify.queue.task.completed(counter)fedify.queue.task.failed(counter)fedify.queue.task.duration(histogram)fedify.queue.task.in_flight(up/down counter, process local)
Instruments carry
fedify.queue.role, best-effortfedify.queue.backend(the queue implementation's constructor name), andfedify.queue.native_retrial. The enqueue/started/completed/ failed/duration instruments additionally carryactivitypub.activity.typewhenever Fedify knows the activity type for the queued message; the in-flight up/down counter deliberately omits per-message attributes so that increment and decrement operations always pair up cleanly per attribute series. Enqueue measurements additionally carryfedify.queue.task.attemptfor retries, and the completion-side instruments carryfedify.queue.task.result(completed,failed, oraborted). Together withMessageQueue.getDepth()reporting, these metrics let operators distinguish a slow-draining queue from a queue that sees less traffic. [#316, #740, #759] -
Added OpenTelemetry metrics for ActivityPub fanout and activity lifecycle events, complementing the per-recipient
activitypub.delivery.*counters and the per-taskfedify.queue.task.*metrics with an activity-level view of inbox and outbox pressure:activitypub.fanout.recipients(histogram) records the number of recipient inboxes produced by a single fanout enqueue.activitypub.inbox.activity(counter) classifies an inbound activity via the newactivitypub.processing.resultattribute asqueued,processed,retried,rejected, orabandoned.activitypub.outbox.activity(counter) classifies an outbound activity asqueued,retried, orabandoned. Per-recipientsent/failedrows remain onactivitypub.delivery.sentandactivitypub.delivery.permanent_failureand are not duplicated.
The lifecycle counters cover only Fedify-managed events: queue backends with
nativeRetrialdefer retry handling and therefore do not recordretriedorabandoned. Recipient URLs, actor IDs, and other high-cardinality identifiers are deliberately excluded from the fanout histogram. [#316, #742, #770] -
Added OpenTelemetry metrics for public key lookups, remote JSON-LD document fetches, and
lookupObject()calls so operators can observe how often Fedify hits the cache, how long remote fetches take, and howlookupObject()resolutions split between actors, non-actor objects, and unresolved lookups:activitypub.key.lookup(counter) andactivitypub.key.lookup.duration(histogram) cover every public key lookup performed byfetchKey()/fetchKeyDetailed(), including signature verification paths.activitypub.document.fetch(counter) andactivitypub.document.fetch.duration(histogram) cover every Fedify-wrapped document or context loader invocation, including the authenticated loader.activitypub.document.cache(counter) recordshitormissfor eachkvCache()-backed cache lookup.activitypub.object.lookup(counter) records the parsed-result classification of everylookupObject()call asactor,object, orother.
Instruments share an
activitypub.lookup.kindand (where applicable)activitypub.lookup.resultattribute drawn from small, spec-bounded enumerations.activitypub.remote.hostrecords the URL host, including any non-default port;http.response.status_codeis recorded when an HTTP response was observed;activitypub.cache.enabledis recorded on the key and document fetch metrics whenever Fedify can confidently report the cache layer's presence. Key IDs, actor IDs, object IDs, JSON-LD context URLs, full URLs, and fediverse handles are deliberately excluded so attacker-controlled remotes cannot inflate metric cardinality. The existingactivitypub.signature.key_fetch.durationhistogram (introduced in Fedify 2.3 for signature-scoped key-fetch latency, sliced byactivitypub.signature.kind) remains in place; the newactivitypub.key.lookup.durationis the general-purpose histogram that covers non-signature key...
Fedify 2.2.5
Released on June 5, 2026.
@fedify/cli
- Fixed
fedifycommand failing under Deno 2.8+/TypeScript 6.0 wheresetTimeout()returnsTimeoutinstead ofnumber. UsedReturnType<typeof setTimeout>for thesignalTimersWeakMap so it is compatible across all TypeScript/Deno versions. [#789 by Rui Chen]
Fedify 2.1.16
Released on June 5, 2026.
@fedify/cli
- Fixed
fedifycommand failing under Deno 2.8+/TypeScript 6.0 wheresetTimeout()returnsTimeoutinstead ofnumber. UsedReturnType<typeof setTimeout>for thesignalTimersWeakMap so it is compatible across all TypeScript/Deno versions. [#789 by Rui Chen]
Fedify 2.0.20
Released on June 5, 2026.
@fedify/cli
- Fixed
fedifycommand failing under Deno 2.8+/TypeScript 6.0 wheresetTimeout()returnsTimeoutinstead ofnumber. UsedReturnType<typeof setTimeout>for thesignalTimersWeakMap so it is compatible across all TypeScript/Deno versions. [#789 by Rui Chen]
Fedify 2.2.4
Released on June 4, 2026.
@fedify/vocab-runtime
-
Fixed
validatePublicUrl()allowing special-use IPv4 ranges, such as shared address space, benchmarking, multicast, reserved, and documentation ranges, which could bypass private network protections in remote document loading. [CVE-2026-50131] -
Fixed
validatePublicUrl()allowing IPv6 translation and tunneling prefixes, including NAT64, Teredo, and 6to4 addresses, which could bypass private network protections in remote document loading. [CVE-2026-50131]
Fedify 2.1.15
Released on June 4, 2026.
@fedify/vocab-runtime
-
Fixed
validatePublicUrl()allowing special-use IPv4 ranges, such as shared address space, benchmarking, multicast, reserved, and documentation ranges, which could bypass private network protections in remote document loading. [CVE-2026-50131] -
Fixed
validatePublicUrl()allowing IPv6 translation and tunneling prefixes, including NAT64, Teredo, and 6to4 addresses, which could bypass private network protections in remote document loading. [CVE-2026-50131]
Fedify 2.0.19
Released on June 4, 2026.
@fedify/vocab-runtime
-
Fixed
validatePublicUrl()allowing special-use IPv4 ranges, such as shared address space, benchmarking, multicast, reserved, and documentation ranges, which could bypass private network protections in remote document loading. [CVE-2026-50131] -
Fixed
validatePublicUrl()allowing IPv6 translation and tunneling prefixes, including NAT64, Teredo, and 6to4 addresses, which could bypass private network protections in remote document loading. [CVE-2026-50131]
Fedify 1.10.11
Released on June 4, 2026.
@fedify/fedify
-
Fixed
validatePublicUrl()allowing special-use IPv4 ranges, such as shared address space, benchmarking, multicast, reserved, and documentation ranges, which could bypass private network protections in remote document loading. [CVE-2026-50131] -
Fixed
validatePublicUrl()allowing IPv6 translation and tunneling prefixes, including NAT64, Teredo, and 6to4 addresses, which could bypass private network protections in remote document loading. [CVE-2026-50131]
Fedify 1.9.12
Released on June 4, 2026.
@fedify/fedify
-
Fixed
validatePublicUrl()allowing special-use IPv4 ranges, such as shared address space, benchmarking, multicast, reserved, and documentation ranges, which could bypass private network protections in remote document loading. [CVE-2026-50131] -
Fixed
validatePublicUrl()allowing IPv6 translation and tunneling prefixes, including NAT64, Teredo, and 6to4 addresses, which could bypass private network protections in remote document loading. [CVE-2026-50131]
Fedify 2.2.3
Released on May 21, 2026.
@fedify/fedify
- Fixed a security vulnerability in Linked Data Signature verification that could allow certain signed activities to be interpreted differently than intended. [CVE-2026-42462]