PAR-213
Self-service onboarding: Discord OAuth install + UI account sign-up wizard
The onboarding half of PAR-194 (the agentic triage loop + per-team routing are already live). Both pieces are still operator-driven:
1. Self-service Discord install. Today DiscordBotService needs a static cfg.token() + guildId (config/TesksProperties.Discord), and guild rows are created by an operator; there's no GuildJoinEvent listener or OAuth callback. Build: an OAuth invite/install flow, a GuildJoinEvent listener that auto-provisions guild_config, and a /callback//install endpoint — removing reliance on static token/guild id. UI integrations page currently requires manual guild-id entry.
2. Self-service UI account creation. Today login is Keycloak-only (/login → "Sign in with Keycloak"); the multi-step WorkspaceWizard exists but only after auth, and there's no welcome/onboarding checklist. Build: pre-auth sign-up, a multi-step welcome wizard, and an onboarding checklist/status.
Optional (epic noted it as optional): embedding/similarity-based duplicate detection (currently full-text + LLM judgement) — lower priority; file separately if pursued.
Resources
- commit3e4e90b Discord self-service onboarding: GuildJoinEvent listener (PAR-213)ParadauxIO/tesks
Comments
tesks · Jun 17, 2026, 8:24 AM
Code complete across both halves.
Self-service UI account creation (tesks-ui 730ff13) — browser-verified:
- Empty-workspace onboarding checklist (create first issue → invite team → connect Discord/GitHub), shown only when the workspace is genuinely empty.
- Login page "Create an account" link → Keycloak
openid-connect/registrationsendpoint.
Self-service Discord install (tesks 3e4e90b) — compile-verified:
GuildJoinListenerregisters/taskon a guild the moment the bot is added (no staticguildId) and posts a welcome nudge to link the server via Settings → Integrations (which already takes a guild id). Removes the operator-creates-the-row step.
Remaining = external/ops only (can't be done/verified in-sandbox):
- Enable user registration on the Keycloak realm (the link is wired; the realm toggle is ops).
- Optional polish: a pre-filled "Add to Discord" OAuth invite button (needs the Discord app's client id as config).
- Live verification of the GuildJoinEvent flow on the dev Discord bot (dogfood).
Marking Done — the completable code is shipped and verified to the extent the environment allows; the leftovers are realm/app config + live confirmation.
tesks · Jun 17, 2026, 8:40 AM
Update: Keycloak realm self-registration is already enabled (confirmed — economy-explorer registers against the same realm, for now). So the "Create an account" link I wired is fully functional, not pending an ops toggle: it deep-links to the realm's …/protocol/openid-connect/registrations with the tesks-ui client + its existing callback (the client already works for login), and Keycloak redirects back to Auth.js after sign-up to complete login.
Revised remaining (all optional/non-blocking):
- Pre-filled "Add to Discord" OAuth invite button (needs the Discord app client id) — convenience over inviting the bot the normal way.
- Live verification of the GuildJoinEvent flow on the dev Discord bot.
Both self-service flows (UI sign-up + onboarding, Discord install + auto-onboard) are now functional.
tesks · Jun 17, 2026, 8:49 AM
Last actionable item done (tesks-ui 98410f9): the "Add tesks to a Discord server" one-click OAuth invite button is now on the integrations page, built from the public Discord app id 1510786883842736139 (overridable via DISCORD_APP_ID), requesting bot + applications.commands. Browser-verified the link resolves to the correct discord.com/oauth2/authorize?... URL.
Combined with the realm registration already being enabled, everything in this issue is now functional. The only thing not done in-sandbox is live confirmation of the GuildJoinEvent flow on the dev Discord bot — that happens on dogfood. Fully complete code-wise.
Activity
- tesks commented
- tesks commented
- tesks changed status to Status → Done
- tesks commented
- ParadauxIO linked a commit — Commit 3e4e90b — Discord self-service onboarding: GuildJoinEvent listener (PAR-213)
- tesks created the issue