Skip to content

Upgrade the docs site to VitePress 2 and add a custom landing page#809

Merged
dahlia merged 21 commits into
fedify-dev:mainfrom
dahlia:docs/renewal
Jun 18, 2026
Merged

Upgrade the docs site to VitePress 2 and add a custom landing page#809
dahlia merged 21 commits into
fedify-dev:mainfrom
dahlia:docs/renewal

Conversation

@dahlia

@dahlia dahlia commented Jun 17, 2026

Copy link
Copy Markdown
Member

Here's the preview: https://2ff11e56.fedify.pages.dev/.

The documentation site has been running on VitePress 1.6.3 with the stock default theme. It works, but it still looks like a default VitePress site: the home page is the stock hero above a grid of one-line feature cards, and nothing carries Fedify's colors. This PR upgrades VitePress to the 2.0 line, applies a Fedify color and type palette across the whole site, and replaces the home page with a custom landing page. The manual and reference pages are otherwise unchanged.

VitePress moves from 1.6.3 to 2.0.0-alpha.17, and the plugins that have to move with it do. The Twoslash plugin follows Shiki up to 3.x, and the group-icons and llms plugins are bumped to releases built against VitePress 2. Mermaid has no VitePress 2 release yet, so it stays at 2.0.17 with a peer-dependency override in pnpm-workspace.yaml; pnpm only warns on the unmet peer, and withMermaid still wraps the config cleanly. Shiki 3 is stricter about languages it has not been told to load, and Twoslash re-highlights the code it finds in hover tooltips, so docs/.vitepress/config.mts now preloads the languages used across the docs. The same change also corrects the priority order of the JSR ref plugin.

The branding lives in a new docs/.vitepress/theme/brand.css, wired up from docs/.vitepress/theme/index.ts. The logo's blues turn out to be Tailwind's sky scale, so the brand tokens are built from sky with contrast-checked steps for light and dark. Those tokens set the link, button, and accent variables that the default theme already reads. A display typeface, Bricolage Grotesque, is self-hosted through Fontsource and applied to the hero and to the h1 through h3 headings; body text, navigation, and the sidebar keep the readable base font.

The landing page is one component, docs/.vitepress/theme/components/HomeLanding.vue, rendered as a custom layout through frontmatter in docs/index.md. It drops the default feature grid for a single narrative. In order, it covers what Fedify is, the ActivityPub-related specifications it implements, a code sample, the type-safe vocabulary API, queued delivery and fan-out, web framework integration, pluggable storage, interoperability with existing software, the CLI and debugging tools, OpenTelemetry, and the client-to-server ActivityPub API, then closes with a short community note and a credit to the Sovereign Tech Agency.

The copy presents Fedify as a framework rather than only a protocol library, but a modular one: an application uses the parts it needs and keeps its own routes, database schema, and queue backend. The artwork uses the Lucide icon set and CC0 Simple Icons. No emoji, no hand-drawn shapes. Third-party logos render through CSS masks so they take the current text color and follow light and dark, and a few are vendored under docs/public/logos/.

This is docs-site work. It does not touch the library and needs no CHANGES.md entry. The production docs build passes, and the new landing page was checked in both light and dark themes.

The following is the new Open Graph image:

New Open Graph image

dahlia added 15 commits June 17, 2026 16:26
Previously, JSR reference plugins were applied in their original order,
causing packages later in the list to override packages earlier in the
list when both matched the same reference.  Reversing the application
order ensures that packages listed first take precedence, as intended.
Move the documentation site from VitePress 1.6.3 to 2.0.0-alpha.17
(the latest "next" release) and replace the stock default theme with a
distinctive Fedify identity.

Build/tooling:

 - Bump VitePress to 2.0.0-alpha.17 (Vite 7, Vue 3.5, Shiki 3), and
   move @shikijs/vitepress-twoslash to 3.x to match Shiki; bump the
   group-icons and llms plugins to compatible releases.
 - Preload the languages used in JSDoc example code fences via
   markdown.languages: Shiki 3 no longer lazily loads them while
   Twoslash renders hover tooltips, which otherwise broke the build.
 - Allow vitepress-plugin-mermaid's unmet VitePress peer in
   pnpm-workspace.yaml; it has no VitePress 2 release yet, but the
   withMermaid wrapper works under 2.
 - Add @fontsource-variable/bricolage-grotesque (display font) and
   lucide-vue-next (feature icons).

