Skip to content

Release 0.2.5: self-updating app, styled DMG, homepage tour, hosted release channel - #3

Merged
fzn0728 merged 7 commits into
SergioChan:mainfrom
fzn0728:release/0.2.5
Aug 15, 2026
Merged

Release 0.2.5: self-updating app, styled DMG, homepage tour, hosted release channel#3
fzn0728 merged 7 commits into
SergioChan:mainfrom
fzn0728:release/0.2.5

Conversation

@fzn0728

@fzn0728 fzn0728 commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Self-updater: clicking the update banner downloads the release, verifies it three ways (registry SHA-256, Gatekeeper notarization, the running app's own designated code-signing requirement), swaps the bundle in place, and lets the KeepAlive LaunchAgent relaunch the new version — no manual download/drag/reopen. Fallback to the verified-DMG-in-Downloads flow on any failed check or unwritable /Applications. Also stops the Node bridge on exit (was leaking one process per update/quit).
  • Hosted release channel: the registry serves /api/v1/latest from TOKEN_METER_LATEST_* env vars and 302-redirects /download/token-widget.dmg to the immutable GitHub release asset — production containers no longer need the DMG bytes. Clients verify the download against the published digest.
  • Styled DMG: drag-to-Applications Finder window with background art, hidden chrome, and positioned icons — same format as other Mac apps.
  • Share row redesign (dashboard + public profiles): icon buttons with tooltips, copy-confirmation glyph swap, leaderboard CTA on its own row; fixes a CSS bug where flex display rules defeated [hidden] on share elements.
  • Widget settings: "Share with friends" copies tokenwidget.app (download + curl) instead of the GitHub repo; panel leads with the @handle.
  • New homepage: hero → scroll-tracked feature tour (live telemetry, runaway alarm, identity & community, privacy) → privacy-first dark footer. Support line names Claude Code, Codex, and Cline.
  • Release 0.2.5: package.json + CHANGELOG. 0.2.3/0.2.4 were internal self-update test builds, never published.

Test plan

  • npm run check + full suite: 144/144 pass (includes new registry redirect tests and source guards on the updater's verification chain)
  • Self-update exercised live on this machine: 0.2.2 → 0.2.3 via a local registry — download → verify → atomic swap → launchd relaunch in ~6s, Accessibility permission survived without re-prompt
  • TokenWidget-0.2.5.dmg built, notarized, stapled; spctl --assess accepted
  • Homepage verified at 1280px/375px in both scroll directions; DMG Finder layout verified by decoding the volume's .DS_Store

🤖 Generated with Claude Code

fzn0728 and others added 7 commits August 14, 2026 22:23
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>
@vercel

vercel Bot commented Aug 15, 2026

Copy link
Copy Markdown

@fzn0728 is attempting to deploy a commit to the t54 labs Team on Vercel.

A member of the Team first needs to authorize it.

@fzn0728
fzn0728 merged commit 8c19eed into SergioChan:main Aug 15, 2026
0 of 2 checks passed
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