Shared feed
Community-sourced bot reports — on by default, a challenge rather than a block; sharing your own is opt-in.
unmask installs can opt in to share their BAN button decisions with the
community feed. Pulling and enforcing the feed is on by default: installs
challenge matching IP / JA4 / IP+JA4 pairs unless the operator sets the feed to
browse-only or off. By default a match gets a proof-of-work step and then a CAPTCHA,
so a person caught by a wrong report can still get through; operators who trust the
feed can choose deny instead.
📤 Submit (opt-in per BAN)
In admin → settings → Community Bans, agree to the terms once.
The BAN button on the hunt page then includes a Share checkbox
and a 280-char comment field.
Submissions are tied to a pseudonymous token, not an account: no email, no name. You can stop sharing any time, and entries rotate out of the public feed a fixed period after their most recent report (see the privacy policy).
📥 Subscribe (on by default)
subscribe_mode defaults to fetch_apply: unmask pulls the feed
every hour and enforces matches. Set it to fetch to pull for the browse
list only, or off to stop. A match gets the Community Bans action,
pow_then_captcha by default (captcha_only, pow_only
and deny can be selected); search bots and bypass IPs are always exempt.
Pulling starts with a one-time registration with the hub; the
privacy policy lists what it stores.
Browse what you’re currently pulling at /admin/community-bans/.
How a report becomes a feed entry
- An admin presses BAN on the hunt page with
Sharechecked. - The IP / JA4 / reason / comment, and which kind of BAN it was, travel to the hub over TLS.
- The hub aggregates by (IP, JA4) and scores the reports with rule-based checks; it can also ask an AI model for a second opinion.
- When the reports meet the hub's rules (typically, enough independent installs reporting the same target), the hub publishes the entry with one of three match kinds —
ip_ja4,ja4_only, orip_only. - Installs that enforce the feed (the default) fetch it on their next hourly pull and challenge matching requests (with the nginx module, from the next nginx reload).
deny.
unmask.sh, run by the unmask project as a separate service; the hub
software is not part of the unmask package. If you would rather not use the shared
feed, set subscribe_mode to off.
Raw feed JSON: https://unmask.sh/api/feed/list.json
(= all aggregated entries, including reports-only rows; 30s cache).
There is no local score threshold: which entries are enforced is decided on the hub.