Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d93b8fd
Start the threadiverse tutorial
dahlia Apr 21, 2026
6048733
Tutorial: swap ESLint for Biome
dahlia Apr 21, 2026
5ced2c5
Tutorial: layout and navigation
dahlia Apr 21, 2026
1653161
Tutorial: users table
dahlia Apr 21, 2026
82f5e06
Tutorial: signup form
dahlia Apr 21, 2026
8cbbf00
Tutorial: login and sessions
dahlia Apr 21, 2026
bb1bdfa
Tutorial: profile page
dahlia Apr 21, 2026
6ef5d57
Tutorial: Person actor + tunnel + Academy test
dahlia Apr 21, 2026
d2db1d9
Tutorial: communities as Group actors
dahlia Apr 21, 2026
a05e522
Tutorial: Follow and Accept(Follow)
dahlia Apr 21, 2026
b8afb5b
Tutorial: threads, Create(Page), Announce fan-out
dahlia Apr 21, 2026
48cf5a6
Tutorial: replies as Create(Note) with Announce fan-out
dahlia Apr 21, 2026
529b789
Tutorial: Like and Dislike votes
dahlia Apr 21, 2026
01b17f5
Tutorial: subscribed feed + Undo(Follow)
dahlia Apr 21, 2026
e82a95a
Tutorial: closing chapter + CHANGES entry
dahlia Apr 21, 2026
3109739
Tutorial: Lemmy-compatible Group actor
dahlia Apr 21, 2026
0393c4b
Tutorial: document full Lemmy subscribe round-trip
dahlia Apr 21, 2026
a87dbcf
Tutorial: update Lemmy interop status after tunnel-agnostic fix
dahlia Apr 21, 2026
31241ea
Serialize public audience as full URI in outgoing activities
dahlia Apr 22, 2026
ab373c5
Tutorial: document Lemmy Announce compatibility as working
dahlia Apr 22, 2026
e743cf0
Guard public audience normalization with canonical-form check
dahlia Apr 22, 2026
904a416
Tutorial: tighten typography and cross-references
dahlia Apr 22, 2026
a2a960e
Address review feedback on public audience normalization
dahlia Apr 22, 2026
d4aa208
Add PR links to the changelog
dahlia Apr 22, 2026
d5a9e5d
Harden public audience normalization heuristics
dahlia Apr 22, 2026
c21a922
Force cache-bypass in the Ed25519-mismatch proof retry
dahlia Apr 22, 2026
32081e4
Guard the public audience fast-path against nested @context
dahlia Apr 22, 2026
00c584a
Strip the expanded proof key in verifyProof() too
dahlia Apr 22, 2026
a63c5c4
Fix the Cloudflare Workers build for the public-audience test
dahlia Apr 22, 2026
892523d
Harden public audience normalization against adversarial input
dahlia Apr 22, 2026
f4c8278
Reject top-level arrays in verifyProofInternal
dahlia Apr 22, 2026
b5a7318
Restore signing-time normalization consistency
dahlia Apr 22, 2026
6aec7b7
Default to a preloaded-only loader in normalizePublicAudience
dahlia Apr 22, 2026
8ac89b4
Tighten typing and hoist the digest buffer in verifyProofInternal
dahlia Apr 22, 2026
03ed180
Tutorial: drop the Next.js 16 downgrade workaround
dahlia Apr 22, 2026
db38f27
Tutorial: drop the Lemmy JSON-LD context bundling workaround
dahlia Apr 23, 2026
a95be52
Harden public audience normalization against adversarial keys
dahlia Apr 23, 2026
253053c
Tutorial: mention the Biome Tailwind CSS parse error
dahlia Apr 23, 2026
4a82277
Tutorial: strip broken VitePress titles from dynamic-route code blocks
dahlia Apr 24, 2026
b9e893c
Tutorial: call out the new imports in the Subscribing chapter
dahlia Apr 24, 2026
3a16085
Tutorial: name the files the Votes chapter edits
dahlia Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion .hongdown.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,20 @@ proper_nouns = [
"ActivityPub",
"ActivityStreams",
"Akkoma",
"bun-types",
"Biome",
"BotKit",
"BrowserPub",
"bun-types",
"cloudflared",
"Cloudflare Tunnel",
"Cloudflare Workers",
"create-next-app",
"Deno",
"Deno Deploy",
"Deno Lint",
"Docker Compose",
"Drizzle Kit",
"Drizzle ORM",
"Fastify",
"Fedify",
"Elysia",
Expand All @@ -63,34 +69,46 @@ proper_nouns = [
"Hono",
"HTTP Message Signatures",
"HTTP Signatures",
"JSX",
"Koa",
"Lemmy",
"Linked Data Signatures",
"LitePub",
"LogTape",
"Mastodon",
"Mbin",
"mise",
"Misskey",
"NestJS",
"Next.js",
"Node.js",
"NodeBB",
"NodeInfo",
"ngrok",
"Object Integrity Proofs",
"OpenTelemetry",
"Piefed",
"Pixelfed",
"Pleroma",
"Podman Compose",
"RabbitMQ",
"Redis",
"scrypt",
"Scoop",
"Serveo",
"SiliconBeest",
"SolidStart",
"SQLite",
"SvelteKit",
"TypeScript",
"Typo Blue",
"URI Template",
"URI Templates",
"Visual Studio Code",
"VitePress",
"WebAssembly",
"WebFinger",
"x-forwarded-fetch",
]

[code_block.formatters]
Expand Down
29 changes: 29 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,29 @@ To be released.
`getAuthenticatedDocumentLoader()` now also respects
`GetAuthenticatedDocumentLoaderOptions.maxRedirection`.

- Improved interoperability with threadiverse software by serializing the
public audience as the full `https://www.w3.org/ns/activitystreams#Public`
URI in outgoing activities' `to`, `cc`, `bto`, `bcc`, and `audience`
fields, instead of the compacted `as:Public` or `Public` CURIEs that
JSON-LD compaction would otherwise produce. Some ActivityPub
implementations, [Lemmy] included, match those fields as plain URLs
without JSON-LD expansion and would silently drop activities carrying
the CURIE form; see [LemmyNet/lemmy#6465]. The rewrite is gated on a
URDNA2015 canonical-form equivalence check, so an application-defined
`@context` that redefines the `as:` prefix or the bare `Public` term
is preserved as is. The rewrite is also applied before
`eddsa-jcs-2022` Object Integrity Proof signing so the signed bytes
match what is sent on the wire. [[#710]]

[Agent Skills]: https://agentskills.io/
[skills-npm]: https://github.com/antfu/skills-npm
[Lemmy]: https://join-lemmy.org/
[LemmyNet/lemmy#6465]: https://github.com/LemmyNet/lemmy/issues/6465
[#430]: https://github.com/fedify-dev/fedify/issues/430
[#644]: https://github.com/fedify-dev/fedify/issues/644
[#680]: https://github.com/fedify-dev/fedify/pull/680
[#688]: https://github.com/fedify-dev/fedify/pull/688
[#710]: https://github.com/fedify-dev/fedify/pull/710
[#711]: https://github.com/fedify-dev/fedify/issues/711
[#712]: https://github.com/fedify-dev/fedify/pull/712

Expand Down Expand Up @@ -171,11 +188,23 @@ To be released.
`Create`/`Update`/`Delete(Note)` inbox activities as comments.
[[#691], [#695]]

- Added a new tutorial, [*Building a threadiverse community platform*], that
walks through building a Lemmy-style community server with Fedify and
Next.js. Where the existing [*Creating your own federated microblog*]
tutorial is actor- and timeline-centric, this one is community-centric: it
models communities as `Group` actors, threads as `Page` objects wrapped in
`Create`, replies as `Note` objects, and the community-side `Announce`
redistribution that threadiverse software (Lemmy, Mbin, NodeBB) uses to fan
activity out to every subscriber. [[#704], [#710]]

[*Building a federated blog* tutorial]: https://fedify.dev/tutorial/astro-blog
[Astro]: https://astro.build/
[Bun]: https://bun.sh/
[*Building a threadiverse community platform*]: https://fedify.dev/tutorial/threadiverse
[*Creating your own federated microblog*]: https://fedify.dev/tutorial/microblog
[#691]: https://github.com/fedify-dev/fedify/issues/691
[#695]: https://github.com/fedify-dev/fedify/pull/695
[#704]: https://github.com/fedify-dev/fedify/issues/704


Version 2.1.9
Expand Down
4 changes: 4 additions & 0 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ const TUTORIAL = {
{ text: "Learning the basics", link: "/tutorial/basics.md" },
{ text: "Creating a microblog", link: "/tutorial/microblog.md" },
{ text: "Building a federated blog", link: "/tutorial/astro-blog.md" },
{
text: "Building a threadiverse community",
link: "/tutorial/threadiverse.md",
},
],
activeMatch: "/tutorial",
};
Expand Down
Loading