Skip to content

Add native macOS preview for Apple Silicon and Intel - #1

Merged
aaamosh merged 19 commits into
mainfrom
feat/macos
Oct 5, 2026
Merged

aaamosh merged 19 commits into
mainfrom
feat/macos

Conversation

@aaamosh

@aaamosh aaamosh commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Merge and follow-up outcome

This port is merged. macOS Preview 2 is available for Apple Silicon and Intel from source 0b9924b014d4c46271647e95d97806811fb45229. It includes the wake-capture correction from PR #2. The original Preview 1 remains available with its original files.

Initial macOS preview

Download the first public macOS preview — native Apple Silicon and Intel DMGs, app ZIPs, source manifests and a combined SHA256SUMS.

Released source: 54889c5b04fe3dc32b79084d56bbec6e187a53de
Tree: 22871b90d7b7fef582ebbd166018c5e80940089e

Why

The desktop app's Linux paths, capture setup, startup integration and packaging need native equivalents on a Mac. This port retains DotDial's calls, modem sounds, saved replies and configuration behavior, while adding a self-contained macOS application.

Changes

  • Native menu-bar controls, a Command–Shift–Space default shortcut, microphone permission handling and Login Item status reporting.
  • macOS application-data paths, a bundled Node-independent CLI and a native configuration-lock helper.
  • Optional local wake recognition through Electron's bounded 16 kHz PCM capture and a private supported Python environment.
  • Immediate cancellation of unfinished unmute requests, guards against stale capture completions and recovery after unexpected microphone-track termination.
  • Repair of missing or empty required wake-model files using a checksum-verified staged download and rollback.
  • Native Apple Silicon and Intel ZIP/DMG packages with ad-hoc signatures, source manifests and exact checksums.
  • Exact Electron MIT and Chromium license texts embedded before signing. Both extracted ZIP and mounted DMG are checked against the pinned runtime's notice bytes.
  • A one-time release promotion step scoped to this repository, branch and explicit publication commit. It verifies the current run's six distribution files, creates a draft, verifies all seven GitHub asset sizes and SHA-256 digests, then publishes the prerelease. Conflicting tags or assets are never overwritten.

Main's launch materials are preserved through the existing merge of 77986b32b0a5c88874be733405a176945843098e.

Validation of the published source

Environment Result
Native Apple Silicon macOS 381 tests passed with no skips; all 11 package gates passed.
Native Intel macOS 381 tests passed with no skips; all 11 package gates passed.
Linux CI 381 tests passed with no skips; public-source audit passed.

Native builds, QA and verified publication · Linux CI

The native gates cover runtime notices, every bundled Mach-O deployment target, signed identities and entitlements, config locking, CLI without system Node, synthetic GUI/media capture, packaged worker, wake model repair/decoder, the complete wake PCM pipeline, spoken wake recognition and DMG contents. The pipeline exercises pause/resume, a stopped Python reader, bounded backpressure and restart. Speech recognition uses commit-pinned Flite SLT fixtures for one positive phrase and two negative controls.

The publisher has 14 regression tests, including a retry after remote publication succeeds but the CLI response is lost. Native publication uses the exact artifacts from the verified push run; binaries are not rebuilt during upload.

Preview limits

These builds are ad-hoc signed, without Apple Developer ID signing or notarization. The minimum binary deployment target is macOS 13, while automated native execution uses macOS 15 runners. Synthetic checks do not establish Ventura runtime behavior, physical microphone/speakers, actual TCC denial/grant, hot-unplug or sleep recovery, Login Items in a user session, or real ChatGPT account calls. Login startup can remain unavailable with this signature.

Installation and optional wake setup · Acceptance scope · Publication procedure

Test harness follow-up after publication

Head used for this historical harness follow-up: 391c67e4700cac34f838ff22900e13256bf8344b.

Later native runs exposed timing assumptions in the test harness:

  • The settings smoke now waits for the application's normal initial window show. After its programmatic reload, the existing 12-second readiness check requires both the saved input and two fresh animation frames before starting the unchanged five-second font/opacity capture check. A UUID marker stays stable across polls and is fresh for each reload. Readiness probes remain sequential and preserve the last successful renderer snapshot on failure. Pixel assertions and application animations are unchanged.
  • The speech-preparation timeout regression observes the real Popen handle instead of requiring Python to print its PID before the unchanged 150 ms timeout. Its silent child must be killed, reaped and absent; log-bound and cancellation checks remain intact.