Design:

 - Derive a contrast-checked brand palette from the logo (its blues
   are Tailwind's sky scale) and apply it through the default theme's
   CSS variables; use Bricolage Grotesque for headings and the hero.
 - Replace the default home layout with a custom landing page
   (HomeLanding.vue): a narrative hero with a federated-network
   illustration, package-manager install tabs (npm/pnpm/Yarn/Deno/Bun)
   and a "runs on" runtime strip (Node.js, Deno, Bun, Cloudflare
   Workers), a feature grid using Lucide icons and the official
   ActivityPub logo, a code showcase, an interop section, and a
   closing call to action.
 - Drop the "Quick demo" playground link from the Tutorials menu.

Assisted-by: Claude Code:claude-opus-4-8
The landing page's "Batteries included" feature grid largely
duplicated the "Why Fedify?" spec stack, so fold the two together.

 - Remove the feature grid section (component data, markup, and CSS).
 - Give each spec in the stack its own vector icon in place of the
   generic check mark: the official ActivityPub logo, plus Lucide
   icons (braces, file-pen, signature, user-search, server,
   badge-check, link) for the rest.
 - Annotate specs that have a formal designation with a small muted
   monospace id (e.g. RFC 9421, FEP-8b32, draft-cavage-http-signatures-12)
   and add Activity Streams 2.0, linking each row to its manual page.
 - Re-balance the alternating section backgrounds now that a section
   is gone, and tighten the stack rows on mobile so they stay compact
   instead of wrapping into bulky two-line rows.

Assisted-by: Claude Code:claude-opus-4-8
Replace the text chips in the landing page's "Plays well with others"
section with a monochrome logo wall, where each logo links to that
project's official website in a new tab.

 - Most marks are inline currentColor SVGs from Simple Icons
   (Mastodon, Misskey, Lemmy, Pleroma, PeerTube, Pixelfed, Ghost).
 - Akkoma and Hollo aren't in Simple Icons, so their SVGs are vendored
   under docs/public/logos/ (from the FediverseIconography project) and
   rendered through a CSS mask so they also follow currentColor and
   adapt to light and dark themes.

Assisted-by: Claude Code:claude-opus-4-8
Add a "Works with your stack" section to the landing page to highlight
one of Fedify's strengths: it slots into the web framework you already
use, and even without a first-party package it is easy to wire up
yourself because it is built on the web-standard Request and Response.

 - Show a logo wall of the frameworks with an official integration
   package (Express, Fastify, Koa, Hono, h3, Nuxt, SvelteKit, NestJS,
   Next.js, Astro, SolidStart, Fresh), each linking to its section in
   the integration manual.
 - Add a "No official package? No problem." callout with a compact
   custom-middleware snippet, linking Request and Response to MDN and
   pointing to the custom middleware guide.

See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/integration.md

Assisted-by: Claude Code:claude-opus-4-8
Highlight another of Fedify's strengths: reliable activity delivery
through a message queue, and the variety of broker backends it can run
on.

 - Three points: activities are queued and retried with exponential
   backoff; a two-stage fan-out keeps delivery to large audiences fast
   while retrying each inbox independently; and the queue backend is
   pluggable.
 - A broker logo wall (Redis, PostgreSQL, RabbitMQ, MySQL, MariaDB,
   SQLite, Deno KV, Cloudflare Queues, and more), each linking to its
   section in the message queue manual.
 - Re-balance the alternating section backgrounds for the inserted
   section.

See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/send.md
See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/mq.md

Assisted-by: Claude Code:claude-opus-4-8
Highlight that Fedify is instrumented with OpenTelemetry out of the
box, which is invaluable when operating a federated server in
production, with detailed structured logging as a bonus.

 - Spell out the appeal: distributed traces for every operation,
   metrics for delivery, queue depth, signature verification, and
   more, export to any OTLP backend, plus traceable structured logs
   through LogTape.
 - Pair the copy with a trace-waterfall mock built from real Fedify
   span names, rather than a fourth logo wall, for visual variety.
 - Link to the OpenTelemetry manual, and keep the alternating section
   backgrounds intact by inserting the section before the call to
   action.

See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/opentelemetry.md
See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/log.md

Assisted-by: Claude Code:claude-opus-4-8
Showcase Fedify's core Vocabulary API: type-safe ActivityPub objects
backed by a real JSON-LD processor, so applications never have to deal
with JSON-LD's rough edges themselves.

 - A normalization demo drives the point home: the four equivalent
   JSON-LD forms of "to" (a compact string, an array, a full IRI, and
   an array of the full IRI) all read back as one typed value through
   the accessor.
 - A second snippet contrasts the id accessor (no network request)
   with the dereferencing accessor that fetches and hydrates a remote
   object, e.g. actorId versus getActor().
 - A check list covers standard-compliant output, form normalization,
   the getActor()/getObject() dereferencing accessors, and the
   origin-based security model (FEP-fe34), linking the FEP.
 - Re-balance the alternating section backgrounds for the inserted
   section, and share the check-list styles with the observability
   section.

See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/vocab.md

Assisted-by: Claude Code:claude-opus-4-8
Highlight that Fedify is ready for the ActivityPub API, i.e. the
client-to-server (C2S) side of the protocol, which is something of a
holy grail in the fediverse.

 - Explain that POST requests to an actor's outbox are routed through
   typed listeners and authorized however the application likes, so
   clients speak the standard ActivityPub outbox rather than a bespoke
   API.
 - A check list covers typed outbox listeners, the authorize() hook for
   pluggable authentication, and the standard-not-bespoke benefit.
 - Pair the copy with an outbox.ts demo using setOutboxListeners(),
   on(Create, ...), and authorize().
 - Place it as the closing capability before the call to action, which
   also keeps the alternating section backgrounds intact.

See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/outbox.md

Assisted-by: Claude Code:claude-opus-4-8
Mention that help is available from the Fedify community, which is one
of the project's appeals, as a short closing line in the call-to-action
band.

The line points to GitHub Discussions and the Matrix chat space, and
notes that questions can be tagged with #Fedify in the fediverse.  It
sits just above the sponsors line so the community comes first.

See: https://github.com/fedify-dev/fedify/blob/main/README.md

Assisted-by: Claude Code:claude-opus-4-8
Add a "Backed by an investment from" strip to the bottom of the docs
landing page that credits the Sovereign Tech Agency, whose Sovereign
Tech Fund invested in Fedify.

The credit shows the official Sovereign Tech Agency logo rather than a
plain text wordmark.  The SVG was taken from the agency's own site, had
its framework-specific fill classes stripped, and a solid fill baked in
so it can be used as a CSS mask.  Rendering it through a mask with
background-color: currentColor lets the mark follow the active theme,
appearing dark on the light theme and light on the dark theme, and turn
the brand color on hover.  The link points at the project's page and
carries an aria-label for accessibility.

https://www.sovereign.tech/tech/fedify
On wide desktop screens the hero's right column has space to spare, so
the artwork looked a little small.  Add a min-width: 1080px rule that
grows the hero artwork to fill more of the column and bumps the Fedify
mark at its center from 38% to 42%, giving the logo noticeably more
presence (about 167px to 210px wide) while the surrounding rings and
nodes scale with it.

The rule is gated behind the breakpoint and bounded by the column, so
tablet and mobile layouts are untouched and the artwork cannot overflow.

Assisted-by: Claude Code:claude-opus-4-8
Tune the landing page wording so Fedify reads as what it is, a
full-featured framework for federation rather than merely an ActivityPub
or protocol library, while making clear that it stays modular and does
not impose an application architecture.

The change touches the few beats that carry positioning, leaving the
feature sections to demonstrate the breadth on their own and keeping the
existing plain, non-promotional voice:

 -  Hero lede now opens with "a TypeScript framework that handles
    federation, signatures, discovery, activity vocabulary, and delivery
    behind type-safe APIs" and adds that it is modular, so you can adopt
    the whole thing or just the parts you need and it never dictates how
    your app is built.
 -  The "What's Fedify?" headline changes from "One library that lets
    your app speak to the entire fediverse" to "A federation framework,
    not just a protocol library," and its body lists what Fedify covers
    before noting it is that broad yet modular and won't decide how the
    rest of your app is structured.
 -  The frameworks section leads with "Fedify doesn't take over your
    app," reinforcing that it runs as middleware alongside your existing
    routes, and the heading now says "web framework" to avoid clashing
    with Fedify-as-framework.

Assisted-by: Claude Code:claude-opus-4-8
Following a holistic review of the landing page, add the capabilities it
undersold, broaden the tooling story, and regroup the sections so related
beats sit together.

Content:

 -  Add a data-ownership section ("Your data, your schema"): your actors,
    posts, and followers stay in your own database and schema, read
    through dispatcher callbacks, while Fedify keeps only its internal
    state in a pluggable KvStore (in memory, or Redis, PostgreSQL, MySQL,
    SQLite, Deno KV, or Cloudflare Workers KV). This is the clearest proof
    of the framework-yet-modular positioning.
 -  Broaden the CLI section into a developer-tooling beat: add the
    fedify tunnel command, and mention @fedify/lint (catches common
    federation mistakes) and @fedify/debugger (a live inbox and outbox
    dashboard) so the whole development loop is visible.
 -  Drop the lone first-person voice ("We implement it" becomes "Fedify
    implements it") and the mild overclaim "every time" from the
    vocabulary point.

Order:

 -  Pair the two "fits into your app" beats by moving the data-ownership
    section up next to the web framework section (your framework, then
    your data), which also separates the framework and interop logo walls
    with a text section for better rhythm.
 -  Move the CLI tooling beat ahead of observability, following the
    natural build-then-operate progression.
 -  Section background banding still alternates throughout.

Assisted-by: Claude Code:claude-opus-4-8
Assisted-by: Codex:gpt-5.2-codex
The vocabulary, observability, and ActivityPub API sections marked each
list item with the same generic checkmark, which read like a checkbox
and carried no meaning.  Replace it with a per-item Lucide icon, drawn
from the lucide-vue-next set already used by the stack and delivery
sections, and restyle the icon badge to match those sections (a brand
colored line icon on a soft tint with a subtle border) rather than the
solid blue check.

Icon choices:

 -  Vocabulary: badge-check, shapes, external-link, shield-check.
 -  Observability: activity, gauge, plug, scroll-text.
 -  ActivityPub API: webhook, key-round, blocks.

Every icon name was checked against the installed lucide-vue-next
declarations before use, and all three sections were verified in light
and dark.

Assisted-by: Claude Code:claude-opus-4-8
@dahlia dahlia added this to the Fedify 2.3 milestone Jun 17, 2026
@dahlia dahlia self-assigned this Jun 17, 2026
@netlify

netlify Bot commented Jun 17, 2026

Copy link
Copy Markdown

Deploy Preview for fedify-json-schema ready!

Name Link
🔨 Latest commit 7fc695d
🔍 Latest deploy log https://app.netlify.com/projects/fedify-json-schema/deploys/6a33a6e8782a4b000847d192
😎 Deploy Preview https://deploy-preview-809--fedify-json-schema.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b3d08003-47f6-4689-8862-ca1342f90d25

📥 Commits

Reviewing files that changed from the base of the PR and between ec739d4 and 7fc695d.

⛔ Files ignored due to path filters (2)
  • docs/public/logos/botkit.svg is excluded by !**/*.svg
  • docs/public/logos/drfed.svg is excluded by !**/*.svg
📒 Files selected for processing (2)
  • docs/.vitepress/config.mts
  • docs/.vitepress/theme/components/HomeLanding.vue

📝 Walkthrough

Walkthrough

Upgrades the docs site from VitePress 1 to VitePress 2 alpha, adds a custom HomeLanding Vue component registered globally via theme wiring, introduces Fedify brand color tokens and Bricolage Grotesque typography in a new brand.css, replaces the default home page layout with HomeLanding, and adjusts Twoslash language preloading and JSR plugin registration order.

Changes

VitePress 2 Upgrade and Custom Landing Page

Layer / File(s) Summary
Dependency upgrades and peer rule
docs/package.json, pnpm-workspace.yaml
Adds @fontsource-variable/bricolage-grotesque and @lucide/vue; upgrades @shikijs/vitepress-twoslash to ^3.23.0, vitepress to ^2.0.0-alpha.17, and related plugins; adds peerDependencyRules to silence the vitepress-plugin-mermaid VitePress 2 peer warning.
Brand tokens and typography CSS
docs/.vitepress/theme/brand.css
Defines --vp-c-brand-* CSS variables for light and dark modes, applies Bricolage Grotesque font with optical sizing and letter-spacing to .vp-doc h1/h2/h3, and sets padding-top: 0 on .VPContent.is-home.
HomeLanding component registration and font imports
docs/.vitepress/theme/index.ts
Imports HomeLanding, Bricolage Grotesque variable font, and brand.css into the theme entry; registers HomeLanding globally so pages can set layout: HomeLanding in frontmatter.
Landing page switched to HomeLanding layout
docs/index.md
Changes frontmatter from layout: home to layout: HomeLanding, adds isHome: true, and removes the previous hero/features/sponsors body content.
VitePress config: nav cleanup, head metadata, Twoslash languages, plugin order
docs/.vitepress/config.mts
Removes the "Quick demo" tutorial nav entry, dynamically builds Open Graph and Twitter card metadata in head, adds an explicit Shiki language preload list for Twoslash, and reverses jsrRefPlugins registration order with toReversed().

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

Suggested labels

type/documentation

Suggested reviewers

  • sij411
  • 2chanhaeng
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: upgrading VitePress to version 2 and adding a custom landing page, which are the two primary objectives of the PR.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering the VitePress upgrade, branding implementation, landing page design, and technical details about dependencies and configuration changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request upgrades VitePress to version 2 (alpha) along with its related plugins, introduces a custom home landing layout (HomeLanding) with custom brand styling and the Bricolage Grotesque font, and preloads markdown languages to prevent rendering errors. Additionally, several SVG logos are added, and peer dependency rules are adjusted for compatibility. Feedback on the changes highlights that the newly added lucide-vue-next package is deprecated and suggests replacing it with the official @lucide/vue package.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread docs/package.json Outdated
@codecov

codecov Bot commented Jun 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.
see 16 files with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

The docs landing page imported its icons from lucide-vue-next, which npm
now marks as deprecated ("Package deprecated. Please use @lucide/vue
instead.").  Move the dependency to @lucide/vue and update the import in
the landing page component; every icon the page uses exists in the new
package.

The package was pinned at ^1.20.0, the current release.  The review
suggested ^0.475.0, but that version predates the rename and is not the
latest.

fedify-dev#809 (comment)

Assisted-by: Claude Code:claude-opus-4-8
@dahlia

dahlia commented Jun 17, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request upgrades VitePress to version 2 (alpha) and introduces a custom landing page layout (HomeLanding) along with brand theming, display typography (Bricolage Grotesque), and new SVG logos. It also updates dependencies, configures preloaded languages in docs/.vitepress/config.mts to prevent Shiki highlighting errors, and adds peer dependency rules for Mermaid. Feedback suggests sorting the newly added languages array alphabetically to improve maintainability.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread docs/.vitepress/config.mts
@dahlia dahlia requested review from 2chanhaeng and sij411 June 18, 2026 00:22
The site used GitHub's generic repository preview as its og:image, so
shared links carried no brand identity.  Replace it with a 1200x630 card
(docs/public/og.png) that matches the new landing page: the logo, the
Fedify wordmark in the brand gradient, the "Build for the fediverse,
skip the boilerplate." tagline, and a fedify.dev footer.

Point og:image at the new card and add og:image:width, height, type,
and alt, og:type, and twitter:card (summary_large_image) with
twitter:image so it renders as a large card on services that read the
Twitter tags.  The image URL is absolute against fedify.dev, as Open
Graph requires.

Assisted-by: Claude Code:claude-opus-4-8

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/.vitepress/config.mts (1)

377-379: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Consider adding a comment explaining why plugins are reversed.

The reversal of jsrRefPlugins affects the order in which plugins process markdown. Adding a brief comment explaining why reverse order is necessary would help future maintainers understand this non-obvious choice.

📝 Suggested comment
-    for (const jsrRefPlugin of jsrRefPlugins.toReversed()) {
+    // Register JSR ref plugins in reverse order so that more specific packages
+    // (e.g., `@fedify/vocab`) take precedence over broader ones (e.g., `@fedify/fedify`).
+    for (const jsrRefPlugin of jsrRefPlugins.toReversed()) {
       md.use(jsrRefPlugin);
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/.vitepress/config.mts` around lines 377 - 379, The loop that iterates
through jsrRefPlugins using toReversed() lacks a comment explaining why the
plugins must be processed in reverse order, which is non-obvious to future
maintainers. Add a brief comment immediately before the for loop that explains
why jsrRefPlugins.toReversed() is necessary and how the reverse order affects
the plugin processing behavior, making the code's intent clear to developers who
maintain it later.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/.vitepress/config.mts`:
- Around line 377-379: The loop that iterates through jsrRefPlugins using
toReversed() lacks a comment explaining why the plugins must be processed in
reverse order, which is non-obvious to future maintainers. Add a brief comment
immediately before the for loop that explains why jsrRefPlugins.toReversed() is
necessary and how the reverse order affects the plugin processing behavior,
making the code's intent clear to developers who maintain it later.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7069c939-1bc2-4b74-a5db-7aae87b20a8f

📥 Commits

Reviewing files that changed from the base of the PR and between c592d11 and 0574ba5.

⛔ Files ignored due to path filters (1)
  • docs/public/og.png is excluded by !**/*.png
📒 Files selected for processing (1)
  • docs/.vitepress/config.mts

dahlia added 2 commits June 18, 2026 12:12
On narrow screens the landing page code samples were cut off on the
right.  The non-wrapping <pre> blocks have overflow-x: auto, but their
grid and flex tracks lacked min-width: 0, so instead of scrolling the
blocks widened past the viewport and the page's overflow: clip cut them
off.  Add min-width: 0 to the code window, the terminal, and the
vocabulary demo column so each block stays within its column and the
existing horizontal scroll engages.

On phones the samples no longer fit on one line at all, so wrap them
there rather than scrolling: at most 600px wide the code switches to
white-space: pre-wrap with overflow-wrap: anywhere, which also breaks
otherwise unbreakable tokens such as the full ActivityStreams IRI in the
vocabulary demo.  The desktop layout is unchanged.

Assisted-by: Claude Code:claude-opus-4-8
The og:image and twitter:image tags were hard-coded to
https://fedify.dev/og.png, the stable host.  The docs also deploy to an
unstable site and to PR previews, each built with SITEMAP_HOSTNAME set
to its own URL, and og.png only reaches the stable site on a tagged
release.  So those non-stable deploys served pages whose image tag
pointed at fedify.dev, where the file did not exist yet, which is the
404.

Derive the absolute image URL from SITEMAP_HOSTNAME (falling back to
https://fedify.dev/ for local builds) so it matches whichever host is
serving the page.  The og.png itself lives in docs/public, so every
build already emits it at the site root.

Assisted-by: Claude Code:claude-opus-4-8
BotKit, a framework for building ActivityPub bots, and DrFed, a
web-based ActivityPub debugging platform, are sister projects built on
Fedify by the same team.  Add a quiet line to the landing footer, under
the community and sponsors lines, that links to both with their small
logos.  It is deliberately understated rather than a feature section, so
it reads as a footnote about the wider family rather than competing with
Fedify's own pitch.

Assisted-by: Claude Code:claude-opus-4-8
@github-actions

Copy link
Copy Markdown
Contributor

Pre-release has been published for this pull request:

Packages

Package Version JSR npm
@fedify/fedify 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/cli 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/amqp 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/astro 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/cfworkers 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/create 2.3.0-pr.809.39+f65f60c0 npm
@fedify/debugger 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/denokv 2.3.0-pr.809.39+f65f60c0 JSR
@fedify/elysia 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/express 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/fastify 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/fixture 2.3.0-pr.809.39+f65f60c0 JSR
@fedify/fresh 2.3.0-pr.809.39+f65f60c0 JSR
@fedify/h3 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/hono 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/init 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/koa 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/lint 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/mysql 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/nestjs 2.3.0-pr.809.39+f65f60c0 npm
@fedify/next 2.3.0-pr.809.39+f65f60c0 npm
@fedify/nuxt 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/postgres 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/redis 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/relay 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/solidstart 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/sqlite 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/sveltekit 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/testing 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/uri-template 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/vocab 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/vocab-runtime 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/vocab-tools 2.3.0-pr.809.39+f65f60c0 JSR npm
@fedify/webfinger 2.3.0-pr.809.39+f65f60c0 JSR npm

Documentation

The docs for this pull request have been published:

https://2ff11e56.fedify.pages.dev

A review noted that the jsrRefPlugins.toReversed() loop gave no reason
for iterating in reverse, which is easy to misread as accidental.  Add a
comment recording the rationale behind the earlier priority fix: the
package list is ordered by precedence, but a later-registered jsrRef
plugin overrides earlier ones for the same reference, so the plugins are
applied in reverse to let the first-listed package win.  No behavior
change.

Assisted-by: Claude Code:claude-opus-4-8
@dahlia dahlia merged commit 35dea44 into fedify-dev:main Jun 18, 2026
21 checks passed
@dahlia dahlia deleted the docs/renewal branch June 18, 2026 09:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants