BIND Zone File Prettifier & Checker
Rewrites a zone master file into a readable, canonical form: one
$TTL and one $ORIGIN at the top, every owner name
written out in full, and aligned columns.
Zone files have a lot of syntax that is valid but hard to read. An indented
line silently inherits the previous record's owner name; $ORIGIN
and $TTL can each change part-way through, so the same label or
the same bare record means different things in different places; TTL and
class can be left out entirely. This resolves all of
that, then checks the result for the usual problems β a missing or duplicated
SOA, no NS at the apex, a CNAME sharing a name with other records, unbalanced
parentheses, and domain names that lost their trailing dot and quietly
expanded into nonsense.
Everything runs in your browser. The zone file is never uploaded, and no request is made when you press Prettify.
Findings
Nothing yet.
Paste a zone file above,
then press Prettify & Check.
What it changes, and what it deliberately does not
One $ORIGIN
Every name is resolved against whichever $ORIGIN was in effect
where it was written, then re-expressed relative to the first
$ORIGIN in the file. Later $ORIGIN lines are
dropped. Names in RDATA are rewritten too β the target of a CNAME, an MX
exchange, an SRV target β not just owner names, since those would otherwise
change meaning once the directive they were written under disappears.
A later $ORIGIN outside the first one's tree cannot be
expressed relative to it. Those records are written out fully qualified
instead, and a warning says so.
One $TTL
Every record is given the TTL that was in effect where it was written β
its own, or the $TTL above it. The one covering the most
records becomes the single $TTL at the top of the file (ties
go to whichever came first), and the rest of the $TTL lines
are dropped. A record matching that default is left bare; one that differs
gets its TTL written in, so no record's TTL depends on how far up the file
you look. Values are compared as durations, so 1h and
3600 count as the same TTL.
A file with no $TTL at all is left alone β every TTL stays
exactly as written, since hoisting one in would change what the bare
records mean. Records above the first $TTL are the one case
where this does change the zone: they used to fall back to the SOA minimum,
and a warning names them.
Explicit owner names
An indented record inherits the owner name of the record above it. Every output line repeats the owner explicitly, so no line depends on the one before it any more.
Explicit class
A record with no class gets one written in β inherited from the last record
that stated one, or IN if none did, which is what BIND itself
would use.
Left alone on purpose
$INCLUDE and $GENERATE are passed through
byte-for-byte: the first cannot be read (nothing is ever fetched) and the
second is not expanded, so neither is reformatted or checked.
Any record with a type this tool does not recognise is also passed through
unchanged rather than reformatted into something possibly wrong.
Index of /t/bind/
../ bindzone.js 02-Sep-2026 08:30 41644