Five focused smoke-readiness regressions pass. Only scripts/smoke-packaged.cjs, two test files and docs/TESTING.md changed after the public release; application runtime code, the public tag and all seven release assets remain at the released source above.

Investigation history is preserved in the preceding native run. It included one resumed PCM observation below the unchanged 25-chunk/seven-second threshold (18 acknowledged chunks, no capture/detector/cleanup error). One unchanged retry passed that PCM stage and recorded the separate settings capture failure: fonts loaded and window visible, but the 220 ms animation had advanced only 150 ms near the capture deadline. The fresh-frame readiness check addresses that ordering gap; no throughput threshold or capture deadline was relaxed.

Verification before final integration

All four workflows for 391c67e4700cac34f838ff22900e13256bf8344b completed successfully on their first attempt, with no reruns of this revision:

Environment Result
Native Apple Silicon, push and PR 386 tests passed, no failures or skips; all 11 package gates passed in both jobs.
Native Intel, push and PR 386 tests passed, no failures or skips; all 11 package gates passed in both jobs.
Linux 386 tests passed, no failures or skips; public-source audit passed. Both push and PR workflows succeeded.

PR native checks · Push native checks · Linux push CI · Linux PR CI

Final integration and CI notification cleanup

The update in 7eef1ef22b25e0e0aa2237223c2c2ecd6747fce6 integrates the current launch documentation from main (270fe150ec242ea00c9fbefe831bb027aafbf772) and resolves the README/public-source inventory conflicts. It retains both the reviewed Mac icon and the platform share card, all existing download links, and the distinction between current source and the fixed Preview 1 binaries.

Both workflows now run once per PR update, on main pushes and version tags, and on manual request. Newer runs cancel older runs only for the same workflow/event/ref. All existing Linux package checks and the native Apple Silicon/Intel jobs are unchanged. The completed one-time Preview 1 publishing job has been retired; its original source, publisher script and regression tests remain available. These workflows do not change GitHub releases.

A bounded independent integration review found no additional merge blocker in the shared Linux/macOS paths, capture cancellation, permission handling, packaging or source inventory. There were no unresolved inline review threads; the Codex bot's sole comment concerns its review quota.

Integration verification

For 7eef1ef22b25e0e0aa2237223c2c2ecd6747fce6, GitHub created exactly the two intended PR workflows; both passed on their first attempt. The tested PR merge tree exactly matches the reviewed integration tree (7f05c4192dad3da6c3148af5e0c69b0c40b33ed5).

Runner Result
Linux 386 tests passed, zero failures/skips; public-source audit, Linux archive/deb packages, checksums and bundled CLI checks passed.
Apple Silicon 386 tests passed, zero failures/skips; all 11 native package gates passed.
Intel 386 tests passed, zero failures/skips; all 11 native package gates passed.

Linux PR CI · Native macOS PR CI

The separate local Work executor cannot bind Unix sockets and exposes a different PID namespace; its restricted preflight is not counted as a passing suite. The complete results above are from the normal GitHub runners with the pinned Node.js runtime. Preview 1's tag and all seven public release assets were checked and remain unchanged.

Post-merge wake correction and Preview 2

The first main run after this merge exposed an intermittent ARM audio-rendering slowdown despite successful PR checks. PR #2 records the reproduced timing evidence, rejected intermediate candidate and accepted silent-sink/latency correction. Native acceptance now requires four resumes and a steady PCM cadence, in addition to the original acknowledgement deadline.

The release source additionally records bounded startup stages and requires four fresh GUI captures. The native release run passed both architecture jobs and all 11 package gates each. The resumed publisher used those original artifacts and verified all seven uploaded sizes/SHA-256 values before making Preview 2 public. Its initial draft-readback failure did not cause a native rebuild or replacement of existing assets.

Publication closeout be423d5 adds the exact download links and removes the completed one-time write job. Normal CI remains active for PRs, main pushes, version tags and manual runs.

Final main verification

Final main commit be423d51a8974627d66b98a5c63a27199cecbefd passed Linux CI and both native macOS jobs on their first attempt. All three logs explicitly report 404 tests passed, zero failures or skips; both Mac builds pass all 11 package gates, four fresh GUI captures, four pipeline resumes, cadence checks, and clean teardown. The native job definition and application runtime are unchanged from the released source by this documentation/workflow closeout.

