Product
The product
A REST API that implements the Chorus OpenAPI contract, and a web dashboard over it. Every record and domain belongs to one organization and carries its own mode.
Records and domains
An org:admin registers the organization’s domains. Members with the org:admin or org:contributor role, and service accounts, create records under them: the record name is the name host joined to the domain, and the record type is A, CNAME, TXT or SRV.
Each record also carries a TTL, a routing policy (simple, failover, geo_location, split-view or weighted), an optional service owner label and an optional loose reference to a YellowPages service.
Permissions you can read
Every record and domain has a 9-bit mode, read like a unix file: view, edit and delete for the record owner, for members of the organization, and for everyone else, including anonymous callers.
Only the record owner or an org:admin may chmod. A mode can narrow what a role allows, never widen it across organizations.
Private by default, published on purpose
New records are private (0o770). Publishing sets the other-view bit, which puts the record in the public directory, read-only, with only allowlisted fields. Organization-private data never reaches it.
Each publish or unpublish emits exactly one dns.record.published or dns.record.unpublished event.
A linter for mistakes
The record linter is a deterministic rule set. It flags an A record whose content is not an IPv4 address, a CNAME that points at an IP, is malformed or sits at the apex, TXT content that is too long, a TTL out of range, a published record that exposes a private IP, and duplicate name and type pairs.
Lint findings are opt-in on the API (GET /list?lint=1) and appear in the dashboard’s Health column.
Webhooks you can trust
Record, domain and report changes become events. Each event is written in the same database transaction as the change itself, so a change and its delivery are never split.
Deliveries are signed with HMAC-SHA256 in the X-DNS-Signature header, sent only to public addresses, retried with backoff and dead-lettered after five failed attempts. Signing secrets are encrypted at rest.
What Chorus does not do
Chorus stores and governs DNS records. It does not write them to a DNS provider and does not answer DNS queries; no provider client exists in the API or its packages.
The repo also contains a Tauri desktop app and an Expo mobile app with release workflows, but no build has been published, so this site offers no download. The web app is how you use Chorus today.
At a glance
- API
- REST, Hono with @hono/zod-openapi, document at /openapi.json
- Web
- Next.js dashboard
- Database
- PostgreSQL through Drizzle ORM
- Sign-in
- Zitadel (OIDC), the shared Fleetworks identity provider
- Tenancy
- Every record, domain and webhook belongs to one organization
- Record types
- A, CNAME, TXT, SRV
- Default mode
- 0o770, private
- Webhook signature
- HMAC-SHA256 in X-DNS-Signature
Keep your organization’s DNS records in one place
Sign in with your Fleetworks account, or search the public directory first, which needs no account.