Skip to content

https-app: an app can claim a handle ending, so its handles resolve through nginx - #3

Merged
tompscanlan merged 1 commit into
mainfrom
group-handles
Oct 17, 2026
Merged

tompscanlan merged 1 commit into
mainfrom
group-handles

Conversation

@tompscanlan

Copy link
Copy Markdown
Contributor

An app that hands out handles of its own, as a PDS does, can now have them resolve on the https devnet.

Before: a handle like bookclub.gh.devnet.test failed twice. The leaf's *.devnet.test covers one label, so TLS failed, and nginx sent the name to the alpha, which answered "User not found".

Now: scripts/https-app.sh <name> <port> <ending> claims an ending.

  • nginx gets a server for *.<ending>.<domain> that proxies to the app with Host passed through, so the app answers /.well-known/atproto-did. As the longer wildcard, it wins over the alpha's *.<domain>.
  • The leaf is reissued from the same CA with *.<ending>.<domain>, so nothing has to be trusted again. A reload picks it up.
  • alpha, regular and prod are refused, and so is an ending another app holds. A rerun without the ending drops it.
  • The leaf's names now live in one place, https-lib.sh (leaf_names). https-up.sh reissues the leaf whenever it lacks any of them, which covers the old *.devnet.internal check.

The two-word form is unchanged, and so is every existing data/https/apps line.

Checked

  • A throwaway nginx on the rendered config: a group handle reached the app with its name intact, a person's handle still went to the alpha's server, a name two labels under the ending was refused by TLS, and after a reissue a reload served the new leaf. Refusals: a taken ending, regular, an uppercase ending and a fourth word.
  • The lab (devnet-spaces) with the group host claiming gh: an existing group's handle now resolves to its DID through nginx, and alice's still resolves on the alpha. The group host's probes pass: day 2 8/8, including a new check that a fresh group's handle resolves through nginx with the certificate verified, day 3 8/8, day 4 16/16 and sign-up 4/4. atmo's groups e2e against the host passed 52 of 52.
  • A second devnet copy under DEVNET_DOMAIN=lighthouse.snowglobe.test (on 127.0.0.2, beside the lab) with a second host: the leaf got *.gh.lighthouse.snowglobe.test, the host's handle domain was .gh.lighthouse.snowglobe.test, and the probes passed day 2 8/8 (the group's handle resolved there), day 3 8/8 and sign-up 4/4. Day 4 was 15/16: one part of f8 asks to join a lab group by its fixed DID, which that copy's directory doesn't have. The copy was torn down afterward.

…hrough nginx

An app that hands out handles of its own, as a PDS does, had no way to have them
resolve: the leaf's *.<domain> covers one label, and nginx sent <x>.<ending>.<domain>
to the alpha, which answered "User not found". A third word to https-app.sh claims an
ending: nginx gets a server for *.<ending>.<domain> beside the app's upstream, Host
passed through, and the leaf is reissued from the same CA with *.<ending>.<domain>.
https-up.sh reissues the leaf whenever it lacks any name the scripts expect, and the
leaf's names live in one place, https-lib.sh. The PDSes' own endings and an ending
another app holds are refused.
@tompscanlan
tompscanlan merged commit 88fe699 into main Oct 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant