The "Also on fediverse" widget was passing the blog post URL directly
to authorize_interaction. If a static file server intercepts the request
before Node.js, the remote instance gets HTML instead of AP JSON and
shows "Could not connect to the given address".
Now fetches /activitypub/api/ap-url first to get the Fedify-served AP
object URL (/activitypub/objects/…), which is always routed to Node.js
and reliably returns AP JSON. Falls back to the original URL on error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The @keydown.tab handler in fediverse-modal.njk contained complex
inline JS with arrow functions, querySelector strings with escaped
quotes, and comparison operators — all of which confused
html-minifier-terser's HTML parser, causing parse errors on every
page that includes the modal (i.e., nearly every page).
Moved the focus-trap logic to a trapFocus() method on the Alpine
component where it belongs.
Confab-Link: http://localhost:8080/sessions/edb1b7b0-da66-4486-bd9c-d1cfa7553b88
- Replace single localStorage string with versioned multi-domain store
(fediverse_domains_v1) with usage tracking, inspired by Mastodon's
share.joinmastodon.org project
- Add domain validation via URL constructor before redirecting
- Add mode param to fediverseInteract component: "interact" for
authorize_interaction, "share" for /share?text=...
- Migrate old fediverse_instance key automatically on first load
- Extract shared modal partial (fediverse-modal.njk) used by post
interaction, follow widget, and share widget
- Share widget now prompts visitors for their own instance instead of
hardcoding site owner's Mastodon instance
Confab-Link: http://localhost:8080/sessions/0ec83454-d346-4329-8aaf-6b12139bf596
nodes.fediverse.party doesn't send CORS headers, so the fetch fails
from the browser. Remove autocomplete entirely — users type their
instance once and localStorage remembers it.
Add a Fediverse button to the "Also on" footer for posts syndicated via
self-hosted ActivityPub. Clicking it redirects users to their own instance
via authorize_interaction so they can like/boost/reply natively. Instance
is stored in localStorage for repeat visits, with a modal for first-time
entry and Shift+click to change.
Also adds branded syndication buttons for LinkedIn and IndieNews, and
replaces the heuristic Mastodon URL detection with exact matching against
the configured MASTODON_INSTANCE.