rc), ZNC decommissioned. Remaining: replace placeholder stripe-keys, configure Upptime (needs GH token perms), remove znc.josie.lol DNS from Cloudflare. - `stripe_util.rs` (renamed from `stripe.rs` to avoid shadowing the `stripe` crate) ## Phase 3 Status Deployed and live. Two new crates: paste (txt.irc.now) and pics (irc.pics). Auth: OIDC via Keycloak, plan detection via token claims (defaults to free/None). Paste: nanoid IDs, 24h expiry for free users, 5 paste limit, hourly cleanup task. Pics: MinIO (S3) storage, thumbnails (300px WebP), 50MB free / 1GB pro storage limit. Keycloak migrated to operator-managed CR in `keycloak` namespace (was manual Deployment in `irc-keycloak`). Custom irc-now login theme deployed via ConfigMap + init container. Logout redirect fixed: derives origin from OIDC_REDIRECT_URL, post-logout URIs configured in Keycloak clients. - `rust-s3 = "0.35"` for S3 client - `image = "0.25"` for thumbnail generation - Axum route ordering: static routes (`/my`) must precede parameterized (`/{id}`) - SameSite::Lax required on session cookies for cross-site OIDC redirects ## Chat Service (chat.irc.now) gamja web IRC client served by nginx. Top-level `chat/` directory (not a Rust crate). - Containerfile clones gamja from `git.sr.ht/~emersion/gamja` (codeberg mirror unreliable) - nginx serves static files, proxies `/socket` to soju WebSocket (`josie:8080`) - `proxy_set_header Host $host;` required so soju's WebSocket Origin check passes - Theme injected via nginx `sub_filter` on `
` tag (AGPL compliance) - Title renamed via `sub_filter 'gamja IRC client' 'chat.irc.now'` - soju-operator supports `websocket: bool` on Listener type (`ws+insecure://`, `wss://`) - OAuth2 SSO: gamja -> Keycloak (public client `chat`) -> SASL OAUTHBEARER -> soju - soju `auth oauth2` with `enable-user-on-auth true`, credentials from `oidc-soju` secret - Keycloak `chat` client: PKCE disabled (gamja doesn't support it), `exclude.session.state.from.auth.response` and `exclude.issuer.from.auth.response` set to avoid redirect_uri mismatch - Build: `oc start-build chat --from-dir=chat/ -n irc-josie-cloud --follow` - Route has `haproxy.router.openshift.io/timeout: 600s` for WebSocket keepalive ## Whois Hostname Cloaking (Deployed) Design: docs/plans/2026-03-05-whois-hostname-cloaking-design.md Plan: docs/plans/2026-03-05-whois-hostname-cloaking-plan.md - CRD has `hostname_cloak: Option