Module 10
Xcode and tooling
Project structure
| Concept | What it is |
|---|---|
| Project | .xcodeproj — files, targets, settings |
| Target | One buildable output (the app, a test bundle, an extension) |
| Scheme | Which targets to build and how to run them |
| Configuration | Debug vs Release — different optimisation and flags |
| Build settings | Hundreds of knobs. Use the search field; never scroll. |
| Info.plist | App metadata: version, permissions, LSUIElement |
Modern Xcode keeps Info.plist values in the target's Info tab rather than a visible file. Both work; the tab is easier and is what the setup guide uses.
Debugging
Xcode's debugger is genuinely excellent and worth learning properly — it will save you far more time than an equivalent investment in anything else here.
- Breakpoints: click a line number. Right-click to add a condition (
index == 5) or an action that logs and continues automatically. - Symbolic breakpoints: break on a method name you don't have source for. Adding one on
-[NSWindow makeKeyAndOrderFront:]is how you'd catch something stealing focus. - LLDB console:
po someVariableprints an object;pprints a raw value. You can call methods on live objects while paused. - View hierarchy debugger: the 3D-looking icon. Explodes your UI into layers — indispensable when something is invisible or mispositioned.
- Memory graph debugger: shows retain cycles visually.
Instruments
A separate profiling app (Product → Profile, or ⌘I). The templates worth knowing:
- Time Profiler — where CPU time goes. Use this if dictation feels sluggish.
- Allocations — memory growth over time. Run a hundred dictations and confirm memory returns to baseline.
- Leaks — finds objects that can never be freed.
Wispr Flow reportedly idles around 800 MB on Windows. Spoke should idle in the tens of megabytes. Measuring that and putting the number on your landing page is a legitimate competitive weapon.
Building without the IDE
xcodebuild -scheme Spoke -destination 'platform=macOS' build
This is the command that makes agentic development viable on this project — it lets an assistant compile, read real compiler errors, and iterate without you relaying anything. It's the single most useful thing to know once you move to a repo.
Two surfaces can run it, both on your own Mac and both using the same engine and the same CLAUDE.md: the Code tab in the Claude desktop app, or the standalone claude CLI in a terminal. The Code tab adds visual diff review, parallel sessions on automatic git worktrees, image attachments, and an integrated terminal. The CLI adds scripting (--print), CI pipelines, and agent teams. For building Spoke, the Code tab is the more comfortable choice; neither is more capable at the actual work.