The site had picture containers but no post containers
the deep one
Watched working
For a long time a published photograph was stored as a bare image, not as a post. That sounds like an internal detail; it wasn’t. With no post to hang things on, a photo’s ownership, its date, its comments and likes, the collections it belonged to, and its identity out on the fediverse had no single home. Comments imported from Flickr were written against the picture instead of the post and came unstuck from it. Post counts collapsed to near-zero on photoblogs. A profile with thousands of live photos reported “no posts yet.” A repair tool kept having to convert loose photos into posts, and sites kept drifting back.
The going-forward fix: posting a new photo now creates a real post in the background, built to match exactly what the repair tool and the poster already produced, so nothing else on the site can tell the difference — and web addresses never change, so federation stays stable. The deeper remediation is a proper post-model inventory with a transactional conversion.
One tail still being tidied: a batch of older comments are still being moved across from the photo to the post. They’re real people’s words, so it’s being done carefully rather than rushed.
Read the full report →
Background jobs ran inside web requests and took whole sites down
the 524 outages
Watched working
To pace out fediverse deliveries kindly, the code slept between them — but it was doing that inside a live web request. Each pause held a web-server worker hostage; enough of them piling up starved the pool, and the entire site timed out with a Cloudflare 524, even on a plain page load. A related version leaned on ordinary visitors to do background work, which made photoblog pages hang and 524 as well.
The fix wasn’t to patch it — it was to remove the feature that leaned on page loads. That work now runs through the desktop tools and proper scheduled jobs instead, never a visitor’s page view. File backups now go through the desktop side; and you can always pull your files straight off the server yourself by FTP or SFTP. The sites stopped timing out.
Watched working: the outages stopped once the feature was pulled — confirmed on live sites.
Read the full report →
Deliveries that landed on a web page counted as “delivered”
“Wrong Door”
Fixed — confirming
Some follower records held an old, wrong delivery address that quietly rendered the site’s homepage — a normal 200 OK. The sender read that 200 as success, ticked the post off, deleted it from the queue, and the post simply vanished. This is the exact reason SnapSmack-to-SnapSmack followers never received the Photo Friday prompt cards while Mastodon and Pixelfed followers got them fine.
Now a success that comes back as a full web page is treated as a failure — “not an inbox” — and on that failure the sender re-fetches the follower’s live address, rewrites the wrong one, and knocks on the right door next pass. No manual unfollow-and-refollow needed. The lesson underneath it drives everything below: a 2xx proves the pipe carried the bytes, never that the other end kept the post.
Confirming: the site itself now confirms the delivery landed, but we haven’t yet run it end-to-end through the test lab to watch a post travel the whole way. That’s the remaining step.
Read the full report →
Incoming fediverse activity arrived, passed checks, then vanished
“Signed Receipt”
Fixed — confirming
Something coming in from another fediverse server — a post, a like, a reply — could arrive, pass its signature check, and still disappear: because it came from an account we weren’t following, or was a duplicate, or the save failed and the error was swallowed. Every one of those read exactly like “never delivered” while someone hunted for a lost post. You can’t fix what you can’t see, and this class of bug was invisible.
Every inbound item now leaves a receipt in the interactions log saying what happened to it — ingested, ignored and why, a duplicate suppressed, a reply routed — so a drop is now something you can read instead of a mystery. Several of the federation fixes on this page were only findable after this went in.
Read the full report →
The default network relay pointed at a machine that no longer existed
retired box
Fixed — confirming
The built-in default relay address still named a standalone server that had been decommissioned. Any install that hadn’t set its own relay address — including the fleet hub — aimed every join at a dead inbox, and every join silently failed with no error to show for it. The default now points at the live network actor; an explicit per-site address still overrides it.
Confirming: the default is corrected in the code; we haven’t yet watched a fresh install join the relay cleanly on that new default alone.
Read the full report →
The scheduled jobs looked registered while pointing at yesterday’s door
the cron drift
Fixed — confirming
Federation quietly stopped across the whole fleet for about two days, and it looked like several separate features breaking at once — new follows got no catalogue, posts never pushed, the version check went silent. It was one cause: the scheduled jobs still existed, but the command each one ran pointed at a script path that no longer existed after a deploy moved the install directory. A check that only asks “is the job registered?” said yes — the job was registered to run nothing.
The command-level checker (not just a heartbeat) exposed it, the jobs were re-registered across the hub and all 24 spokes, and a permanent self-heal shipped so a deploy re-points every job to the current path. The repair was watched working — a hub run completed and a backfill test landed end to end — but the durable fix isn’t deployed fleet-wide yet.
Read the full report →
Adding a blog to the fleet never actually made it follow the others
discovery ≠ connection
Fixed — confirming
The fleet is meant to be all-to-all: every blog follows every other, so a post on one reaches the rest. It wasn’t. Blogs had been added to the fleet’s roster — the list of who exists — but adding them never established the actual follow relationships. Being on the list is not being connected, and nothing ever did the connecting: about 180 of the 600 relationships a 25-blog network needs were simply never made.
The missing follows were added back through each site’s own controls (adding only, never deleting anyone’s external follows), and a permanent reconciler now fills one missing peer per cron tick. All 600 relationships now exist and a backfill test landed end to end; the durable reconciler ships in the same build that isn’t deployed fleet-wide yet.
Read the full report →