Oh yeah. It's happening.

Set up Wagtail with password-free sign-in #13

targeting main from codex/oidc-login
Merged opened by and assigned to personhood.removal.surgery
targeting main from codex/oidc-login

Hornroot now has a working local Wagtail admin with custom OIDC, Discord, and ATProto sign-in in place of local passwords. Provider settings and administrator identities come from an ignored TOML config; email addresses do not link accounts, and provider tokens are not stored.

The foundation uses a uv workspace with separate web, authentication, and ATProto packages, an ASGI development server, mise tasks, strict basedpyright checks, pytest, and Zed configuration. ATProto sign-in verifies the DID/PDS relationship and uses PKCE, PAR, and DPoP. Existing sessions recheck configured access, and authentication errors and logs omit private OAuth state.

Validation:

  • 49 pytest tests passed, including access-policy, callback, session, and failure-boundary tests.
  • Ruff, basedpyright, Django checks, and migration consistency passed.
  • Live ATProto sign-in completed in a regular browser; OIDC and Discord flows are covered with simulated provider responses.
  • Local configuration, credentials, databases, media, and research source checkouts are excluded from Git.
Commits 0