156 Commits

Author SHA1 Message Date
Ricardo
cd587282f2 fix: add options property to syndicator for Indiekit compatibility
Indiekit's endpoint-posts accesses target.options.checked directly on
syndicator objects. Upstream syndicators are class instances with
this.options from the constructor. Our plain-object syndicator lacked
this property, causing a 500 TypeError on post creation.
2026-02-19 00:27:53 +01:00
Ricardo
43549c6334 fix: restructure locale keys to use proper nesting for migrate section
The i18n system resolves dots as nested path separators, but migrate
keys were flat strings with dots in the key name. Restructure migrate
as a nested object with a title sub-key.
2026-02-18 23:50:02 +01:00
Ricardo
deb9cb54a3 fix: prefix view templates to avoid Nunjucks name collisions
Rename all views to activitypub-*.njk to prevent collisions with other
plugins that have dashboard.njk (podroll). Fix all new Date() calls to
use .toISOString() per Indiekit convention. Add try-catch in syndicator
to prevent delivery failures from crashing post creation.
2026-02-18 23:10:35 +01:00
Ricardo
b551d82a21 fix: use Express 5 wildcard syntax for content negotiation route
Express 5 uses path-to-regexp v8 which requires named wildcards.
Bare "*" is no longer valid — use "{*path}" instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 22:37:32 +01:00
Ricardo
4350010d5d fix: remove filePath getter that conflicts with Indiekit plugin loader
Indiekit's getInstalledPlugins() assigns plugin.filePath via require.resolve().
Our getter made the property read-only, causing:
  TypeError: Cannot set property filePath which has only a getter

Let Indiekit set it instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 22:29:26 +01:00
Ricardo
da625592fd feat: ActivityPub federation endpoint for Indiekit
Implements full ActivityPub federation as an Indiekit plugin:
- Actor document (Person) with RSA key pair for HTTP Signatures
- WebFinger discovery (acct:rick@rmendes.net)
- Inbox: handles Follow, Undo, Like, Announce, Create, Delete, Move
- Outbox: serves published posts as ActivityStreams 2.0
- Content negotiation: AS2 JSON for AP clients, passthrough for browsers
- JF2-to-AS2 converter for all Indiekit post types
- Syndicator integration (pre-ticked checkbox for delivery to followers)
- Mastodon migration: alias config, CSV import for followers/following
- Admin UI: dashboard, followers, following, activity log, migration page
- Data retention: configurable TTL on activities, optional raw JSON storage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 22:13:51 +01:00