feat: redesign automation connect UX with silent connect and self-renewal - #16
Merged
Conversation
Removes the manual "Connect automation" step in favor of silent connect-on-activation, with a one-time consent toast, silent proactive renewal, and a quieter status/manage affordance. Signed-off-by: Lukas Hirt <info@hirt.cz>
Page-load-piggybacked renewal only covered users who revisit the Workflows app; a periodic job using the scheduler's existing Basic-auth-with-app-password pattern renews indefinitely with no live session required. Also corrects a wrong assumption that oCIS core ships a native app-password management UI. Signed-off-by: Lukas Hirt <info@hirt.cz>
Empirically confirmed against owncloud/ocis-rolling:latest that an app-password can mint its own replacement via Basic auth, and traced why through the reva/auth-app source. Also notes a DELETE /auth-app/tokens 500 quirk observed during testing, unrelated to this design. Signed-off-by: Lukas Hirt <info@hirt.cz>
Seven-task plan covering the backend self-renewal job and server wiring, then the frontend composable, panel, view rewrites, and e2e test rewrite, per the approved design spec. Signed-off-by: Lukas Hirt <info@hirt.cz>
…elopment Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
…age panel Signed-off-by: Lukas Hirt <info@hirt.cz>
…e/event workflow Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
Signed-off-by: Lukas Hirt <info@hirt.cz>
LukasHirt
force-pushed
the
feature/automation-connect-ux
branch
from
July 24, 2026 15:29
61abb1a to
5510cca
Compare
mzner
approved these changes
Jul 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replaces the manual "Connect automation" button with a silent, self-healing flow:
pkg/automation/renew.go) periodically renews any stored app-password within 14 days of its 90-day expiry, authenticating with the app-password itself via Basic auth (same convention as the scheduler) — no live user session required, so background execution never lapses as long as renewal keeps succeeding.WorkflowBuilder.vuesilently connects automation when activating a schedule/event-triggered workflow (blocking the save if connecting fails);WorkflowList.vueself-heals on mount if an active automated workflow exists but automation isn't connected. The header pill/button is replaced by a quiet status line + a "manage" panel (status, expiry, disconnect with a confirmation warning).Full design rationale and open questions:
docs/superpowers/specs/2026-07-24-automation-connect-ux-design.mdImplementation plan:
docs/superpowers/plans/2026-07-24-automation-connect-ux.mdTwo issues were found and fixed during implementation, beyond the original plan:
WorkflowBuilder.vue'ssave()used to show the success toast before the workflow was actually persisted — navigating away right after seeing it could abort the in-flight save and silently lose the change. Fixed by splittinguseAutomationConnect'sconnectWithNotice()intoconnect()(no toast) +notifyConnected()(toast only), and reorderingsave()to persist first, notify after.Service.Statusnever checked whether a stored credential's expiry had already passed, so a credential that lapsed in place (e.g. renewal failing for the whole 14-day window) still reportedconnected: true, defeating the frontend's self-heal. Fixed by treating a pastExpiresAtas disconnected.Known, accepted limitation (documented in the plan, not a regression): the connect toast isn't reliably observable when creating a brand-new schedule/event workflow from scratch, since save immediately hard-navigates to the new workflow's URL. It is observable when editing an existing workflow to add such a trigger — that's the path the e2e test exercises.
Test plan
go build ./... && go vet ./... && go test ./...(frombackend/) — all green, including new tests for the renewal job and the expiry-aware status check.pnpm test:unit && pnpm check:types && pnpm lint— all green.pnpm test:e2e(all 4 specs) — all green, including a rewrittenautomation.spec.tsexercising the full silent-connect/self-heal/disconnect flow with zero manual "connect" button clicks.owncloud/ocis-rolling:lateststack before implementation began.🤖 Generated with Claude Code