feat(onboarding): replace Custom tier card with a "Set up later" button#650
Merged
Conversation
The starting-point step listed Custom as a fourth tier card, but for new users it resolved to the same plan as Everyday and its real purpose was just "let me move on without committing to a curated tier." Surfacing that as a full card added scrolling and a redundant choice. Drop the Custom card (render only `OnboardingTemplate.curatedTiers`) and fold its behavior into the footer: when no tier is selected the primary button reads "Set up later" and applies `.custom` under the hood before advancing. With a tier selected it stays "Continue" with the existing download gating. The `.custom` case is unchanged, so returning users still keep their tuned settings and the recommender stays fully covered by tests.
Addresses Greptile feedback: the array is constant, so a stored static let avoids re-allocating it on every access and signals immutability.
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
The onboarding "Choose a starting point" step listed Custom as a fourth tier card, but for a new user it resolved to the same plan as Everyday; its only real job was "let me move forward without committing to a curated tier." That made it a redundant card that added scrolling and a heavier-feeling choice. This removes the Custom card and folds its behavior into the footer: when no tier is selected, the primary button reads "Set up later" and applies the Custom path under the hood before advancing, so it's easier to keep moving through onboarding.
Validation
Not screenshotted end-to-end: reaching the template step at runtime requires granting real macOS permissions on the prior step, which isn't practical in this environment. Manual repro for a reviewer: reset onboarding, advance to Step 2 of 4, and confirm (1) only Quick / Everyday / Powerful cards render, (2) with nothing selected the footer button says "Set up later" and is enabled, and (3) selecting a tier flips it back to "Continue" with the existing download gating.
Linked issues
None.
Risk / rollout notes
.customand advances, instead of leaving "Continue" disabled. This is the same settings bundle the old Custom card produced (lean defaults; on the Open Source engine it downloads the balanced default model in the background, exactly as the Custom card did)..custompath still early-returns and preserves their tuned engine/model/behavior settings.OnboardingTemplate.customenum case is intentionally retained (now applied implicitly, not shown as a card), soOnboardingTemplateRecommenderand its tests keep full coverage over every tier.Cotabby/(auto-discovered), so noproject.yml/ XcodeGen change.Greptile Summary
This PR removes the Custom tier card from the onboarding template step and replaces its role with a "Set up later" footer button. When no curated tier is selected the primary button shows "Set up later" and is always enabled; tapping it applies the
.custompath under the hood before advancing — a new user on the Open Source engine gets the same balanced default model download the Custom card used to trigger, and a returning user's existing settings are preserved unchanged.OnboardingTemplate.curatedTiersis added as astatic letcontaining only the three shown cards;.customis intentionally kept inallCases/CaseIterableso the recommender and its tests continue to cover every tier.canContinueFromTemplatenow returnstruewhenselectedTemplate == nil,WelcomeNavigationgains acontinueTitledefaulting to"Continue", and theonContinueclosure callsapplyTemplate(.custom)only when nothing was selected before stepping forward.Confidence Score: 5/5
Safe to merge — the change only touches first-run onboarding UI and applies the pre-existing Custom path implicitly.
All three paths through the template step (new user on Apple Intelligence, new user on Open Source, returning user) are handled correctly. The
applyTemplate(.custom)call for a new Open Source user starts the same model download the old Custom card triggered; the returning-user early-return inapplyTemplatepreserves existing settings unchanged.curatedTiersis correctly astatic letexcluding.custom, whileallCases/CaseIterablestill cover the full enum for recommender tests. No schema, settings, or migration changes are involved.No files require special attention.
Important Files Changed
curatedTiersas astatic letlisting only Quick/Everyday/Powerful;.customis retained inallCasesfor recommender coverage. Updated doc comment accurately describes the new UX contract.allCases→curatedTiersin theForEachthat renders tier cards, correctly hiding the Custom card while keeping all other card logic unchanged.canContinueFromTemplatereturnstruefor the nil-template case,continueTitletoggles between "Set up later" and "Continue", andonContinuecallsapplyTemplate(.custom)before advancing when nothing was selected. Returning-user early-return inapplyTemplatekeeps preservation behavior intact.Comments Outside Diff (1)
Cotabby/UI/WelcomeTemplateStepView.swift, line 28-29 (link)"Pick one to get set up."now contradicts the new UX — the footer button actively invites users to skip choosing a card. A first-run user will read this subtitle, feel obligated to pick, then be confused by the "Set up later" option. Something like"Pick one, or tap \"Set up later\" to configure in Settings."or simply dropping the imperative would align copy with intent.Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Reviews (2): Last reviewed commit: "refactor(onboarding): make curatedTiers ..." | Re-trigger Greptile