DomainProof
Foundations

Tokens

Color

Surfaces
--bg
--surface
--surface-2
--surface-3
--border
--border-strong
Text
--text
--text-muted
--text-faint
Accent
--accent
--accent-strong
--accent-soft
--accent-foreground
Status
--success
--success-soft
--warning
--warning-strong
--warning-soft
--danger
--danger-soft

Spacing

space-1
space-2
space-3
space-4
space-5
space-6
space-8
space-10
space-12
space-16
space-20
space-24

Type

--text-3xsThe quick brown fox
--text-2xsThe quick brown fox
--text-xsThe quick brown fox
--text-smThe quick brown fox
--text-mdThe quick brown fox
--text-baseThe quick brown fox
--text-xlThe quick brown fox
--text-2xlThe quick brown fox
--text-3xlThe quick brown fox
--text-4xlThe quick brown fox

Radius

--radius-sm
--radius-md
--radius-lg
--radius-xl
--radius-full
Primitives

Components

Logo

default
DomainProof

Header

Empty chrome shell — height, background, border, and container. Each surface composes its own left/right content; this page’s own header above is a glass-variant instance.

variant=glass — marketing pages, locked create-project screen
DomainProof
variant=solid — dashboard topbar, next to the sidebar
DomainsPreview

Buttons

variant
size=sm
shape=pill
copy / copied
disabled
loading

Badges & pills

tone
TXTVerifiedPropagatingNeeds attentionNot found
provider badge
CloudflareGoDaddy
status pill
VerifiedPropagatingNot started
mode pill (badge variant)
TEST MODE

Callouts

tone=warning
Using Cloudflare, GoDaddy, or Route 53? Field names differ slightly — some call this "Name," some "Host."
tone=accent
Your nameservers look like Cloudflare — we can open the record form pre-filled.
tone=neutral
What likely happened: the value got truncated or edited when it was pasted.
emphasis=dashed
What's happening under the hood

Your DNS provider published the record. We queried three regions — two saw it immediately, one still has the old cached answer.

Card

head + body + row composition
Ownership recordTXT
Host_acmeapp-challenge.acme.co
Valueacmeapp-verify=8f2c9e1a4b7d3f60
body only, no head

A panel that only needs the surface, border, and padding — no head or rows.

Browser chrome

mock window card, composable content
app.domainproof.dev/acme-app/events
domain.claimed200
domain.propagating200
domain.verified200

Icons

lucide-react — used for the copy button, theme toggle, and chevrons throughout the system.

Copy
Check
ChevronDown
ChevronRight
Sun
Moon
Composed

Data & flow

Record card & field

full — step chip, explain text, copy buttons
1
Add this DNS record
Log in to where you manage acme.co's DNS.
TXT
Host / Name_acmeapp-challenge.acme.co
This subdomain is unique to this request. It doesn't touch your existing DNS, mail, or website.
Valueacmeapp-verify=8f2c9e1a4b7d3f60
A one-time token, generated for this request only. Paste it exactly.
compact — dashboard detail, success step, no copy/explain
Ownership record
TXT
Host / Name_acmeapp-challenge.acme.co
Valueacmeapp-verify=8f2c9e1a4b7d3f60
headless — onboarding inline, compact + copy, no head
Host_acmeapp-challenge.acme.co
Valueacmeapp-verify=8f2c9e1a4b7d3f60

Table

The generic primitive DomainTable is built on — bring your own grid template via className and lay out cells however the data calls for.

generic 3-column layout
NameRoleSeats
Acme Inc.
Owner
12
Globex Corp.
Member
4

Domain table

Header hides and rows stack into cards below 760px wide — see the mobile screenshot capture for the collapsed layout.

all six status combinations
DomainProviderStatusLast checked
acme.co
Cloudflare
Verified
2 min ago
pending-then-verified.test
Sandbox
Propagating
just now
wrong-value.test
GoDaddy
Needs attention
4 min ago
flaky.test
Route 53
Recovering
6 min ago
updates.acme.co
Cloudflare
Verified
1 hour ago
nxdomain.test
—
Not found
1 hour ago
loading
DomainProviderStatusLast checked

Vertical timeline

claimed → record added → propagating (current) → verified
Claimed
14:02:11
Acme App asked us to verify acme.co on your behalf. We generated a one-time record.
Record added
14:22:44
We saw your TXT record for the first time and confirmed the value matches.
3
Propagating
now
Your DNS provider is telling the rest of the internet about the change. Usually minutes.
4
Verified
—
We'll notify Acme App the moment every region agrees. No action needed from you.

Status summary & stepper

status summary — all steps done
Verified
Last checked 2 min agoNext check in ~3 min
Claimed09:41
Record added09:52
Propagated09:58
Verified09:58
stepper — in progress, scrolls horizontally when narrow
Claimed09:41
Record added
Propagated
Verified
stepper — blocked on a failed step
Claimed09:41
Record added09:52
Propagated
Verified

Code panel

tabs + syntax tokens + copy
# claim a domain, sandbox mode
curl -X POST https://api.domainproof.dev/v1/domains \
  -H "Authorization: Bearer dp_test_51H8..." \
  -H "Content-Type: application/json" \
  -d '{"domain":"acme.co"}'

Path chooser

4 integration paths, keyboard + click selectable

Verification log

entries with a native details/summary technical toggle
What we've checked so far
3 entries
14:02
Looked for your TXT record — nothing there yet. Totally normal, DNS can take a few minutes to update.
Technical detail
$ dig TXT _acmeapp-challenge.acme.co → no record found
14:22
Found your TXT record and the value matches exactly.
Technical detail
$ dig TXT _acmeapp-challenge.acme.co → record found, value matches
14:24
Checked from three regions — two confirm it, one still has the old answer cached for about 3 more minutes.
Technical detail
$ check 3 regions → us-east ok, eu-west ok, ap-southeast cached, ~3m ttl
empty
What we've checked so far

No checks yet.

Inputs

Form controls

Text field

label + placeholder
filled
disabled
invalid + inline error

Must be a valid https:// URL

Select

label + options
disabled
invalid + inline error

Choose a backoff strategy

Checkbox

unchecked / checked
disabled
Design system — DomainProof