<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/8dhduodot" -->

---
title: How We Built Our Own DNS Server | daily.dev
description: Sliplane hit Hetzner DNS record limits and 90-minute propagation delays, so they built a custom DNS server in ~1000 lines of Go. The solution uses the hidden...
canonical: https://daily.dev/posts/8dhduodot
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How We Built Our Own DNS Server | daily.dev
og:description: Sliplane hit Hetzner DNS record limits and 90-minute propagation delays, so they built a custom DNS server in ~1000 lines of Go. The solution uses the hidden...
og:url: https://daily.dev/posts/8dhduodot
og:image: https://api.daily.dev/og/posts/8DHDUODOt.png
og:image:alt: Post cover image
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How We Built Our Own DNS Server

**[Bobby Iliev](https://daily.dev/sources/9adj6fgmy)** · [@bobbyiliev](https://daily.dev/bobbyiliev) · 192 upvotes · 19 comments

## Summary

Sliplane hit Hetzner DNS record limits and 90-minute propagation delays, so they built a custom DNS server in ~1000 lines of Go. The solution uses the hidden primary pattern: a private Go server (built on miekg/dns) serves zone data via AXFR/IXFR to Hetzner Robot's public secondary nameservers. Postgres LISTEN/NOTIFY acts as the event bus — triggers fire on service changes, the Go server hashes records to detect real changes, bumps the SOA serial, and sends DNS NOTIFY to secondaries. The result: propagation dropped from up to 90 minutes to near-instant. Key lessons include the need to implement IXFR (not just AXFR) since Hetzner Robot secondaries don't always fall back cleanly, and that the hidden primary pattern avoids vendor lock-in since AXFR/NOTIFY are standard protocols.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://sliplane.io/blog/how-we-built-our-own-dns-server>

## Community discussion

Top comments from developers on daily.dev.

**@jonasscholz** · 29 upvotes

> Thank you for posting!

**@sevensolutions** · 26 upvotes

> Maybe this is a dumb question, but why not using a wildcard entry to a central reverse proxy?

**@paulmarc** · 12 upvotes

> Love it, we did nearly exactly the same thing years back. Glad to have intersecting ideas happening around!
>
> Granted, our main issue was security more than "need for fast propagation", but it boiled down to the same infrastructure design.

**@sankalpdawada** · 11 upvotes

> After reading this post i feel motivated

**@noureldinhamed** · 8 upvotes

> Even though the answer to "should you do it" is "probably not", but ig it's a great exercise even if you end up not using it lol!

## Similar posts on daily.dev

- [Don’t just attend KubeCon \+ CloudNativeCon, Merge Forward your experience\!](https://daily.dev/posts/don-t-just-attend-kubecon-cloudnativecon-merge-forward-your-experience--l0rpp73x8) · CNCF · 1 upvotes · 0 comments
- [Announcing H2 2026 KCDs](https://daily.dev/posts/announcing-h2-2026-kcds-m96goajm1) · CNCF · 1 upvotes · 0 comments
- [Two months of Open Community Groups](https://daily.dev/posts/two-months-of-open-community-groups-asf52zhbs) · CNCF · 0 upvotes · 0 comments
- [CNCF Unveils Schedule for KubeCon \+ CloudNativeCon Europe 2026](https://daily.dev/posts/cncf-unveils-schedule-for-kubecon-cloudnativecon-europe-2026-ikhcoa5cb) · CNCF · 2 upvotes · 0 comments
- [CNCF Debuts KubeCon \+ CloudNativeCon Japan 2026 Schedule](https://daily.dev/posts/cncf-debuts-kubecon-cloudnativecon-japan-2026-schedule-xp5pyudub) · CNCF · 1 upvotes · 0 comments

---

Tags: [#golang](https://daily.dev/tags/golang), [#postgresql](https://daily.dev/tags/postgresql), [#dns](https://daily.dev/tags/dns)

[View this post on daily.dev](https://daily.dev/posts/8dhduodot)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/8dhduodot","headline":"How We Built Our Own DNS Server","text":"Shared: How We Built Our Own DNS Server","url":"https://daily.dev/posts/8dhduodot","datePublished":"2026-04-18T13:07:50.240Z","dateModified":"2026-04-18T13:09:04.531Z","author":{"@type":"Person","name":"Bobby Iliev","url":"https://daily.dev/bobbyiliev","image":"https://avatars3.githubusercontent.com/u/21223421?v=4","description":"DevOps, DevEx, cloud & open source\n","worksFor":{"@type":"Organization","name":"Materialize","logo":"https://res.cloudinary.com/daily-now/image/upload/s--4mL2CrlK--/f_auto/v1725263959/companies/materialize"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":78960}},"image":"https://media.daily.dev/image/upload/s--HRgLpUt6--/f_auto/v1722860399/public/Placeholder%2003","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":192},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":19}],"sharedContent":{"@type":"WebPage","url":"https://api.daily.dev/r/R2B1WTYSo"},"comment":[{"@type":"Comment","text":"Thank you for posting!","datePublished":"2026-04-18T15:04:56.779Z","url":"https://daily.dev/posts/8DHDUODOt#c-Vn1FRE75M","author":{"@type":"Person","name":"Jonas Scholz","url":"https://daily.dev/jonasscholz","image":"https://media.daily.dev/image/upload/s--zZBhwKxI--/f_auto/v1749375788/avatars/avatar_8uy3kQaeDWEY1NouIHhj7?_a=BAMClqUq0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":29}},{"@type":"Comment","text":"Maybe this is a dumb question, but why not using a wildcard entry to a central reverse proxy?","datePublished":"2026-04-19T12:04:32.375Z","url":"https://daily.dev/posts/8DHDUODOt#c-uww2IbJUN","author":{"@type":"Person","name":"Daniel Peinhopf","url":"https://daily.dev/sevensolutions","image":"https://avatars.githubusercontent.com/u/84123899?v=4"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":26}},{"@type":"Comment","text":"Love it, we did nearly exactly the same thing years back. Glad to have intersecting ideas happening around!\nGranted, our main issue was security more than “need for fast propagation”, but it boiled down to the same infrastructure design.","datePublished":"2026-04-21T03:12:43.851Z","url":"https://daily.dev/posts/8DHDUODOt#c-ExPL9oSnS","author":{"@type":"Person","name":"paulmarc","url":"https://daily.dev/paulmarc","image":"https://media.daily.dev/image/upload/s--yFutR-QN--/f_auto/v1737446314/avatars/avatar_iHStoImiuFyQFvwEddWek"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":12}},{"@type":"Comment","text":"After reading this post i feel motivated","datePublished":"2026-04-21T08:32:52.006Z","url":"https://daily.dev/posts/8DHDUODOt#c-c0kxxcqeL","author":{"@type":"Person","name":"Sankalp Dawada","url":"https://daily.dev/sankalpdawada","image":"https://avatars.githubusercontent.com/u/173169094?v=4"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":11}},{"@type":"Comment","text":"Even though the answer to “should you do it” is “probably not”, but ig it’s a great exercise even if you end up not using it lol!","datePublished":"2026-04-21T09:53:37.393Z","url":"https://daily.dev/posts/8DHDUODOt#c-U6FyVBeWJ","author":{"@type":"Person","name":"NourEldin Hamed","url":"https://daily.dev/noureldinhamed","image":"https://avatars.githubusercontent.com/u/63375181?v=4"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":8}}],"isPartOf":{"@type":"WebPage","url":"https://daily.dev/sources/9adj6fgmy","name":"Bobby Iliev"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Bobby Iliev","item":"https://daily.dev/sources/9adj6fgmy"},{"@type":"ListItem","position":3,"name":"How We Built Our Own DNS Server"}]}
```

