1<!DOCTYPE html> 2<html lang="en-US" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>Fedify</title> 7 <meta name="description" content="Fedify is a TypeScript library for building federated server apps powered by ActivityPub and other standards, so-called fediverse."> 8 <meta name="generator" content="VitePress v2.0.0-alpha.18"> 9 <link rel="preload stylesheet" href="/assets/style.CTBGmvMY.css" as="style"> 10 <link rel="preload stylesheet" href="/vp-icons.css" as="style"> 11 12
12<script type="module" src="/assets/app.CpFrVWM4.js"></script>
12 13 <link rel="preload" href="/assets/inter-roman-latin.Cy4MYw_J.woff2" as="font" type="font/woff2" crossorigin=""> 14 <link rel="modulepreload" href="/assets/chunks/framework.C9bOz_IG.js"> 15 <link rel="modulepreload" href="/assets/chunks/src.OML0vtuu.js"> 16 <link rel="modulepreload" href="/assets/chunks/chunk-NUTPFWZB.BfLBatDp.js"> 17 <link rel="modulepreload" href="/assets/chunks/chunk-YL523NDC.BRnFDfRm.js"> 18 <link rel="modulepreload" href="/assets/chunks/chunk-F7MYA6JM.yESDnz63.js"> 19 <link rel="modulepreload" href="/assets/chunks/line.gj7qtdpS.js"> 20 <link rel="modulepreload" href="/assets/chunks/createAssigner.D-6Ph3xT.js"> 21 <link rel="modulepreload" href="/assets/chunks/chunk-7N6UNFX7.Cz62gft1.js"> 22 <link rel="modulepreload" href="/assets/chunks/chunk-DS2CGKN3.BP8jBmO2.js"> 23 <link rel="modulepreload" href="/assets/chunks/theme.Ba1Atwo9.js"> 24 <link rel="modulepreload" href="/assets/index.md.DyNBHRei.lean.js"> 25 <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png"> 26 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 27 <meta property="og:type" content="website"> 28 <meta property="og:image" content="https://fedify.dev/og.png"> 29 <meta property="og:image:width" content="1200"> 30 <meta property="og:image:height" content="630"> 31 <meta property="og:image:type" content="image/png"> 32 <meta property="og:image:alt" content="Fedify: an ActivityPub framework for TypeScript"> 33 <meta name="twitter:card" content="summary_large_image"> 34 <meta name="twitter:image" content="https://fedify.dev/og.png"> 35 <meta name="fediverse:creator" content="@[email protected]"> 36
36<script defer data-domain="fedify.dev" src="https://plausible.io/js/plausible.js"></script>
36 37
37<script id="check-dark-mode">(()=>{let e=localStorage.getItem(`vitepress-theme-appearance`)||`auto`,t=window.matchMedia(`(prefers-color-scheme: dark)`).matches;(!e||e===`auto`?t:e===`dark`)&&document.documentElement.classList.add(`dark`)})();</script>
37 38
38<script id="check-mac-os">document.documentElement.classList.toggle(`mac`,/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
38 39 <meta property="og:title" content="Fedify"> 40 <meta property="og:description" content="Fedify is a TypeScript library for building federated server apps powered by ActivityPub and other standards, so-called fediverse."> 41 </head> 42 <body> 43 <div id="app"><div class="Layout" data-v-7aba3c65><!--[--><!--]--><!--[--><span tabindex="-1" data-v-db07facb></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-db07facb>Skip to content</a><!--]--><!----><header class="VPNav" data-v-7aba3c65 data-v-99a99263><div class="VPNavBar home top" data-v-99a99263 data-v-fa001d8c><div class="wrapper" data-v-fa001d8c><div class="container" data-v-fa001d8c><div class="title" data-v-fa001d8c><div class="VPNavBarTitle" data-v-fa001d8c data-v-8c064cfe><a class="title" href="/" data-v-8c064cfe><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-c14766bc><!--]--><span data-v-8c064cfe>Fedify</span><!--[--><!--]--></a></div></div><div class="content" data-v-fa001d8c><div class="content-body" data-v-fa001d8c><!--[--><!--]--><div class="VPNavBarSearch search" data-v-fa001d8c data-v-afceeb0e><!--[--><button type="button" class="VPNavBarSearchButton" aria-label="Search" aria-keyshortcuts="/ control+k meta+k" data-v-afceeb0e data-v-81adaca1><span class="vpi-search" aria-hidden="true" data-v-81adaca1></span><span class="text" data-v-81adaca1>Search</span><span class="keys" aria-hidden="true" data-v-81adaca1><kbd class="key-cmd" data-v-81adaca1>â</kbd><kbd class="key-ctrl" data-v-81adaca1>Ctrl</kbd><kbd data-v-81adaca1>K</kbd></span></button><!----><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-fa001d8c data-v-680616b2><span id="main-nav-aria-label" class="visually-hidden" data-v-680616b2> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/" tabindex="0" data-v-680616b2 data-v-e029bd81><!--[--><span data-v-e029bd81>Home</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/install" tabindex="0" data-v-680616b2 data-v-e029bd81><!--[--><span data-v-e029bd81>Installation</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/cli" tabindex="0" data-v-680616b2 data-v-e029bd81><!--[--><span data-v-e029bd81>CLI</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-680616b2 data-v-2cee7c19><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-2cee7c19><span class="text" data-v-2cee7c19><!----><span data-v-2cee7c19>Tutorials</span><span class="vpi-chevron-down text-icon" data-v-2cee7c19></span></span></button><div class="menu" data-v-2cee7c19><div class="VPMenu" data-v-2cee7c19 data-v-4e238694><div class="items" data-v-4e238694><!--[--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/tutorial/basics" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Learning the basics</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/tutorial/microblog" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Creating a microblog</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/tutorial/content-sharing" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Creating an image sharing service</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/tutorial/astro-blog" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Building a federated blog</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/tutorial/threadiverse" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Building a threadiverse community</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-680616b2 data-v-2cee7c19><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-2cee7c19><span class="text" data-v-2cee7c19><!----><span data-v-2cee7c19>Manual</span><span class="vpi-chevron-down text-icon" data-v-2cee7c19></span></span></button><div class="menu" data-v-2cee7c19><div class="VPMenu" data-v-2cee7c19 data-v-4e238694><div class="items" data-v-4e238694><!--[--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/federation" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Federation</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/context" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Context</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/context-advanced" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Advanced context helpers</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/vocab" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Vocabulary</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/actor" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Actor dispatcher</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/inbox" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Inbox listeners</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/outbox" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Outbox listeners</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/media-upload" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Media upload</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/send" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Sending activities</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/collections" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Collections</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/backfill" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Conversation backfill</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/object" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Object dispatcher</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/access-control" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Access control</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/interaction-controls" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Interaction controls</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3>
43<a class="VPLink link" href="/manual/portable" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Portable objects</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/webfinger" data-v-e161d3c3><!--[--><span data-v-e161d3c3>WebFinger</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/nodeinfo" data-v-e161d3c3><!--[--><span data-v-e161d3c3>NodeInfo</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/uri-template" data-v-e161d3c3><!--[--><span data-v-e161d3c3>URI Template</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/pragmatics" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Pragmatics</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/kv" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Keyâvalue store</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/mq" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Message queue</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/tasks" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Background tasks</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/circuit-breaker" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Circuit breaker</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/integration" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Integration</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/migrate" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Migration</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/relay" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Relay</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/test" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Testing</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/debug" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Debugging</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/lint" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Linting</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/log" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Logging</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/opentelemetry" data-v-e161d3c3><!--[--><span data-v-e161d3c3>OpenTelemetry</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/monitoring" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Monitoring</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/benchmarking" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Benchmarking</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="/manual/deploy" data-v-e161d3c3><!--[--><span data-v-e161d3c3>Deployment</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-680616b2 data-v-2cee7c19><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-2cee7c19><span class="text" data-v-2cee7c19><!----><span data-v-2cee7c19>References</span><span class="vpi-chevron-down text-icon" data-v-2cee7c19></span></span></button><div class="menu" data-v-2cee7c19><div class="VPMenu" data-v-2cee7c19 data-v-4e238694><div class="items" data-v-4e238694><!--[--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/fedify/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/fedify</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/amqp/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/amqp</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/astro/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/astro</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/backfill/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/backfill</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/cfworkers/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/cfworkers</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/cli/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/cli</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/debugger/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/debugger</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/denokv/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/denokv</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/express/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/express</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/fastify/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/fastify</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/fresh/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/fresh</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/h3/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/h3</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/hono/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/hono</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/init/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/init</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/interaction-controls/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/interaction-controls</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/koa/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/koa</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/lint/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/lint</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/mysql/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/mysql</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/netlify/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/netlify</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/nuxt/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/nuxt</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/pglite/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/pglite</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/postgres/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/postgres</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/redis/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/redis</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/relay/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/relay</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/solidstart/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/solidstart</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/sqlite/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/sqlite</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/sveltekit/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/sveltekit</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/testing/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/testing</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/uri-template/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/uri-template</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/vocab/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/vocab</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/vocab-runtime/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/vocab-runtime</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/vocab-tools/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/vocab-tools</span><!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-4e238694 data-v-e161d3c3><a class="VPLink link" href="https://jsr.io/@fedify/webfinger/doc" data-v-e161d3c3><!--[--><span data-v-e161d3c3>@fedify/webfinger</span><!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="https://unstable.fedify.dev/" tabindex="0" data-v-680616b2 data-v-e029bd81><!--[--><span data-v-e029bd81>Unstable</span><!--]--></a>
43<!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-fa001d8c data-v-d53330a6><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d53330a6 data-v-a7c53efb data-v-4790f029><span class="check" data-v-4790f029><span class="icon" data-v-4790f029><!--[--><span class="vpi-sun sun" data-v-a7c53efb></span><span class="vpi-moon moon" data-v-a7c53efb></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-fa001d8c data-v-a54c45fb data-v-aed3137e><!--[--><a class="VPSocialLink no-icon" href="https://jsr.io/@fedify/fedify" aria-label="JSR" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-jsr"></span></a><a class="VPSocialLink no-icon" href="https://www.npmjs.com/package/@fedify/fedify" aria-label="npm" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-npm"></span></a><a class="VPSocialLink no-icon" href="https://matrix.to/#/#fedify:matrix.org" aria-label="Matrix" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-matrix"></span></a><a class="VPSocialLink no-icon" href="https://hackers.pub/@fedify" aria-label="hackers.pub (ActivityPub)" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><svg xmlns="http://www.w3.org/2000/svg" width="17.995798" height="12.67316" viewBox="0 0 17.995798 12.67316"><defs><clipPath clipPathUnits="userSpaceOnUse" id="clipPath831"><path d="M 0,982 H 1512 V 0 H 0 Z" transform="translate(-1348.062,-446.10931)" /></clipPath><clipPath clipPathUnits="userSpaceOnUse" id="clipPath833"><path d="M 0,982 H 1512 V 0 H 0 Z" transform="translate(-1349.778,-452.50481)" /></clipPath></defs><g transform="translate(-20112.718,-703.56027)"><g id="g49"><path d="M 0,0 C -2.542,-0.369 -5.396,-0.247 -5.483,0.591 -5.569,1.429 -2.68,2.344 -0.147,2.771 2.499,3.216 5.155,3.372 5.575,2.487 5.993,1.607 2.738,0.398 0,0 M -0.07,3.07 C -3.963,2.432 -6.437,1.398 -6.522,0.163 -6.59,-0.819 -4.481,-1.731 0.28,-1.046 c 5.038,0.724 7.075,2.5 6.635,3.479 -0.45,1 -2.977,1.293 -6.985,0.637" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,-1.3333333,20121.416,714.52093)" clip-path="url(#clipPath831)" /><path d="m 0,0 c -0.909,0.834 -0.652,1.825 -1.553,1.825 -0.876,0 -0.62,-0.905 -1.551,-1.825 -0.623,-0.669 -2.434,-0.14 -2.434,-1.214 0,-0.924 1.364,-0.764 2.306,-1.659 0.745,-0.708 0.711,-2.045 1.679,-2.045 0.884,0 0.901,1.516 1.584,2.199 0.957,0.888 2.255,0.578 2.255,1.505 C 2.286,-0.225 0.8,-0.652 0,0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,-1.3333333,20123.704,705.9936)" clip-path="url(#clipPath833)" /></g></g></svg></a><a class="VPSocialLink no-icon" href="https://opencollective.com/fedify" aria-label="Open Collective" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-opencollective"></span></a><a class="VPSocialLink no-icon" href="https://github.com/fedify-dev/fedify" aria-label="GitHub" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-fa001d8c data-v-2bbab902 data-v-2cee7c19><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-2cee7c19><span class="vpi-more-horizontal icon" data-v-2cee7c19></span></button><div class="menu" data-v-2cee7c19><div class="VPMenu" data-v-2cee7c19 data-v-4e238694><!----><!--[--><!--[--><!----><div class="group" data-v-2bbab902><div class="item appearance" data-v-2bbab902><p class="label" data-v-2bbab902>Appearance</p><div class="appearance-action" data-v-2bbab902><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-2bbab902 data-v-a7c53efb data-v-4790f029><span class="check" data-v-4790f029><span class="icon" data-v-4790f029><!--[--><span class="vpi-sun sun" data-v-a7c53efb></span><span class="vpi-moon moon" data-v-a7c53efb></span><!--]--></span></span></button></div></div></div><div class="group" data-v-2bbab902><div class="item social-links" data-v-2bbab902><div class="VPSocialLinks social-links-list" data-v-2bbab902 data-v-aed3137e><!--[--><a class="VPSocialLink no-icon" href="https://jsr.io/@fedify/fedify" aria-label="JSR" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-jsr"></span></a><a class="VPSocialLink no-icon" href="https://www.npmjs.com/package/@fedify/fedify" aria-label="npm" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-npm"></span></a><a class="VPSocialLink no-icon" href="https://matrix.to/#/#fedify:matrix.org" aria-label="Matrix" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-matrix"></span></a><a class="VPSocialLink no-icon" href="https://hackers.pub/@fedify" aria-label="hackers.pub (ActivityPub)" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><svg xmlns="http://www.w3.org/2000/svg" width="17.995798" height="12.67316" viewB
43ox="0 0 17.995798 12.67316"><defs><clipPath clipPathUnits="userSpaceOnUse" id="clipPath831"><path d="M 0,982 H 1512 V 0 H 0 Z" transform="translate(-1348.062,-446.10931)" /></clipPath><clipPath clipPathUnits="userSpaceOnUse" id="clipPath833"><path d="M 0,982 H 1512 V 0 H 0 Z" transform="translate(-1349.778,-452.50481)" /></clipPath></defs><g transform="translate(-20112.718,-703.56027)"><g id="g49"><path d="M 0,0 C -2.542,-0.369 -5.396,-0.247 -5.483,0.591 -5.569,1.429 -2.68,2.344 -0.147,2.771 2.499,3.216 5.155,3.372 5.575,2.487 5.993,1.607 2.738,0.398 0,0 M -0.07,3.07 C -3.963,2.432 -6.437,1.398 -6.522,0.163 -6.59,-0.819 -4.481,-1.731 0.28,-1.046 c 5.038,0.724 7.075,2.5 6.635,3.479 -0.45,1 -2.977,1.293 -6.985,0.637" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,-1.3333333,20121.416,714.52093)" clip-path="url(#clipPath831)" /><path d="m 0,0 c -0.909,0.834 -0.652,1.825 -1.553,1.825 -0.876,0 -0.62,-0.905 -1.551,-1.825 -0.623,-0.669 -2.434,-0.14 -2.434,-1.214 0,-0.924 1.364,-0.764 2.306,-1.659 0.745,-0.708 0.711,-2.045 1.679,-2.045 0.884,0 0.901,1.516 1.584,2.199 0.957,0.888 2.255,0.578 2.255,1.505 C 2.286,-0.225 0.8,-0.652 0,0" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(1.3333333,0,0,-1.3333333,20123.704,705.9936)" clip-path="url(#clipPath833)" /></g></g></svg></a><a class="VPSocialLink no-icon" href="https://opencollective.com/fedify" aria-label="Open Collective" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-opencollective"></span></a><a class="VPSocialLink no-icon" href="https://github.com/fedify-dev/fedify" aria-label="GitHub" target="_blank" rel="me noopener" data-v-aed3137e data-v-f78e1a0e><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-fa001d8c data-v-bdc24e96><span class="container" data-v-bdc24e96><span class="top" data-v-bdc24e96></span><span class="middle" data-v-bdc24e96></span><span class="bottom" data-v-bdc24e96></span></span></button></div></div></div></div><div class="divider" data-v-fa001d8c><div class="divider-line" data-v-fa001d8c></div></div></div><!----></header><!----><!----><div class="VPContent is-home" id="VPContent" data-v-7aba3c65 data-v-21888e20><div class="lp" data-v-21888e20 data-v-39328e90><section class="lp-hero" data-v-39328e90><div class="wrap lp-hero-grid" data-v-39328e90><div class="lp-hero-copy" data-v-39328e90><h1 class="lp-title" data-v-39328e90> Build for the <em class="lp-em" data-v-39328e90>fediverse</em>,<br data-v-39328e90> skip the boilerplate. </h1><p class="lp-lede" data-v-39328e90><strong data-v-39328e90>Fedify</strong> is a TypeScript framework that handles federation, signatures, discovery, activity vocabulary, and delivery behind type-safe APIs, so you ship features, not specs. It's modular, too: adopt the whole thing or just the parts you need, and it never dictates how your app is built. </p><div class="lp-cta" data-v-39328e90><a class="btn btn-primary" href="/tutorial/basics" data-v-39328e90> Get started <span class="btn-arrow" data-v-39328e90>â</span></a><a class="btn btn-text" href="/why" data-v-39328e90>Why Fedify?</a></div><div class="lp-install" data-v-39328e90><div class="lp-install-tabs" role="tablist" data-v-39328e90><!--[--><button type="button" class="active lp-tab" aria-selected="true" role="tab" data-v-39328e90>npm</button><button type="button" class="lp-tab" aria-selected="false" role="tab" data-v-39328e90>pnpm</button><button type="button" class="lp-tab" aria-selected="false" role="tab" data-v-39328e90>Yarn</button><button type="button" class="lp-tab" aria-selected="false" role="tab" data-v-39328e90>Deno</button><button type="button" class="lp-tab" aria-selected="false" role="tab" data-v-39328e90>Bun</button><!--]--></div><div class="lp-install-cmd" data-v-39328e90><span class="prompt" aria-hidden="true" data-v-39328e90>$</span><code data-v-39328e90>npm install @fedify/fedify</code><button type="button" class="lp-copy" aria-label="Copy command" data-v-39328e90>Copy</button></div></div><div class="lp-runtimes" data-v-39328e90><span class="lp-runtimes-label" data-v-39328e90>Runs on</span><!--[--><span class="rt" data-v-39328e90><span class="rt-logo" data-v-39328e90><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true">
43<path fill="currentColor" d="M11.998 24c-.321 0-.641-.084-.922-.247L8.14 22.016c-.438-.245-.224-.332-.08-.383c.585-.203.703-.25 1.328-.604c.065-.037.151-.023.218.017l2.256 1.339a.29.29 0 0 0 .272 0l8.795-5.076a.28.28 0 0 0 .134-.238V6.921a.28.28 0 0 0-.137-.242l-8.791-5.072a.28.28 0 0 0-.271 0L3.075 6.68a.28.28 0 0 0-.139.241v10.15a.27.27 0 0 0 .139.235l2.409 1.392c1.307.654 2.108-.116 2.108-.89V7.787c0-.142.114-.253.256-.253h1.115c.139 0 .255.112.255.253v10.021c0 1.745-.95 2.745-2.604 2.745c-.508 0-.909 0-2.026-.551L2.28 18.675a1.86 1.86 0 0 1-.922-1.604V6.921c0-.659.353-1.275.922-1.603L11.075.236a1.93 1.93 0 0 1 1.848 0l8.794 5.082c.57.329.924.944.924 1.603v10.15a1.86 1.86 0 0 1-.924 1.604l-8.794 5.078c-.28.163-.599.247-.925.247m7.101-10.007c0-1.9-1.284-2.406-3.987-2.763c-2.731-.361-3.009-.548-3.009-1.187c0-.528.235-1.233 2.258-1.233c1.807 0 2.473.389 2.747 1.607a.254.254 0 0 0 .247.199h1.141a.26.26 0 0 0 .186-.081a.26.26 0 0 0 .067-.196c-.177-2.098-1.571-3.076-4.388-3.076c-2.508 0-4.004 1.058-4.004 2.833c0 1.925 1.488 2.457 3.895 2.695c2.88.282 3.103.703 3.103 1.269c0 .983-.789 1.402-2.642 1.402c-2.327 0-2.839-.584-3.011-1.742a.255.255 0 0 0-.253-.215h-1.137a.25.25 0 0 0-.254.253c0 1.482.806 3.248 4.655 3.248c2.788.001 4.386-1.096 4.386-3.013"/></svg></span>Node.js</span><span class="rt" data-v-39328e90><span class="rt-logo" data-v-39328e90><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path fill="currentColor" d="M1.105 18.02A11.9 11.9 0 0 1 0 12.985q0-.698.078-1.376a12 12 0 0 1 .231-1.34A12 12 0 0 1 4.025 4.02a12 12 0 0 1 5.46-2.771a12 12 0 0 1 3.428-.23c1.452.112 2.825.477 4.077 1.05a12 12 0 0 1 2.78 1.774a12.02 12.02 0 0 1 4.053 7.078A12 12 0 0 1 24 12.985q0 .454-.036.914a12 12 0 0 1-.728 3.305a12 12 0 0 1-2.38 3.875c-1.33 1.357-3.02 1.962-4.43 1.936a4.4 4.4 0 0 1-2.724-1.024c-.99-.853-1.391-1.83-1.53-2.919a5 5 0 0 1 .128-1.518c.105-.38.37-1.116.76-1.437c-.455-.197-1.04-.624-1.226-.829c-.045-.05-.04-.13 0-.183a.155.155 0 0 1 .177-.053c.392.134.869.267 1.372.35c.66.111 1.484.25 2.317.292c2.03.1 4.153-.813 4.812-2.627s.403-3.609-1.96-4.685s-3.454-2.356-5.363-3.128c-1.247-.505-2.636-.205-4.06.582c-3.838 2.121-7.277 8.822-5.69 15.032a.191.191 0 0 1-.315.19a12 12 0 0 1-1.25-1.634a12 12 0 0 1-.769-1.404M11.57 6.087c.649-.051 1.214.501 1.31 1.236c.13.979-.228 1.99-1.41 2.013c-1.01.02-1.315-.997-1.248-1.614c.066-.616.574-1.575 1.35-1.635"/></svg></span>Deno</span><span class="rt" data-v-39328e90><span class="rt-logo" data-v-39328e90><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path fill="currentColor" d="M12 22.596c6.628 0 12-4.338 12-9.688c0-3.318-2.057-6.248-5.219-7.986c-1.286-.715-2.297-1.357-3.139-1.89C14.058 2.025 13.08 1.404 12 1.404c-1.097 0-2.334.785-3.966 1.821a50 50 0 0 1-2.816 1.697C2.057 6.66 0 9.59 0 12.908c0 5.35 5.372 9.687 12 9.687zM10.599 4.715c.334-.759.503-1.58.498-2.409c0-.145.202-.187.23-.029c.658 2.783-.902 4.162-2.057 4.624c-.124.048-.199-.121-.103-.209a5.8 5.8 0 0 0 1.432-1.977m2.058-.102a5.8 5.8 0 0 0-.782-2.306v-.016c-.069-.123.086-.263.185-.172c1.962 2.111 1.307 4.067.556 5.051c-.082.103-.23-.003-.189-.126a5.85 5.85 0 0 0 .23-2.431m1.776-.561a5.7 5.7 0 0 0-1.612-1.806v-.014c-.112-.085-.024-.274.114-.218c2.595 1.087 2.774 3.18 2.459 4.407a.12.12 0 0 1-.049.071a.11.11 0 0 1-.153-.026a.12.12 0 0 1-.022-.083a5.9 5.9 0 0 0-.737-2.331m-5.087.561c-.617.546-1.282.76-2.063 1c-.117 0-.195-.078-.156-.181c1.752-.909 2.376-1.649 2.999-2.778c0 0 .155-.118.188.085c0 .304-.349 1.329-.968 1.874m4.945 11.237a2.96 2.96 0 0 1-.937 1.553c-.346.346-.8.565-1.286.62a2.18 2.18 0 0 1-1.327-.62a2.96 2.96 0 0 1-.925-1.553a.24.24 0 0 1 .064-.198a.23.23 0 0 1 .193-.069h3.965a.23.23 0 0 1 .19.07c.05.053.073.125.063.197m-5.458-2.176a1.86 1.86 0 0 1-2.384-.245a1.98 1.98 0 0 1-.233-2.447c.207-.319.503-.566.848-.713a1.84 1.84 0 0 1 1.092-.11c.366.075.703.261.967.531a1.98 1.98 0 0 1 .408 2.114a1.93 1.93 0 0 1-.698.869zm8.495.005a1.86 1.86 0 0 1-2.381-.253a1.96 1.96 0 0 1-.547-1.366c0-.384.11-.76.32-1.079c.207-.319.503-.567.849-.713a1.84 1.84 0 0 1 1.093-.108c.367.076.704.262.968.534a1.98 1.98 0 0 1 .4 2.117a1.93 1.93 0 0 1-.702.868"/></svg></span>Bun</span><span class="rt" data-v-39328e90><span class="rt-logo" data-v-39328e90><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true">
43<path fill="currentColor" d="m8.213.063l8.879 12.136l-8.67 11.739h2.476l8.665-11.735l-8.89-12.14Zm4.728 0l9.02 11.992l-9.018 11.883h2.496L24 12.656v-1.199L15.434.063ZM7.178 2.02L.01 11.398l-.01 1.2l7.203 9.644l1.238-1.676l-6.396-8.556l6.361-8.313Z"/></svg></span>Cloudflare Workers</span><!--]--></div></div><div class="lp-hero-art" aria-hidden="true" data-v-39328e90><svg class="lp-net" viewBox="0 0 440 440" data-v-39328e90><defs data-v-39328e90><radialGradient id="lpGlow" cx="50%" cy="50%" r="50%" data-v-39328e90><stop offset="0%" stop-color="#38bdf8" stop-opacity="0.35" data-v-39328e90></stop><stop offset="100%" stop-color="#38bdf8" stop-opacity="0" data-v-39328e90></stop></radialGradient></defs><circle cx="220" cy="220" r="200" fill="url(#lpGlow)" data-v-39328e90></circle><g class="rings" data-v-39328e90><circle cx="220" cy="220" r="92" data-v-39328e90></circle><circle cx="220" cy="220" r="150" data-v-39328e90></circle><circle cx="220" cy="220" r="200" data-v-39328e90></circle></g><g class="orbit" data-v-39328e90><line x1="220" y1="220" x2="220" y2="70" data-v-39328e90></line><line x1="220" y1="220" x2="350" y2="160" data-v-39328e90></line><line x1="220" y1="220" x2="330" y2="320" data-v-39328e90></line><line x1="220" y1="220" x2="120" y2="350" data-v-39328e90></line><line x1="220" y1="220" x2="78" y2="170" data-v-39328e90></line><circle class="node" cx="220" cy="70" r="13" data-v-39328e90></circle><circle class="node" cx="350" cy="160" r="11" data-v-39328e90></circle><circle class="node" cx="330" cy="320" r="14" data-v-39328e90></circle><circle class="node" cx="120" cy="350" r="10" data-v-39328e90></circle><circle class="node" cx="78" cy="170" r="12" data-v-39328e90></circle></g></svg><img class="lp-net-logo" src="/logo.svg" alt="" data-v-39328e90></div></div></section><section class="lp-section" data-v-39328e90><div class="wrap lp-narrow" data-v-39328e90><p class="lp-kicker" data-v-39328e90>What's Fedify?</p><h2 class="lp-h2" data-v-39328e90> A federation framework, not just a protocol library. </h2><p class="lp-body" data-v-39328e90> The fediverse is millions of accounts spread across thousands of independent servers, all talking through shared protocols. Implementing those protocols by hand is a lot of subtle, security-critical work. Fedify handles all of it, actors and activity vocabulary, signatures, discovery, and queued delivery, so a post on your server reaches Mastodon, Misskey, Lemmy, and the rest, correctly and securely. It's that broad, yet modular: take only the pieces you need, and it won't decide how the rest of your app is structured. </p><a class="lp-textlink" href="/intro" data-v-39328e90>Read the full introduction â</a></div></section><section class="lp-section lp-section-alt" data-v-39328e90><div class="wrap lp-why" data-v-39328e90><div class="lp-why-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Why Fedify?</p><h2 class="lp-h2" data-v-39328e90>Federation is a stack of specs. Fedify implements it.</h2><p class="lp-body" data-v-39328e90> Going federated means getting a whole pile of standards right, and keeping them right as they evolve. Fedify implements them so you don't have to, and exposes them through one coherent, typed API. </p><a class="lp-textlink" href="/why" data-v-39328e90>See the full rationale â</a></div><ul class="lp-stack" aria-label="Standards implemented by Fedify" data-v-39328e90><!--[--><li style="--i:0;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><span class="lp-stack-logo" data-v-39328e90><svg viewBox="0 0 24 24" width="26" height="26" fill="currentColor" aria-hidden="true"><path d="M10.91 4.442 0 10.74v2.52l8.727-5.04v10.077l2.182 1.26zM6.545 12l-4.364 2.52 4.364 2.518zm6.545-2.52L17.455 12l-4.364 2.52zm0-5.038L24 10.74v2.52l-10.91 6.298v-2.52L21.819 12l-8.728-5.04z"/></svg></span></span><a href="/manual/federation" class="lp-stack-name" data-v-39328e90>ActivityPub</a><!----><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:1;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-braces-icon lucide-braces" data-v-39328e90><path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1"></path><path d="M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"></path></svg></span><a href="/manual/vocab" class="lp-stack-name" data-v-39328e90>Activity Streams 2.0</a><!----><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:2;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-pen-icon lucide-file-pen" data-v-39328e90><path d="M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34"></path><path d="M14 2v5a1 1 0 0 0 1 1h5"></path><path d="M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z"></path></svg></span><a href="/manual/send#http-signatures" class="lp-stack-name" data-v-39328e90>HTTP Signatures</a><span class="lp-stack-spec" data-v-39328e90>draft-cavage-http-signatures-12</span><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:3;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-signature-icon lucide-signature" data-v-39328e90><path d="m21 17-2.156-1.868A.5.5 0 0 0 18 15.5v.5a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1c0-2.545-3.991-3.97-8.5-4a1 1 0 0 0 0 5c4.153 0 4.745-11.295 5.708-13.5a2.5 2.5 0 1 1 3.31 3.284"></path><path d="M3 21h18"></path></svg></span><a href="/manual/send#http-message-signatures" class="lp-stack-name" data-v-39328e90>HTTP Message Signatures</a><span class="lp-stack-spec" data-v-39328e90>RFC 9421</span><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:4;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user-search-icon lucide-user-search" data-v-39328e90><circle cx="10" cy="7" r="4"></circle><path d="M10.3 15H7a4 4 0 0 0-4 4v2"></path><circle cx="17" cy="17" r="3"></circle><path d="m21 21-1.9-1.9"></path></svg></span><a href="/manual/webfinger" class="lp-stack-name" data-v-39328e90>WebFinger</a><span class="lp-stack-spec" data-v-39328e90>RFC 7033</span><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:5;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-server-icon lucide-server" data-v-39328e90><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg></span><a href="/manual/nodeinfo" class="lp-stack-name" data-v-39328e90>NodeInfo</a><!----><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:6;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-check-icon lucide-badge-check" data-v-39328e90><path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z"></path><path d="m9 12 2 2 4-4"></path></svg></span><a href="/manual/send#object-integrity-proofs" class="lp-stack-name" data-v-39328e90>Object Integrity Proofs</a><span class="lp-stack-spec" data-v-39328e90>FEP-8b32</span><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li><li style="--i:7;" class="has-link" data-v-39328e90><span class="lp-stack-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link2-icon lucide-link-2" data-v-39328e90><path d="M9 17H7A5 5 0 0 1 7 7h2"></path><path d="M15 7h2a5 5 0 1 1 0 10h-2"></path><line x1="8" x2="16" y1="12" y2="12"></line></svg></span><a href="/manual/send#linked-data-signatures" class="lp-stack-name" data-v-39328e90>Linked Data Signatures</a><!----><span class="lp-stack-go" aria-hidden="true" data-v-39328e90>â</span></li>
43<!--]--></ul></div></section><section class="lp-section" data-v-39328e90><div class="wrap lp-code-grid" data-v-39328e90><div class="lp-code-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Looks like this</p><h2 class="lp-h2" data-v-39328e90>Define an actor. Fedify handles the wire.</h2><p class="lp-body" data-v-39328e90> Map a route to a typed actor and you get a working, discoverable, cryptographically-signed ActivityPub endpoint, no manual JSON-LD, no signature plumbing. </p><a class="lp-textlink" href="/tutorial/basics" data-v-39328e90>Follow the tutorial â</a></div><div class="lp-code-window" data-v-39328e90><div class="lp-code-bar" aria-hidden="true" data-v-39328e90><span class="lp-code-file" data-v-39328e90>federation.ts</span></div><pre class="lp-code" data-v-39328e90><code data-v-39328e90><span class="c-kw">import</span> { <span class="c-ty">createFederation</span>, <span class="c-ty">Person</span> } <span class="c-kw">from</span> <span class="c-st">"@fedify/fedify"</span>; 44 45<span class="c-kw">const</span> federation = <span class="c-fn">createFederation</span>({ kv }); 46 47federation.<span class="c-fn">setActorDispatcher</span>( 48 <span class="c-st">"/users/{identifier}"</span>, 49 <span class="c-kw">async</span> (ctx, identifier) => { 50 <span class="c-kw">const</span> user = <span class="c-kw">await</span> db.<span class="c-fn">getUser</span>(identifier); 51 <span class="c-kw">if</span> (user == <span class="c-kw">null</span>) <span class="c-kw">return</span> <span class="c-kw">null</span>; 52 <span class="c-kw">return</span> <span class="c-kw">new</span> <span class="c-ty">Person</span>({ 53 id: ctx.<span class="c-fn">getActorUri</span>(identifier), 54 preferredUsername: identifier, 55 name: user.name, 56 inbox: ctx.<span class="c-fn">getInboxUri</span>(identifier), 57 }); 58 }, 59);</code></pre></div></div></section><section class="lp-section lp-section-alt" data-v-39328e90><div class="wrap lp-vocab" data-v-39328e90><div class="lp-vocab-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Type-safe vocabulary</p><h2 class="lp-h2" data-v-39328e90>Type-safe objects, no JSON-LD headaches</h2><p class="lp-body" data-v-39328e90> Fedify models the whole Activity Vocabulary as immutable, type-safe objects, backed by a real JSON-LD processor and exposed as a fully typed API. </p><ul class="lp-checklist" data-v-39328e90><!--[--><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-check-icon lucide-badge-check" data-v-39328e90><path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z"></path><path d="m9 12 2 2 4-4"></path></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>Standard-compliant output</span><span class="lp-check-desc" data-v-39328e90>build an object and toJsonLd() emits valid, interoperable JSON-LD.</span></span></li><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shapes-icon lucide-shapes" data-v-39328e90><path d="M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z"></path><rect x="3" y="14" width="7" height="7" rx="1"></rect><circle cx="17.5" cy="17.5" r="3.5"></circle></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>One shape to read</span><span class="lp-check-desc" data-v-39328e90>every equivalent JSON-LD form normalizes to the same typed value.</span></span></li><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link-icon lucide-external-link" data-v-39328e90><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>References, dereferenced</span><span class="lp-check-desc" data-v-39328e90><code>getActor()</code> and <code>getObject()</code> accessors fetch and hydrate remote objects on demand.</span></span></li><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield-check-icon lucide-shield-check" data-v-39328e90><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>Secure by default</span><span class="lp-check-desc" data-v-39328e90>an origin-based security model (<a href="https://w3id.org/fep/fe34" target="_blank" rel="noopener noreferrer">FEP-fe34</a>) re-fetches cross-origin objects to prevent spoofing.</span></span></li>
59<!--]--></ul><a class="lp-textlink" href="/manual/vocab" data-v-39328e90>Vocabulary guide â</a></div><div class="lp-vocab-demos" data-v-39328e90><div class="lp-code-window" data-v-39328e90><div class="lp-code-bar" aria-hidden="true" data-v-39328e90><span class="lp-code-file" data-v-39328e90>recipients.ts</span></div><pre class="lp-code" data-v-39328e90><code data-v-39328e90><span class="c-cm">// In JSON-LD, these four are all equivalent:</span> 60<span class="c-ty">"to"</span>: <span class="c-st">"as:Public"</span> 61<span class="c-ty">"to"</span>: [<span class="c-st">"as:Public"</span>] 62<span class="c-ty">"to"</span>: <span class="c-st">"https://www.w3.org/ns/activitystreams#Public"</span> 63<span class="c-ty">"to"</span>: [<span class="c-st">"https://www.w3.org/ns/activitystreams#Public"</span>] 64 65<span class="c-cm">// With the Vocabulary API you read one typed value:</span> 66note.<span class="c-fn">toId</span> 67<span class="c-cm">// â URL "https://www.w3.org/ns/activitystreams#Public"</span></code></pre></div><div class="lp-code-window" data-v-39328e90><div class="lp-code-bar" aria-hidden="true" data-v-39328e90><span class="lp-code-file" data-v-39328e90>actor.ts</span></div><pre class="lp-code" data-v-39328e90><code data-v-39328e90><span class="c-kw">const</span> activity = <span class="c-kw">await</span> <span class="c-ty">Activity</span>.<span class="c-fn">fromJsonLd</span>(json); 68 69<span class="c-cm">// Just the URI, no network request:</span> 70activity.actorId; 71<span class="c-cm">// â URL "https://example.com/users/alice"</span> 72 73<span class="c-cm">// getActor() fetches and hydrates the actor:</span> 74<span class="c-kw">const</span> actor = <span class="c-kw">await</span> activity.<span class="c-fn">getActor</span>(); 75actor?.name; <span class="c-cm">// "Alice"</span></code></pre></div></div></div></section><section class="lp-section" data-v-39328e90><div class="wrap" data-v-39328e90><div class="lp-section-head" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Reliable at scale</p><h2 class="lp-h2" data-v-39328e90>Reliable delivery, even to huge audiences</h2><p class="lp-body" data-v-39328e90> Outgoing activities go through a message queue, so a flaky recipient never costs you a post. For large audiences, a two-stage fan-out returns instantly and delivers to every inbox in the background. </p></div><div class="lp-points" data-v-39328e90><!--[--><div class="lp-point" data-v-39328e90><span class="lp-point-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-cw-icon lucide-rotate-cw" data-v-39328e90><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path></svg></span><h3 class="lp-point-title" data-v-39328e90>Queued and retried</h3><p class="lp-point-desc" data-v-39328e90>Outgoing activities go through a queue and retry with exponential backoff, so a flaky server never costs you a post.</p></div><div class="lp-point" data-v-39328e90><span class="lp-point-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-share2-icon lucide-share-2" data-v-39328e90><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" x2="15.42" y1="13.51" y2="17.49"></line><line x1="15.41" x2="8.59" y1="6.51" y2="10.49"></line></svg></span><h3 class="lp-point-title" data-v-39328e90>Fan-out for scale</h3><p class="lp-point-desc" data-v-39328e90>A two-stage fan-out returns instantly and delivers to thousands of inboxes in the background, each retried on its own.</p></div><div class="lp-point" data-v-39328e90><span class="lp-point-icon" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-database-zap-icon lucide-database-zap" data-v-39328e90><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5V19A9 3 0 0 0 15 21.84"></path><path d="M21 5V8"></path><path d="M21 12L18 17H22L19 22"></path><path d="M3 12A9 3 0 0 0 14.59 14.87"></path></svg></span>
75<h3 class="lp-point-title" data-v-39328e90>Pluggable brokers</h3><p class="lp-point-desc" data-v-39328e90>Run the queue on the backend you already operate, and swap it later without touching your application code.</p></div><!--]--></div><p class="lp-brokers-label" data-v-39328e90>Run the queue on the broker you prefer</p><ul class="lp-logos lp-brokers" data-v-39328e90><!--[--><li data-v-39328e90><a class="lp-logo" href="/manual/mq#redismessagequeue" aria-label="Redis" title="Redis" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M22.71 13.145c-1.66 2.092-3.452 4.483-7.038 4.483c-3.203 0-4.397-2.825-4.48-5.12c.701 1.484 2.073 2.685 4.214 2.63c4.117-.133 6.94-3.852 6.94-7.239c0-4.05-3.022-6.972-8.268-6.972c-3.752 0-8.4 1.428-11.455 3.685C2.59 6.937 3.885 9.958 4.35 9.626c2.648-1.904 4.748-3.13 6.784-3.744C8.12 9.244.886 17.05 0 18.425c.1 1.261 1.66 4.648 2.424 4.648c.232 0 .431-.133.664-.365a101 101 0 0 0 5.54-6.765c.222 3.104 1.748 6.898 6.014 6.898c3.819 0 7.604-2.756 9.33-8.965c.2-.764-.73-1.361-1.261-.73zm-4.349-5.013c0 1.959-1.926 2.922-3.685 2.922a4.45 4.45 0 0 1-2.235-.568c1.051-1.592 2.092-3.225 3.21-4.973c1.972.334 2.71 1.43 2.71 2.619"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#postgresmessagequeue" aria-label="PostgreSQL" title="PostgreSQL" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M23.56 14.723a.5.5 0 0 0-.057-.12q-.21-.395-1.007-.231c-1.654.34-2.294.13-2.526-.02c1.342-2.048 2.445-4.522 3.041-6.83c.272-1.05.798-3.523.122-4.73a1.6 1.6 0 0 0-.15-.236C21.693.91 19.8.025 17.51.001c-1.495-.016-2.77.346-3.116.479a10 10 0 0 0-.516-.082a8 8 0 0 0-1.312-.127c-1.182-.019-2.203.264-3.05.84C8.66.79 4.729-.534 2.296 1.19C.935 2.153.309 3.873.43 6.304c.041.818.507 3.334 1.243 5.744q.69 2.26 1.433 3.582q.83 1.493 1.714 1.79c.448.148 1.133.143 1.858-.729a56 56 0 0 1 1.945-2.206c.435.235.906.362 1.39.377v.004a11 11 0 0 0-.247.305c-.339.43-.41.52-1.5.745c-.31.064-1.134.233-1.146.811a.6.6 0 0 0 .091.327c.227.423.922.61 1.015.633c1.335.333 2.505.092 3.372-.679c-.017 2.231.077 4.418.345 5.088c.221.553.762 1.904 2.47 1.904q.375.001.829-.094c1.782-.382 2.556-1.17 2.855-2.906c.15-.87.402-2.875.539-4.101c.017-.07.036-.12.057-.136c0 0 .07-.048.427.03l.044.007l.254.022l.015.001c.847.039 1.911-.142 2.531-.43c.644-.3 1.806-1.033 1.595-1.67M2.37 11.876c-.744-2.435-1.178-4.885-1.212-5.571c-.109-2.172.417-3.683 1.562-4.493c1.837-1.299 4.84-.54 6.108-.13l-.01.01C6.795 3.734 6.843 7.226 6.85 7.44c0 .082.006.199.016.36c.034.586.1 1.68-.074 2.918c-.16 1.15.194 2.276.973 3.089q.12.126.252.237c-.347.371-1.1 1.193-1.903 2.158c-.568.682-.96.551-1.088.508c-.392-.13-.813-.587-1.239-1.322c-.48-.839-.963-2.032-1.415-3.512m6.007 5.088a1.6 1.6 0 0 1-.432-.178c.089-.039.237-.09.483-.14c1.284-.265 1.482-.451 1.915-1a8 8 0 0 1 .367-.443a.4.4 0 0 0 .074-.13c.17-.151.272-.11.436-.042c.156.065.308.26.37.475c.03.102.062.295-.045.445c-.904 1.266-2.222 1.25-3.168 1.013m2.094-3.988l-.052.14c-.133.357-.257.689-.334 1.004c-.667-.002-1.317-.288-1.81-.803c-.628-.655-.913-1.566-.783-2.5c.183-1.308.116-2.447.08-3.059l-.013-.22c.296-.262 1.666-.996 2.643-.772c.446.102.718.406.83.928c.585 2.704.078 3.83-.33 4.736a9 9 0 0 0-.23.546m7.364 4.572q-.024.266-.062.596l-.146.438a.4.4 0 0 0-.018.108c-.006.475-.054.649-.115.87a4.8 4.8 0 0 0-.18 1.057c-.11 1.414-.878 2.227-2.417 2.556c-1.515.325-1.784-.496-2.02-1.221a7 7 0 0 0-.078-.227c-.215-.586-.19-1.412-.157-2.555c.016-.561-.025-1.901-.33-2.646q.006-.44.019-.892a.4.4 0 0 0-.016-.113a2 2 0 0 0-.044-.208c-.122-.428-.42-.786-.78-.935c-.142-.059-.403-.167-.717-.087c.067-.276.183-.587.309-.925l.053-.142c.06-.16.134-.325.213-.5c.426-.948 1.01-2.246.376-5.178c-.237-1.098-1.03-1.634-2.232-1.51c-.72.075-1.38.366-1.709.532a6 6 0 0 0-.196.104c.092-1.106.439-3.174 1.736-4.482a4 4 0 0 1 .303-.276a.35.35 0 0 0 .145-.064c.752-.57 1.695-.85 2.802-.833q.616.01 1.174.081c1.94.355 3.244 1.447 4.036 2.383c.814.962 1.255 1.931 1.431 2.454c-1.323-.134-2.223.127-2.68.78c-.992 1.418.544 4.172 1.282 5.496c.135.242.252.452.289.54c.24.583.551.972.778 1.256c.07.087.138.171.189.245c-.4.116-1.12.383-1.055 1.717a35 35 0 0 1-.084.815c-.046.208-.07.46-.1.766m.89-1.621c-.04-.832.27-.919.597-1.01l.135-.
75041a1 1 0 0 0 .134.103c.57.376 1.583.421 3.007.134c-.202.177-.519.4-.953.601c-.41.19-1.096.333-1.747.364c-.72.034-1.086-.08-1.173-.151m.57-9.271a7 7 0 0 1-.105 1.001c-.055.358-.112.728-.127 1.177c-.014.436.04.89.093 1.33c.107.887.216 1.8-.207 2.701a4 4 0 0 1-.188-.385a8 8 0 0 0-.325-.617c-.616-1.104-2.057-3.69-1.32-4.744c.38-.543 1.342-.566 2.179-.463m.228 7.013l-.085-.107l-.035-.044c.726-1.2.584-2.387.457-3.439c-.052-.432-.1-.84-.088-1.222c.013-.407.066-.755.118-1.092c.064-.415.13-.844.111-1.35a.6.6 0 0 0 .012-.19c-.046-.486-.6-1.938-1.73-3.253a7.8 7.8 0 0 0-2.688-2.04A9.3 9.3 0 0 1 17.62.746c2.052.046 3.675.814 4.824 2.283a1 1 0 0 1 .067.1c.723 1.356-.276 6.275-2.987 10.54m-8.816-6.116c-.025.18-.31.423-.621.423l-.081-.006a.8.8 0 0 1-.506-.315c-.046-.06-.12-.178-.106-.285a.22.22 0 0 1 .093-.149c.118-.089.352-.122.61-.086c.316.044.642.193.61.418m7.93-.411c.011.08-.049.2-.153.31a.72.72 0 0 1-.408.223l-.075.005c-.293 0-.541-.234-.56-.371c-.024-.177.264-.31.56-.352c.298-.042.612.009.636.185"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#amqpmessagequeue" aria-label="RabbitMQ" title="RabbitMQ" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M23.035 9.601h-7.677a.956.956 0 0 1-.962-.962V.962a.956.956 0 0 0-.962-.956H10.56a.956.956 0 0 0-.962.956V8.64a.956.956 0 0 1-.962.962H5.762a.956.956 0 0 1-.961-.962V.962A.956.956 0 0 0 3.839 0H.959a.956.956 0 0 0-.956.962v22.076A.956.956 0 0 0 .965 24h22.07a.956.956 0 0 0 .962-.962V10.58a.956.956 0 0 0-.962-.98zm-3.86 8.152a1.437 1.437 0 0 1-1.437 1.443h-1.924a1.437 1.437 0 0 1-1.436-1.443v-1.917a1.437 1.437 0 0 1 1.436-1.443h1.924a1.437 1.437 0 0 1 1.437 1.443z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#mysqlmessagequeue" aria-label="MySQL" title="MySQL" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M16.405 5.501c-.115 0-.193.014-.274.033v.013h.014c.054.104.146.18.214.273c.054.107.1.214.154.32l.014-.015c.094-.066.14-.172.14-.333c-.04-.047-.046-.094-.08-.14c-.04-.067-.126-.1-.18-.153zM5.77 18.695h-.927a51 51 0 0 0-.27-4.41h-.008l-1.41 4.41H2.45l-1.4-4.41h-.01a73 73 0 0 0-.195 4.41H0q.083-2.95.41-5.53h1.15l1.335 4.064h.008l1.347-4.064h1.095q.363 3.024.428 5.53zm4.017-4.08q-.567 3.069-1.492 4.46q-.723 1.074-1.583 1.073q-.228 0-.566-.138v-.494q.166.026.386.026q.402 0 .647-.222q.295-.27.295-.605q0-.233-.23-.944L6.23 14.615h.91l.727 2.36q.247.804.205 1.123q.6-1.598.835-3.483zm12.325 4.08h-2.63v-5.53h.885v4.85h1.745zm-3.32.135l-1.016-.5q.136-.113.255-.25q.649-.76.648-2.253q0-2.745-2.155-2.746q-1.056 0-1.65.697q-.646.762-.646 2.245q-.001 1.459.574 2.14q.524.615 1.583.615q.396 0 .725-.098l1.325.772l.36-.622zM15.5 17.588q-.337-.541-.337-1.736q0-2.09 1.27-2.09q.666 0 .977.5q.336.543.336 1.723q0 2.107-1.27 2.108q-.667 0-.978-.5zm-1.658-.425q0 .706-.516 1.156q-.514.45-1.384.45c-.543 0-1.064-.172-1.573-.515l.237-.476q.656.329 1.19.328q.498 0 .783-.22a.75.75 0 0 0 .3-.615c0-.33-.23-.61-.648-.845c-.388-.213-1.163-.657-1.163-.657c-.422-.307-.632-.636-.632-1.177q0-.674.47-1.085q.471-.416 1.22-.415q.769 0 1.4.41l-.213.476a2.7 2.7 0 0 0-1.064-.23q-.425 0-.654.206a.69.69 0 0 0-.248.524c0 .328.234.61.666.85c.393.215 1.187.67 1.187.67c.433.305.648.63.648 1.168zm9.382-5.852c-.535-.014-.95.04-1.297.188c-.1.04-.26.04-.274.167c.055.053.063.14.11.214c.08.134.218.313.346.407q.208.167.427.31c.26.16.555.255.81.416c.145.094.293.213.44.313c.073.05.12.14.214.172v-.02c-.046-.06-.06-.147-.105-.214c-.067-.067-.134-.127-.2-.193a3.2 3.2 0 0 0-.695-.675c-.214-.146-.682-.35-.77-.595l-.013-.014c.146-.013.32-.066.46-.106c.227-.06.435-.047.67-.106q.16-.042.32-.094v-.06c-.12-.12-.21-.283-.334-.395a9 9 0 0 0-1.104-.823c-.21-.134-.476-.22-.697-.334c-.08-.04-.214-.06-.26-.127c-.12-.146-.19-.34-.275-.514a18 18 0 0 1-.547-1.163c-.12-.262-.193-.523-.34-.763c-.69-1.137-1.437-1.826-2.586-2.5c-.247-.14-.543-.2-.856-.274c-.167-.008-.334-.02-.5-.027c-.11-.047-.216-.174-.31-.235c-.38-.24-1.364-.76-1.644-.072c-.18.434.267.862.422 1.082c.115.153.26.328.34.5c.047.116.06.235.107.356c.106.294.207.622.347.897c.073.14.153.287.247.413c.054.073.146.107.167.227c-.094.136-.1.334-.154.5c-.24.757-.146 1.693.194 2.25c.107.166.362.534.703.393c.3-.12.234-.5.32-.835c.02-.08.007-.133.048-.187v.015c.094.188.188.367.274.555c.206.328.566.668.867.895c.16.12.287.328.487.402v-.02h-.015c-.043-.058-.1-.086-.154-.133a3.5 3.5 0 0 1-.35-.4a9 9 0 0 1-.747-1.218c-.11-.21-.202-.436-.29-.643c-.04-.08-.04-.2-.107-.24c-.1.146-.247.273-.32.453c-.127.288-.14.642-.188 1.01c-.027.007-.014 0-.027.014c-.214-.052-.287-.274-.367-.46c-.2-.475-.233-1.238-.06-1.785c.047-.14.247-.582.167-.716c-.042-.127-.174-.2-.247-.303a2.5 2.5 0 0 1-.24-.427c-.16-.374-.24-.788-.414-1.162c-.08-.173-.22-.354-.334-.513c-.127-.18-.267-.307-.368-.52c-.033-.073-.08-.194-.027-.274c.014-.054.042-.075.094-.09c.088-.072.335.022.422.062c.247.1.455.194.662.334c.094.066.195.193.315.226h.14c.214.047.455.014.655.073c.355.114.675.28.962.46a5.95 5.95 0 0 1 2.085 2.286c.08.154.115.295.188.455c.14.33.313.663.455.982c.14.315.275.636.476.897c.1.14.502.213.682.286c.133.06.34.115.46.188c.23.14.454.3.67.454c.11.076.443.243.463.378"/>
75</svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#mysqlmessagequeue" aria-label="MariaDB" title="MariaDB" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M23.157 4.412c-.676.284-.79.31-1.673.372c-.65.045-.757.057-1.212.209c-.75.246-1.395.75-2.02 1.59c-.296.398-1.249 1.913-1.249 1.988c0 .057-.65.998-.915 1.32c-.574.713-1.08 1.079-2.14 1.59c-.77.36-1.224.524-4.102 1.477c-1.073.353-2.133.738-2.367.864c-.852.449-1.515 1.036-2.203 1.938c-1.003 1.32-.972 1.313-3.042.947a12 12 0 0 0-.675-.063c-.644-.05-1.023.044-1.332.334L0 17.193l.177.088c.094.05.353.234.561.398c.215.17.461.347.55.391c.088.044.17.088.183.101s-.089.17-.228.353c-.435.581-.593.871-.574 1.048c.019.164.032.17.43.17c.517-.006.826-.056 1.261-.208c.65-.233 2.058-.94 2.784-1.4c.776-.5 1.717-.998 1.956-1.042c.082-.02.354-.07.594-.114c.58-.107 1.464-.095 2.587.05c.108.013.373.045.6.064c.227.025.43.057.454.076c.026.012.474.037.998.056c.934.026 1.104.007 1.3-.189c.126-.133.385-.631.498-.985c.209-.643.417-.921.366-.492c-.113.966-.322 1.692-.713 2.411c-.259.499-.663 1.092-.934 1.395c-.322.347-.315.36.088.315c.619-.063 1.471-.397 2.096-.82c.827-.562 1.647-1.691 2.19-3.03c.107-.27.22-.22.183.083c-.013.094-.038.315-.057.498l-.031.328l.353-.202c.833-.48 1.414-1.262 2.127-2.884c.227-.518.877-2.922 1.073-3.976a10 10 0 0 1 .271-1.042c.127-.429.196-.555.48-.858c.183-.19.625-.555.978-.808c.72-.505.953-.75 1.187-1.205c.208-.417.284-1.13.132-1.357c-.132-.202-.284-.196-.763.006"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#sqlitemessagequeue" aria-label="SQLite" title="SQLite" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M21.678.521c-1.032-.92-2.28-.55-3.513.544a9 9 0 0 0-.547.535c-2.109 2.237-4.066 6.38-4.674 9.544c.237.48.422 1.093.544 1.561a13 13 0 0 1 .164.703s-.019-.071-.096-.296l-.05-.146l-.033-.08c-.138-.32-.518-.995-.686-1.289c-.143.423-.27.818-.376 1.176c.484.884.778 2.4.778 2.4s-.025-.099-.147-.442c-.107-.303-.644-1.244-.772-1.464c-.217.804-.304 1.346-.226 1.478c.152.256.296.698.422 1.186c.286 1.1.485 2.44.485 2.44l.017.224a22 22 0 0 0 .056 2.748c.095 1.146.273 2.13.5 2.657l.155-.084c-.334-1.038-.47-2.399-.41-3.967c.09-2.398.642-5.29 1.661-8.304c1.723-4.55 4.113-8.201 6.3-9.945c-1.993 1.8-4.692 7.63-5.5 9.788c-.904 2.416-1.545 4.684-1.931 6.857c.666-2.037 2.821-2.912 2.821-2.912s1.057-1.304 2.292-3.166c-.74.169-1.955.458-2.362.629c-.6.251-.762.337-.762.337s1.945-1.184 3.613-1.72C21.695 7.9 24.195 2.767 21.678.521m-18.573.543A1.84 1.84 0 0 0 1.27 2.9v16.608a1.84 1.84 0 0 0 1.835 1.834h9.418a23 23 0 0 1-.052-2.707c-.006-.062-.011-.141-.016-.2a27 27 0 0 0-.473-2.378c-.121-.47-.275-.898-.369-1.057c-.116-.197-.098-.31-.097-.432c0-.12.015-.245.037-.386a10 10 0 0 1 .234-1.045l.217-.028c-.017-.035-.014-.065-.031-.097l-.041-.381a33 33 0 0 1 .382-1.194l.2-.019c-.008-.016-.01-.038-.018-.053l-.043-.316c.63-3.28 2.587-7.443 4.8-9.791c.066-.069.133-.128.198-.194Z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#denokvmessagequeue-deno-only" aria-label="Deno KV" title="Deno KV" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M1.105 18.02A11.9 11.9 0 0 1 0 12.985q0-.698.078-1.376a12 12 0 0 1 .231-1.34A12 12 0 0 1 4.025 4.02a12 12 0 0 1 5.46-2.771a12 12 0 0 1 3.428-.23c1.452.112 2.825.477 4.077 1.05a12 12 0 0 1 2.78 1.774a12.02 12.02 0 0 1 4.053 7.078A12 12 0 0 1 24 12.985q0 .454-.036.914a12 12 0 0 1-.728 3.305a12 12 0 0 1-2.38 3.875c-1.33 1.357-3.02 1.962-4.43 1.936a4.4 4.4 0 0 1-2.724-1.024c-.99-.853-1.391-1.83-1.53-2.919a5 5 0 0 1 .128-1.518c.105-.38.37-1.116.76-1.437c-.455-.197-1.04-.624-1.226-.829c-.045-.05-.04-.13 0-.183a.155.155 0 0 1 .177-.053c.392.134.869.267 1.372.35c.66.111 1.484.25 2.317.292c2.03.1 4.153-.813 4.812-2.627s.403-3.609-1.96-4.685s-3.454-2.356-5.363-3.128c-1.247-.505-2.636-.205-4.06.582c-3.838 2.121-7.277 8.822-5.69 15.032a.191.191 0 0 1-.315.19a12 12 0 0 1-1.25-1.634a12 12 0 0 1-.769-1.404M11.57 6.087c.649-.051 1.214.501 1.31 1.236c.13.979-.228 1.99-1.41 2.013c-1.01.02-1.315-.997-1.248-1.614c.066-.616.574-1.575 1.35-1.635"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/mq#workersmessagequeue-cloudflare-workers-only" aria-label="Cloudflare Queues" title="Cloudflare Queues" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true">
75<path fill="currentColor" d="m8.213.063l8.879 12.136l-8.67 11.739h2.476l8.665-11.735l-8.89-12.14Zm4.728 0l9.02 11.992l-9.018 11.883h2.496L24 12.656v-1.199L15.434.063ZM7.178 2.02L.01 11.398l-.01 1.2l7.203 9.644l1.238-1.676l-6.396-8.556l6.361-8.313Z"/></svg></span></a></li><!--]--><li class="lp-logo-more" data-v-39328e90>and more</li></ul></div></section><section class="lp-section lp-section-alt" data-v-39328e90><div class="wrap" data-v-39328e90><div class="lp-section-head" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Works with your stack</p><h2 class="lp-h2" data-v-39328e90>Drops into the web framework you already use</h2><p class="lp-body" data-v-39328e90> Fedify doesn't take over your app. It runs as middleware on the domain and port you already have, using content negotiation to pick out federation traffic and leaving the rest of your routes alone. First-party packages cover the frameworks below, and <code data-v-39328e90>fedify init</code> scaffolds a project for you. </p></div><ul class="lp-logos lp-frameworks" data-v-39328e90><!--[--><li data-v-39328e90><a class="lp-logo" href="/manual/integration#express" aria-label="Express" title="Express" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M24 18.588a1.53 1.53 0 0 1-1.895-.72l-3.45-4.771l-.5-.667l-4.003 5.444a1.466 1.466 0 0 1-1.802.708l5.158-6.92l-4.798-6.251a1.595 1.595 0 0 1 1.9.666l3.576 4.83l3.596-4.81a1.435 1.435 0 0 1 1.788-.668L21.708 7.9l-2.522 3.283a.666.666 0 0 0 0 .994l4.804 6.412zM.002 11.576l.42-2.075c1.154-4.103 5.858-5.81 9.094-3.27c1.895 1.489 2.368 3.597 2.275 5.973H1.116C.943 16.447 4.005 19.009 7.92 17.7a4.08 4.08 0 0 0 2.582-2.876c.207-.666.548-.78 1.174-.588a5.42 5.42 0 0 1-2.589 3.957a6.27 6.27 0 0 1-7.306-.933a6.58 6.58 0 0 1-1.64-3.858c0-.235-.08-.455-.134-.666A88 88 0 0 1 0 11.577zm1.127-.286h9.654c-.06-3.076-2.001-5.258-4.59-5.278c-2.882-.04-4.944 2.094-5.071 5.264z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#fastify" aria-label="Fastify" title="Fastify" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M23.245 6.49L24 4.533l-.031-.121l-7.473 1.967c.797-1.153.523-2.078.523-2.078s-2.387 1.524-4.193 1.485c-1.804-.04-2.387-.52-5.155.362S4.12 9.738 3.32 10.321C2.516 10.904 0 12.798 0 12.798l.006.034l2.27-.724s-.622.585-1.945 2.37l-.062-.057l.002.011s1.064 1.626 2.107 1.324a2 2 0 0 0 .353-.147c.419.234.967.463 1.572.525c0 0-.41-.475-.752-1.017l.238-.154l.865.318l-.096-.812l.008-.006l.849.311l-.105-.738a6 6 0 0 1 .322-.158l.885-3.345l3.662-2.497l-.291.733c-.741 1.826-2.135 2.256-2.135 2.256l-.582.22c-.433.512-.614.637-.764 2.353c.348-.088.682-.107.984-.028c1.564.421 2.107 2.307 1.685 2.827c-.104.13-.356.354-.673.617H7.77l-.008.514l-.065.051h-.645l-.009.504l-.17.127c-.607.011-1.373-.518-1.373-.518c0 .481.401 1.225.401 1.225l.07-.034l-.061.045s1.625 1.083 2.646.681c.91-.356 3.263-2.213 5.296-3.093l6.15-1.62l.811-2.1l-4.688 1.235v-1.889l5.5-1.448l.811-2.1l-6.31 1.662V8.367zm-11.163 4l1.459-.384l.02.074l-.455 1.179l-1.513.398zm.503 2.526l-1.512.398l.489-1.266l1.459-.385l.02.074zm1.971-.424l-1.513.398l.49-1.266l1.459-.385l.02.073Z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#koa" aria-label="Koa" title="Koa" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M0 5.587v12.757h1.19v-4.099l.46-.527l3.147 4.626h1.19L2.33 12.97l2.773-3.13h-.17L1.19 14.058v-8.47zm11.039 4.185q-1.785 0-2.96 1.173q-1.155 1.175-1.156 3.3q0 2.127 1.122 3.147t2.909 1.02q1.803 0 2.96-1.173q1.173-1.174 1.173-3.3t-1.122-3.147t-2.926-1.02m8.896 0a7.3 7.3 0 0 0-3.079.697l.068.12q.392-.222 1.225-.443q.85-.238 1.48-.238t1.02.17q.39.153.545.374q.152.221.238.46q.102.22.068.374c.007.97 0 1.988 0 2.976a9 9 0 0 0-.834-.034q-.459 0-1.003.051q-2.195.136-2.841.749q-.323.306-.391.561q-.069.255-.068.476q0 .204.034.409q.289 1.939 2.432 1.939q1.838 0 2.67-1.514v.357q0 .272.392.646q.424.443 1.582.443H24v-.136h-.527l-.187-.034q-.204-.018-.409-.273q-.186-.271-.187-.765v-5.698q0-.544-.442-1.038c-.498-.557-1.564-.624-2.313-.63zm-8.862.136q1.292 0 2.075.986q.783.987.783 3.045q0 2.04-.85 3.198q-.852 1.14-2.144 1.14t-2.075-.987t-.783-3.028q0-2.058.85-3.198q.851-1.155 2.144-1.156m9.491 4.456q.477 0 .936.034v2.058q-.051.58-.783 1.208a2.42 2.42 0 0 1-1.616.613q-1.36 0-1.513-1.803a3 3 0 0 1-.02-.307q0-.748.392-1.173q.39-.426 1.684-.579c.314-.038.64-.039.92-.05z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#hono" aria-label="Hono" title="Hono" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true">
75<path fill="currentColor" d="M12.445.002a45.5 45.5 0 0 0-5.252 8.146a9 9 0 0 1-.555-.53a28 28 0 0 0-1.205-1.542a8.8 8.8 0 0 0-1.251 2.12a20.7 20.7 0 0 0-1.448 5.88a8.9 8.9 0 0 0 .338 3.468q1.968 5.22 7.445 6.337q4.583.657 8.097-2.312q4.015-3.885 2.047-9.132a33.3 33.3 0 0 0-2.988-5.59A91 91 0 0 0 12.615.053a.22.22 0 0 0-.17-.051m-.336 3.906a51 51 0 0 1 4.794 6.552q.672 1.15 1.108 2.41q.91 3.579-1.951 5.904q-2.768 1.947-6.072 1.156q-3.564-1.105-4.121-4.794a5.1 5.1 0 0 1 .242-2.266q.536-1.361 1.3-2.601l1.446-2.121a397 397 0 0 0 3.254-4.24"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#h3" aria-label="h3" title="h3" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M8.236 6.105c-.099-.045-.256-.084-.373-.173c-.485-.375-.96-.768-1.442-1.148c-.172-.135-.195-.279-.089-.468c.31-.558.594-1.133.924-1.677a1 1 0 0 1 .503-.395a39 39 0 0 1 2.4-.712a.97.97 0 0 1 .63.084c.523.269 1.024.582 1.532.883c.265.157.291.233.182.522c-.216.566-.44 1.127-.647 1.697a.87.87 0 0 1-.609.557c-.88.26-1.76.512-2.641.765c-.101.026-.207.036-.37.065m-6.106 4.93c-.132-.084-.295-.144-.392-.259c-.424-.5-.828-1.017-1.245-1.524c-.139-.167-.123-.34-.026-.501c.464-.754.922-1.51 1.415-2.246c.113-.168.337-.298.537-.363c.817-.263 1.645-.494 2.472-.735c.258-.076.49-.048.708.143c.441.39.894.77 1.351 1.145c.192.155.228.328.127.542c-.373.783-.727 1.577-1.133 2.344a1.1 1.1 0 0 1-.575.497c-1.012.325-2.04.602-3.063.893c-.046.014-.098.012-.146.017zm14.928-9.188c.162.046.337.072.487.144q1.074.515 2.137 1.049c.268.133.41.282.33.644c-.137.614-.231 1.239-.328 1.861c-.048.307-.216.497-.496.579q-1.578.461-3.16.901c-.282.079-.552.009-.795-.152L13.17 5.496c-.197-.132-.265-.296-.18-.527c.228-.623.433-1.252.68-1.866a.7.7 0 0 1 .387-.375c.926-.297 1.863-.564 2.797-.838c.062-.019.13-.012.195-.017q.006-.013.009-.026M9.653 12.65c-.2-.11-.435-.185-.596-.337c-.609-.573-1.192-1.176-1.792-1.757c-.217-.212-.267-.438-.144-.71c.36-.79.7-1.59 1.088-2.366a.98.98 0 0 1 .523-.445c.943-.306 1.898-.573 2.85-.841a.86.86 0 0 1 .753.125l1.995 1.396c.313.219.37.384.266.757c-.232.828-.472 1.654-.7 2.482a.93.93 0 0 1-.677.681a366 366 0 0 1-3.236.915c-.094.026-.193.028-.29.041zM0 16.098c.09-.23.152-.45.258-.647c.49-.917.992-1.827 1.489-2.74c.184-.342.458-.57.832-.676q1.418-.402 2.837-.807c.357-.103.643-.027.905.258a67 67 0 0 0 1.673 1.735c.268.27.336.568.201.918c-.429 1.116-.855 2.231-1.288 3.343c-.166.426-.48.688-.923.807c-1.105.301-2.209.61-3.314.914c-.537.149-.756.063-1.05-.404c-.462-.734-.929-1.468-1.386-2.205c-.09-.15-.15-.318-.234-.496m23.986-6.187c-.
75057.95-.106 1.87-.166 2.785c-.036.533-.207.735-.727.879c-1.184.328-2.37.648-3.553.978c-.464.129-.874.04-1.244-.258c-.894-.718-1.786-1.44-2.684-2.155c-.33-.264-.455-.57-.337-.992c.23-.82.437-1.646.645-2.472c.086-.337.298-.54.62-.635c1.007-.292 2.016-.578 3.024-.867a1.3 1.3 0 0 1 1.043.128l2.866 1.671c.37.22.586.519.513.938M8.16 18.325c.092-.298.156-.534.238-.765c.347-.97.713-1.934 1.049-2.91c.17-.495.484-.783.99-.918c1.021-.268 2.034-.564 3.05-.853c.428-.122.797-.048 1.143.248c.858.735 1.725 1.46 2.596 2.184c.4.334.57.727.469 1.256c-.245 1.286-.46 2.58-.693 3.869c-.089.49-.38.807-.862.937c-1.343.361-2.687.724-4.034 1.075c-.487.126-.882-.045-1.195-.433q-.858-1.06-1.721-2.12c-.243-.299-.506-.585-.722-.901c-.142-.21-.216-.464-.308-.669"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#nuxt" aria-label="Nuxt" title="Nuxt" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M13.464 19.83h8.922c.283 0 .562-.073.807-.21a1.6 1.6 0 0 0 .591-.574a1.53 1.53 0 0 0 .216-.783a1.53 1.53 0 0 0-.217-.782L17.792 7.414a1.6 1.6 0 0 0-.591-.573a1.65 1.65 0 0 0-.807-.21c-.283 0-.562.073-.807.21a1.6 1.6 0 0 0-.59.573L13.463 9.99L10.47 4.953a1.6 1.6 0 0 0-.591-.573a1.65 1.65 0 0 0-.807-.21c-.284 0-.562.073-.807.21a1.6 1.6 0 0 0-.591.573L.216 17.481a1.53 1.53 0 0 0-.217.782c0 .275.074.545.216.783a1.6 1.6 0 0 0 .59.574c.246.137.525.21.808.21h5.6c2.22 0 3.856-.946 4.982-2.79l2.733-4.593l1.464-2.457l4.395 7.382h-5.859Zm-6.341-2.46l-3.908-.002l5.858-9.842l2.923 4.921l-1.957 3.29c-.748 1.196-1.597 1.632-2.916 1.632"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#sveltekit" aria-label="SvelteKit" title="SvelteKit" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M10.354 21.125a4.44 4.44 0 0 1-4.765-1.767a4.1 4.1 0 0 1-.703-3.107a4 4 0 0 1 .134-.522l.105-.321l.287.21a7.2 7.2 0 0 0 2.186 1.092l.208.063l-.02.208a1.25 1.25 0 0 0 .226.83a1.34 1.34 0 0 0 1.435.533a1.2 1.2 0 0 0 .343-.15l5.59-3.562a1.16 1.16 0 0 0 .524-.778a1.24 1.24 0 0 0-.211-.937a1.34 1.34 0 0 0-1.435-.533a1.2 1.2 0 0 0-.343.15l-2.133 1.36a4 4 0 0 1-1.135.499a4.44 4.44 0 0 1-4.765-1.766a4.1 4.1 0 0 1-.702-3.108a3.86 3.86 0 0 1 1.742-2.582l5.589-3.563a4 4 0 0 1 1.135-.499a4.44 4.44 0 0 1 4.765 1.767a4.1 4.1 0 0 1 .703 3.107a4 4 0 0 1-.134.522l-.105.321l-.286-.21a7.2 7.2 0 0 0-2.187-1.093l-.208-.063l.02-.207a1.25 1.25 0 0 0-.226-.831a1.34 1.34 0 0 0-1.435-.532a1.2 1.2 0 0 0-.343.15L8.62 9.368a1.16 1.16 0 0 0-.524.778a1.24 1.24 0 0 0 .211.937a1.34 1.34 0 0 0 1.435.533a1.2 1.2 0 0 0 .344-.151l2.132-1.36a4 4 0 0 1 1.135-.498a4.44 4.44 0 0 1 4.765 1.766a4.1 4.1 0 0 1 .702 3.108a3.86 3.86 0 0 1-1.742 2.583l-5.589 3.562a4 4 0 0 1-1.135.499m10.358-17.95C18.484-.015 14.082-.96 10.9 1.068L5.31 4.63a6.4 6.4 0 0 0-2.896 4.295a6.75 6.75 0 0 0 .666 4.336a6.4 6.4 0 0 0-.96 2.396a6.83 6.83 0 0 0 1.168 5.167c2.229 3.19 6.63 4.135 9.812 2.108l5.59-3.562a6.4 6.4 0 0 0 2.896-4.295a6.76 6.76 0 0 0-.665-4.336a6.4 6.4 0 0 0 .958-2.396a6.83 6.83 0 0 0-1.167-5.168"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#nestjs" aria-label="NestJS" title="NestJS" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M14.131.047c-.173 0-.334.037-.483.087c.316.21.49.49.576.806c.007.043.019.074.025.117a1 1 0 0 1 .013.112c.024.545-.143.614-.26.936c-.18.415-.13.861.086 1.22a.7.7 0 0 0 .074.137c-.235-1.568 1.073-1.803 1.314-2.293c.019-.428-.334-.713-.613-.911a1.37 1.37 0 0 0-.732-.21zM16.102.4c-.024.143-.006.106-.012.18c-.006.05-.006.112-.012.161c-.013.05-.025.1-.044.149q-.019.075-.05.149l-.067.142c-.02.025-.031.05-.05.075l-.037.055a2 2 0 0 1-.093.124c-.037.038-.068.081-.112.112v.006c-.037.031-.074.068-.118.1c-.13.099-.278.173-.415.266c-.043.03-.087.056-.124.093a1 1 0 0 0-.118.099c-.043.037-.074.074-.111.118c-.031.037-.068.08-.093.124a2 2 0 0 0-.087.13c-.025.05-.043.093-.068.142c-.019.05-.037.093-.05.143a2 2 0 0 0-.043.155c-.006.025-.006.056-.012.08c-.007.025-.007.05-.013.075c0 .05-.006.105-.006.155q-.002.055.006.111q0 .074.019.155q.01.075.03.15c.02.049.032.098.05.148c.013.03.031.062.044.087l-1.426-.552c-.241-.068-.477-.13-.719-.186l-.39-.093q-.56-.111-1.128-.167c-.013 0-.019-.006-.031-.006A11 11 0 0 0 8.9 2.855c-.378.025-.756.074-1.
75134.136a13 13 0 0 0-.837.174l-.279.074c-.092.037-.18.08-.266.118l-.205.093c-.012.006-.024.006-.03.012c-.063.031-.118.056-.174.087a3 3 0 0 0-.236.118c-.043.018-.086.043-.124.062l-.055.03q-.085.048-.162.094a2 2 0 0 0-.148.093c-.044.03-.087.055-.124.086c-.006.007-.013.007-.019.013c-.037.025-.08.056-.118.087l-.012.012l-.093.074c-.012.007-.025.019-.037.025c-.031.025-.062.056-.093.08c-.006.013-.019.02-.025.025c-.037.038-.074.069-.111.106c-.007 0-.007.006-.013.012a2 2 0 0 0-.111.106c-.007.006-.007.012-.013.012a2 2 0 0 0-.093.1c-.012.012-.03.024-.043.036a1 1 0 0 1-.106.112c-.006.012-.018.019-.024.03c-.05.05-.093.1-.143.15l-.018.018c-.1.106-.205.211-.317.304q-.168.15-.347.273a3.8 3.8 0 0 1-.762.421c-.13.056-.267.106-.403.149c-.26.056-.527.161-.756.18c-.05 0-.105.012-.155.018l-.155.037l-.149.056q-.075.03-.148.068c-.044.031-.093.056-.137.087a1 1 0 0 0-.124.106c-.043.03-.087.074-.124.111c-.037.043-.074.08-.105.124c-.031.05-.068.093-.093.143a1 1 0 0 0-.087.142c-.025.056-.05.106-.068.161q-.028.077-.056.161c-.012.05-.025.1-.03.15c0 .005-.007.012-.007.018c-.012.056-.012.13-.019.167C.006 7.95 0 7.986 0 8.03a.66.66 0 0 0 .074.31v.006q.03.056.069.112q.035.056.08.111c.031.031.068.069.106.1a1 1 0 0 0 .117.099c.149.13.186.173.378.272c.031.019.062.031.1.05c.006 0 .012.006.018.006c0 .013 0 .019.006.031a1.3 1.3 0 0 0 .08.298c.02.037.032.074.05.111q.01.02.02.031c.024.05.049.093.073.137l.093.13c.031.037.069.08.106.118s.074.068.118.105c0 0 .006.006.012.006q.055.048.112.087a1 1 0 0 0 .136.08c.043.025.093.05.142.069a1 1 0 0 0 .124.043c.007.006.013.006.025.012c.025.007.056.013.08.019c-.018.335-.024.65.026.762c.055.124.328-.254.6-.688c-.036.428-.061.93 0 1.079c.069.155.44-.329.763-.862c4.395-1.016 8.405 2.02 8.826 6.31c-.08-.67-.905-1.041-1.283-.948c-.186.458-.502 1.047-1.01 1.413c.043-.41.025-.83-.062-1.24a4 4 0 0 1-.769 1.562c-.588.043-1.177-.242-1.487-.67c-.025-.018-.031-.055-.05-.08q-.029-.065-.05-.13a.5.5 0 0 1-.037-.13q-.008-.064-.006-.137v-.093a1 1 0 0 1 .031-.13q.017-.064.044-.13c.024-.043.043-.087.074-.13c.105-.298.105-.54-.087-.682a1 1 0 0 0-.118-.062c-.024-.006-.055-.018-.08-.025l-.05-.018a1 1 0 0 0-.13-.031a.5.5 0 0 0-.13-.019a1 1 0 0 0-.136-.012c-.031 0-.062.006-.093.006a.5.5 0 0 0-.137.019q-.064.008-.13.024a1 1 0 0 0-.13.044c-.043.018-.08.037-.124.056c-.037.018-.074.043-.118.062c-1.444.942-.582 3.148.403 3.787c-.372.068-.75.148-.855.229l-.013.012q.4.24.837.416c.397.13.818.247 1.004.297v.006a6 6 0 0 0 1.562.112c2.746-.192 4.996-2.28
751 5.405-5.033l.037.161c.019.112.043.23.056.347v.006q.016.085.025.162v.024q.01.085.012.162q.01.102.012.204v.1c0 .03.007.067.007.098c0 .038-.007.075-.007.112v.087c0 .043-.006.08-.006.124q.002.036-.006.08c0 .044-.006.087-.006.137q-.007.027-.006.055l-.02.143q.001.028-.005.056c-.007.062-.019.118-.025.18v.012l-.037.174v.018l-.037.167c0 .007-.007.02-.007.025a2 2 0 0 1-.043.168v.018q-.03.091-.05.174q-.008.01-.006.012l-.056.186c-.024.062-.043.118-.068.18s-.043.124-.068.18c-.025.062-.05.117-.074.18h-.007c-.024.055-.05.117-.08.173l-.019.043c-.006.006-.006.013-.012.019a5.9 5.9 0 0 1-1.742 2.082c-.05.031-.099.069-.149.106c-.012.012-.03.018-.043.03a3 3 0 0 1-.136.094l.018.037h.007l.26-.037h.006q.241-.039.483-.087c.044-.006.093-.019.137-.031l.087-.019c.043-.006.086-.018.13-.024c.037-.013.074-.02.111-.031c.62-.15 1.221-.354 1.798-.595a9.9 9.9 0 0 1-3.85 3.142c.714-.05 1.426-.167 2.114-.366a9.9 9.9 0 0 0 5.857-4.68a9.9 9.9 0 0 1-1.667 3.986a9.8 9.8 0 0 0 1.655-1.376a9.8 9.8 0 0 0 2.61-5.268c.21.98.272 1.99.18 2.987c4.474-6.241.371-12.712-1.346-14.416c-.006-.013-.012-.019-.012-.031c-.006.006-.006.006-.006.012c0-.006 0-.006-.007-.012q-.002.11-.012.223a8 8 0 0 1-.062.415c-.03.136-.068.273-.105.41c-.044.13-.093.266-.15.396a5 5 0 0 1-.185.378a5 5 0 0 1-.477.688c-.093.111-.192.21-.292.31a4 4 0 0 1-.18.155l-.142.124a4 4 0 0 1-.347.241a4 4 0 0 1-.366.211q-.195.091-.39.174a4.4 4.4 0 0 1-.818.223c-.143.025-.285.037-.422.05a5 5 0 0 1-.297.012a5 5 0 0 1-.422-.025a3 3 0 0 1-.421-.062a3 3 0 0 1-.415-.105h-.007c.137-.013.273-.025.41-.05a4.5 4.5 0 0 0 .818-.223c.136-.05.266-.112.39-.174c.13-.062.248-.13.372-.204q.178-.119.347-.248q.168-.13.316-.279c.105-.093.198-.198.291-.304q.14-.167.26-.334c.013-.019.026-.044.038-.062q.095-.15.18-.298a4.3 4.3 0 0 0 .334-.775c.044-.13.075-.266.106-.403c.025-.142.05-.278.062-.415c.012-.142.025-.285.025-.421c0-.1-.007-.199-.013-.298a7 7 0 0 0-.05-.415a5 5 0 0 0-.092-.415c-.044-.13-.087-.267-.137-.397s-.111-.26-.173-.384q-.102-.187-.211-.366a7 7 0 0 0-.248-.34q-.138-.16-.285-.317a4 4 0 0 0-.161-.155q-.422-.327-.862-.607a1 1 0 0 0-.124-.062a2.4 2.4 0 0 0-.589-.26Z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#next-js" aria-label="Next.js" title="Next.js" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M18.665 21.978A11.94 11.94 0 0 1 12 24C5.377 24 0 18.623 0 12S5.377 0 12 0s12 5.377 12 12c0 3.583-1.574 6.801-4.067 9.001L9.219 7.2H7.2v9.596h1.615V9.251zm-3.332-8.533l1.6 2.061V7.2h-1.6z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#astro" aria-label="Astro" title="Astro" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M8.358 20.162c-1.186-1.07-1.532-3.316-1.038-4.944c.856 1.026 2.043 1.352 3.272 1.535c1.897.283 3.76.177 5.522-.678c.202-.098.388-.229.608-.36c.166.473.209.95.151 1.437c-.14 1.185-.738 2.1-1.688 2.794c-.38.277-.782.525-1.175.787c-1.205.804-1.531 1.747-1.078 3.119l.044.148a3.16 3.16 0 0 1-1.407-1.188a3.3 3.3 0 0 1-.544-1.815c-.004-.32-.004-.642-.048-.958c-.106-.769-.472-1.113-1.161-1.133c-.707-.02-1.267.411-1.415 1.09c-.012.053-.028.104-.045.165zm-5.961-4.445s3.24-1.575 6.49-1.575l2.451-7.565c.092-.366.36-.614.662-.614s.57.248.662.614l2.45 7.565c3.85 0 6.491 1.575 6.491 1.575L16.088.727C15.93.285 15.663 0 15.303 0H8.697c-.36 0-.615.285-.784.727z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#solidstart" aria-label="SolidStart" title="SolidStart" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M11.558.788A9 9 0 0 0 9.776.99l-.453.15c-.906.303-1.656.755-2.1 1.348l-.301.452l-2.035 3.528c.426-.387.974-.698 1.643-.894h.001l.613-.154h.001a9 9 0 0 1 1.777-.206c2.916-.053 6.033 1.148 8.423 2.36c2.317 1.175 3.888 2.32 3.987 2.39L24 5.518c-.082-.06-1.66-1.21-3.991-2.386c-2.393-1.206-5.521-2.396-8.45-2.343zM8.924 5.366a8.6 8.6 0 0 0-1.745.203l-.606.151c-1.278.376-2.095 1.16-2.43 2.108s-.188 2.065.487 3.116c.33.43.747.813 1.216 1.147L12.328 10h.001a6.94 6.94 0 0 1 6.013 1.013l2.844-.963c-.17-.124-1.663-1.2-3.91-2.34c-2.379-1.206-5.479-2.396-8.352-2.344m5.435 4.497a6.8 6.8 0 0 0-1.984.283L2.94 13.189L0 18.334l9.276-2.992a6.945 6.945 0 0 1 7.408 2.314v.001c.695.903.89 1.906.66 2.808l2.572-4.63c.595-1.041.45-2.225-.302-3.429a6.8 6.8 0 0 0-5.255-2.543m-3.031 5.341a6.8 6.8 0 0 0-2.006.283L.008 18.492c.175.131 2.02 1.498 4.687 2.768c2.797 1.332 6.37 2.467 9.468 1.712l.454-.152h.002c1.278-.376 2.134-1.162 2.487-2.09c.353-.93.207-2.004-.541-2.978a6.8 6.8 0 0 0-5.237-2.548"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" href="/manual/integration#fresh" aria-label="Fresh" title="Fresh" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true">
75<path fill="currentColor" d="M18.144 1.913c-.818-.017-1.704.078-2.626.264c-2.46.496-5.215 1.667-7.73 3.319c-2.877 1.89-5.037 4.094-6.346 6.056c-.656.981-1.1 1.9-1.309 2.708s-.192 1.536.187 2.067c.93 1.3 1.312 2.654 1.748 3.747c.218.547.449 1.034.809 1.409s.868.606 1.49.606c.368 0 .685-.08.937-.247s.422-.407.537-.665a3.3 3.3 0 0 0 .178-.544c3.863 1.74 7.955 1.54 10.295.732c1.096 1.247 3.982.724 3.258-1.81c2.963-2.534 6.465-7.13 2.963-15.678a5 5 0 0 0-.88-.74q-.062-.063-.13-.125h-.002c-.674-.587-1.56-.92-2.586-1.044q-.384-.047-.793-.055m-.031.732q.374.01.72.05c.92.112 1.68.398 2.216.863c.404.352.572.715.596 1.136s-.112.916-.407 1.463c-.59 1.091-1.797 2.349-3.265 3.559c-2.937 2.42-6.922 4.68-9.034 5.52c-2.462.98-3.108 2.701-3.389 4.043c-.078.383-.14.73-.204 1.027v.003a5 5 0 0 1-.07.291q-.044.16-.097.282a1 1 0 0 1-.125.215a.7.7 0 0 1-.15.14c-.112.076-.27.128-.537.128q-.173 0-.312-.024a1.04 1.04 0 0 1-.467-.192a1.5 1.5 0 0 1-.189-.167c-.244-.253-.452-.66-.659-1.176c-.105-.268-.213-.566-.33-.881a28 28 0 0 0-.292-.756c-.034-.082-.065-.163-.102-.247A10.4 10.4 0 0 0 .91 15.905a1 1 0 0 1-.07-.12a1 1 0 0 1-.064-.184l-.011-.05a1.5 1.5 0 0 1-.032-.231a2 2 0 0 1 .002-.26l.004-.073a3 3 0 0 1 .044-.311v-.002q.022-.112.053-.232c.18-.695.586-1.556 1.207-2.488C3.287 10.09 5.388 7.94 8.187 6.101c2.443-1.604 5.13-2.743 7.474-3.216a11.2 11.2 0 0 1 2.452-.24m-2.007.923c-1.601.254-5.374 1.608-8.391 3.636c-.679.456-.681.559-.291 1.118c-.583 0-1.008-.102-1.653.469c-3.576 3.162-4.71 6.603-2.183 6.603c1.167 0 3.236-.562 4.224-.932c.17-.064.676-1.383.676-1.685c0-.906.906.85 1.171.725c.954-.45 3.035-1.548 5.737-3.498c2.851-2.057 6.479-5.276 3.115-6.181c-.295-.08-1.516.1-1.813.2c0-.202-.327-.444-.592-.455m-5.45 3.507c.235.337 1.2.44 1.7
7576.507c-.517.327-.764.617-1.05 1.525c-1.06-.442-2.294-.22-3.18.304c.714-.541 1.19-.732 1.521-1.829c.41.087.608-.057.933-.507"/></svg></span></a></li><!--]--><li class="lp-logo-more" data-v-39328e90>and more</li></ul><div class="lp-byo" data-v-39328e90><div class="lp-byo-copy" data-v-39328e90><h3 class="lp-byo-title" data-v-39328e90>No official package? No problem.</h3><p class="lp-byo-text" data-v-39328e90> Fedify is built on the web-standard <a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" target="_blank" rel="noopener noreferrer" data-v-39328e90><code data-v-39328e90>Request</code></a> and <a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" target="_blank" rel="noopener noreferrer" data-v-39328e90><code data-v-39328e90>Response</code></a>, so dropping it into anything with middleware takes about a dozen lines. </p><a class="lp-textlink" href="/manual/integration#custom-middleware" data-v-39328e90> Custom middleware guide â </a></div><div class="lp-code-window lp-byo-window" data-v-39328e90><div class="lp-code-bar" aria-hidden="true" data-v-39328e90><span class="lp-code-file" data-v-39328e90>middleware.ts</span></div><pre class="lp-code" data-v-39328e90><code data-v-39328e90><span class="c-kw">import</span> { federation } <span class="c-kw">from</span> <span class="c-st">"./federation.ts"</span>; 76 77<span class="c-kw">export default</span> (request: <span class="c-ty">Request</span>, next) => 78 federation.<span class="c-fn">fetch</span>(request, { 79 contextData: <span class="c-kw">undefined</span>, 80 onNotFound: next, <span class="c-cm">// not a federation request</span> 81 onNotAcceptable: next, <span class="c-cm">// fall back to your HTML</span> 82 });</code></pre></div></div></div></section><section class="lp-section" data-v-39328e90><div class="wrap lp-narrow" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Your data, your schema</p><h2 class="lp-h2" data-v-39328e90>Fedify never owns your data model</h2><p class="lp-body" data-v-39328e90> Your actors, posts, and followers live in your own database, in whatever schema you already have. Fedify reads them through dispatcher callbacks you write, so the data model stays yours. For its own internal state, a cache and some federation bookkeeping, it relies on a pluggable <code data-v-39328e90>KvStore</code>: keep it in memory while you develop, or back it with Redis, PostgreSQL, MySQL, SQLite, Deno KV, or Cloudflare Workers KV. </p><a class="lp-textlink" href="/manual/kv" data-v-39328e90>Keyâvalue store guide â</a></div></section><section class="lp-section lp-section-alt" data-v-39328e90><div class="wrap lp-interop" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Plays well with others</p><h2 class="lp-h2" data-v-39328e90>Interoperates with the software people already use</h2><ul class="lp-logos" data-v-39328e90><!--[--><li data-v-39328e90><a class="lp-logo" style="" href="https://joinmastodon.org" target="_blank" rel="noopener noreferrer" aria-label="Mastodon" title="Mastodon" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127C.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611c.118 1.24.325 2.47.62 3.68c.55 2.237 2.777 4.098 4.96 4.857c2.336.792 4.849.923 7.256.38q.398-.092.786-.213c.585-.184 1.27-.39 1.774-.753a.06.06 0 0 0 .023-.043v-1.809a.05.05 0 0 0-.02-.041a.05.05 0 0 0-.046-.01a20.3 20.3 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.6 5.6 0 0 1-.319-1.433a.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546c.376 0 .75 0 1.125-.01c1.57-.044 3.224-.124 4.768-.422q.059-.011.11-.024c2.435-.464 4.753-1.92 4.989-5.604c.008-.145.03-1.52.03-1.67c.002-.512.167-3.63-.024-5.545m-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976c-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35c-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102q0-1.965 1.011-3.12c.696-.77 1.608-1.164 2.74-1.164c1.311 0 2.302.5 2.962 1.498l.638 1.06l.638-1.06c.66-.999 1.65-1.498 2.96-1.498c1.13 0 2.043.395 2.74 1.164q1.012 1.155 1.012 3.12z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://misskey-hub.net" target="_blank" rel="noopener noreferrer" aria-label="Misskey" title="Misskey" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true">
82<path fill="currentColor" d="M8.91 16.892c-1.039.003-1.931-.63-2.352-1.366c-.225-.322-.67-.437-.676 0v2.014q0 1.215-.876 2.1q-.85.86-2.078.86q-1.2 0-2.077-.86A2.93 2.93 0 0 1 0 17.54V6.46q0-.936.526-1.695a2.86 2.86 0 0 1 1.402-1.088a2.9 2.9 0 0 1 1-.177q1.353 0 2.253 1.063l2.997 3.515c.067.05.263.437.732.437c.47 0 .692-.386.758-.437l2.972-3.515Q13.567 3.5 14.918 3.5q.501 0 1.001.177a2.73 2.73 0 0 1 1.377 1.088q.55.758.55 1.695v11.08q0 1.215-.875 2.1q-.852.86-2.078.86q-1.201 0-2.078-.86a2.93 2.93 0 0 1-.85-2.1v-2.014c-.05-.55-.531-.204-.702 0c-.45.843-1.313 1.361-2.352 1.366M21.448 8.61q-1.05 0-1.802-.733q-.726-.759-.726-1.822c0-1.063.242-1.307.726-1.796a2.44 2.44 0 0 1 1.802-.758q1.05 0 1.803.758q.75.735.75 1.796q0 1.063-.75 1.822q-.751.732-1.803.733m.025.507q1.05 0 1.777.758q.75.759.751 1.822v6.248q0 1.064-.75 1.821a2.4 2.4 0 0 1-1.778.734q-1.05 0-1.802-.733a2.5 2.5 0 0 1-.75-1.822v-6.248a2.5 2.5 0 0 1 .75-1.822a2.44 2.44 0 0 1 1.802-.758"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://join-lemmy.org" target="_blank" rel="noopener noreferrer" aria-label="Lemmy" title="Lemmy" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M2.96 4.223a4 4 0 0 0-.333.019A2.84 2.84 0 0 0 .474 5.628c-.475.8-.593 1.68-.35 2.497c.242.816.83 1.558 1.698 2.145l.016.011c.746.45 1.492.743 2.288.9c-.02.332-.028.669-.006 1.018c.063 1.043.436 2 .996 2.85l-2.006.818a.42.42 0 0 0-.228.224a.42.42 0 0 0 .088.455a.42.42 0 0 0 .294.123a.4.4 0 0 0 .16-.031l2.209-.904c.408.486.87.932 1.372 1.318q.03.02.06.043l-1.291 1.71a.416.416 0 0 0 .664.5l1.314-1.738a9.3 9.3 0 0 0 2.229 1.025c.383.72 1.138 1.187 2.02 1.187c.89 0 1.644-.501 2.024-1.207a9.4 9.4 0 0 0 2.208-1.027l1.332 1.76a.416.416 0 0 0 .744-.193a.42.42 0 0 0-.08-.307l-1.31-1.735c.008-.007.018-.01.026-.018c.497-.38.955-.818 1.362-1.294l2.155.88a.416.416 0 0 0 .541-.228a.415.415 0 0 0-.227-.544l-1.944-.792c.577-.854.97-1.819 1.05-2.87c.027-.35.025-.691.009-1.026a7 7 0 0 0 2.273-.897l.017-.012c.868-.587 1.456-1.328 1.698-2.145c.242-.816.125-1.697-.35-2.497a2.84 2.84 0 0 0-2.155-1.386a3 3 0 0 0-.332-.019c-.786-.015-1.623.23-2.429.694c-.593.342-1.125.867-1.543 1.439c-1.17-.67-2.693-1.048-4.564-1.078a16 16 0 0 0-.51 0c-2.086.034-3.755.43-5.015 1.144c-.003-.003-.005-.011-.008-.015C6.55 5.815 6 5.27 5.389 4.917c-.805-.465-1.643-.708-2.428-.694Zm.285.736c.557.042 1.17.236 1.779.588c.485.28.976.755 1.346 1.27a6 6 0 0 0-.497.408c-.92.852-1.461 1.96-1.668 3.233a6.2 6.2 0 0 1-1.984-.794C1.466 9.15 1.005 8.54.821 7.919C.636 7.295.713 6.648 1.098 6c.375-.63.928-.953 1.612-1.032a3 3 0 0 1 .535-.007Zm17.51 0a3 3 0 0 1 .535.008c.684.078 1.237.402 1.612 1.032c.385.648.462 1.296.277 1.92c-.184.622-.645 1.231-1.4 1.744a6.2 6.2 0 0 1-1.96.789c-.194-1.297-.737-2.434-1.666-3.302a6 6 0 0 0-.47-.392c.364-.49.828-.943 1.293-1.212c.61-.351 1.222-.545 1.779-.587m-8.749 1.045a15 15 0 0 1 .487 0c2.39.039 4.085.67 5.163 1.678c1.15 1.075 1.642 2.6 1.5 4.467c-.132 1.707-1.221 3.228-2.653 4.324a9 9 0 0 1-2.225 1.229c.003-.045.014-.089.014-.135c.003-1.196-.932-2.213-2.292-2.213s-2.322 1.015-2.292 2.221c.001.05.014.097.018.147a8.9 8.9 0 0 1-2.278-1.245c-1.423-1.095-2.5-2.613-2.603-4.322c-.113-1.857.378-3.339 1.521-4.397s2.986-1.711 5.64-1.754m-3.642 6.829a1.096 1.096 0 1 0 0 2.192a1.096 1.096 0 0 0 0-2.192m7.282.011a1.086 1.086 0 1 0 0 2.173a1.086 1.086 0 0 0 0-2.173M12 16.084c1.024 0 1.565.638 1.563 1.482c-.001.785-.672 1.485-1.563 1.485c-.917 0-1.54-.562-1.563-1.493c-.022-.834.54-1.474 1.563-1.474"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://pleroma.social" target="_blank" rel="noopener noreferrer" aria-label="Pleroma" title="Pleroma" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M6.36 0a1.87 1.87 0 0 0-1.87 1.868V24h5.964V0zm7.113 0v12h4.168a1.87 1.87 0 0 0 1.868-1.868V0zm0 18.036V24h4.168a1.87 1.87 0 0 0 1.868-1.868v-4.096Z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://joinpeertube.org" target="_blank" rel="noopener noreferrer" aria-label="PeerTube" title="PeerTube" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true">
82<path fill="currentColor" d="M12 6.545v10.91L20.727 12M3.273 12v12L12 17.455M3.273 0v12L12 6.545"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://pixelfed.org" target="_blank" rel="noopener noreferrer" aria-label="Pixelfed" title="Pixelfed" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12s-5.373 12-12 12m-.953-9.38h2.202c2.074 0 3.755-1.637 3.755-3.656S15.323 7.31 13.249 7.31h-3.177c-1.197 0-2.167.944-2.167 2.109v8.208z"/></svg></span></a></li><li data-v-39328e90><a class="lp-logo--mask lp-logo" style="--mask:url(/logos/akkoma.svg);" href="https://akkoma.social" target="_blank" rel="noopener noreferrer" aria-label="Akkoma" title="Akkoma" data-v-39328e90><!----></a></li><li data-v-39328e90><a class="lp-logo--mask lp-logo" style="--mask:url(/logos/hollo.svg);" href="https://docs.hollo.social" target="_blank" rel="noopener noreferrer" aria-label="Hollo" title="Hollo" data-v-39328e90><!----></a></li><li data-v-39328e90><a class="lp-logo" style="" href="https://ghost.org" target="_blank" rel="noopener noreferrer" aria-label="Ghost" title="Ghost" data-v-39328e90><span class="lp-logo-svg" data-v-39328e90><svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12s12-5.373 12-12S18.627 0 12 0m.256 2.313c2.47.005 5.116 2.008 5.898 2.962l.244.3c1.64 1.994 3.569 4.34 3.569 6.966c0 3.719-2.98 5.808-6.158 7.508c-1.433.766-2.98 1.508-4.748 1.508c-4.543 0-8.366-3.569-8.366-8.112c0-.706.17-1.425.342-2.15c.122-.515.244-1.033.307-1.549c.548-4.539 2.967-6.795 8.422-7.408a4 4 0 0 1 .49-.026Z"/></svg></span></a></li><!--]--><li class="lp-logo-more" data-v-39328e90>and more</li></ul></div></section><section class="lp-section" data-v-39328e90><div class="wrap lp-cli" data-v-39328e90><div class="lp-cli-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Developer tooling</p><h2 class="lp-h2" data-v-39328e90>A toolchain for building and debugging</h2><p class="lp-body" data-v-39328e90> The <code data-v-39328e90>fedify</code> command-line tool turns the fiddly parts of ActivityPub development into one-liners, from inspecting remote objects to watching exactly what your own server sends. Alongside it, <a href="https://jsr.io/@fedify/lint" target="_blank" rel="noopener noreferrer" data-v-39328e90><code data-v-39328e90>@fedify/lint</code></a> catches common federation mistakes as you write, and <a href="/manual/debug" data-v-39328e90><code data-v-39328e90>@fedify/debugger</code></a> adds a live dashboard of inbox and outbox activity. </p><ul class="lp-cli-list" data-v-39328e90><!--[--><li data-v-39328e90><a class="lp-cli-link" href="/cli#a-authorized-fetch-authorized-fetch" data-v-39328e90><code class="lp-cli-cmd" data-v-39328e90>fedify lookup --authorized-fetch</code></a><span class="lp-cli-desc" data-v-39328e90>Inspect any actor or object, even the authorized-fetch-only ones.</span></li><li data-v-39328e90><a class="lp-cli-link" href="/cli#fedify-inbox-ephemeral-inbox-server" data-v-39328e90><code class="lp-cli-cmd" data-v-39328e90>fedify inbox</code></a><span class="lp-cli-desc" data-v-39328e90>Spin up an ephemeral, public inbox to see exactly what your server sends.</span></li><li data-v-39328e90><a class="lp-cli-link" href="/cli#fedify-tunnel-exposing-a-local-http-server-to-the-public-internet" data-v-39328e90><code class="lp-cli-cmd" data-v-39328e90>fedify tunnel</code></a><span class="lp-cli-desc" data-v-39328e90>Expose your local server to the public internet for live testing.</span></li><li data-v-39328e90><a class="lp-cli-link" href="/cli#fedify-init-initializing-a-fedify-project" data-v-39328e90><code class="lp-cli-cmd" data-v-39328e90>fedify init</code></a><span class="lp-cli-desc" data-v-39328e90>Scaffold a ready-to-run project in seconds.</span></li><li data-v-39328e90><a class="lp-cli-link" href="/cli#fedify-nodeinfo-visualizing-an-instance-s-nodeinfo" data-v-39328e90><code class="lp-cli-cmd" data-v-39328e90>fedify nodeinfo</code></a><span class="lp-cli-desc" data-v-39328e90>Inspect any instance's software, version, and stats.</span></li>
82<!--]--></ul><a class="lp-textlink" href="/cli" data-v-39328e90>Explore the CLI â</a></div><div class="lp-term" aria-hidden="true" data-v-39328e90><div class="lp-term-bar" data-v-39328e90><span class="lp-term-title" data-v-39328e90>zsh â fedify</span></div><pre class="lp-term-body" data-v-39328e90><code data-v-39328e90><span class="t-p">$</span> fedify inbox 83 84<span class="t-ok">â</span> Ephemeral server up: <span class="t-url">https://f9285cf4.lhr.life/</span> 85<span class="t-ok">â</span> Sent follow to <span class="t-at">@[email protected]</span> 86 87 <span class="t-k">Actor handle</span> [email protected] 88 <span class="t-k">Actor inbox</span> https://f9285cf4.lhr.life/i/inbox 89 <span class="t-k">Shared inbox</span> https://f9285cf4.lhr.life/inbox 90 91<span class="t-rx">⸠Received</span> <span class="t-at">Follow</span> POST /i/inbox <span class="t-ok">202</span></code></pre></div></div></section><section class="lp-section lp-section-alt" data-v-39328e90><div class="wrap lp-otel" data-v-39328e90><div class="lp-otel-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>Built for production</p><h2 class="lp-h2" data-v-39328e90>See exactly what your server is doing</h2><p class="lp-body" data-v-39328e90> Fedify is instrumented with OpenTelemetry out of the box, so the whole federation lifecycle shows up as traces and metrics in the observability stack you already run. </p><ul class="lp-otel-list" data-v-39328e90><!--[--><li data-v-39328e90><span class="lp-otel-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-activity-icon lucide-activity" data-v-39328e90><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"></path></svg></span><span class="lp-otel-text" data-v-39328e90><span class="lp-otel-term" data-v-39328e90>Distributed traces</span><span class="lp-otel-desc" data-v-39328e90>every step is a span: HTTP, inbox, outbox, fan-out, signatures, and WebFinger.</span></span></li><li data-v-39328e90><span class="lp-otel-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gauge-icon lucide-gauge" data-v-39328e90><path d="m12 14 4-4"></path><path d="M3.34 19a10 10 0 1 1 17.32 0"></path></svg></span><span class="lp-otel-text" data-v-39328e90><span class="lp-otel-term" data-v-39328e90>Rich metrics</span><span class="lp-otel-desc" data-v-39328e90>counters and histograms for delivery, queue depth, signature verification, and more.</span></span></li><li data-v-39328e90><span class="lp-otel-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plug-icon lucide-plug" data-v-39328e90><path d="M12 22v-5"></path><path d="M15 8V2"></path><path d="M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"></path><path d="M9 8V2"></path></svg></span><span class="lp-otel-text" data-v-39328e90><span class="lp-otel-term" data-v-39328e90>Any OTLP backend</span><span class="lp-otel-desc" data-v-39328e90>ship to Grafana, Jaeger, Sentry, or Deno's built-in OpenTelemetry.</span></span></li><li data-v-39328e90><span class="lp-otel-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-scroll-text-icon lucide-scroll-text" data-v-39328e90><path d="M15 12h-5"></path><path d="M15 8h-5"></path><path d="M19 17V5a2 2 0 0 0-2-2H4"></path><path d="M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3"></path></svg></span><span class="lp-otel-text" data-v-39328e90><span class="lp-otel-term" data-v-39328e90>Structured logs too</span><span class="lp-otel-desc" data-v-39328e90>traceable JSON logging via LogTape, correlated by request and message IDs.</span></span></li>
91<!--]--></ul><a class="lp-textlink" href="/manual/opentelemetry" data-v-39328e90> OpenTelemetry guide â </a></div><div class="lp-trace" aria-hidden="true" data-v-39328e90><div class="lp-trace-bar" data-v-39328e90><span class="lp-trace-title" data-v-39328e90>trace · activitypub.inbox</span></div><div class="lp-trace-body" data-v-39328e90><!--[--><div class="lp-trace-row" data-v-39328e90><span class="lp-trace-label" style="padding-left:0px;" data-v-39328e90>activitypub.inbox</span><span class="lp-trace-track" data-v-39328e90><span class="lp-trace-span" style="margin-left:0%;width:100%;" data-v-39328e90></span></span></div><div class="lp-trace-row" data-v-39328e90><span class="lp-trace-label" style="padding-left:14px;" data-v-39328e90>http_signatures.verify</span><span class="lp-trace-track" data-v-39328e90><span class="lp-trace-span" style="margin-left:3%;width:19%;" data-v-39328e90></span></span></div><div class="lp-trace-row" data-v-39328e90><span class="lp-trace-label" style="padding-left:14px;" data-v-39328e90>activitypub.dispatch_inbox_listener</span><span class="lp-trace-track" data-v-39328e90><span class="lp-trace-span" style="margin-left:25%;width:34%;" data-v-39328e90></span></span></div><div class="lp-trace-row" data-v-39328e90><span class="lp-trace-label" style="padding-left:14px;" data-v-39328e90>activitypub.send_activity</span><span class="lp-trace-track" data-v-39328e90><span class="lp-trace-span" style="margin-left:62%;width:31%;" data-v-39328e90></span></span></div><div class="lp-trace-row" data-v-39328e90><span class="lp-trace-label" style="padding-left:28px;" data-v-39328e90>http_signatures.sign</span><span class="lp-trace-track" data-v-39328e90><span class="lp-trace-span" style="margin-left:65%;width:13%;" data-v-39328e90></span></span></div><!--]--></div></div></div></section><section class="lp-section" data-v-39328e90><div class="wrap lp-c2s" data-v-39328e90><div class="lp-c2s-copy" data-v-39328e90><p class="lp-kicker" data-v-39328e90>ActivityPub API</p><h2 class="lp-h2" data-v-39328e90>Accept posts straight from your clients</h2><p class="lp-body" data-v-39328e90> The ActivityPub API, the client-to-server (C2S) side of the protocol, is something of a holy grail in the fediverse, and Fedify is ready for it. Route <code data-v-39328e90>POST</code> requests to an actor's outbox through typed listeners and authorize them however you like. </p><ul class="lp-checklist" data-v-39328e90><!--[--><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-webhook-icon lucide-webhook" data-v-39328e90><path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"></path><path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"></path><path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"></path></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>Typed outbox listeners</span><span class="lp-check-desc" data-v-39328e90>handle client posts per activity type, exactly like inbox listeners.</span></span></li><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-key-round-icon lucide-key-round" data-v-39328e90><path d="M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"></path><circle cx="16.5" cy="7.5" r=".5" fill="currentColor"></circle></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>Auth your way</span><span class="lp-check-desc" data-v-39328e90>an <code>authorize()</code> hook plugs in OAuth, access tokens, or sessions.</span></span></li><li data-v-39328e90><span class="lp-check-ic" aria-hidden="true" data-v-39328e90><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-blocks-icon lucide-blocks" data-v-39328e90><path d="M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2"></path><rect x="14" y="2" width="8" height="8" rx="1"></rect></svg></span><span class="lp-check-text" data-v-39328e90><span class="lp-check-term" data-v-39328e90>Standard, not bespoke</span><span class="lp-check-desc" data-v-39328e90>clients speak the real ActivityPub outbox, so there's no custom API to maintain.</span></span></li>
91<!--]--></ul><a class="lp-textlink" href="/manual/outbox" data-v-39328e90>Outbox listeners guide â</a></div><div class="lp-code-window lp-c2s-window" data-v-39328e90><div class="lp-code-bar" aria-hidden="true" data-v-39328e90><span class="lp-code-file" data-v-39328e90>outbox.ts</span></div><pre class="lp-code" data-v-39328e90><code data-v-39328e90>federation 92 .<span class="c-fn">setOutboxListeners</span>(<span class="c-st">"/users/{identifier}/outbox"</span>) 93 .<span class="c-fn">on</span>(<span class="c-ty">Create</span>, <span class="c-kw">async</span> (ctx, activity) => { 94 <span class="c-kw">await</span> <span class="c-fn">saveAndDeliver</span>(ctx, activity); 95 }) 96 .<span class="c-fn">authorize</span>(<span class="c-kw">async</span> (ctx, id) => 97 (<span class="c-kw">await</span> <span class="c-fn">getSession</span>(ctx.request))?.user === id);</code></pre></div></div></section><section class="lp-cta-band" data-v-39328e90><div class="wrap" data-v-39328e90><h2 class="lp-cta-title" data-v-39328e90>Ready to join the fediverse?</h2><p class="lp-cta-sub" data-v-39328e90> Install Fedify and have a federated actor running in minutes. </p><div class="lp-cta" data-v-39328e90><a class="btn btn-primary" href="/install" data-v-39328e90> Start building <span class="btn-arrow" data-v-39328e90>â</span></a><a class="btn btn-text" href="/manual/federation" data-v-39328e90>Browse the manual</a><a class="btn btn-text" href="https://github.com/fedify-dev/fedify" data-v-39328e90> GitHub </a></div><p class="lp-community" data-v-39328e90> Need a hand? Ask the community on <a href="https://github.com/fedify-dev/fedify/discussions" target="_blank" rel="noopener noreferrer" data-v-39328e90>GitHub Discussions</a> or <a href="https://matrix.to/#/#fedify:matrix.org" target="_blank" rel="noopener noreferrer" data-v-39328e90>Matrix</a>, or tag <a href="https://mastodon.social/tags/fedify" target="_blank" rel="noopener noreferrer" data-v-39328e90>#Fedify</a> in the fediverse. </p><p class="lp-sponsors" data-v-39328e90> Fedify is free and open source. <a href="/sponsors" data-v-39328e90>Meet our sponsors â</a></p><p class="lp-also" data-v-39328e90><span class="lp-also-label" data-v-39328e90>Also from the Fedify team:</span><!--[--><a class="lp-also-link" href="https://botkit.fedify.dev/" title="A framework for building ActivityPub bots." target="_blank" rel="noopener noreferrer" data-v-39328e90><img src="/logos/botkit.svg" alt="" data-v-39328e90>BotKit</a><a class="lp-also-link" href="https://drfed.org/" title="A web-based ActivityPub debugging platform." target="_blank" rel="noopener noreferrer" data-v-39328e90><img src="/logos/drfed.svg" alt="" data-v-39328e90>DrFed</a><!--]--></p></div></section><section class="lp-backer" data-v-39328e90><p class="lp-backer-label" data-v-39328e90>Backed by an investment from</p><a class="lp-backer-link" href="https://www.sovereign.tech/tech/fedify" target="_blank" rel="noopener noreferrer" aria-label="Sovereign Tech Agency" data-v-39328e90><span class="lp-backer-logo" aria-hidden="true" data-v-39328e90></span></a></section></div></div><!----><!--[--><!--]--></div></div> 98
98<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"BlhG5Bp3\",\"cli.md\":\"p6csFcY3\",\"contribute.md\":\"DHMVyWk5\",\"index.md\":\"DyNBHRei\",\"install.md\":\"DKaRktDG\",\"intro.md\":\"Dwam5mMy\",\"manual_access-control.md\":\"CVObqaqC\",\"manual_actor.md\":\"CuYlHZt4\",\"manual_backfill.md\":\"D9oH-7qc\",\"manual_benchmarking.md\":\"Dl4-iD_S\",\"manual_circuit-breaker.md\":\"65sO3q4I\",\"manual_collections.md\":\"CK2LYJWj\",\"manual_context-advanced.md\":\"CcBppnL2\",\"manual_context.md\":\"BoRrpkWb\",\"manual_debug.md\":\"DMaSvFSc\",\"manual_deploy.md\":\"ByYu0gBw\",\"manual_federation.md\":\"B-8m9_O0\",\"manual_inbox.md\":\"DNxkg_yL\",\"manual_integration.md\":\"cUodt0Ra\",\"manual_interaction-controls.md\":\"TuDXiPom\",\"manual_kv.md\":\"CJVzXoXL\",\"manual_lint.md\":\"Ishj9K0K\",\"manual_log.md\":\"By_K32v0\",\"manual_media-upload.md\":\"CCmiFZut\",\"manual_migrate.md\":\"Dia8Zw-Z\",\"manual_monitoring.md\":\"3IIPeWuT\",\"manual_mq.md\":\"BjVgfyD-\",\"manual_nodeinfo.md\":\"C1m9Txnp\",\"manual_object.md\":\"lVn7tqjs\",\"manual_opentelemetry.md\":\"DOQRX2qY\",\"manual_outbox.md\":\"Bz_8DY9Y\",\"manual_portable.md\":\"C8oFDeuX\",\"manual_pragmatics.md\":\"Bx0NgEa8\",\"manual_relay.md\":\"BRIgYuh1\",\"manual_send.md\":\"DF7VpVeR\",\"manual_tasks.md\":\"CcgC4sc8\",\"manual_test.md\":\"BBZugI_1\",\"manual_uri-template.md\":\"DwpA16Q5\",\"manual_vocab.md\":\"MACdMKxX\",\"manual_webfinger.md\":\"CGuhx7KV\",\"readme.md\":\"CoL-qSaO\",\"security.md\":\"BnjGlGFS\",\"sponsors.md\":\"CjE230b8\",\"tutorial.md\":\"ENAbke-x\",\"tutorial_astro-blog.md\":\"B9Kn0vY3\",\"tutorial_basics.md\":\"DxlQnbW2\",\"tutorial_content-sharing.md\":\"DXXv6FNv\",\"tutorial_microblog.md\":\"BAeQ17AB\",\"tutorial_threadiverse.md\":\"YVN2Y0yx\",\"why.md\":\"D7SyioMX\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Fedify\",\"description\":\"Fedify docs\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Installation\",\"link\":\"/install.md\"},{\"text\":\"CLI\",\"link\":\"/cli.md\"},{\"text\":\"Tutorials\",\"items\":[{\"text\":\"Learning the basics\",\"link\":\"/tutorial/basics.md\"},{\"text\":\"Creating a microblog\",\"link\":\"/tutorial/microblog.md\"},{\"text\":\"Creating an image sharing service\",\"link\":\"/tutorial/content-sharing.md\"},{\"text\":\"Building a federated blog\",\"link\":\"/tutorial/astro-blog.md\"},{\"text\":\"Building a threadiverse community\",\"link\":\"/tutorial/threadiverse.md\"}],\"activeMatch\":\"/tutorial\"},{\"text\":\"Manual\",\"items\":[{\"text\":\"Federation\",\"link\":\"/manual/federation.md\"},{\"text\":\"Context\",\"link\":\"/manual/context.md\"},{\"text\":\"Advanced context helpers\",\"link\":\"/manual/context-advanced.md\"},{\"text\":\"Vocabulary\",\"link\":\"/manual/vocab.md\"},{\"text\":\"Actor dispatcher\",\"link\":\"/manual/actor.md\"},{\"text\":\"Inbox listeners\",\"link\":\"/manual/inbox.md\"},{\"text\":\"Outbox listeners\",\"link\":\"/manual/outbox.md\"},{\"text\":\"Media upload\",\"link\":\"/manual/media-upload.md\"},{\"text\":\"Sending activities\",\"link\":\"/manual/send.md\"},{\"text\":\"Collections\",\"link\":\"/manual/collections.md\"},{\"text\":\"Conversation backfill\",\"link\":\"/manual/backfill.md\"},{\"text\":\"Object dispatcher\",\"link\":\"/manual/object.md\"},{\"text\":\"Access control\",\"link\":\"/manual/access-control.md\"},{\"text\":\"Interaction controls\",\"link\":\"/manual/interaction-controls.md\"},{\"text\":\"Portable objects\",\"link\":\"/manual/portable.md\"},{\"text\":\"WebFinger\",\"link\":\"/manual/webfinger.md\"},{\"text\":\"NodeInfo\",\"link\":\"/manual/nodeinfo.md\"},{\"text\":\"URI Template\",\"link\":\"/manual/uri-template.md\"},{\"text\":\"Pragmatics\",\"link\":\"/manual/pragmatics.md\"},{\"text\":\"Keyâvalue store\",\"link\":\"/manual/kv.md\"},{\"text\":\"Message queue\",\"link\":\"/manual/mq.md\"},{\"text\":\"Background tasks\",\"link\":\"/manual/tasks.md\"},{\"text\":\"Circuit breaker\",\"link\":\"/manual/circuit-breaker.md\"},{\"text\":\"Integration\",\"link\":\"/manual/integration.md\"},{\"text\":\"Migration\",\"link\":\"/manual/migrate.md\"},{\"text\":\"Relay\",\"link\":\"/manual/relay.md\"},{\"text\":\"Testing\",\"link\":\"/manual/test.md\"},{\"text\":\"Debugging\",\"link\":\"/manual/debug.md\"},{\"text\":\"Linting\",\"link\":\"/manual/lint.md\"},{\"text\":\"Logging\",\"link\":\"/manual/log.md\"},{\"text\":\"OpenTelemetry\",\"link\":\"/manual/opentelemetry.md\"},{\"text\":\"Monitoring\",\"link\":\"/manual/monitoring.md\"},{\"text\":\"Benchmarking\",\"link\":\"/manual/benchmarking.md\"},{\"text\":\"Deployment\",\"link\":\"/manual/deploy.md\"}],\"activeMatch\":\"/manual\"},{\"text\":\"References\",\"items\":[{\"text\":\"@fedify/fedify\",\"link\":\"https://jsr.io/@fedify/fedify/doc\"},{\"text\":\"@fedify/amqp\",\"link\":\"https://jsr.io/@fedify/amqp/doc\"},{\"text\":\"@fedify/astro\",\"link\":\"https://jsr.io/@fedify/astro/doc\"},{\"text\":\"@fedify/backfill\",\"link\":\"https://jsr.io/@fedify/backfill/doc\"},{\"text\":\"@fedify/cfworkers\",\"link\":\"https://jsr.io/@fedify/cfworkers/doc\"},{\"text\":\"@fedify/cli\",\"link\":\"https://jsr.io/@fedify/cli/doc\"},{\"text\":\"@fedify/debugger\",\"link\":\"https://jsr.io/@fedify/debugger/doc\"},{\"text\":\"@fedify/denokv\",\"link\":\"https://jsr.io/@fedify/denokv/doc\"},{\"text\":\"@fedify/express\",\"link\":\"https://jsr.io/@fedify/express/doc\"},{\"text\":\"@fedify/fastify\",\"link\":\"https://jsr.io/@fedify/fastify/doc\"},{\"text\":\"@fedify/fresh\",\"link\":\"https://jsr.io/@fedify/fresh/doc\"},{\"text\":\"@fedify/h3\",\"link\":\"https://jsr.io/@fedify/h3/doc\"},{\"text\":\"@fedify/hono\",\"link\":\"https://jsr.io/@fedify/hono/doc\"},{\"text\":\"@fedify/init\",\"link\":\"https://jsr.io/@fedify/init/doc\"},{\"text\":\"@fedify/interaction-controls\",\"link\":\"https://jsr.io/@fedify/interaction-controls/doc\"},{\"text\":\"@fedify/koa\",\"link\":\"https://jsr.io/@fedify/koa/doc\"},{\"text\":\"@fedify/lint\",\"link\":\"https://jsr.io/@fedify/lint/doc\"},{\"text\":\"@fedify/mysql\",\"link\":\"https://jsr.io/@fedify/mysql/doc\"},{\"text\":\"@fedify/netlify\",\"link\":\"https://jsr.io/@fedify/netlify/doc\"},{\"text\":\"@fedify/nuxt\",\"link\":\"https://jsr.io/@fedify/nuxt/doc\"},{\"text\":\"@fedify/pglite\",\"link\":\"https://jsr.io/@fedify/pglite/doc\"},{\"text\":\"@fedify/postgres\",\"link\":\"https://jsr.io/@fedify/postgres/doc\"},{\"text\":\"@fedify/redis\",\"link\":\"https://jsr.io/@fedify/redis/doc\"},{\"text\":\"@fedify/relay\",\"link\":\"https://jsr.io/@fedify/relay/doc\"},{\"text\":\"@fedify/solidstart\",\"link\":\"https://jsr.io/@fedify/solidstart/doc\"},{\"text\":\"@fedify/sqlite\",\"link\":\"https://jsr.io/@fedify/sqlite/doc\"},{\"text\":\"@fedify/sveltekit\",\"link\":\"https://jsr.io/@fedify/sveltekit/doc\"},{\"text\":\"@fedify/testing\",\"link\":\"https://jsr.io/@fedify/testing/doc\"},{\"text\":\"@fedify/uri-template\",\"link\":\"https://jsr.io/@fedify/uri-template/doc\"},{\"text\":\"@fedify/vocab\",\"link\":\"https://jsr.io/@fedify/vocab/doc\"},{\"text\":\"@fedify/vocab-runtime\",\"link\":\"https://jsr.io/@fedify/vocab-runtime/doc\"},{\"text\":\"@fedify/vocab-tools\",\"link\":\"https://jsr.io/@fedify/vocab-tools/doc\"},{\"text\":\"@fedify/webfinger\",\"link\":\"https://jsr.io/@fedify/webfinger/doc\"}]},{\"text\":\"Unstable\",\"link\":\"https://unstable.fedify.dev/\"}],\"sidebar\":[{\"text\":\"What is Fedify?\",\"link\":\"/intro.md\"},{\"text\":\"Why Fedify?\",\"link\":\"/why.md\"},{\"text\":\"Installation\",\"link\":\"/install.md\"},{\"text\":\"CLI toolchain\",\"link\":\"/cli.md\"},{\"text\":\"Tutorials\",\"items\":[{\"text\":\"Learning the basics\",\"link\":\"/tutorial/basics.md\"},{\"text\":\"Creating a microblog\",\"link\":\"/tutorial/microblog.md\"},{\"text\":\"Creating an image sharing service\",\"link\":\"/tutorial/content-sharing.md\"},{\"text\":\"Building a federated blog\",\"link\":\"/tutorial/astro-blog.md\"},{\"text\":\"Building a threadiverse community\",\"link\":\"/tutorial/threadiverse.md\"}],\"activeMatch\":\"/tutorial\"},{\"text\":\"Manual\",\"items\":[{\"text\":\"Federation\",\"link\":\"/manual/federation.md\"},{\"text\":\"Context\",\"link\":\"/manual/context.md\"},{\"text\":\"Advanced context helpers\",\"link\":\"/manual/context-advanced.md\"},{\"text\":\"Vocabulary\",\"link\":\"/manual/vocab.md\"},{\"text\":\"Actor dispatcher\",\"link\":\"/manual/actor.md\"},{\"text\":\"Inbox listeners\",\"link\":\"/manual/inbox.md\"},{\"text\":\"Outbox listeners\",\"link\":\"/manual/outbox.md\"},{\"text\":\"Media upload\",\"link\":\"/manual/media-upload.md\"},{\"text\":\"Sending activities\",\"link\":\"/manual/send.md\"},{\"text\":\"Collections\",\"link\":\"/manual/collections.md\"},{\"text\":\"Conversation backfill\",\"link\":\"/manual/backfill.md\"},{\"text\":\"Object dispatcher\",\"link\":\"/manual/object.md\"},{\"text\":\"Access control\",\"link\":\"/manual/access-control.md\"},{\"text\":\"Interaction controls\",\"link\":\"/manual/interaction-controls.md\"}
98,{\"text\":\"Portable objects\",\"link\":\"/manual/portable.md\"},{\"text\":\"WebFinger\",\"link\":\"/manual/webfinger.md\"},{\"text\":\"NodeInfo\",\"link\":\"/manual/nodeinfo.md\"},{\"text\":\"URI Template\",\"link\":\"/manual/uri-template.md\"},{\"text\":\"Pragmatics\",\"link\":\"/manual/pragmatics.md\"},{\"text\":\"Keyâvalue store\",\"link\":\"/manual/kv.md\"},{\"text\":\"Message queue\",\"link\":\"/manual/mq.md\"},{\"text\":\"Background tasks\",\"link\":\"/manual/tasks.md\"},{\"text\":\"Circuit breaker\",\"link\":\"/manual/circuit-breaker.md\"},{\"text\":\"Integration\",\"link\":\"/manual/integration.md\"},{\"text\":\"Migration\",\"link\":\"/manual/migrate.md\"},{\"text\":\"Relay\",\"link\":\"/manual/relay.md\"},{\"text\":\"Testing\",\"link\":\"/manual/test.md\"},{\"text\":\"Debugging\",\"link\":\"/manual/debug.md\"},{\"text\":\"Linting\",\"link\":\"/manual/lint.md\"},{\"text\":\"Logging\",\"link\":\"/manual/log.md\"},{\"text\":\"OpenTelemetry\",\"link\":\"/manual/opentelemetry.md\"},{\"text\":\"Monitoring\",\"link\":\"/manual/monitoring.md\"},{\"text\":\"Benchmarking\",\"link\":\"/manual/benchmarking.md\"},{\"text\":\"Deployment\",\"link\":\"/manual/deploy.md\"}],\"activeMatch\":\"/manual\"},{\"text\":\"References\",\"items\":[{\"text\":\"@fedify/fedify\",\"link\":\"https://jsr.io/@fedify/fedify/doc\"},{\"text\":\"@fedify/amqp\",\"link\":\"https://jsr.io/@fedify/amqp/doc\"},{\"text\":\"@fedify/astro\",\"link\":\"https://jsr.io/@fedify/astro/doc\"},{\"text\":\"@fedify/backfill\",\"link\":\"https://jsr.io/@fedify/backfill/doc\"},{\"text\":\"@fedify/cfworkers\",\"link\":\"https://jsr.io/@fedify/cfworkers/doc\"},{\"text\":\"@fedify/cli\",\"link\":\"https://jsr.io/@fedify/cli/doc\"},{\"text\":\"@fedify/debugger\",\"link\":\"https://jsr.io/@fedify/debugger/doc\"},{\"text\":\"@fedify/denokv\",\"link\":\"https://jsr.io/@fedify/denokv/doc\"},{\"text\":\"@fedify/express\",\"link\":\"https://jsr.io/@fedify/express/doc\"},{\"text\":\"@fedify/fastify\",\"link\":\"https://jsr.io/@fedify/fastify/doc\"},{\"text\":\"@fedify/fresh\",\"link\":\"https://jsr.io/@fedify/fresh/doc\"},{\"text\":\"@fedify/h3\",\"link\":\"https://jsr.io/@fedify/h3/doc\"},{\"text\":\"@fedify/hono\",\"link\":\"https://jsr.io/@fedify/hono/doc\"},{\"text\":\"@fedify/init\",\"link\":\"https://jsr.io/@fedify/init/doc\"},{\"text\":\"@fedify/interaction-controls\",\"link\":\"https://jsr.io/@fedify/interaction-controls/doc\"},{\"text\":\"@fedify/koa\",\"link\":\"https://jsr.io/@fedify/koa/doc\"},{\"text\":\"@fedify/lint\",\"link\":\"https://jsr.io/@fedify/lint/doc\"},{\"text\":\"@fedify/mysql\",\"link\":\"https://jsr.io/@fedify/mysql/doc\"},{\"text\":\"@fedify/netlify\",\"link\":\"https://jsr.io/@fedify/netlify/doc\"},{\"text\":\"@fedify/nuxt\",\"link\":\"https://jsr.io/@fedify/nuxt/doc\"},{\"text\":\"@fedify/pglite\",\"link\":\"https://jsr.io/@fedify/pglite/doc\"},{\"text\":\"@fedify/postgres\",\"link\":\"https://jsr.io/@fedify/postgres/doc\"},{\"text\":\"@fedify/redis\",\"link\":\"https://jsr.io/@fedify/redis/doc\"},{\"text\":\"@fedify/relay\",\"link\":\"https://jsr.io/@fedify/relay/doc\"},{\"text\":\"@fedify/solidstart\",\"link\":\"https://jsr.io/@fedify/solidstart/doc\"},{\"text\":\"@fedify/sqlite\",\"link\":\"https://jsr.io/@fedify/sqlite/doc\"},{\"text\":\"@fedify/sveltekit\",\"link\":\"https://jsr.io/@fedify/sveltekit/doc\"},{\"text\":\"@fedify/testing\",\"link\":\"https://jsr.io/@fedify/testing/doc\"},{\"text\":\"@fedify/uri-template\",\"link\":\"https://jsr.io/@fedify/uri-template/doc\"},{\"text\":\"@fedify/vocab\",\"link\":\"https://jsr.io/@fedify/vocab/doc\"},{\"text\":\"@fedify/vocab-runtime\",\"link\":\"https://jsr.io/@fedify/vocab-runtime/doc\"},{\"text\":\"@fedify/vocab-tools\",\"link\":\"https://jsr.io/@fedify/vocab-tools/doc\"},{\"text\":\"@fedify/webfinger\",\"link\":\"https://jsr.io/@fedify/webfinger/doc\"}]},{\"text\":\"Examples\",\"link\":\"https://github.com/fedify-dev/fedify/tree/main/examples\"},{\"text\":\"Security policy\",\"link\":\"/security.md\"},{\"text\":\"Contribute\",\"link\":\"/contribute.md\"},{\"text\":\"Sponsors\",\"link\":\"/sponsors.md\"},{\"text\":\"Changelog\",\"link\":\"/changelog.md\"}],\"socialLinks\":[{\"icon\":\"jsr\",\"link\":\"https://jsr.io/@fedify/fedify\",\"ariaLabel\":\"JSR\"},{\"icon\":\"npm\",\"link\":\"https://www.npmjs.com/package/@fedify/fedify\",\"ariaLabel\":\"npm\"},{\"icon\":\"matrix\",\"link\":\"https://matrix.to/#/#fedify:matrix.org\",\"ariaLabel\":\"Matrix\"},{\"icon\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"17.995798\\\" height=\\\"12.67316\\\" viewBox=\\\"0 0 17.995798 12.67316\\\"><defs><clipPath clipPathUnits=\\\"userSpaceOnUse\\\" id=\\\"clipPath831\\\"><path d=\\\"M 0,982 H 1512 V 0 H 0 Z\\\" transform=\\\"translate(-1348.062,-446.10931)\\\" /></clipPath><clipPath clipPathUnits=\\\"userSpaceOnUse\\\" id=\\\"clipPath833\\\"><path d=\\\"M 0,982 H 1512 V 0 H 0 Z\\\" transform=\\\"translate(-1349.778,-452.50481)\\\" /></clipPath></defs><g transform=\\\"translate(-20112.718,-703.56027)\\\"><g id=\\\"g49\\\"><path d=\\\"M 0,0 C -2.542,-0.369 -5.396,-0.247 -5.483,0.591 -5.569,1.429 -2.68,2.344 -0.147,2.771 2.499,3.216 5.155,3.372 5.575,2.487 5.993,1.607 2.738,0.398 0,0 M -0.07,3.07 C -3.963,2.432 -6.437,1.398 -6.522,0.163 -6.59,-0.819 -4.481,-1.731 0.28,-1.046 c 5.038,0.724 7.075,2.5 6.635,3.479 -0.45,
981 -2.977,1.293 -6.985,0.637\\\" style=\\\"fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none\\\" transform=\\\"matrix(1.3333333,0,0,-1.3333333,20121.416,714.52093)\\\" clip-path=\\\"url(#clipPath831)\\\" /><path d=\\\"m 0,0 c -0.909,0.834 -0.652,1.825 -1.553,1.825 -0.876,0 -0.62,-0.905 -1.551,-1.825 -0.623,-0.669 -2.434,-0.14 -2.434,-1.214 0,-0.924 1.364,-0.764 2.306,-1.659 0.745,-0.708 0.711,-2.045 1.679,-2.045 0.884,0 0.901,1.516 1.584,2.199 0.957,0.888 2.255,0.578 2.255,1.505 C 2.286,-0.225 0.8,-0.652 0,0\\\" style=\\\"fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none\\\" transform=\\\"matrix(1.3333333,0,0,-1.3333333,20123.704,705.9936)\\\" clip-path=\\\"url(#clipPath833)\\\" /></g></g></svg>\"},\"link\":\"https://hackers.pub/@fedify\",\"ariaLabel\":\"hackers.pub (ActivityPub)\"},{\"icon\":\"opencollective\",\"link\":\"https://opencollective.com/fedify\",\"ariaLabel\":\"Open Collective\"},{\"icon\":\"github\",\"link\":\"https://github.com/fedify-dev/fedify\",\"ariaLabel\":\"GitHub\"}],\"search\":{\"provider\":\"local\"},\"editLink\":{\"pattern\":\"https://github.com/fedify-dev/fedify/edit/main/docs/:path\"},\"outline\":\"deep\"},\"locales\":{},\"cleanUrls\":true,\"additionalConfig\":{}}");</script>
98 99 100 </body> 101</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.