2026-08-11 00:53:44 +02:00
2026-04-09 18:07:09 +02:00
2026-04-15 19:02:39 +02:00
2026-08-11 18:43:42 +02:00
2026-08-11 18:43:42 +02:00
2026-04-09 18:07:09 +02:00
2026-04-09 18:07:09 +02:00
2026-04-09 18:07:09 +02:00
2026-08-10 21:54:07 +02:00
2026-08-10 21:54:07 +02:00
2026-08-10 19:43:14 +02:00
2026-08-11 00:53:44 +02:00
2026-08-11 18:43:42 +02:00

who dis?

A lightweight, self-hosted RDAP and WHOIS lookup tool with a clean web interface. Query domain names, TLDs, IP addresses, CIDR ranges, ASNs, and tagged entity handles from your browser.

The default Auto mode tries RDAP first and falls back to WHOIS when RDAP is unavailable. RDAP responses are rendered as complete, syntax-highlighted JSON on the server, with the exact upstream body available in a collapsed raw view; the application does not require browser JavaScript.

Screenshot of who dis?

Deploying

docker run -p 8080:8080 foundry.fsky.io/fsky/whodis:latest

A Quadlet unit file is available at contrib/quadlet/whodis.container for deploying with Podman and systemd.

From source

Requires Go 1.26+.

go build ./cmd/whodis
./whodis

Then open http://localhost:8080 in your browser.

Go packages

The protocol clients are importable without pulling the web application into your program:

import "foundry.fsky.io/fsky/whodis/whois"

client := whois.NewClient()
result, err := client.Lookup(ctx, "example.com")

RDAP exposes the same raw-response style of API:

import "foundry.fsky.io/fsky/whodis/rdap"

client := rdap.NewClient()
result, err := client.Lookup(ctx, "example.com")
for _, response := range result.Responses {
    fmt.Printf("%s returned %d bytes\n", response.URL, len(response.Body))
}
response, err := client.Query(ctx, "https://rdap.example/rdap/domain/example.com")

The repository remains one Go module, so its downloaded source archive also contains the web app, but importing whois or rdap neither compiles nor initializes the application package.

Lookup chooses an appropriate server and follows recognized referrals. Query sends an exact, single-line query to a caller-selected whois.Endpoint. Responses are returned as raw bytes together with the endpoint, exact wire query, and referral metadata; interpreting registry records is left to the caller.

When a later referral fails, Lookup returns the completed responses together with the error. Errors support errors.Is and errors.As, including typed operation errors and registry web URLs for resources without WHOIS service.

Automatic lookups only contact public WHOIS/RWhois endpoints by default. Direct queries permit caller-selected private endpoints, and both policies can be replaced with client options.

RDAP Lookup discovers the service from the checked-in IANA bootstrap data, tries advertised alternatives, follows safe redirects and top-level registrar referrals, and validates successful responses as JSON. Like WHOIS, it retains completed responses in traversal order when a later referral fails. Query fetches an exact caller-selected HTTP(S) URL. It permits private endpoints by default, while automatic lookups only contact public addresses and pin validated DNS results when dialing.

Both routing snapshots are compiled into the packages. Normal builds and tests perform no bootstrap downloads. Maintainers can refresh the checked-in data from the public registries with:

make refresh-data

Use make refresh-whois or make refresh-rdap to refresh only one snapshot.

Development

The root Makefile provides the common workflows:

make                 # build ./whodis (the default target)
make run             # run from source
make check           # formatting check, go vet, and tests; fully offline
make test-race       # run tests with the race detector
make fmt             # format Go source in place
make container       # build whodis:dev with Docker (overridable)
make help            # list every target

Variables can be overridden on the command line, for example make BINARY=whodis-dev build or make CONTAINER_ENGINE=podman IMAGE=localhost/whodis:dev container.

Configuration

Configuration is handled through environment variables:

Variable Default Description
PORT 8080 TCP port the HTTP server listens on
CACHE_TTL 24h Cache duration for successful lookups. Accepts Go duration strings (1h, 30m, etc.)
RATE_LIMIT_PER_MINUTE 20 Per-IP rate limit applied only to cache misses. Set to 0 to disable.
RATE_LIMIT_BURST 10 Maximum burst of cache-miss lookups a single IP can make before throttling.
TRUST_PROXY_HEADERS false When true, honor X-Forwarded-For / X-Real-IP for client IP and X-Forwarded-Proto for generated OpenSearch URLs. Only enable when whodis is behind a trusted reverse proxy.

Error results are cached for 5 minutes regardless of CACHE_TTL. Rate limiting only applies to cache misses. Popular lookups served from cache are never throttled.

License

The code of this project is released under the Zero-Clause BSD License. See the LICENSE file for details.

S
Description
Web RDAP and WHOIS lookup tool
https://whois.fsky.io/ Readme 0BSD
664 KiB
Languages
Go 91.2%
CSS 4.1%
HTML 3.8%
Makefile 0.7%
Dockerfile 0.2%