All seven public Preview 2 files were independently downloaded over anonymous HTTPS, with HTTP 200, exact byte counts and SHA-256 matching GitHub metadata. All six entries in the downloaded SHA256SUMS match the streamed bytes, and both downloaded manifests identify the clean released source 0b9924b014d4c46271647e95d97806811fb45229. No native binaries were rebuilt for publication recovery.

aaamosh added 18 commits October 4, 2026 17:41
Integrate macOS microphone consent, menu bar controls, Login Items, native paths and bundled CLI. Keep wake capture in Electron and run local keyword recognition in its managed Python environment.

Build ad-hoc signed app ZIPs and DMGs on both native architectures, with packaged UI, local media, worker cleanup and real wake-model checks. Document preview installation and signing limitations.
Preserve explicit example shortcuts, exercise both platform quit menus, and compare canonical temporary data paths while retaining managed Python invocation semantics.
Exercise the installed hook runner before native builds so launcher placement and source permissions use the same API as packaging.
Keep ipcRenderer out of contextBridge unsubscribe results. Complete the light palette exposed by native Mac screenshots, wait for settled captures, and use software compositing only in Intel VM smoke checks.
…layout

Keep CLI, GUI/media, worker, wake decoder and DMG gates mandatory while preserving diagnostic results from independent stages. Hidden settings sections must not block the call-panel screenshot.
Run packaged GUI, audio, recovery and real PCM lifecycle checks with owned
Linux display, audio and session-bus services. Fail on orphaned processes,
contradictory reports and bounded-output violations. Require the complete
wake pipeline on native macOS with independently bounded group cleanup.
Document repeatable checks and their synthetic-input limits.
The native audio service cannot read an arbitrary temporary WAV. Use the
pinned Chromium fake device's built-in beeps on macOS while preserving
the real capture graph, nonzero PCM check, queue limits and all sandboxes.
Keep the Linux WAV fixture unchanged and report the actual input source.
Preserve the reviewed ICNS and add the exact launch-media hashes to the public-source allowlist.
Cancel pending unmute immediately on mute, reconcile ended audio tracks without dropping the call, and prevent stale completions from replacing newer capture.

Repair incomplete wake models from checksum-verified staging with rollback. Verify each download checksum exactly once, native Mach-O deployment targets, and actual signed identities and microphone entitlements.

Add pinned private Flite fixtures and require positive recognition plus two negative controls on both Mac architectures. Preserve native evidence and document the hardware and signing limits.
Wait for the application's normal initial show before driving settings save and reload. Preserve the existing font, opacity and pixel assertions, and add bounded window and renderer readiness diagnostics with three regression tests.

The published macOS preview remains tied to 54889c5; this follow-up changes only smoke tests and their documentation.
Capture the real Popen handle in the test instead of parsing a PID from stdout, which can remain empty when the unchanged 150 ms deadline kills Python during startup. Use a silent sleeper and require SIGKILL, a collected exit status and process absence. Keep the noisy-child log bound and cancellation tests unchanged.

Test-only follow-up; the public macOS preview source and distribution assets remain unchanged.
Give each sequential renderer probe the remaining existing five-second capture budget. Stop after an unresolved query instead of queuing more JavaScript behind it, and retain the last successful renderer snapshot separately from the latest timeout.

Add coverage for a single unresolved probe and retained earlier state. Preserve the application-controlled initial show, font and opacity predicates, pixel assertions, and original production deadline. This changes only test tooling; the published preview stays immutable.
Require a fresh double-animation-frame marker alongside the saved input value inside the existing twelve-second reload-readiness wait. A late first compositor frame then precedes the separate unchanged five-second font and opacity capture check.

The marker is stable across polls and unique to each reload. Add a deterministic callback-order regression and document the readiness sequence. App code, animations, capture assertions and published preview artifacts are unchanged.
@aaamosh
aaamosh marked this pull request as ready for review October 5, 2026 11:47
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

Merge the current launch documentation into the macOS port, retaining both reviewed asset inventories and published preview links. Run full Linux and native macOS checks once per PR update, on main and version tags, and on manual request. Retire the completed one-time Preview 1 publisher without changing its historical source or published artifacts.

Co-authored-by: ChatGPT <noreply@openai.com>
@aaamosh
aaamosh merged commit b40ed8e into main Oct 5, 2026
3 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