Bug: actor avatar changes do not notify ActivityPub followers #38
Labels
No labels
activitypub
actor
admin
ai-safety
article
articles
atproto
bug
cli
configuration
content
dev-environment
docker
enhancement
feature
federation
fediverse
forgejo
garage
health
how-to
logging
markdown
mastodon
media
navigation
opengraph
passkeys
preview
priority:medium
production
release
rendering
s3
settings
setup
status:active
status:done
status:inprogress
technical
webauthn
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
erik/slugkit.com#38
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Changing the actor avatar image at
https://slugkit.com/settings/actorupdates local actor/profile settings but does not notify ActivityPub followers, so remote followers such as Mastodon do not receive/update the new avatar.Observed remote target:
mastodon.online/@evcraddock/ Mastodon follow relationship for theslugkit.comactorExpected behavior
When the actor avatar is changed in settings:
Updatefor the actor is delivered to followers.Scope
Updateactivities.Acceptance criteria
/settings/actortriggers an ActivityPub actorUpdatedelivery to followers.Synced from todu comment by @todu on 2026-06-28T16:01:16.444Z
Additional requirement: actor settings logging
While investigating via k3s pod logs, we found successful actor/settings changes are not currently logged. That makes it hard to verify whether an avatar change happened, whether ActivityPub delivery was attempted, or whether a remote follower update failed.
Add logging as part of this task:
Updatedelivery is enqueued/attempted after actor settings changes.Acceptance criteria addition:
/settings/actorproduces a structured log entry for the settings change.Synced from todu comment by @todu on 2026-06-28T16:13:04.328Z
Implementation PR #39
Opened and reviewed approved:
erik/slugkit.com#39— Notify ActivityPub followers on actor updatesChanges:
/settings/actorsaves now call ActivityPub actorUpdatedelivery after saving local actor/account settings.icon, banner image, profile attachments, inbox/outbox/followers/following/featured URLs, and shared inbox endpoint.updatedAttimestamp so repeated profile/avatar changes are not deduped by remotes.Verification passed:
npm run typechecknpm testnpm run buildProcess note:
mainby mistake. I repaired this without force-pushing by reverting that commit onmain, then cherry-picking the implementation ontotask-d213c262-actor-update-deliveryand opening PR #39 normally. Current PR contains the intended changes.Synced from todu comment by @todu on 2026-06-28T16:33:34.776Z
Production deploy findings after
web-v0.1.24The new logging confirmed the settings path and delivery path were running, but Mastodon rejected delivery.
Observed logs:
slugkit settings: actor saved { actorUsername: 'slug', actorId: 1, changedFields: [ 'avatar' ] }slugkit ActivityPub actor update delivery started ... followerCount: 1slugkit ActivityPub actor update delivery queued ... followerCount: 1ActivityPub outbound delivery failed ... 401 Unauthorized ... {"error":"Public key not found for key https://slugkit.com/users/slug#multikey-1"}Additional deployment note:
Recreate, plus Flux/image automation reconciliation causing extra pod churn. There was a zero-ready-pod window while the new pod started.Hotfix PR opened and reviewed approved:
erik/slugkit.com#40— Use ActivityPub main key for HTTP signaturesChange:
#main-keyinstead of#multikey-1.publicKey.id = https://slugkit.com/users/slug#main-keyin the actor document.#main-keyand not#multikey-1.Verification passed:
npm run typechecknpm test -- --run src/federation/__tests__/delivery.test.ts src/federation/__tests__/routes.test.tsnpm testnpm run buildNext after merge/release/deploy:
#multikey-1.Synced from todu comment by @todu on 2026-06-28T16:48:33.936Z
Correction: PR #40 was wrong
Closed task
task-becaf72balready established the key behavior:https://slugkit.com/users/slug#multikey-1.#main-keywas rejected by Mastodon.#multikey-1.PR #40 changed signing back to
#main-key, which regressed that known fix. Production logs afterweb-v0.1.25confirmed Mastodon rejected#main-keytoo.Opened and reviewed approved:
erik/slugkit.com#41— Revert main-key ActivityPub signature regressionVerification passed:
npm run typechecknpm test -- --run src/federation/__tests__/delivery.test.ts src/federation/__tests__/routes.test.tsnpm testnpm run buildNext: merge/release/deploy #41 to restore known-working outbound signing, then investigate actor Update-specific failure with
#multikey-1without changing the global signing key behavior again.Synced from todu comment by @todu on 2026-06-28T16:58:11.966Z
Revert released/deployed
Merged PR #41, released
web-v0.1.26, and deployedevcraddock/slugkit-com:0.1.26.Details:
cb11340#32succeededevcraddock/slugkit-com:0.1.26This restores the known-working outbound ActivityPub signing key behavior from
task-becaf72b: delivery signatures use#multikey-1, not#main-key.Task remains open because actor avatar Update delivery still needs investigation/fix without regressing the global signing key behavior.
Synced from todu comment by @todu on 2026-06-28T17:14:34.189Z
Replacement fix PR #42
Opened and reviewed approved:
erik/slugkit.com#42— Send actor updates with keyed Fedify actor objectWhat changed from the broken PR #39 implementation:
buildLocalActivityPubActorObject(...).publicKey/#main-key/publicKeyPemassertionMethod/#multikey-1/publicKeyMultibase#multikey-1path fromtask-becaf72b.Verification passed:
npm run typechecknpm test -- --run src/routes/__tests__/admin-activitypub.test.ts src/federation/__tests__/routes.test.ts src/federation/__tests__/delivery.test.tsnpm testnpm run buildImportant deploy note:
Public key not found, force a remote actor refetch/re-follow flow before assuming the new payload is still wrong.Synced from todu comment by @todu on 2026-06-28T17:38:37.371Z
PR #42 released/deployed
Merged PR #42, released
web-v0.1.27, and deployedevcraddock/slugkit-com:0.1.27.Details:
9db5e5b#33succeededevcraddock/slugkit-com:0.1.27Next verification order:
slugand verify normal Mastodon fanout.Public key not found, treat Mastodon remote actor/key cache as poisoned and force refetch/re-follow.Synced from todu comment by @todu on 2026-06-28T18:55:20.462Z
Completed and verified
Released/deployed fixes through
web-v0.1.32.What changed:
/settings/actorsaves trigger ActivityPub actorUpdatedelivery to followers with structured logs.actor.updatedAt, so repeated actor saves produce unique IDs.publicKeyonly, served at/activitypub/keys/{actor}/main-key, and signing delivery withacct:{actor}@{domain}so Mastodon refreshes the cached account key correctly.Verification:
evcraddock/slugkit-com:0.1.32.publicKey.id = https://slugkit.com/activitypub/keys/slug/main-key;assertionMethodomitted.following: true,requested: false.activitypub-test-20260628185052; Mastodon account statuses show it as latest status./settings/actor; logs show:slugkit settings: actor savedslugkit ActivityPub actor update delivery startedslugkit ActivityPub actor update delivery queuedTests run on final changes:
npm run typechecknpm testnpm run build