The full app compiles, but the standalone logic-test harness exposed an architectural coupling in the new tutorial: it was importing live controller services directly. I’m narrowing that interface to simple status values and an image input, which keeps onboarding reactive in the app while preserving fast isolated tests.


Compilation and all 111 logic checks pass. I’m now doing a visual usability pass on the real macOS windows before release packaging—especially the first-run pairing graphic and the new clipboard wording—using computer control so I can verify what a user will actually see.


The visual pass looks good: the onboarding opens automatically, the Create and PS buttons are clearly circled and named, USB is presented as an equal path, and the permissions step is concise. I’m starting the signed/notarized release build now; Apple’s notarization is the remaining time-consuming step.


The app itself signed, notarized and stapled successfully. The new DMG layout then hit one packaging compatibility issue: this macOS `hdiutil` rejects an explicit read/write format when creating a blank image. I’ve isolated it to that single flag and am correcting it before re-running the release.


The release build has now passed both Apple notarization stages and Gatekeeper validation. I’m doing one final read-only check of the actual mounted DMG window and artifact contents, then I’ll commit and push.


The mounted DMG revealed one last polish issue specific to Macs with “show hidden files” enabled: Finder was placing the hidden background and filesystem folders over the header. The installer is otherwise correct. I’m moving those support items outside the visible canvas so the branded window stays clean even with that developer setting enabled.


The final DMG now opens cleanly with only the app and Applications visible, even with hidden files enabled. I’m running the final regression checks, then I’ll commit, push `main`, and replace both GitHub release assets with these notarized builds so the downloadable copy matches the code.


One important check caught a mismatch: the GitHub release now has the new DMG, but `www.control-deck.com` is still serving the previous file. Since your next install is meant to come from the website, I’m updating that existing hosted asset too and will verify its checksum before I hand it back. I’m using the Sites hosting workflow because this is an update to the already-deployed ControlDeck site, not a new site build.


Completed, published, committed, and pushed.

Changes include:

- Polished drag-to-Applications DMG window.
- Automatic, skippable eight-step first-run guide.
- Visual Create + PS pairing instructions and USB alternative.
- Direct Accessibility Settings guidance.
- L3 = Copy and R3 = Paste for Codex and General profiles.
- Screenshot editor now clearly says “Done & Copy” and confirms the marked-up image is ready to paste.

Validation passed:

- 111 logic checks
- Swift build
- Visual onboarding and DMG inspection
- Apple notarization and stapling
- Gatekeeper assessment

The website now serves the exact new DMG, and the GitHub release assets are updated.

Download: [www.control-deck.com](https://www.control-deck.com)
GitHub: [ControlDeck 1.0.0 release](https://github.com/ihansel/control-deck/releases/tag/v1.0.0)
Local artifact: [ControlDeck.dmg]([LOCAL_PATH_REDACTED])

Commit: `d60476f Polish first-run setup and installer`

::git-stage{cwd="[LOCAL_PATH_REDACTED]"}
::git-commit{cwd="[LOCAL_PATH_REDACTED]"}
::git-push{cwd="[LOCAL_PATH_REDACTED]" branch="main"}
::git-stage{cwd="[LOCAL_PATH_REDACTED]"}
::git-commit{cwd="[LOCAL_PATH_REDACTED]"}
::git-push{cwd="[LOCAL_PATH_REDACTED]" branch="main"}


I want the codex app to be able to voice dictation anywhere there is a text input field using the L2 button like in codex. Also, if I press square and x I want it to bring up the quick select menu in mac to swap between apps.


I’ll make L2 a universal “dictate into the focused text field” control across profiles, while preserving the Codex-quality capture path where available. I’ll also add a Square + Cross chord for the native macOS app switcher, with chord handling that prevents either button’s normal action from firing accidentally.

I’m using the ControlDeck customization skill to keep the new defaults, migrations, and runtime behavior consistent with the existing profile system, then I’ll build and test the macOS app.


The customization skill confirms this needs a source-level change rather than a profile-only remap: universal dictation requires runtime focus handling, and Square + Cross is a new chord. I’m reading the controller architecture now before touching the event pipeline.


The interaction design is now fixed: Cross keeps its zero-delay mouse behavior. Square acts as the chord modifier—hold Square, tap Cross to open/cycle the macOS app switcher, then release Square to select. A normal Square tap still performs its profile action, so the shortcut doesn’t damage existing mappings.


I’ve got the interaction model settled: L2 will keep Codex’s native transcription inside Codex, while every other profile gets tap-or-hold dictation into whichever text field is focused. For app switching, hold Square, tap Cross to open/cycle the macOS switcher, then release Square to select—this keeps ordinary Cross clicks immediate. I’m wiring those behaviors through the runtime, defaults, migration, overlay, tutorial, and tests now.


The runtime path is now in place, including a held Command lifecycle for the real macOS app switcher and a safety release if the controller disconnects or ControlDeck quits. I’m updating the existing saved-profile migration now so current users gain L2 dictation without overwriting any L2 mapping they deliberately customized.


All logic checks and the debug build are passing. The behavior is also reflected in the first-run tutorial and contextual overlay, so users will see that L2 dictates into the focused field and that Square + Cross controls the macOS app switcher. I’m doing the final packaged-app launch verification now.