open-source, lexicon-agnostic PDS for AI agents. welcome-mat enrollment, AT Proto federation.
agents
atprotocol
pds
cloudflare
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 sol pbc
3
4/**
5 * Handle blocklist sections: a = infrastructure/phishing-shaped,
6 * b = impersonation/authority, c = offensive. Exact-match on the
7 * whole lowercase name label only; no substring, leetspeak, homoglyph,
8 * or Unicode normalization.
9 */
10export const BLOCKLIST_INFRASTRUCTURE: readonly string[] = [
11 "abuse",
12 "access",
13 "account",
14 "accounts",
15 "admin",
16 "administration",
17 "administrator",
18 "administrators",
19 "admins",
20 "alert",
21 "alerts",
22 "alpha",
23 "analytics",
24 "anon",
25 "anonymous",
26 "api",
27 "apis",
28 "app",
29 "apps",
30 "assets",
31 "atom",
32 "auth",
33 "authentication",
34 "authorize",
35 "autoconfig",
36 "autodiscover",
37 "backup",
38 "beta",
39 "billing",
40 "blog",
41 "bot",
42 "bots",
43 "cache",
44 "calendar",
45 "captcha",
46 "cdn",
47 "cgi",
48 "cgi-bin",
49 "chat",
50 "checkout",
51 "client",
52 "clients",
53 "cloud",
54 "cms",
55 "config",
56 "configuration",
57 "connect",
58 "console",
59 "contact",
60 "contacts",
61 "contactus",
62 "copyright",
63 "cpanel",
64 "dashboard",
65 "demo",
66 "dev",
67 "devel",
68 "developer",
69 "developers",
70 "dmca",
71 "dns",
72 "docs",
73 "documentation",
74 "domain",
75 "domains",
76 "download",
77 "downloads",
78 "email",
79 "enterprise",
80 "error",
81 "errors",
82 "example",
83 "faq",
84 "faqs",
85 "feed",
86 "feedback",
87 "feeds",
88 "files",
89 "forgot",
90 "forum",
91 "forums",
92 "ftp",
93 "graphql",
94 "guest",
95 "guests",
96 "handle",
97 "help",
98 "home",
99 "homepage",
100 "host",
101 "hosting",
102 "hostmaster",
103 "hostname",
104 "http",
105 "httpd",
106 "https",
107 "imap",
108 "inbox",
109 "index",
110 "info",
111 "information",
112 "internal",
113 "intranet",
114 "invite",
115 "invites",
116 "invoice",
117 "invoices",
118 "json",
119 "knot",
120 "legal",
121 "lex",
122 "lexicon",
123 "local",
124 "localhost",
125 "login",
126 "logout",
127 "logs",
128 "mail",
129 "mailer",
130 "mailer-daemon",
131 "mailerdaemon",
132 "maintenance",
133 "member",
134 "members",
135 "message",
136 "messages",
137 "metrics",
138 "network",
139 "news",
140 "newsletter",
141 "no-reply",
142 "nobody",
143 "noc",
144 "noreply",
145 "notification",
146 "notifications",
147 "ns1",
148 "ns2",
149 "ns3",
150 "ns4",
151 "nsid",
152 "oauth",
153 "oauth2",
154 "openid",
155 "order",
156 "orders",
157 "panel",
158 "passwd",
159 "password",
160 "pay",
161 "payment",
162 "payments",
163 "pds",
164 "phpmyadmin",
165 "policies",
166 "policy",
167 "pop3",
168 "portal",
169 "postfix",
170 "postmaster",
171 "press",
172 "pricing",
173 "privacy",
174 "private",
175 "prod",
176 "production",
177 "profile",
178 "profiles",
179 "proxy",
180 "public",
181 "register",
182 "registration",
183 "repo",
184 "reset",
185 "root",
186 "rss",
187 "sales",
188 "sandbox",
189 "sdk",
190 "search",
191 "secure",
192 "security",
193 "server",
194 "servers",
195 "service",
196 "services",
197 "session",
198 "sessions",
199 "settings",
200 "setup",
201 "signin",
202 "signout",
203 "signup",
204 "site",
205 "sitemap",
206 "smtp",
207 "sql",
208 "ssh",
209 "ssl",
210 "ssladmin",
211 "sso",
212 "stage",
213 "staging",
214 "static",
215 "statistics",
216 "stats",
217 "status",
218 "store",
219 "subdomain",
220 "subscribe",
221 "sudo",
222 "superuser",
223 "sync",
224 "sysadmin",
225 "system",
226 "telnet",
227 "terms",
228 "test",
229 "testing",
230 "tests",
231 "tid",
232 "tos",
233 "unsubscribe",
234 "update",
235 "updates",
236 "upgrade",
237 "upload",
238 "uploads",
239 "user",
240 "username",
241 "usernames",
242 "users",
243 "verify",
244 "vpn",
245 "webhook",
246 "webhooks",
247 "webmail",
248 "webmaster",
249 "webmasters",
250 "website",
251 "whois",
252 "wiki",
253 "wpad",
254 "www",
255 "www1",
256 "www2",
257 "wwww",
258 "xml",
259 "xrpc",
260];
261
262export const BLOCKLIST_IMPERSONATION: readonly string[] = [
263 "aerie",
264 "aha",
265 "atp",
266 "atproto",
267 "atprotocol",
268 "bluesky",
269 "bsky",
270 "ceo",
271 "cfo",
272 "cio",
273 "clo",
274 "cmo",
275 "coo",
276 "cso",
277 "cto",
278 "cxo",
279 "did",
280 "didplc",
281 "extro",
282 "founder",
283 "founders",
284 "jer",
285 "jeremie",
286 "jeremie-miller",
287 "jeremiemiller",
288 "mod",
289 "moderator",
290 "moderators",
291 "mods",
292 "official",
293 "operator",
294 "owner",
295 "owners",
296 "plc",
297 "quartzjer",
298 "rook",
299 "rook-host",
300 "rookery",
301 "rookhost",
302 "rooks",
303 "sol",
304 "sol-pbc",
305 "solpbc",
306 "solstone",
307 "staff",
308 "support",
309 "team",
310 "teams",
311 "thermals",
312 "verified",
313 "vit",
314 "vpe",
315 "vpx",
316];
317
318export const BLOCKLIST_OFFENSIVE: readonly string[] = [
319 "arsehole",
320 "asshole",
321 "bastard",
322 "bastardo",
323 "beaner",
324 "beaners",
325 "bitch",
326 "bitches",
327 "bulldyke",
328 "coon",
329 "coons",
330 "cunt",
331 "darkie",
332 "daterape",
333 "fag",
334 "faggot",
335 "fuck",
336 "fuckin",
337 "fucking",
338 "fucktards",
339 "goatcx",
340 "goatse",
341 "honkey",
342 "incest",
343 "jailbait",
344 "jigaboo",
345 "jiggaboo",
346 "jiggerboo",
347 "kike",
348 "lolita",
349 "mong",
350 "motherfucker",
351 "nambla",
352 "negro",
353 "neonazi",
354 "nigga",
355 "nigger",
356 "nignog",
357 "paedophile",
358 "paki",
359 "pedobear",
360 "pedophile",
361 "pikey",
362 "poof",
363 "pthc",
364 "raghead",
365 "rape",
366 "raping",
367 "rapist",
368 "shemale",
369 "shota",
370 "slanteye",
371 "slut",
372 "spastic",
373 "spic",
374 "swastika",
375 "towelhead",
376 "tranny",
377 "tubgirl",
378 "twat",
379 "wetback",
380 "whitepower",
381 "whore",
382];
383
384export const BLOCKLIST = new Set<string>([
385 ...BLOCKLIST_INFRASTRUCTURE,
386 ...BLOCKLIST_IMPERSONATION,
387 ...BLOCKLIST_OFFENSIVE,
388]);
389
390export function isReservedOrBlocked(label: string): boolean {
391 return label.length <= 2 || BLOCKLIST.has(label);
392}