Prufy notes
The domain · 6 min

What people see

The status says what's true. The phase says what to show. And every outcome becomes exactly one headline, one fix and one action.

Status and phase are different things

A claim's status is stored. Its phase is worked out on every read, from the status and the last check. A pending claim could be waiting for you, or being checked, or waiting on a cache, and those call for very different screens.

Every phaseRuns the real toClaimView
One character looks right but isn't the same
Fix needed
Character 41 is “1” where the code has “l”. Those are easy to mix up when a value is retyped.
In Cloudflare, replace the Content with the one from the Copy button.
Check now
What this phase carries
claimId
domainAscii
domainUnicode
status
record
instructions
timing
phase
outcome
explanation
Predict it first
You got a new code. The last check found nothing. Which phase are you in?

The same failure, in each provider's words

Providers call the same fields different things, and saying the wrong word sends people hunting. The copy always uses the provider's own.

ProviderThe fix we show
GoDaddyIn GoDaddy, replace the Value with the one from the Copy button.
CloudflareIn Cloudflare, replace the Content with the one from the Copy button.
NamecheapIn Namecheap, replace the Value with the one from the Copy button.
Amazon Route 53In Amazon Route 53, replace the Value with the one from the Copy button.

The copy rules

These came out of the research, and a test enforces them across every outcome.

RuleInstead ofWe say
Never blameYou entered it wrongWe can't see the record yet
No judgement wordsInvalid valueOne character looks right but isn't the same
Name who we're waiting onPendingWe're waiting on Google Public DNS
Lead with the typical timeCan take up to 48 hoursUsually a few minutes
One fix per failureCheck your settings and try againIn Cloudflare, replace the Content

Every outcome also gets exactly one primary action. There's no menu of things to try. The action is one of check_now, wait, new_code or none.

Alerts follow the same rules. Their words are written in packages/core/src/alerts.ts, next to the rest of the copy, and alerts.test.ts checks that every title names the domain, fits in 60 characters and never uses a blaming word.