Skip to content
Chorus
Menu

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.