New articles: - pihole-doh-dot-bypass-defense - pihole-v6-adlist-management - mastodon-db-maintenance - mastodon-federation - fantastical-google-phantom-calendar-syncselect - rsync-tailscale-teardown-stall - ollama-chat-template-pipe-stdin-bypass Updated: wsl2-backup, wsl2-rebuild, ssh-config-key-management, selfhosting index, mastodon-instance-tuning, ansible-check-mode, windows-openssh, windows-sshd, yt-dlp, README, SUMMARY, index Removed: fedora-usrmerge-ebtables-blocker (superseded by prior push)
168 lines
5.8 KiB
Markdown
168 lines
5.8 KiB
Markdown
---
|
|
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: <key-from-bitwarden>" \
|
|
-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
|