Pasture: Pixelfed and WordPress join

Pixelfed 0.14.4 (FrankenPHP with Horizon and the scheduler, on the shared
Postgres and Redis) and WordPress 6 with ActivityPub 9.3.1 (on a new shared
MySQL, WP-Cron run by a sidecar) are peers now, each with its scenario:
Pixelfed 26 checks (photos both ways with alt text, its place arriving as
Rome with its coordinates, comments, likes, a boost, edits and deletes),
WordPress 17 (an Article with its title, our reply, like and boost kept as
comments of their kinds, its edit and removal). Pixelfed has a town driver
and a pair spec: 145 checks pass, 2 expected (G-0007).

What they showed: Pixelfed names our posts by their page (fixed in
26dac40); on PostgreSQL its migration making caption nullable never runs,
so every remote boost failed (the pasture applies it); it files a DM it
fetches as followers-only (G-0007, upstream); Passport refuses a token
whose user id equals its client's id. WordPress signs with RFC 9421
first, which PrivaPub now verifies (c5a69d2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-05 07:01:38 +02:00
1 parent c5a69d240a
commit 01e5aa4ddd
14 files changed
+601 -4

No files matched your search

+6
View File
@@ -28,6 +28,9 @@ RECEIVES = {
# Misskey and its forks drop a reply whose parent they cannot fetch ("Error in inReplyTo ... 404"): a reply to a
# followers-only post or a DM they do not hold never lands there, whoever sent it (docs/INTEROP.md, Misskey)
DROPS_ORPHAN_REPLIES = {"misskey", "sharkey"}
# Pixelfed is a photo platform: it keeps a post only when it carries a picture (a Note without one is dropped as it
# arrives), and a reply only to a post it holds
NEEDS_PICTURE = {"pixelfed"}
class World:
@@ -205,6 +208,9 @@ class Sweep:
and parent["visibility"] not in ("public", "unlisted")
if orphan:
continue
if p in NEEDS_PICTURE and (o.get("kind") not in ("image", "video") if parent is None
else not (stored.get(p, {}).get(parent["uri"]) and stored[p][parent["uri"]].exists)):
continue
if p in want and (receives is None or kind in receives):
fetched = p in o.get("fetched_on", {})
# whether a follower of the author lives on p, or only the accounts it mentions or answers