Skip to content

feat(onboarding): fresh installs start with detected providers + welcome card#830

Merged
robinebers merged 2 commits into
mainfrom
feat/first-run-provider-detection
Jul 3, 2026
Merged

feat(onboarding): fresh installs start with detected providers + welcome card#830
robinebers merged 2 commits into
mainfrom
feat/first-run-provider-detection

Conversation

@robinebers

Copy link
Copy Markdown
Owner

Approved issue

Part of #626 (first-launch onboarding) — delivers the minimal first-launch experience; contextual tips remain open.

TL;DR

Fresh installs no longer light up all nine providers. First launch detects which AI tools actually have credentials on the Mac and enables only those (falling back to Claude, Codex, Cursor), with a one-time dismissible welcome card pointing at Customize. Existing installs are completely untouched.

What was happening

  • Every provider was enabled by default, so new users got a wall of menu-bar icons for tools they don't use — a recurring complaint.
  • Enablement was stored as a disabled list, so every future provider we add would also pop up enabled for everyone.
  • There was no onboarding at all: nothing explained where Customize lives or that providers can be hidden.

What this changes

  • First-run seeding (FirstRunSeeder): on a genuinely fresh install (empty defaults domain, checked before migrations run), Claude/Codex/Cursor are enabled immediately, then each provider's local credentials are probed asynchronously and the enabled set switches to exactly the detected providers. No detections → the starter trio stays. A toggle the user flips during the probe wins over detection.
  • Local credential detection: ProviderRuntime gains hasLocalCredentials(); every provider implements it by reusing the same auth-store loading (config files, Keychain, SQLite, env keys) as its refresh() — local checks only, no network calls.
  • Enabled-list storage: fresh installs persist openusage.enabledProviders.v1 (providers not in the list are off), so future providers default to off for them. Installs with existing settings keep the legacy disabled-list semantics — their setup and upgrade behavior don't change.
  • Welcome card: a one-time dismissible card at the top of the dashboard ("Welcome to OpenUsage") with an Open Customize button. It only disappears via its ✕ button and never returns after dismissal.
  • Docs updated (dashboard.md, menu-bar.md, settings.md, adding-a-provider.md, AGENTS.md) — including the new provider checklist item for hasLocalCredentials().

Heads-up

  • The detection probe is best-effort: a provider whose credentials appear after first launch isn't auto-enabled later; the user enables it in Customize (the welcome card points there).
  • New providers added later default to off for fresh-install users but remain on for legacy-mode users, matching each mode's semantics.

Tests

  • New FirstRunSeederTests (sync fallback, async detection, empty detection, upgrade no-op, idempotency, user-toggle precedence, hint persistence) and expanded ProviderEnablementStoreTests for the enabled-list mode.
  • swift test passes locally; manual verification with a wiped defaults domain (fresh install seeds + shows card) and with existing defaults (nothing changes, no card).

Screenshots

First launch on a Mac where only Claude was detected:

First-run welcome card

Made with Cursor

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

robinebers has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit cd6bc25. Configure here.

Comment thread Sources/OpenUsage/App/FirstRunSeeder.swift
robinebers and others added 2 commits July 2, 2026 20:24
…ome card

New installs no longer enable all nine providers: first launch seeds
Claude/Codex/Cursor synchronously, probes each provider's local
credentials (files/keychain only, no network), and switches to exactly
the detected set — falling back to the starter trio when nothing is
found. A one-time dismissible welcome card points new users at
Customize. Fresh installs persist an enabled-list
(openusage.enabledProviders.v1) so future providers default off for
them, while existing installs keep the legacy disabled-list semantics
untouched and never see any of this.

Co-authored-by: Cursor <cursoragent@cursor.com>
… main

PRs #827 (drops ccusage) and #828 (adds this test using the old
ccusage-based ClaudeProvider initializer) merged past each other, so
main's CI is red: the test still passed the removed ccusageRunner:
argument. Construct the provider with the current initializer instead.

Co-authored-by: Cursor <cursoragent@cursor.com>
@robinebers robinebers force-pushed the feat/first-run-provider-detection branch from cd6bc25 to e26b1c8 Compare July 2, 2026 16:26

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

robinebers has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@robinebers robinebers added the gate-passed Passed the automated PR gatekeeper checks (gatekeeper skips it on later runs) label Jul 2, 2026 — with Cursor
@robinebers robinebers merged commit 8b46193 into main Jul 3, 2026
3 checks passed
@robinebers robinebers deleted the feat/first-run-provider-detection branch July 3, 2026 02:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs gate-passed Passed the automated PR gatekeeper checks (gatekeeper skips it on later runs) provider tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant