place.wisp.domain
Lexicon Version: 1
Overview
Section titled “Overview”The place.wisp.domain lexicon defines metadata records for wisp.place subdomains,
such as alice.wisp.place or miku-fan.wisp.place.
- What lives in the PDS: a small record that says “this DID claimed this domain at this time”.
- What is authoritative: the PostgreSQL
domainstable on the wisp.place backend
(routing and availability checks use the DB, not this record).
Use this page as a schema reference; routing and TLS details are covered elsewhere.
Record: main
Section titled “Record: main”main (record)
Section titled “main (record)”Type: record
Description: Metadata record for a claimed wisp.place subdomain.
Properties:
| Name | Type | Req’d | Description | Constraints |
|---|---|---|---|---|
domain | string | ✅ | Full domain name, e.g. alice.wisp.place | |
createdAt | string | ✅ | When the domain was claimed | Format: datetime |
Claim Flow & rkey
Section titled “Claim Flow & rkey”Subdomain claiming (high‑level)
Section titled “Subdomain claiming (high‑level)”When a user claims handle.wisp.place:
- User authenticates via OAuth (proves DID control).
- Handle is validated:
- 3–63 characters
a-z,0-9,-only- Does not start/end with
- - Not in the reserved set (
www,api,admin,static,public,preview, …)
- Domain limit enforced: max 3 wisp.place subdomains per DID.
- Database row created in
domains:
INSERT INTO domains (domain, did, rkey)VALUES ('handle.wisp.place', did, NULL);- PDS record written in
place.wisp.domainas metadata.
Record key (rkey)
Section titled “Record key (rkey)”The record key is the normalized handle (the subdomain label):
at://did:plc:abc123/place.wisp.domain/wispIf a DID claims multiple subdomains, it will have multiple records:
at://did:plc:abc123/place.wisp.domain/wispat://did:plc:abc123/place.wisp.domain/miku-fan
Examples
Section titled “Examples”Basic domain record
Section titled “Basic domain record”{ "$type": "place.wisp.domain", "domain": "alice.wisp.place", "createdAt": "2024-01-15T10:30:00.000Z"}URI structure
Section titled “URI structure”Complete AT-URI for a domain record:
at://did:plc:7puq73yz2hkvbcpdhnsze2qw/place.wisp.domain/wispBreakdown:
did:plc:7puq73yz2hkvbcpdhnsze2qw– User DIDplace.wisp.domain– Collection IDwisp– Record key (subdomain handle)
Domain rules (summary)
Section titled “Domain rules (summary)”- Length: 3–64 characters
- Characters:
a-z,0-9, and- - Shape: must start and end with alphanumeric
- Case: stored/compared in lowercase
- Limit: up to 3 wisp.place subdomains per DID
- Uniqueness: each
*.wisp.placecan only be owned by one DID at a time.
Valid examples:
alice→alice.wisp.placemy-site→my-site.wisp.placedev2024→dev2024.wisp.place
Invalid examples:
ab(too short)-alice/alice-(leading or trailing hyphen)alice.bob(dot)alice_bob(underscore)
Database & routing
Section titled “Database & routing”The lexicon record is not used for routing. All real decisions use the DB:
CREATE TABLE domains ( domain TEXT PRIMARY KEY, -- "alice.wisp.place" did TEXT NOT NULL, -- User DID rkey TEXT, -- Site rkey (place.wisp.fs) created_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW()));
CREATE INDEX domains_did_rkey ON domains (did, rkey);The domains table powers:
- Availability checks (
/api/domain/check) - Mapping from hostname →
(did, rkey)for the hosting service - Safety: you must explicitly change/delete routing in the DB, avoiding accidental takeovers.
The place.wisp.domain PDS record is there for:
- Audit trail – who claimed what, when
- User-visible history in their repo
- Optional cross‑checking against the DB if you care to.
Related
Section titled “Related”- place.wisp.fs – Site manifest lexicon
- Custom domains / DNS verification – covered in separate routing/hosting docs
- AT Protocol Lexicons
Additional commentary
Section titled “Additional commentary”For a detailed write‑up of the full domain system (subdomains, custom domains, DNS TXT/CNAME flow, Caddy on‑demand TLS, and hosting routing), see
How wisp.place maps domains to DIDs.