Zonekeeper
Laravel API + Nuxt SPA
Zonekeeper keeps a domain portfolio in one place: registrations, DNS zones, nameservers, expiry and pricing, aggregated from the registrars' own APIs. Here is how the machine behind it actually runs.
Hover or tab through the boxes to see what each part does.
5 containers
Stack
7 named queues
Queues
8 registrar APIs
Providers
daily waves
Sync cadence
The daily sweep
Every night the scheduler kicks off sync waves, half an hour apart: reconcile domain lists per registrar account, refresh each domain's details, then pricing, then DNS zones, then every zone's records. Exchange rates land first so pricing converts correctly. By morning the whole portfolio is fresh without a single user-facing request having paid for it.
Fast lane, slow lane
The queues are split on purpose: user-triggered refreshes ride their own lanes (domain refresh, pricing, DNS records) so a nightly cron sweep can never make a button press feel slow. Horizon balances workers across all seven queues automatically.
Self-hosted, same front door
Zonekeeper can be self-hosted, with a twist: there is no separate frontend to deploy. Every install reuses the one SPA. You register your backend in the main app, point a CNAME at the SPA entry point, and the rest is automatic: verification, an on-demand certificate at the first TLS handshake, and backend auto-discovery by hostname. The SPA then negotiates with your backend directly, discovering its endpoints and feature set.
The edges
The frontend is a static Nuxt single-page app served from the edge; only API calls reach this server. The API itself runs on Laravel Octane, staying warm between requests instead of booting the framework each time.
One front door, any backend
Both journeys, end to end: the hosted app on the left, a self-hosted install on the right. Either way you enter through the same SPA, and the registry pairs your hostname to the right backend.
Hover or tab through the boxes to see what each part does.