Pre-1.0 — blocking, the web UI, and clustering all work today

See every question.
Answer on your terms.

Every app, TV, and gadget on your network starts with a DNS lookup. TelltaleDNS answers them in microseconds, blocks what you don't want, and shows you exactly who asked what.

Devices ask TelltaleDNS, which answers, blocks, and shows you everything 📱 Phone 💻 Laptop 📺 Smart TV 📷 Camera TelltaleDNS 🌍 Internet encrypted 🛑 Tracker blocked 📺 TV asked 4,112 times 38% blocked · p99 1.2 ms (illustration)

Why TelltaleDNS

Four promises

See

Every question is tied to a device, explained (why it was blocked or allowed), and timed step by step.

Decide

Your rules, per device or group: block ads, trackers, or whole services, on a schedule if you like.

Never fail

Keeps answering from what it knows, even when upstream servers or its own control plane are down.

Run anywhere

The same tiny program on a $35 Raspberry Pi, in Kubernetes, or both at once as one system.

Standing on the shoulders of giants

Inspired by Pi-hole and Technitium

TelltaleDNS exists because two projects showed what self-hosted DNS can be. We're grateful to both communities, and if either one already serves you well, keep using it.

Pi-hole

Brought network-wide ad blocking to millions of homes, on a $35 computer, with a dashboard anyone can read. Its blocklist formats, regex rules and Teleporter export are a shared language, and TelltaleDNS reads them as they are.

Technitium DNS Server

Showed how complete a self-hosted DNS server can be: encrypted DNS, real zones, and a capable web console. Its API makes bringing a setup across to TelltaleDNS straightforward.

TelltaleDNS is an independent, clean-room project under Apache-2.0 OR MIT: it uses their public documentation and data formats, not their code.

Where we put our focus

What TelltaleDNS is built around

✓ available now◐ partly done

Every CPU core answering, with no pauses✓
"Why was this blocked?" down to the list and line✓
Per-question timing and percentiles, per device✓
Per-network rules: each VLAN or device group gets its own lists, schedules, safe search, and upstream servers: see how✓
Try a change against yesterday's real traffic before you save it: what it would have blocked, allowed, or rerouted, by device✓
Knows what each device is (a Roku player, a camera, a thermostat) from its maker and the names it asks for, and suggests a name and a group◐
Encrypted DNS both ways (DoT / DoH), and DNSSEC validation✓
Keeps answering when upstreams fail (serve-stale)✓
A small footprint: about 50 MB on a Pi 4 with 2.7 million blocked names✓
One cluster across a Pi and Kubernetes, managed from any node✓
Changes reach a few canary nodes first, and the cluster goes back to the last good version by itself if they start failing✓
Planned maintenance: take a node out of service for a while, with no dropped queries and no false alarms✓
Prometheus metrics and a Grafana dashboard built in✓
Safe AI-agent access (scoped tokens or SSO; MCP changes as plans you can approve): see how✓
Easy to try: imports a Pi-hole or Technitium setup✓

Throughput numbers come only from the project's reproducible benchmark (Performance). How it all fits together is on the For nerds page.

The web UI

Built into the binary

A dashboard, a searchable query log with a "Why?" on every row, devices and groups, lists, upstreams, local names, and the cluster, in light or dark, on a desktop or a phone. Take the tour →

Dashboard: KPI tiles with changes and sparklines, and queries by status
Dashboard (a made-up demo network)
Query log with filters, in the dark theme
Query log (dark theme)
Cluster page: a live topology of a Kubernetes site and a Pi
Cluster topology (example data)

Fast by design

Measured in nanoseconds

Answers come from a cache that stores finished replies and only patches the parts that change. No garbage collector, no pauses, and every core works independently.

See how a question is answered →

Micro-benchmark timings of the hot path Time per operation (micro-benchmarks, x86) Copy + patch a cached answer 5 ns Read a question + fingerprint 53 ns Build a "blocked" answer 56 ns Full cache hit, end to end 153 ns
Criterion micro-benchmarks from the repository. Not a full-system benchmark: those come with the comparison harness.