Skip to content

Account migration (Move activity) resulted in significant follower loss #428

@CR0CKER

Description

@CR0CKER

Summary

When migrating a Mastodon-compatible account to Hollo via the ActivityPub Move activity, a large fraction of followers who processed the Move on their side (unfollowed the old account) never appeared as followers on the Hollo instance. Four affected users independently reported seeing a "pending" follow request for the Hollo account on their end. Hollo's logs contain no record of ever receiving Follow activities from any of these four users around the time of the migration — the Follow requests were sent by their servers but never arrived at Hollo's inbox.


Environment

  • Hollo version: 0.7.10
  • Fedify version: 1.10.8 (from lockfile)
  • Node.js: 22.22.2
  • PostgreSQL: 15 (with any_value aggregate installed manually)
  • Platform: CentOS 7 (kernel 3.10, glibc 2.17) on shared hosting
  • Reverse proxy: nginx, BEHIND_PROXY=true, BIND=0.0.0.0

Migration history

The account went through two consecutive migrations a few days apart:

  1. @johndoe@mastodon-instance.tld@johndoe@social.domain.tld (snac2 self-hosted)
  2. @johndoe@social.domain.tld@johndoe@hollo.domain.tld (Hollo self-hosted)

At the time of the snac2 → Hollo Move, @johndoe@hollo.domain.tld had the alsoKnownAs field correctly set to include https://social.domain.tld/johndoe (verified from the live actor JSON). The account has never had protected enabled (protected = false in the database throughout).


Verified observations

On the snac2 side (old instance logs):

  • The snac migrate command delivered the Move activity to 985 inboxes at approximately 14:55 on 2026-04-10
  • Within ~10 minutes, 803 remote accounts processed the Move and sent Undo Follow activities back to snac2 ("no longer following us" log entries)
  • snac2's follower count dropped from ~985 to ~8

On the Hollo side (database):

SELECT 
  DATE(created) AS day,
  EXTRACT(HOUR FROM created) AS hour,
  COUNT(*) AS follows
FROM follows f
JOIN accounts a ON a.id = f.following_id
WHERE a.handle = '@johndoe@hollo.domain.tld'
  AND approved IS NOT NULL
GROUP BY day, hour
ORDER BY day, hour;
day hour follows
2026-04-10 13 1
2026-04-10 14 214
2026-04-10 15 30
2026-04-10 16 1
2026-04-10 23 1
2026-04-11 7 1
2026-04-11 18 3
2026-04-11 19 11
SELECT
  COUNT(*) FILTER (WHERE approved IS NULL) AS pending,
  COUNT(*) FILTER (WHERE approved IS NOT NULL) AS accepted
FROM follows f
JOIN accounts a ON a.id = f.following_id
WHERE a.handle = '@johndoe@hollo.domain.tld';
pending accepted
0 262

Summary of the gap:

  • 803 accounts unfollowed snac2 after the Move
  • 262 accounts appear as accepted followers on Hollo
  • ~541 accounts unfollowed the old instance but are absent from Hollo's database entirely

Four users on different remote instances reported that their Mastodon client showed a "pending" follow request for @johndoe@hollo.domain.tld after the Move was processed. All four have since cancelled their pending requests and re-followed manually, which was accepted. Searching Hollo's full log file for all activity associated with these four accounts, the first appearance of any of them is their Undo Follow activity on 2026-04-11, when they cancelled the pending request. There is no log entry showing Hollo received a Follow activity from any of these four users at any earlier point — in particular, nothing around 14:55–15:30 on 2026-04-10 when the Move was processed and the bulk of follow requests arrived.


Notes

This issue was investigated by querying the Hollo PostgreSQL database, cross-referencing follower lists between the old and new instances, and analysing server logs from both snac2 and Hollo. The investigation and this bug report were produced with the assistance of Claude Code, which was used to query the database, cross-reference follower lists, analyse log files, and summarise the findings. I've checked and revised the report carefully so it reflects what happened to the best of my knowledge.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdependenciesPull requests that update a dependency fileperformance

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions