Secure, fast, multi-platform DNS stack built with AdGuard Home, Unbound, and RethinkDNS, plus a real-time dashboard, DoH/DoT support, and alerting.
- AdGuard Home: Ad/Tracker blocking, parental control, web dashboard
- Unbound: DNSSEC-validating resolver with rate-limiting
- RethinkDNS: Filter sync + client support (Android/iOS)
- Web Dashboard: Realtime logs, stats, filter manager (React + Tailwind)
- DoH/DoT endpoint: Technitium with watchdog
- Security: Alert via Telegram/Email on suspicious queries
- Offline Setup Wizard: PWA + QR export for Android, iOS, Windows, Linux, macOS
ZenDNS/
├── backend/ # Python API + log store + websocket + env
├── scripts/ # CLI installer, firewall, watchdog
├── public/ # setup.html + manifest + config exports
├── src/components/ # React TSX UI: dashboard, wizard, logs
├── dist/ # React build output
├── adguard/ # Config, certs, work for AdGuard Home
├── unbound/ # unbound.conf (resolver config)
├── .github/workflows/ # CI for Docker + frontend + lintcp .env.example .env
npm install && npm run build python backend/store_logs.py # first time init
docker compose -f docker-compose.prod.yml up -d
Access dashboard: http://localhost
Android: RethinkDNS, import zendns-config.json
iOS: DNSCloak, use stamp from dnscloak.txt
Windows/macOS/Linux: system DNS + https://yourdomain.com/dns-query
docker-publish.yml: build + push image to Docker Hub
react-build.yml: build UI on push
test-lint.yml: run flake8 + pytest
Fully Dockerized: docker-compose.prod.yml
Optional DoH server: docker-compose.doh.yml
zen_minimal_dist.sh: make snapshot-only deployment
MIT 2025
Made by GeekNeuron | v1.0