Open
Conversation
6c4d072 to
025b40e
Compare
d447b33 to
9af93cf
Compare
9af93cf to
12e252c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
1.9.7→2.1.31.9.7→2.1.31.9.7→2.1.31.9.7→2.1.3Release Notes
fedify-dev/fedify (@fedify/cli)
v2.1.3Compare Source
Released on March 31, 2026.
@fedify/init
@fedify/initafter thetsdownupgrade started publishing
dist/*.mjsfiles while the package metadatastill exported
dist/*.jsanddist/*.d.ts. Node consumers such as@fedify/clican start again, includingnpx -y @​fedify/cli --help.[#655]
@fedify/create
@fedify/createso the publishedbinandexportspaths once again point to generateddist/mod.jsoutput instead of missing
dist/mod.jsfiles. This prevents the samepackaging regression from breaking
npm init @​fedify. [#655]v2.1.2Compare Source
Released on March 29, 2026.
@fedify/fedify
@fedify/fedify/vocabmissing theObjectexport from the entry point. Older
tsdownoutput generated an invalidCommonJS re-export, causing
require("@​fedify/fedify/vocab").Objectto beundefined. Updated the bundler toolchain and added a regression test forthe built CommonJs entry point. [#651]
v2.1.1Compare Source
Released on March 27, 2026.
@fedify/fedify
Limited the number of HTTP redirects followed by the remote document
loaders and signed HTTP fetches to mitigate resource exhaustion during
remote key and document resolution. [CVE-2026-34148 by Abhinav Jaswal]
Stopped the remote document loaders and signed HTTP fetches from
revisiting the same URL within a redirect chain, preventing
self-referential redirect loops. [CVE-2026-34148 by Abhinav Jaswal]
Persisted negative public key cache entries for failed remote key
fetches, reducing repeated retries against the same unavailable key
across requests. [CVE-2026-34148 by Abhinav Jaswal]
v2.1.0Compare Source
Released on March 24, 2026.
@fedify/fedify
Added
InboxListenerSetters.onUnverifiedActivity()so applications caninspect inbound activities whose signatures could not be verified and
optionally return a custom response instead of the default
401 Unauthorized. This is useful for cases likeDeletedeliveriesfrom actors whose signing keys now return
404 Not Foundor410 Gone.Added the supporting public types
UnverifiedActivityHandlerandUnverifiedActivityReason. [#472, #611]Added
verifyRequestDetailed()plus the public typesVerifyRequestDetailedResult,VerifyRequestFailureReason, andFetchKeyErrorResultso applications can distinguish unsigned requests,invalid signatures, and key-fetch failures during HTTP signature
verification. [#611]
OpenTelemetry spans/events and
FedifySpanExportersignature details nowexpose HTTP signature failure reasons and key-fetch failure details for
inbound activities. [#611]
Fixed
RequestContext.getSignedKeyOwner()to returnnullinstead ofthrowing an error when the remote server requires authorized fetch and
returns
401 Unauthorizedfor the key owner lookup. Previously, thiscaused a
500 Internal Server Errorwhen interoperating with servers likeGoToSocial that have authorized fetch enabled. [#473, #589]
Added RFC 9421 §5
Accept-Signaturenegotiation for both outbound andinbound paths. On the outbound side,
doubleKnock()now parsesAccept-Signaturechallenges from401responses and retries with acompatible RFC 9421 signature before falling back to legacy spec-swap.
On the inbound side, a new
InboxChallengePolicyoption inFederationOptionsenables emittingAccept-Signatureheaders oninbox
401responses, with optional one-time nonce support for replayprotection. [#583, #584, #626 by ChanHaeng Lee]
@fedify/vocab-runtime
Added
Decimal, a branded string type for exactxsd:decimalvalues,along with
isDecimal(),canParseDecimal(), andparseDecimal()forchecking and validating XML Schema decimal lexical forms without
introducing a decimal arithmetic dependency.
isDecimal()performs astrict lexical-form check, while
canParseDecimal()andparseDecimal()apply XML Schema whitespace normalization first. This lays the runtime
groundwork for precision-safe marketplace and measurement values such as
those needed by FEP-0837. [#617, #640]
Updated the preloaded https://gotosocial.org/ns JSON-LD context to
match the current GoToSocial v0.21+ namespace, adding new type terms
(
LikeRequest,LikeAuthorization, etc.) and property terms(
automaticApproval,manualApproval,interactingObject, etc.) whileretaining deprecated terms (
always,approvalRequired) for backwardcompatibility. [#453, #622]
Added optional
FetchError.responseso callers can inspect the originalfailed HTTP response when remote document or key fetches return an HTTP
error (such as
404 Not Foundor410 Gone). This enables higher-levelAPIs to distinguish transport failures from specific HTTP fetch failures.
[#611]
@fedify/cli
Added
--reverseoption tofedify lookupto reverse presentation orderof emitted results. It now works across default multi-input lookup,
--traversecollection traversal output, and--recurseobject chains,while preserving existing fetch/error semantics. [#607, #609]
Fixed
fedify lookupprinting separators with extra quotes betweenadjacent objects/items in some output paths (e.g., recurse/traverse
flows). Separators are now printed as plain text consistently.
[#608]
Added
--recurseand--recurse-depthoptions tofedify lookupforrecursively following object relationships (e.g., reply chains via
replyTarget/inReplyTo, and quote chains viaquoteUrland quoteIRIs).
--traverseand--recurseare now mutually exclusive,--recurse-depthdepends on--recurse, and--suppress-errorsnowworks in recurse mode as best-effort lookup.
[#606, #608]
Hardened
fedify lookupby disallowing private/localhost document loadsby default. For local-development workflows,
-p/--allow-private-address(or
lookup.allowPrivateAddress = truein config) can re-enable privateaddress access for explicit lookup/traverse requests. This option does
not apply to recursive fetches, which always disallow private addresses.
[#608]
@fedify/vocab
Added GoToSocial interaction controls vocabulary for expressing who
can like, reply to, or announce posts and for approving interactions.
[#453, #622]
InteractionPolicyandInteractionRuletypeless valueclasses.
LikeRequest,ReplyRequest, andAnnounceRequestactivitytypes for requesting interaction approval.
LikeAuthorization,ReplyAuthorization, andAnnounceAuthorizationtypes for proving approved interactions.Object.interactionPolicy,Object.approvedBy,Object.getLikeAuthorization()/Object.likeAuthorizationId,Object.getReplyAuthorization()/Object.replyAuthorizationId, andObject.getAnnounceAuthorization()/Object.announceAuthorizationId.Fixed
Endpoints.toJsonLd()to no longer emit invalid"type": "as:Endpoints"in the serialized JSON-LD. Theas:Endpointstype does not exist in the ActivityStreams vocabulary, and its presence
caused validation failures on implementations like browser.pub.
[#576]
Fixed
Source.toJsonLd()to no longer emit invalid"type": "as:Source"in the serialized JSON-LD. Theas:Sourcetypedoes not exist in the ActivityStreams vocabulary either.
@fedify/vocab-tools
Added
xsd:decimalsupport to the vocabulary code generator. Propertieswith that range are now generated as
Decimalin TypeScript, serializedas
xsd:decimalJSON-LD literals, validated throughcanParseDecimal()when checking input data, and normalized throughparseDecimal()when decoded. Code generation now also rejects propertyranges that mix
xsd:stringandxsd:decimal, since both map to runtimestrings and would make serialization ambiguous. [#617, #640]
Added
typelessfield to the type YAML schema. When set totrue,the generated
toJsonLd()method does not emit@type(ortypeincompact form) in the serialized JSON-LD. This is useful for types
that are not real vocabulary types but rather anonymous object structures.
@fedify/init
Changed
fedify initto add"temporal"todeno.json's"unstable"field only when the installed Deno version is earlier than 2.7.0.
On Deno 2.7.0 or later, it is no longer added.
fedify initnow omits the"unstable"field entirely when no unstablefeature is required for the generated Deno project.
Supported Astro as a web framework option in
fedify init, withruntime-specific templates for Deno, Bun, and Node.js environments.
[#50 by ChanHaeng Lee]
@fedify/astro
@fedify/astropackage for integrating Fedify with Astro.It provides
fedifyIntegration()for Vite SSR configuration andfedifyMiddleware()for request handling. [#50 by Chanhaeng Lee]@fedify/mysql
Added
MysqlMessageQueueclass to the@fedify/mysqlpackage, aMySQL/MariaDB-backed
MessageQueueimplementation. It uses periodicpolling (
SELECT … FOR UPDATE SKIP LOCKED) to deliver messages andMySQL advisory locks (
GET_LOCK/RELEASE_LOCK) for ordering-keyserialization. Supports delayed delivery, ordering keys,
enqueueMany(), and concurrent workers. Requires MySQL 8.0+ orMariaDB 10.6+. [#586, #599]
Added
@fedify/mysqlpackage, a MySQL/MariaDB-backedKvStoreimplementation. It provides
MysqlKvStore, which stores key–valuepairs in a MySQL table using the
mysql2driver. Supports TTL,prefix listing, and compare-and-swap (
cas()) operations.[#585, #597]
v2.0.10Compare Source
Released on March 31, 2026.
@fedify/lint
@fedify/lintso the packageexports and type declarations point to the actual files generated by
tsdown. This restores imports such asimport fedifyLint from "@​fedify/lint"in documentation examples and otherTypeScript consumers.
@fedify/init
@fedify/initafter thetsdownupgrade started publishing
dist/*.mjsfiles while the package metadatastill exported
dist/*.jsanddist/*.d.ts. Node consumers such as@fedify/clican start again, includingnpx -y @​fedify/cli --help.[[#655]]
@fedify/create
@fedify/createso the publishedbinandexportspaths once again point to generateddist/mod.jsoutput instead of missing
dist/mod.jsfiles. This prevents the samepackaging regression from breaking
npm init @​fedify. [[#655]]v2.0.9Compare Source
Released on March 29, 2026.
@fedify/fedify
@fedify/fedify/vocabmissing theObjectexport from the entry point. Older
tsdownoutput generated an invalidCommonJS re-export, causing
require("@​fedify/fedify/vocab").Objectto beundefined. Updated the bundler toolchain and added a regression test forthe built CommonJs entry point. [[#651]]
v2.0.8Compare Source
Released on March 27, 2026.
@fedify/fedify
Limited the number of HTTP redirects followed by the remote document
loaders and signed HTTP fetches to mitigate resource exhaustion during
remote key and document resolution. [[CVE-2026-34148] by Abhinav Jaswal]
Stopped the remote document loaders and signed HTTP fetches from
revisiting the same URL within a redirect chain, preventing
self-referential redirect loops. [[CVE-2026-34148] by Abhinav Jaswal]
Persisted negative public key cache entries for failed remote key
fetches, reducing repeated retries against the same unavailable key
across requests. [[CVE-2026-34148] by Abhinav Jaswal]
v2.0.7Compare Source
Released on March 22, 2026.
@fedify/fedify
@fedify/vocab-runtime/jsonldsubpath so generated vocabulary code andLinked Data signature support no longer have to evaluate
jsonldthrougha CommonJS-sensitive package root in Fresh 2, Deno, and other ESM-first
runtimes. Fresh 2 development mode has been verified on Deno 2.7.7
after an upstream Deno 2.7.6 dev server regression was fixed.
[#621, #639]
@fedify/vocab-runtime
Fixed multibase public key handling to stop relying on the deprecated
CommonJS-only
multicodecpackage. This removes the Vite SSR crash thatprevented Fresh 2 applications from importing
@fedify/fedifywithTypeError: varint.encode is not a function. Fresh 2 no longer needs aVite externalization workaround for Fedify. [#621, #639]
Added the new
@fedify/vocab-runtime/jsonldsubpath export so generatedvocabulary code and other Fedify runtime code can share a JSR-safe wrapper
around
jsonld's ESM entrypoint instead of depending on fragile relativeshims or the package-root import path. [#621, #639]
@fedify/init
fedify initoptions. [#632, #638 by ChanHaeng Lee]bare-bonesoption for web framework.in-memoryoption for key-value store.in-processoption for message queue.v2.0.6Compare Source
Released on March 19, 2026.
@fedify/init
fedify initcrashing when@fedify/clior@fedify/initisexecuted through the JSR/Deno distribution.
import.meta.dirnameisundefinedfor remote JSR modules, so the template loading andrepository-relative path logic has been made safe for published JSR
execution. [#624, #633]
@fedify/vocab-runtime
This URL has never served a real JSON-LD context document (Mastodon
has always inlined the term definitions), but some ActivityPub
implementations put it as a bare URL in their
@context, causingJSON-LD processors to fail with a 404. [#630, #631]
v2.0.5Compare Source
Released on March 11, 2026.
@fedify/fedify
contexts.
v2.0.4Compare Source
Released on March 11, 2026.
@fedify/fastify
onNotAcceptablehandler in@fedify/fastifytocreate a fresh
Responsefor each request instead of reusing a sharedsingleton instance. [#612 by Lee Dogeon]
v2.0.3Compare Source
Released on March 3, 2026.
@fedify/postgres
Fixed
PostgresMessageQueue.listen()crashing the process when amalformed
NOTIFYpayload is received.Temporal.Duration.from()was called without error handling, so an invalid duration string
caused an unhandled
RangeErrorthat propagated through the postgresdriver. The
NOTIFYcallback is now wrapped in atry–catchthatlogs the error and falls back to an immediate poll. [#594]
Fixed
PostgresMessageQueue.listen()permanently stalling all messageprocessing when a message handler hangs indefinitely (e.g., due to an
unresponsive remote server). The
serializedPollmechanism chainsevery
poll()invocation onto a single promise, so a single hunghandler blocked the entire queue permanently. Handler invocations
are now wrapped with a configurable timeout (default: 60 seconds)
via the new
handlerTimeoutoption inPostgresMessageQueueOptions.When a handler exceeds the timeout, it is treated as an error and the
poll loop moves on, preventing permanent stalls. [#595]
v2.0.2Compare Source
Released on February 27, 2026.
@fedify/fedify
signedKeyandsignedKeyOwner) fromAuthorizePredicateandObjectAuthorizePredicate. These parameters were deprecated sinceFedify 1.5.0 in favor of
RequestContext.getSignedKey()andRequestContext.getSignedKeyOwner()methods, but were mistakenlyleft in the Fedify 2.0.0 release. The internal handler code that
eagerly called
getSignedKey()andgetSignedKeyOwner()beforeinvoking the predicate has also been removed; predicates should now
call those methods themselves when needed. [[#473], #590]
v2.0.1Compare Source
Released on February 24, 2026.
@fedify/cli
fedifycommand hanging indefinitely when invoked as an executable(e.g., via
npx @​fedify/cliornpm exec -- fedify) on Linux. Theshebang line
#!/usr/bin/env node --disable-warning=ExperimentalWarningwas passing
node --disable-warning=ExperimentalWarningas a singleargument to
env, which caused an infinite exec loop on Linux because thekernel passes all shebang arguments as one string. Fixed by using
env -Sto properly split arguments:#!/usr/bin/env -S node --disable-warning=ExperimentalWarning.@fedify/postgres
Fixed
PostgresMessageQueue.listen()permanently stopping messageprocessing when
poll()throws (e.g., transient PostgreSQL errors orhandler failures).
listen()now catches polling errors for subscribe,notify, and interval-triggered polls, logs them, and retries on subsequent
triggers instead of terminating the listener. [#581]
PostgresMessageQueue.initialize()now creates an index on thecreatedcolumn (
idx_{table}_created) to improve dequeue query performance underbacklog growth. [#581]
v2.0.0Compare Source
Released on February 22, 2026.
@fedify/fedify
Remove
contextLoaderoption (which was deprecated) fromFederationOptionsinterface in favor ofcontextLoaderFactoryoptionfor better flexibility. [#376, #445 by Hasang Cho]
Migrated from @phensley/language-tag package and its
LanguageTagclassto the standardized
Intl.Localeclass for representing language tags.[#280, #392 by Jang Hanarae]
LanguageString.languageproperty is nowLanguageString.localeandis of type
Intl.Localeinstead ofLanguageTag.LanguageStringconstructor now accepts either anIntl.Localeobject or a string for the language parameter.
Link.languageproperty is now of typeIntl.Localeinsteadof
LanguageTag.@phensley/language-tagdependency.Remove
documentLoaderoption (which was deprecated) fromFederationOptionsinterface in favor ofdocumentLoaderFactoryoptionfor better flexibility. [#376, #393 by Hasang Cho]
Remove
CreateFederationOptions<TContextData>interface (which wasdeprecated since 1.6.0). Use
FederationOptions<TContextData>instead.[#376]
Remove
fetchDocumentLoader()function (which was deprecated since 0.14.0).Use
getDocumentLoader()from@fedify/vocab-runtimeinstead. [#376]Remove
{ handle: string }parameter form fromsendActivity(),forwardActivity(),getDocumentLoader(), andParseUriResult.Use
{ identifier: string }or{ username: string }instead. [#376]Changed NodeInfo
software.versionfield type fromSemVertostringto properly handle non-SemVer version strings in accordance with the
NodeInfo specification. [#366, #433 by Hyeonseo Kim]
parseNodeInfo()function now returns version asstringinsteadof
SemVerobject.Software.versionfield is now ofstring(was ofSemVer).parseSemVer()andformatSemVer()functions.Federation dispatchers are now only triggered when the request accepts
ActivityPub-compatible content types. This improves compatibility with
applications that serve both HTML and ActivityPub content from the same
URLs. [#434 by Emelia Smith]
requests with
Accept: text/htmlor other non-ActivityPub contenttypes.
notAcceptablecallback is now triggered at the middleware levelbefore dispatchers are invoked.
Acceptheader, you may need to adjust your routing logic.Changed the default activity idempotency strategy from
"per-origin"to"per-inbox"to align with standard ActivityPub behavior. [#441]activity ID to be processed once per inbox independently.
"per-origin"strategy (deduplicate per receiving server)can still be explicitly configured using
.withIdempotency("per-origin").on the same server, fixing issues where activities were incorrectly
deduplicated globally.
Separated modules from
@fedify/fedify/runtimeto improve modularity andreduce coupling between vocabulary generation and core federation
functionality. [#444, #451 by ChanHaeng Lee]
into the new
@fedify/vocab-runtimepackage.@fedify/fedify/runtimehave beenreorganized into the
@fedify/fedify/utilsdirectory within the mainpackage.
organization.
Deprecated the
@fedify/fedify/runtimemodule in favor of the new@fedify/vocab-runtimepackage. The@fedify/fedify/runtimemodule nowre-exports all exports from
@fedify/vocab-runtimefor backwardcompatibility, but will be removed in a future version. Please migrate
to
@fedify/vocab-runtimedirectly. [#560]The
KvCacheParameters.rulesoption's type became[string | URL | URLPattern, Temporal.Duration | Temporal.DurationLike][](was
[string | URL | URLPattern, Temporal.Duration][]).The
@fedify/fedify/x/*modules are removed. Also, there are no Freshintegration for now. [#391 by Chanhaeng Lee]
@fedify/fedify/x/cfworkersin favor of@fedify/cfworkers.@fedify/fedify/x/denokvin favor of@fedify/denokv.@fedify/fedify/x/honoin favor of@fedify/hono.@fedify/fedify/x/sveltekitin favor of@fedify/sveltekit.@fedify/fedify/x/fresh(Fresh integration). [#466]Deprecated the
@fedify/fedify/vocabmodule in favor of the new@fedify/vocabpackage. The@fedify/fedify/vocabmodule now re-exportsall exports from
@fedify/vocabfor backward compatibility, but will beremoved in a future version. Please migrate to
@fedify/vocabdirectly.[#437, #517 by ChanHaeng Lee]
The
KvStore.list()method is now required instead of optional.This method was added as optional in version 1.10.0 to give existing
implementations time to add support. All official
KvStoreimplementationsalready support this method. [#499, #506]
Added
orderingKeyoption toMessageQueueEnqueueOptionsinterface forordered message delivery. Messages with the same ordering key are
guaranteed to be processed in the order they were enqueued, while messages
with different ordering keys can be processed in parallel. This helps
prevent race conditions when processing related activities (e.g., ensuring
a
Deleteactivity is processed after aCreateactivity for the sameobject). [#536, #538, #540, #544]
MessageQueueEnqueueOptions.orderingKeyproperty.MessageQueueEnqueueOptionsare nowreadonly.InProcessMessageQueuenow supports theorderingKeyoption.SendActivityOptions.orderingKeyoption to ensure ordereddelivery of activities for the same object. When specified, activities
with the same
orderingKeyare guaranteed to be delivered in orderto each recipient server.
Added
Federatable.setOutboxPermanentFailureHandler()method to handlepermanent delivery failures (such as
410 Goneor404 Not Found) whensending activities to remote inboxes. This allows applications to clean
up unreachable followers and avoid future delivery attempts to permanently
failed inboxes. [#548, #559]
Added
permanentFailureStatusCodesoption toFederationOptionstoconfigure which HTTP status codes are treated as permanent delivery
failures. By default,
404and410are treated as permanent failures.[#548, #559]
Added
SendActivityErrorclass, a structured error that is thrown whenan activity fails to send to a remote inbox. It includes the HTTP status
code, the inbox URL, and the response body, making it easier to
programmatically handle delivery errors. [#548, #559]
Added
traceIdandspanIdto LogTape context in federation middlewareso that log records emitted during request handling and queue processing
include the OpenTelemetry trace and span IDs in their properties. This
enables the
@fedify/debuggerdashboard to display per-trace logs.[#561, #564]
Fixed unbounded memory consumption when activity delivery fails with large
error responses. The
SendActivityError.responseBodyproperty is nowlimited to 1 KiB to prevent memory pressure when remote servers return
large HTML error pages (e.g., Cloudflare error pages of 50–100 KB each).
This prevents potential OOM crashes in production environments with many
unreachable inboxes. [#569]
@fedify/cli
The Fedify CLI now runs natively on Node.js and Bun without requiring
compiled binaries, providing a more natural JavaScript package experience
for Node.js and Bun users. [#374, #456, #457]
Added
fedify generate-vocabcommand to generate Activity Vocabularyclasses from schema files. This command uses the new @fedify/vocab-tools
package internally and allows users to extend Activity Vocabulary with
custom types. [#444, #458 by ChanHaeng Lee]
Updated
fedify initcommand for better DX.[#397, #435 by Chanhaeng Lee]
before proceeding. If the user agrees, it moves the remaining directory
to trash and continue the initialization from new created directory.
The
fedify lookupcommand now supports multiple URLs with the-t/--traverseoption, allowing users to traverse multiple collectionsin a single command. [#408, #449 by Jiwon Kwon]
The
fedify initcommand now supports Elysia as a web framework option,with runtime-specific templates for Deno, Bun, and Node.js environments.
[#460, #496 by Hyeonseo Kim]
Fixed a bug in the
fedify initcommand where Deno import map generationincorrectly handled dependencies with registry prefixes (e.g.,
npm:),creating invalid specifiers in deno.json.
[#460, #496 by Hyeonseo Kim]
Added
fedify relaycommand to run an ephemeral ActivityPub relay server.[#510, #518 by Jiwon Kwon]
--protocoloption.
--persistentoption withSQLite database.
--accept-followand
--reject-followoptions.access, with
--no-tunneloption to run locally only.Added
--tunnel-serviceoption tofedify lookup,fedify inbox, andfedify relaycommands to select the tunneling service (localhost.run,serveo.net, or pinggy.io). Also added
--tunnel-serviceas an aliasto the existing
-s/--serviceoption infedify tunnelfor consistency.[#525, #529, #531 by Jiwon Kwon]
Added configuration file support for CLI commands. The CLI now loads
settings from configuration files at multiple levels, with a well-defined
precedence chain. [#555, #566 by Jiwon Kwon]
from a system-wide configuration file (/etc/xdg/fedify/config.toml),
a user-level configuration file (~/.config/fedify/config.toml),
and .fedify.toml in the current directory; later files override
earlier ones.
--configoption to specify a custom configuration file path;this file has the highest precedence over all other configuration
sources.
--ignore-configoption to skip configuration file loading.inbox,lookup,webfinger,nodeinfo,tunnel,relay) can now be configured via any of the configurationfiles.
@fedify/debugger
Created the @fedify/debugger package, an embedded real-time ActivityPub
debug dashboard for Fedify. It wraps an existing
Federationobject asa proxy, intercepting requests to a configurable path prefix (default
/__debug__) and serving an SSR-based web UI. [#561, #564]createFederationDebugger()function that returns aFederationproxy with a built-in debug dashboard. When calledwithout an
exporteroption, it automatically sets up OpenTelemetrytracing (creating
MemoryKvStore,FedifySpanExporter,BasicTracerProvider) and registers it as the global tracerprovider—no manual OTel configuration needed.
and timestamps, with auto-polling for real-time updates.
verification details, inbox URL, and expandable activity JSON.
/__debug__/api/tracesfor programmatic access.object now includes a
sinkproperty (a LogTapeSinkfunction)that captures log records grouped by trace ID. In the simplified
overload (without
exporter), LogTape is auto-configured.logger category, and message for each log record in the trace.
/__debug__/api/logs/:traceIdfor retrievinglog records for a specific trace.
authconfiguration for protecting the debug dashboardwith authentication. Supports three modes: password-only,
username + password, and request-based (e.g., IP filtering).
Each mode supports both static credentials and callback functions.
Uses cookie-based sessions with HMAC-signed tokens.
@fedify/relay
Created ActivityPub relay integration as the @fedify/relay package.
[#359, #459, #471, #490, #510, #518 by Jiwon Kwon]
Relayinterface defining the common contract for relayimplementations.
MastodonRelayclass implementing Mastodon-compatible relayprotocol.
LitePubRelayclass implementing LitePub-compatible relayprotocol.
SubscriptionRequestHandlertype for custom subscription approvallogic.
RelayOptionsinterface for relay configuration.RelayTypetype alias to document the type-safe parametercreateRelay()factory function as a key public API@fedify/vocab-tools
Created Activity Vocabulary code generator as the @fedify/vocab-tools
package. Separated vocabulary code generation tools from the main
@fedify/fedify package to improve modularity and enable custom vocabulary
extensions across different JavaScript runtimes.
[#444, #458 by ChanHaeng Lee]
and Bun environments.
schema files.
fedify generate-vocabCLI command.@fedify/vocab-runtime
Created ActivityPub vocabulary runtime as the @fedify/vocab-runtime
package. Separated core vocabulary generation and processing modules
from the main @fedify/fedify package to improve modularity and reduce
coupling between vocabulary processing and federation functionality.
[#444, #451 by ChanHaeng Lee]
DocumentLoader,RemoteDocument, and related types fromthe main package.
importSpki,exportSpki,importMultibaseKey,exportMultibaseKey.LanguageStringclass).provides the runtime infrastructure for ActivityPub object processing.
@fedify/elysia
in the package. [#460, #496]
@fedify/lint
This package provides shared Deno Lint and ESLint configurations for
consistent code style across Fedify packages and user projects.
[#297, #494 by ChanHaeng Lee]
@fedify/fresh
between Fedify and Fresh 2.0, replacing the deprecated
@fedify/fedify/x/freshmodule that was designed for Fresh 1.x.[#466, #478 by Hyeonseo Kim]
@fedify/webfinger
This package provides tools for working with WebFinger resources,
including parsing and generating WebFinger documents.
[#517 by ChanHaeng Lee]
@fedify/vocab
Created ActivityPub Vocabulary API package as the @fedify/vocab package.
This package contains the generated Activity Vocabulary classes and
related types, separated from the main @fedify/fedify package to
improve modularity and enable custom vocabulary extensions.
The previous
@fedify/fedify/vocabmodule is now deprecated andre-exports all exports from this package for backward compatibility.
[#437, #517 by ChanHaeng Lee]
@fedify/vocabnow re-exportsLanguageString,DocumentLoader,GetUserAgentOptions, andRemoteDocumentfrom@fedify/vocab-runtimeso that downstream consumers do not need to depend on
@fedify/vocab-runtimedirectly. [#560]Fixed
@fedify/vocab-runtimebeing bundled inline into@fedify/vocab'sESM/CJS output instead of being kept as an external dependency. This
caused
instanceof LanguageStringchecks to fail because two distinctLanguageStringclasses existed at runtime. [#560]@fedify/sqlite
Added
SqliteMessageQueueclass implementingMessageQueueinterfaceusing SQLite as the backing store. This implementation uses polling to
check for new messages and is suitable for single-node deployments and
development environments. [#477, #526 by ChanHaeng Lee]
SqliteMessageQueueclass.SqliteMessageQueueOptionsinterface.SqliteMessageQueuenow supports theorderingKeyoption to ensuremessages with the same ordering key are processed sequentially.
[#538, #540]
ordering_keycolumn to the message queue table schema.SqliteMessageQueue.initialize()is called on a fresh database.
@fedify/testing
Added
testMessageQueue()utility function for standardized testing ofMessageQueueimplementations. This function provides a reusable testharness that covers common message queue operations including
enqueue(),enqueue()with delay,enqueueMany(), and multiple listener scenarios.[#477, #526 by ChanHaeng Lee]
testMessageQueue()function.waitFor()helper function.getRandomKey()helper function.Added
TestMessageQueueOptionsinterface and optionaloptionsparameterto
testMessageQueue()function. [#538, #540]TestMessageQueueOptionsinterface.testOrderingKeyoption to enable ordering key tests.@fedify/redis
Fixed a race condition in
RedisMessageQueue.listen()where pub/subnotifications could be missed if
enqueue()was called immediately afterlisten()started. The issue occurred because the message handler wasattached inside an async callback, allowing a timing window where messages
could be published before the handler was ready.
[#515, #532 by Jiwon Kwon]
RedisMessageQueuenow supports theorderingKeyoption to ensuremessages with the same ordering key are processed sequentially.
[#538, #540]
@fedify/postgres
PostgresMessageQueuenow supports theorderingKeyoption to ensuremessages with the same ordering key are processed sequentially.
[#538, #540]
ordering_keycolumn to the message queue table schema.PostgresMessageQueue.initialize()is called on a fresh database.
Fixed a race condition in
PostgresMessageQueue.initialize()whereconcurrent calls from
listen()andenqueue()would run DDLstatements in parallel, causing redundant table creation and
ALTER TABLEoperations. The initialization promise is now cachedso that concurrent callers share the same work.
Fixed
PostgresMessageQueue.listen()spawning many concurrentpoll()calls when a burst ofNOTIFYsignals arrived (e.g., frombulk enqueue of 100 messages), causing excessive database contention.
Poll executions are now serialized so that at most one runs at a time,
with subsequent requests queued after the current one finishes.
@fedify/amqp
AmqpMessageQueuenow supports theorderingKeyoption to ensuremessages with the same ordering key are processed sequentially.
[#538, #540]
rabbitmq_consistent_hash_exchangeplugin to routemessages with the same ordering key to the same queue.
support to work.
@fedify/cfworkers
WorkersMessageQueuenow supports theorderingKeyoption to ensuremessages with the same ordering key are processed sequentially.
[#538, #540]
WorkersMessageQueueOptionsinterface withorderingKv,orderingKeyPrefix, andorderingLockTtloptions.processMessage()method to handle lock acquisition and release.@fedify/init
Created project initializer as the @fedify/init package. Separated
the
fedify initfunctionality from @fedify/cli into a standalonepackage to improve modularity and enable reuse by other tools such as
@fedify/create. [#482 by Chanhaeng Lee]runInit()function as the main initialization action handler.initCommandandinitOptionsfor CLI integration.testInitCommandfor comprehensive testing of all initcombinations.
@fedify/create
Created standalone project scaffolding CLI as the @fedify/create
package. This enables creating new Fedify projects without installing
the full
@fedify/clitoolchain. [#351 by Chanhaeng Lee]npm init @​fedify,pnpm create @​fedify,yarn create @​fedify, andbunx @​fedify/create.@fedify/initinternally for all initialization logic.fedify init.v1.10.6Compare Source
Released on March 29, 2026.
@fedify/fedify
@fedify/fedify/vocabmissing theObjectexport from the entry point. Older
tsdownoutput generated an invalidCommonJS re-export, causing
require("@​fedify/fedify/vocab").Objectto beundefined. Updated the bundler toolchain and added a regression test forthe built CommonJs entry point. [[#651]]
v1.10.5Compare Source
Released on March 27, 2026.
@fedify/fedify
loaders and signed HTTP fetc
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - Between 07:00 AM and 04:59 PM, only on Monday, Tuesday, Wednesday, and Thursday ( * 7-16 * * 1,2,3,4 ) (UTC).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Never, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.