Release 0.2.5: self-updating app, styled DMG, homepage tour, hosted release channel - #3
Merged
Merged
Conversation
Clicking the update banner now downloads the release DMG, verifies it three independent ways — the registry's published SHA-256, Gatekeeper's notarization assessment, and the running app's own designated code-signing requirement (same team + identifier, no hard-coded values) — then swaps the bundle atomically with ditto + replaceItem and exits so the KeepAlive LaunchAgent relaunches the new version from the same path. Any failed check, or an unwritable /Applications, falls back to the previous behaviour: the verified DMG lands in ~/Downloads and opens on the drag-to-install window. The updater and quit-widget now stop the Node snapshot bridge before exit; a bare exit(0) stranded the child process, leaking one bridge per update, each with file watchers and an hourly sync of its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
hdiutil alone produces a bare Finder window. The build now stages a read-write image, applies the layout through Finder scripting (background art, hidden chrome, 128px icons, app and Applications positioned over the artwork), detaches so the .DS_Store persists, then converts to compressed UDZO. make-dmg-background.py renders the 1x/2x background in the app icon's palette; both are merged into a Retina-aware TIFF. The AppleScript addresses the disk by its actual mount point rather than by name — a same-named volume already mounted would otherwise receive the styling (or corrupt the wrong image). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The update banner now walks through downloading / verifying / installing / restarting as the native layer reports progress, with manual-install and failed terminal states that re-arm the retry. Settings: "Refer friends" becomes "Share with friends" and copies the tokenwidget.app home page (download + curl, side by side) instead of the GitHub repository; the IDENTITY label is gone — the panel leads with the @handle itself. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
X, LinkedIn, copy-link, and save-PNG become equal-weight icon buttons with hover tooltips; the copy button swaps its glyph for a check on success. "Get a shareable link" is removed — a quiet "Share to community" link in the leaderboard row covers the unpublished state, so the leaderboard CTA is the page's one filled control. Also fixes a latent bug this redesign exposed: .share-row's flex display rules outranked the UA [hidden] rule, so every state-hidden share element rendered anyway — which is why "Copy link" and "Get a shareable link" could appear together. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page is now hero → tour → footer. The tour is a sticky left index with four panels scrolling past it — live telemetry, the runaway alarm (dark stage, real alert screenshot), identity & community, and a privacy diagram of what stays local versus what never leaves. The active item is chosen by which panel occupies the most viewport, so the highlight tracks correctly in both scroll directions. The footer is the page's one dark surface: the privacy-first statement, free / open-source / yours pillars, and the GitHub link as its own action. The hero support line now names everything tracked: Claude Code, Codex, and Cline. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Production containers ship no DMG, which kept /api/v1/latest at 404 and the update channel dark. The registry now accepts release metadata from the environment — TOKEN_METER_LATEST_VERSION / SHA256 / SIZE feed /api/v1/latest, and /download/token-widget.dmg 302-redirects to the immutable GitHub release asset in TOKEN_METER_LATEST_URL. Clients verify the downloaded bytes against the published digest, so the redirect adds no trust in the asset host. A local dist/ DMG still takes precedence for development. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
0.2.3 and 0.2.4 were internal builds used to exercise the self-update pipeline end to end; they were never published. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
@fzn0728 is attempting to deploy a commit to the t54 labs Team on Vercel. A member of the Team first needs to authorize it. |
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
/api/v1/latestfromTOKEN_METER_LATEST_*env vars and 302-redirects/download/token-widget.dmgto the immutable GitHub release asset — production containers no longer need the DMG bytes. Clients verify the download against the published digest.[hidden]on share elements.Test plan
npm run check+ full suite: 144/144 pass (includes new registry redirect tests and source guards on the updater's verification chain)TokenWidget-0.2.5.dmgbuilt, notarized, stapled;spctl --assessaccepted🤖 Generated with Claude Code