Files
Evan JarrettandClaude Opus 5 6173da4349 lexicon-authority: serve io.atcr.* as a static did:web authority
The namespace no longer depends on the personal PDS at jarrett.app being
online. lexicons/ is compiled by Corpora into a signed AT Protocol
repository and served from a Cloudflare Worker that holds no key, no
state and no database. Signing happens offline; nothing at serving time
signs.

This is the failure that prompted it: when that PDS returned HTTP 500,
OAuth logins failed with "invalid_scope: Failed to resolve requested
permission set", and only for users whose Auth Server met the NSID on a
cold cache — which is why it looked user-specific rather than global.

lexicons/ stays the source of truth. dist/ is compiled output and is
gitignored, as is any signing key, which lives outside both repositories
and is needed for every publish: any record change moves the MST root and
re-signs the whole repo.

The README carries the cutover runbook and the distinction that is
easiest to get wrong — lexicon.atcr.io is the host the Worker serves on
and is created once by wrangler, while the six _lexicon.* TXT records are
the authority pointers and are flipped separately.

Cutover completed 2026-08-04. All six authority domains name
did:web:lexicon.atcr.io. Verified by corpora verify (101 checks), goat,
@atproto/lexicon-resolver returning our exact record CIDs, and a cold
OAuth PAR against two unrelated Auth Servers. Two lexicons resolve for the
first time: io.atcr.hold.image.getConfig and io.atcr.hold.stats.daily.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 21:24:00 -05:00

25 lines
1.1 KiB
JSON

{
"name": "atcr-lexicon-authority",
"version": "0.0.0",
"private": true,
"type": "module",
"description": "Serves io.atcr.* lexicons as a signed, static did:web authority. Source of truth is ../lexicons.",
"scripts": {
"build": "corpora build --lexicons ../lexicons --out dist --did did:web:lexicon.atcr.io",
"build:cutover": "corpora build --lexicons ../lexicons --out dist --did did:web:lexicon.atcr.io --dns-check cutover",
"domains": "corpora build --lexicons ../lexicons --out /tmp/corpora-domains --did did:web:lexicon.atcr.io --dns-check off --force",
"serve": "corpora serve --dist dist --port 2583",
"verify:local": "corpora verify --origin http://127.0.0.1:2583 --source ../lexicons --no-dns",
"verify:pre": "corpora verify --origin https://lexicon.atcr.io --source ../lexicons --no-dns",
"verify": "corpora verify --origin https://lexicon.atcr.io --source ../lexicons",
"deploy": "wrangler deploy",
"size": "wrangler deploy --dry-run --outdir .wrangler/bundled"
},
"dependencies": {
"corpora": "file:../../corpora"
},
"devDependencies": {
"wrangler": "^4.118.0"
}
}