feat: desktop app bring-up (stream B: B1-B5)#2
Merged
Conversation
Imports the open-source Swift/SwiftUI menu-bar app (Clicky, MIT) that we build on: ScreenCaptureKit capture pipeline, pointer overlay engine, push-to-talk voice pipeline, and panel UI. Upstream LICENSE retained at desktop/LICENSE. Excluded from the import: xcuserdata, agent docs, and ~9MB of onboarding media (music/images) that our fork does not use - the only code reference (onboarding music) degrades gracefully. All functional changes land in follow-up commits so the diff against upstream stays reviewable. Co-authored-by: Cursor <cursoragent@cursor.com>
- Replace placeholder bundle identifiers with com.flexithon.companion (app, tests, uitests). - Remove hardcoded upstream developer team IDs; automatic signing now prompts each dev for their own personal team on first open. - Add a shared build scheme so fresh clones (and future CI) can build without relying on per-user Xcode state. Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the hardcoded proxy URL placeholder with an APIBaseURL key read through AppBundleConfiguration at startup. Dev builds ship pointing at http://localhost:3000/api (our Next.js proxy); the demo build only needs a plist edit to target production. Missing key fails fast with a clear message, and a trailing slash is trimmed so /chat and /tts endpoint interpolation stays correct. Co-authored-by: Cursor <cursoragent@cursor.com>
Set VoiceTranscriptionProvider to the Apple provider in Info.plist. The transcription factory already resolves this key, so no code changes: voice input now transcribes on-device (private, free, no third-party STT key or token proxy needed). AssemblyAI remains available behind the same key as a fallback if accuracy testing disappoints. Co-authored-by: Cursor <cursoragent@cursor.com>
Covers Xcode 16.3 install constraints on macOS 15.2, signing with a personal team, the four runtime permissions (with the Screen Recording relaunch gotcha), Info.plist configuration keys, the end-to-end smoke test, and troubleshooting for the known non-interactive SPM stall. Co-authored-by: Cursor <cursoragent@cursor.com>
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
Stream B from
docs/TASKS.md— brings the native macOS companion app into the repo and wires it for our stack. Five commits, in order:desktop/(capture pipeline, pointer overlay, voice pipeline, panel UI). UpstreamLICENSEretained; per-user Xcode state and unused onboarding media excluded.com.flexithon.companion*), upstream signing team IDs removed (automatic signing prompts each dev for their own personal team), shared build scheme added so fresh clones build headlessly.APIBaseURLInfo.plist key. Dev builds point athttp://localhost:3000/api; the demo build will point at Vercel with a one-line plist edit.VoiceTranscriptionProvider = apple— speech-to-text now runs on-device via Apple Speech, no third-party STT key needed.desktop/README.mdwith Xcode 16.3/macOS 15.2 constraints, signing, the four runtime permissions, smoke test, and troubleshooting.Headless build verified on this branch:
xcodebuild ... CODE_SIGNING_ALLOWED=NO→ BUILD SUCCEEDED (only pre-existing upstream warnings).What's left (B6 — not in this PR)
The end-to-end smoke test has NOT run yet. It is blocked on:
feat/api-proxy):/api/chatand/api/ttsroutes inflexithon-app— nothing is listening onlocalhost:3000/apiyet, so chat/TTS will fail until that lands.assemblyai+ porting the token-proxy route.Also deliberately NOT in this PR (next streams): the imported code still phones home (analytics + form endpoint) — stream C strips it before anything ships; senior UI (D), verify loop (E), scam guardian (F).
Test plan
plutil -linton Info.plist; Swift file parse checkdocs/TASKS.md)Made with Cursor