--- title: Mastodon Federation — Domain Blocks, Silencing, and FediSeer domain: selfhosting category: services tags: - mastodon - federation - fediverse - domain-blocks - fediseer - majortoot status: published created: 2026-04-22 updated: 2026-04-22 --- # Mastodon Federation — Domain Blocks, Silencing, and FediSeer ## Domain Block Severity — Critical Gotcha The Mastodon admin UI labels severities as **Silence** and **Suspend**, but the integer values stored in the database are **not** in alphabetical order. The Rails enum is: ```ruby # app/models/domain_block.rb enum :severity, { silence: 0, suspend: 1, noop: 2 }, validate: true ``` | DB value | Meaning | Effect | |----------|---------|--------| | `0` | **silence** | Instance limited — posts hidden from public timelines; follows require manual approval | | `1` | **suspend** | Full defederation — all content removed, all follows severed | | `2` | **noop** | No effect — entry tracked but no federation action taken | > [!warning] Don't trust raw integer queries > If you query `domain_blocks` directly via psql, severity `0` looks like "the lowest level" but it's actually **silence** — a meaningful restriction. Always map through the enum. This tripped up a defederation investigation on 2026-04-22 where 13 silenced instances (including mastodon.social) were initially misread as noop. ### majortoot block inventory (as of 2026-04-22) | Severity | Count | Notable entries | |----------|-------|-----------------| | silence (0) | 13 | mastodon.social, mastodon.world, chaos.social, fosstodon.org, tech.lgbt, threads.net | | suspend (1) | 413 | Full defederation list | | noop (2) | 0 | — | --- ## How Silencing Affects Follows When your instance silences a remote domain, **every follow request from that domain requires manual approval** — even if your account has `locked = false`. This is enforced in `app/lib/activitypub/activity/follow.rb`: ```ruby if target_account.locked? || @account.silenced? LocalNotificationWorker.perform_async(target_account.id, follow_request.id, 'FollowRequest', 'follow_request') ``` `@account.silenced?` returns true when the sending account's domain is in your `domain_blocks` at severity=0. The follow goes to the follow_requests queue instead of being automatically accepted. **Practical effect on majortoot:** mastodon.social is silenced (added 2026-12-11, same day as a FluentInFinance follow-spam report). All follows from mastodon.social accounts appear as pending follow requests requiring manual approval. This is intentional — it's the expected behavior of a silence block. --- ## Checking Defederation Status ### Are major instances blocking you? Check if your domain appears in another instance's public block list: ```bash # Check mastodon.social's public block list (397 entries as of 2026-04-22) curl -s "https://mastodon.social/api/v1/instance/domain_blocks" | \ python3 -c "import sys,json; data=json.load(sys.stdin); \ found=[b for b in data if b['domain']=='toot.majorshouse.com']; \ print('BLOCKED' if found else 'Not in public block list')" ``` Note: instances can mark blocks as private, so absence from the public list is not a guarantee. ### Are you in their peer list? If you're in an instance's peer list, they've federated with you at some point: ```bash curl -s "https://mastodon.social/api/v1/instance/peers" | \ python3 -c "import sys,json; data=json.load(sys.stdin); print('toot.majorshouse.com' in data)" ``` ### Is the account visible from a remote instance? ```bash curl -s "https://mastodon.social/api/v1/accounts/lookup?acct=majorlinux@toot.majorshouse.com" | \ python3 -c "import sys,json; d=json.load(sys.stdin); print('limited:', d.get('limited'), 'suspended:', d.get('suspended'))" ``` `limited: true` means the remote instance has silenced toot.majorshouse.com. ### Check federation delivery health (Sidekiq) ```bash ssh root@100.110.197.17 "redis-cli llen sidekiq:dead; redis-cli llen sidekiq:retry" # Both should be 0 for a healthy instance ``` ### Check unavailable domains (delivery consistently failing) ```bash ssh root@100.110.197.17 " sudo -u postgres psql mastodon_production -c \ 'SELECT domain, updated_at FROM unavailable_domains ORDER BY updated_at DESC LIMIT 20;'" ``` These are domains where ActivityPub delivery has repeatedly failed. Most are dead instances, not active blocks. --- ## FediSeer Registration [FediSeer](https://fediseer.com) is a community service that tracks censures (formal complaints) against fediverse instances. Registering lets you monitor if any instance formally censures toot.majorshouse.com. ### majortoot status (registered 2026-04-22) | Field | Value | |-------|-------| | Domain | toot.majorshouse.com | | ID | 5575 | | State | UP | | Censures received | 0 | | Endorsements | 0 | | Tags | mastodon, selfhosted, leftist, foss | | Guarantor | none | | API key | Bitwarden — "FediSeer — toot.majorshouse.com" | ### Claiming / re-claiming your instance ```bash # Claim (sends API key via DM from @fediseer@fediseer.com) curl -s -X PUT "https://fediseer.com/api/v1/whitelist/toot.majorshouse.com" \ -H "Content-Type: application/json" \ -d '{"admin": "majorlinux", "pm_proxy": "MASTODON"}' # The API key arrives as a DM — delete the DM after saving to Bitwarden ``` ### Check censures ```bash curl -s "https://fediseer.com/api/v1/censures/toot.majorshouse.com" | python3 -c \ "import sys,json; d=json.load(sys.stdin); print('Censures:', d.get('total',0))" ``` ### Update tags ```bash curl -s -X PUT "https://fediseer.com/api/v1/tags" \ -H "Content-Type: application/json" \ -H "apikey: " \ -d '{"tags_csv": "mastodon,selfhosted,leftist,foss"}' ``` --- ## See Also - [[Mastodon]] — service doc - [[majortoot]] — server doc - [[mastodon-db-maintenance]] — statuses remove, accounts cull, vacuum - [[mastodon-instance-tuning]] — character limits, media cache