coredns/coredns
Lore
The story of how CoreDNS got from "fork of Caddy" to "the Kubernetes cluster DNS". Dates are derived from git history and tagged releases.
March 2016 — First commits
3ec0d9fe on 2016-03-18 is the first commit. The next two on the same day are titled "Gut the readme as it is mostly Caddy" and "Slightly more text in the README for the time being." The project is initially Miek Gieben's experiment in carving the Caddy server framework into a DNS server.
A burst of activity in mid-2016 explicitly removes the "middleware" terminology from Caddy and replaces it with "plugin", and the Caddyfile becomes the Corefile.
- Apr 2016 — Strip caddy: "Clean up remove caddy refs (#139)", "Fix more tests and remove json caddyfile stuff."
- Aug 2016 — Server-type plugin: "Make CoreDNS a server type plugin for Caddy (#220)", followed by "Set correct versioning for CoreDNS (#225)" and "Remove old stuff from caddy and some go vet changes (#227)". This is the architectural move that defines CoreDNS — instead of being a fork of Caddy, it becomes a plugin for it.
Sep 2017 — Plugin terminology, dnstap, the modern shape
By Sep 2017 the codebase mass-renames "middleware" to "plugin" ("Remove the word middleware (#1067)"). On the same day every existing plugin gets its modern directory layout. dnstap arrives within two weeks ("Adds the dnstap I/O routines (#1083)"). Most of the today-still-current plugin set was already in the tree by this date: cache, forward (added Feb 2018), file, auto, etcd, hosts, dnssec, errors, log, metrics, secondary. The kubernetes plugin existed earlier in some form and got dynamic SOAs in Nov 2017 ("plugin/{kubernetes/etcd}: dynamic SOA (#1188)").
Health checks become a plugin in Nov 2017 ("plugin/health: implement dyn health checks (#1214)").
Dec 2017 — CoreDNS 1.0.0
Released on 2017-12-01, CoreDNS 1.0.0 is the project's coming-of-age. The release notes (notes/coredns-1.0.0.md) describe a stable plugin API, polished docs, and a clear story for cluster DNS.
2018 — Forward replaces proxy, dnstap, gRPC server
- Feb 2018: the new
forwardplugin lands ("plugin/forward: add it (#1447)") with periodic health checks viapkg/up("plugin/forward using pkg/up (#1493)") and a TCP-on-truncation retry ("plugin/{forward,proxy}: check for truncated (#1644)"). - Mar 2018: filenames standardise on underscores ("Use underscores in file names (#1620)") so
plugin/server-tlsbecomesplugin/server_tls. Cosmetic but it touches every transport. - Jun 2018: the DoH server is renamed ("Remove the hyphen from server-https (#1844)"). The HTTPS server has been there since the first encrypted-transport patches.
- May 2018: "Implement deprecation notice for 1.1.4 (#1833)" introduces the
deprecatedplugin pattern.
2019 — Proxy moved out of tree
In Mar 2019 the long-running proxy plugin is removed: "Move proxy to external (#2651)". forward had taken over its job a year earlier; this is the cleanup. A handful of intermediate releases (1.4.0, 1.5.0) finalize the deprecation window. Anyone still using proxy after this point pulls from the external repository.
v1.5.0 ships on 2019-04-06 with forward as the canonical forwarder.
2020–2021 — Kubernetes, security, and HTTPS hardening
The CoreDNS that runs in nearly every Kubernetes cluster is now stable. Releases through v1.7.0 (2020-06-16) and v1.8.0 (2020-10-22) focus on the kubernetes plugin's controller efficiency, broader DNSSEC support, and the dnstap plugin. Cure53 audited the project earlier (Mar 2018); a second-generation security review by Trail of Bits in Mar 2022 is referenced in the README.md and influences subsequent hardening.
2022–2023 — DoH and DoQ
v1.9.0 (2022-02-09) and v1.10.0 (2022-09-19) are the first releases with full DoH support and a path toward DoQ. The DoQ server lands in 2024–2025 and grows quickly: stream limits, worker pool, ALPN tweaks, and the quic plugin to expose the knobs ("feat: limit concurrent DoQ streams and goroutines (#7296)" on 2025-05-19).
v1.11.0 (2023-08-07) introduces the multicluster integration in kubernetes and overhauls the metrics namespace.
2024 — Multisocket and Kubernetes 1.31
v1.12.0 ships 2024-11-21. The multisocket plugin lands shortly before that ("multisocket plugin (#6882)" on 2024-11-13) so a single CoreDNS process can use Linux's SO_REUSEPORT to scale UDP receive across cores.
2025 — DoQ, DoH3, and the security plugin set
A heavy year of transport work. The https3 plugin and ServerHTTPS3 add HTTP/3 DoH. The quic plugin (May 2025) limits concurrent DoQ streams. The DoH server gets a security commit on Dec 2025 ("Merge commit from fork" into core/dnsserver/server_https.go) that hardens path validation.
v1.13.0 (2025-09-30) adds the gRPC server, plus a long list of dependency upgrades.
v1.14.0 ships 2026-01-06 with the QUIC stream worker pool and a redone reload model.
2026 — PROXY protocol, DoQ stabilisation, and the latest cut
- Feb 2026: the
proxyprotoplugin lands ("feat(proxyproto): add proxy protocol support (#7738)" on 2026-02-11), supporting both TCP and UDP including Cloudflare Spectrum session tracking. - Mar–Apr 2026: rapid-fire dependency bumps and lint hardening.
golangci-lintis bumped to v2.11.4 and areviveunused-parametercleanup sweeps the tree (Mar 2026, "lint(revive): fix unused-parameter violations (#7980)"). - 2026-04-22:
v1.14.3is tagged.
The latest commit at the time of this snapshot is 145029c84 on 2026-04-30, a dependabot bump for aws-sdk-go-v2/service/secretsmanager.
Longest-standing features
A handful of plugins and modules date back to the first weeks of the project and are still in the chain:
| Subsystem | First commit | Notes |
|---|---|---|
plugin/file |
2017-09-14 | The original RFC 1035 zone server. |
plugin/cache |
2017-09-14 | Sharded LRU; serve-stale and prefetch were added later. |
plugin/etcd |
2017-09-14 | Survived multiple etcd major versions. |
plugin/hosts |
2017-09-14 | Tiny, untouched for years at a time. |
plugin/dnssec |
2017-09-14 | NSEC black lies; on-the-fly signing. |
core/dnsserver/server.go |
2016-08-19 | The "Server" struct itself. |
Deprecated and removed features
proxyplugin (deprecated May 2018, removed Mar 2019). Replaced byforward. Thedeprecatedplugin still lives in tree to give users a clear error when they hit old directives.- The original Caddyfile JSON form, removed in 2016 ("Fix more tests and remove json caddyfile stuff").
server-httpsdirectory name, renamed tohttpsin 2018.- NSEC3 in
dnssec— never implemented; the README explicitly states only NSEC is supported. coredns-auto-go-mod-tidy[bot]— earlier automation, now subsumed by Dependabot.
Major rewrites
- 2016 — From fork to server type. Caddy went from being CoreDNS's parent codebase to being its embedded framework. This is the foundational rewrite.
- 2018 —
proxytoforward. The forwarding logic is rebuilt inplugin/pkg/proxywith persistent connections and inline health checks. - 2017 — "Plugin" rename. A repository-wide search-and-replace from "middleware" to "plugin", touching docs, tests, and code.
- 2024–2025 — Encrypted-transport hardening. A series of patches to
core/dnsserver/server_https.go,server_quic.go, andserver_https3.goto add stream limits, worker pools, and explicit application error codes.
Growth trajectory
- 666 unique committer email addresses since 2016 (some are duplicates of the same person across personal/work accounts).
- 4,750 commits total. About 34% are bot-attributed (mostly Dependabot).
- 60 in-tree plugins as of
v1.14.3. The list grows slowly — most major plugins were in by 2018 — but the quality of each plugin increases steadily. - The CI matrix has grown from a single Go test job in 2016 to today's
golangci-lint,codeql-analysis,cifuzz,make.doc,verify-make-gen,scorecards,trivy-scan,release, anddockerworkflows.
What might come next
Nothing in this section is a roadmap; it is what the recent diff trail suggests. The DoQ and DoH3 implementations have the most active churn. Multi-socket scaling on Linux, PROXY protocol UDP session tracking, and the gRPC server are the newest features and continue to evolve. The Kubernetes plugin keeps absorbing minor breakages from upstream API changes (k8s.io/api is bumped almost weekly).
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.