Skip to content

An earned, one-time in-app ask to star the repository - #207

Open
scgopi wants to merge 1 commit into
mainfrom
feat/in-app-star-ask
Open

An earned, one-time in-app ask to star the repository#207
scgopi wants to merge 1 commit into
mainfrom
feat/in-app-star-ask

Conversation

@scgopi

@scgopi scgopi commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Designed first as four variants — placement, tone, dismissibility — against the app's real Theme tokens: https://claude.ai/code/artifact/284490c6-397f-4539-856c-2e8ce72c1ad6

This builds variant A.

What it does

  • SidebarStarBanner in the sidebar foot, mirroring SidebarUpdateBanner's anatomy (8pt radius, 7/10 padding, 12pt semibold over 10.5pt at 55% white, opaque #252629 under a 16% tint) in the attention amber rather than the update blue.
  • Earned: hidden until three loops have resolved on this machine. The subtitle is the work already done — "3 loops resolved here · a star helps" — not a pitch.
  • Once: a tap opens the repo, the × retires it, and either answer is final.
  • Yields: shown only when the update banner isn't. News the user asked for outranks an ask aimed at them.
  • Behind a FeatureRamps ramp (100/100) so it has a kill switch via ramps.json.

Notes

  • Counting is crossings into resolution, not resolved-node count, which would re-count the same loop on every broadcast.
  • Persistence is @Shared(.appStorage) so a test run can't write the real defaults.
  • The delete-from-disk effect moved to the trailing extension; that is what keeps AppFeature's type body under swiftlint's 350-line error (345 now).

Verification

Check Result
xcodebuild build ✅ succeeded
Full test suite ✅ 1244 tests in 135 suites, 0 failures (was 1240 + 4 new)
swiftlint lint ✅ 0 errors
swift format lint --strict ✅ clean

🤖 Generated with Claude Code

https://claude.ai/code/session_0168f4VtAUJQgZsyRg8einV5

The install path routes around github.com — brew install --cask puts the
app on disk without the user ever seeing the repo — so the README and the
site only ever ask people who already found it. This asks the population
that actually installs.

Earned rather than nagging: nothing appears until three loops have
resolved on this machine, it shows once, and a tap or a dismiss retires it
for good. It sits in the update banner's slot and yields to it, since news
the user asked for outranks an ask aimed at them. Behind a FeatureRamps
ramp so it has a kill switch.

Counting is crossings-only — counting resolved nodes outright would
re-count the same loop on every broadcast.

Also moves the delete-from-disk effect into the trailing extension, which
is what keeps AppFeature's type body inside swiftlint's 350-line budget.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168f4VtAUJQgZsyRg8einV5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant