Skip to content

fix(app): launchable packaged macOS app + native bar context menu & pause#6

Open
ShadowEsu wants to merge 8 commits into
codex/design-pixel-launch-experimentfrom
claude/determined-curie-l09fo1
Open

fix(app): launchable packaged macOS app + native bar context menu & pause#6
ShadowEsu wants to merge 8 commits into
codex/design-pixel-launch-experimentfrom
claude/determined-curie-l09fo1

Conversation

@ShadowEsu

Copy link
Copy Markdown
Owner

Summary

Primary fix — the built app didn't show in the Dock or menu bar on macOS.

Root cause: app/package.json sets mac.hardenedRuntime: true with mac.identity: null. The documented install command npm run dist:dmg makes electron-builder fall back to an ad-hoc signature but does not disable library validation. hardenedRuntime + ad-hoc signature + library-validation-on is a combination macOS silently kills at launch — the process never reaches the Dock or menu bar, and there's no crash dialog. Only scripts/package-local.mjs had a manual re-sign workaround; the documented dist / dist:dmg path had none.

Fix: added app/scripts/after-sign.mjs, wired as electron-builder's build.afterSign hook. It re-signs any bundle without a real Team Identifier using build/entitlements.local.plist (which disables library validation), so every packaging path is launchable. A real Developer ID signature (package:release with CSC_NAME) is detected by its Team Identifier and left untouched. Removed the now-duplicate manual re-sign from package-local.mjs.

Island / bar redesign (incremental)

  • Native right-click context menu on the floating bar (acceptance criterion) — right-click → bar:contextMenuMenu.popup({ window: bar }), sharing one buildAppMenu() with the tray so state stays in sync.
  • Pause / Resume Unvibe — new paused setting gates startReview() and clipboard capture; the bar dims and reads "Paused".
  • Explain Clipboard menu action.
  • Settings… menu item opens the companion and jumps straight to Settings (open:settingsonOpenSettings).

Testing

  • npm run typecheck, npm run build, npm test (31 pass) all green.
  • Could not run the packaged app or the GUI in this environment (no macOS codesign; electron binary download is blocked). The afterSign hook is validated for syntax and ESM default-export shape only.
  • Still needs a real macOS run to confirm the Dock/menu-bar fix and the native context-menu popup on a non-activating panel.

Notes

Targeted at codex/design-pixel-launch-experiment (the real trunk) rather than the stale main, per the branch guidance. Not self-merged.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk


Generated by Claude Code

…menu + pause

The documented `npm run dist:dmg` produced an app macOS silently killed at
launch (hardened runtime + ad-hoc signature + library validation on), so it
never appeared in the Dock or menu bar. Add an electron-builder afterSign hook
(scripts/after-sign.mjs) that re-signs any non-Developer-ID bundle with the
local library-validation-disabling entitlements, covering every packaging path;
remove the now-duplicate manual re-sign from package-local.mjs. Real Developer
ID signatures are detected by Team Identifier and left untouched.

Island/bar work: native right-click context menu on the floating bar (shared
with the tray via buildAppMenu), Pause/Resume, Explain Clipboard, and a
Settings… item that opens the companion's Settings. New `paused` setting gates
review triggers and dims the bar.

typecheck + build + tests (31) green. Packaged-app launch and the context-menu
popup still need a real macOS run to confirm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
@vercel

vercel Bot commented Jul 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
unvibe-site Error Error Jul 22, 2026 8:09pm

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Homepage demo section (VideoDemo) plays Unvibe's hosted pitch-deck recording
(the same Vercel Blob URL the marketing site's HeroVideo defaults to; override
with NEXT_PUBLIC_DEMO_VIDEO_URL) with a Vibe-Island-style chaptered slider that
seeks the video. Adds a reusable AmbientLightField hero background (layered
CSS+SVG "sunlight under water": base glow, caustic bands, god rays, grain,
vignette) — reduced-motion static, pauses offscreen/hidden, lighter on mobile,
?ambientDebug=1 dev panel. Research notes in docs/research.

typecheck + next build + 36 web tests green. Video host is unreachable from the
build sandbox but resolves in a real browser / on Vercel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Consolidated research on how Vibe Island functions as an app — architecture
(hook-injection + local Unix-socket bridge, per-terminal jump, SSH helper,
NSPanel overlay), UX/notch interaction, sound, onboarding, settings, packaging,
pricing, and changelog themes — plus a synthesis of what transfers to Unvibe
(which is a code-comprehension overlay, not an agent monitor). Sources cited;
mechanism claims labeled confirmed vs inferred from the open-source clone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Firsthand + two exploration passes: what Unvibe does, the repo layout
(app/web/marketing/extension/server/docs) and how they fit, how the island
works today (three disconnected windows: bar strip + review panel + companion),
the full explanation flow with exact IPC/WidgetEvent names, the on-device
secret-filter path, the learning/mastery model, the web backend surface + schema,
and the honest gaps vs a state-driven island. Companion to the Vibe Island teardown.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
Adapts Vibe Island's smoothness to Unvibe's code-learning purpose as testable
logic + safe wiring:

- core/islandState.ts (pure, tested): ProductState -> presentation/narration/
  accent/sound/glance/dwell. One source of truth; backend events map through it.
- core/sound.ts (pure, tested): original chiptune palette + shouldPlaySound gate
  (master toggle, milestones, quiet hours, quiet-while-locked; critical bypass).
- main/island.ts: resolves state, pushes island:state + island:sound to the bar,
  powerMonitor lock detection.
- Wired at real transitions (main.ts capture/permission/idle; review.ts send()
  funnel: generating/streaming/explanationReady/saved/error).
- Bar renderer: narrates state with restrained accent borders + a glance-
  completion dot, synthesizes sounds via Web Audio, transient notices dwell then
  return to dormant.
- Settings: glanceMode, soundMilestones, quietWhileLocked (companion General tab).

+17 tests (48 total). typecheck + build + node --test green. New states verified
by screenshotting the compiled bar in Chromium. Native NSPanel + on-device audio
still need a real Mac run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
…review

- Milestone engine (core/learning.ts, pure+tested): milestonesCrossed() fires
  first_explanation / streaks / ten_concepts / five_languages from real recorded
  data only; wired into review.ts recordReview -> island 'milestone' + sound with
  the milestone's own title.
- ConfirmButton (widget): Understand ✓ lingers a green ✓ before collapsing;
  reduced-motion follows through instantly.
- Panel morph: progressive corners, body blur-to-sharp entry, staggered foot
  chips; all disabled under reduced-motion.
- Live island preview in Settings: reflects glance + accent, with Ready/Saved/
  Milestone cue buttons that synthesize the real sound palette.

+3 tests (51 total). typecheck + build + node --test green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
- Onboarding finale: a real "Unvibe is ready." ceremony with a milestone cue and
  a Try-it-now that starts an actual review (arrival milestone comes from real
  recorded data, never a fake badge).
- Sound gate: added `presenting` (full mute) to the pure SoundGate + test; wired
  as false in island.ts with a note that a native macOS screen-share detector is
  required before exposing any toggle (no decorative switches).
- Progress log: recorded the full island v2 sweep and flagged the native NSPanel
  migration as an explicit out-of-environment follow-up (needs Swift + a Mac).

52 tests pass; typecheck + build green. Settings live-preview verified in Chromium.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TaGmzM1RJ1cVmBTfbumsnk
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.

2 participants