Checks if GitHub username can really be registered. Go, zero deps. Every proxy runs its own workers off one shared queue, own connection joins at a rate limit. Free names go to text file.
GET github.com/<name> → 404 lies:
| name | github.com/<name> |
api.github.com/users/<name> |
truth |
|---|---|---|---|
admin |
404 | 404 | reserved, never registrable |
zzzqqxxwv |
404 | 404 | free |
Same answer, different truth. This tool asks what signup form asks,
github.com/signup_check/username?value=<name>. Three answers:
200+<name> is available.→ free422+Username <name> is not available.→ taken422+Username '<name>' is unavailable.→ reserved
Verified live 2026-09-09.
- Response must carry
X-GitHub-Request-Id. Proxy error page cannot fake it. No header → answer thrown away, name retried elsewhere. - Every hit re-checked through second route before written. One yes not enough.
- GitHub
429is real answer, not proxy fault. Proxy stays, name moves on. - Names breaking GitHub rules (leading/trailing/double hyphen, >39 chars) dropped before request spent.
Tested: 13 known names over free proxies, 4 free / 4 taken / 4 reserved / 1 taken-with-hyphen. 13/13 correct. Random sample of 2032 earlier hits, 8/8 still free.
go build -o ghcheck .
./ghcheck -in wordlists/englishlowercase.txtHits → available.txt as found. Every decided name → checked.txt. Ctrl+C,
run again, resumes.
| flag | default | meaning |
|---|---|---|
-in |
wordlists/dutchlowercase.txt |
wordlist, one name per line |
-out |
available.txt |
free names |
-done |
checked.txt |
resume log |
-proxies |
proxies.txt |
proxy list |
-direct |
true |
own connection joins the pool, rate limited |
-direct-rate |
30 |
direct requests per minute, 0 unlimited |
-per-proxy |
4 |
concurrent requests through each proxy |
-tries |
8 |
failures from proven proxies (or 429s) per name before giving up |
-backoff |
10s |
pause after a proxy fails, doubles each failure in a row |
-max-backoff |
10m |
longest pause for a failing proxy |
-limit-pause |
20s |
pause for a proxy GitHub answered 429 to |
-reload |
2m |
re-read proxy list this often, 0 off |
-min / -max |
2 / 8 |
name length filter |
-letters |
true |
keep only a-z |
-confirm |
true |
re-check hits via second route |
-timeout |
8s |
per request |
-debug |
false |
print why each attempt rejected |
proxies.txt, one per line:
http://1.2.3.4:8080
https://user:pass@1.2.3.4:8443
socks4://5.6.7.8:1080
socks5://user:pass@9.10.11.12:1080
Bare host:port = http. SOCKS handshakes implemented here, no deps. File
gitignored.
Two rules:
- Proxy must CONNECT to https. GitHub is TLS. Lists validated against plain-http target fail every request.
- Free proxies die in hours. Dead proxy never retired, only paused:
-backoffdoubling per failure up to-max-backoff, then probed again. Fast proxies pull most names, dead ones cost only their own time.-reloadpicks up new entries mid-run.
No list, or all dead → run continues direct at -direct-rate. Slow on purpose.
One address, nothing behind it.
- Endpoint answers
406to anyAcceptlist. Send exactly one:text/fragment+html. - Reserved counted separate from taken. Neither written to output.