What it is
Custom recursive DNS server — LAN devices set DNS to this IP. Forwards to Cloudflare, caches, live dashboard, ad-blocking.
Version history
Straight from the project’s own card data — what each version added.
Recursive resolver, cache, dashboard, blocklist.
What broke, and what I’d change
Not written yet. This is the part only I can write — what actually went wrong, and what I’d do differently. It lives in builds/reflections/dns-server.md (see _TEMPLATE.md); as soon as that file has words in it, this section fills in on the next build.
Everything else on this page — the spec, the version history, the file counts — is generated from the project’s own build notes and files, so nothing here is guesswork.
Build spec
The project’s own build notes, rendered. Open the raw .md ↗
Show the spec
DNS Server
Built a custom recursive DNS server that people on the WiFi can set as their DNS resolver.
What it does
- Listens on port 53 (UDP) — the standard DNS port
- Parses incoming DNS queries using dnslib
- Forwards to Cloudflare (1.1.1.1) as upstream
- Caches responses with TTL respect
- Live web dashboard on port 8055 showing all queries
- Optional ad/tracker blocking via blocklist
- Cache persists to disk between restarts
How it works
Client → Your DNS (192.168.1.251:53) → Cloudflare 1.1.1.1 → Answer cached → Client
Tech stack
- Python 3
- dnslib (DNS wire format parsing)
- HTTP server (dashboard)
- Threading (concurrent queries)
- JSON (cache persistence)
Features
- 🌐 Forwarded queries go to Cloudflare
- 📦 Cached queries return instantly (no upstream call)
- 🚫 Blocked domains return NXDOMAIN
- 📊 Live dashboard shows all queries in real-time
Usage
# Full DNS server (needs sudo for port 53):
sudo python3 dns_server.py
# Test without sudo:
python3 dns_server.py --port 5354
Other devices on the network set their DNS to 192.168.1.251 to use it.