Razvan Dimescu def89ffe59 add LAN accessibility indicator for services
Show whether each service is reachable from the network or bound to
localhost only. Dashboard displays green "LAN" or amber "local only"
badge next to each healthy service. Unified TCP check function,
concurrent health+LAN probes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 06:35:12 +02:00
2026-03-21 04:49:18 +02:00

Numa

CI crates.io License: MIT

DNS you own. Everywhere you go.

A portable DNS resolver in a single binary. Block ads on any network, name your local services (frontend.numa), and override any hostname with auto-revert — all from your laptop, no cloud account or Raspberry Pi required.

Built from scratch in Rust. Zero DNS libraries. RFC 1035 wire protocol parsed by hand. One ~8MB binary, no PHP, no web server, no database — everything is embedded.

Numa dashboard

Quick Start

# Install
curl -fsSL https://raw.githubusercontent.com/razvandimescu/numa/main/install.sh | sh

# Run (port 53 requires root)
sudo numa

# Try it
dig @127.0.0.1 google.com           # ✓ resolves normally
dig @127.0.0.1 ads.google.com       # ✗ blocked → 0.0.0.0

Open the dashboard: http://numa.numa (or http://localhost:5380)

Or build from source:

git clone https://github.com/razvandimescu/numa.git && cd numa
cargo build --release
sudo ./target/release/numa

Why Numa

  • Ad blocking that travels with you — 385K+ domains blocked via Hagezi Pro. Works on any network: coffee shops, hotels, airports.
  • Local service proxyhttps://frontend.numa instead of localhost:5173. Auto-generated TLS certs, WebSocket support for HMR. Like /etc/hosts but with a dashboard and auto-revert.
  • Developer overrides — point any hostname to any IP, auto-reverts after N minutes. REST API with 22 endpoints.
  • Sub-millisecond caching — cached lookups in 0ms. Faster than any public resolver.
  • Live dashboard — real-time stats, query log, blocking controls, service management.
  • macOS + Linuxnuma install configures system DNS, numa service start runs as launchd/systemd service.

Local Service Proxy

Name your local dev services with .numa domains:

curl -X POST localhost:5380/services \
  -H 'Content-Type: application/json' \
  -d '{"name":"frontend","target_port":5173}'

open http://frontend.numa            # → proxied to localhost:5173
  • HTTPS with green lock — auto-generated local CA + per-service TLS certs
  • WebSocket — Vite/webpack HMR works through the proxy
  • Health checks — dashboard shows green/red status per service
  • Persistent — services survive restarts
  • Or configure in numa.toml:
[[services]]
name = "frontend"
target_port = 5173

How It Compares

Pi-hole AdGuard Home NextDNS Cloudflare Numa
Ad blocking Yes Yes Yes Limited 385K+ domains
Portable (travels with laptop) No (appliance) No (appliance) Cloud only Cloud only Single binary
Developer overrides No No No No REST API + auto-expiry
Local service proxy No No No No .numa + HTTPS + WS
Data stays local Yes Yes Cloud Cloud 100% local
Zero config Complex Docker/setup Yes Yes Works out of the box
Self-sovereign DNS No No No No pkarr/DHT roadmap

How It Works

Query → Overrides → .numa TLD → Blocklist → Local Zones → Cache → Upstream

No DNS libraries. The wire protocol — headers, labels, compression pointers, record types — is parsed and serialized by hand. Runs on tokio + axum, async per-query task spawning.

Configuration reference

Roadmap

  • DNS proxy core — forwarding, caching, local zones
  • Developer overrides — REST API with auto-expiry
  • Ad blocking — 385K+ domains, live dashboard, allowlist
  • System integration — macOS + Linux, launchd/systemd, Tailscale/VPN auto-discovery
  • Local service proxy — .numa domains, HTTP/HTTPS proxy, auto TLS, WebSocket
  • pkarr integration — self-sovereign DNS via Mainline DHT (15M nodes)
  • Global .numa names — self-publish, DHT-backed, first-come-first-served

License

MIT

Description
Portable DNS resolver in Rust — .numa local domains, ad blocking, developer overrides
Readme MIT 4.1 MiB
v0.14.2 Latest
2026-04-23 04:57:37 +08:00
Languages
Rust 76%
HTML 12.1%
Shell 11.4%
Python 0.2%
Makefile 0.1%