Module 10

Xcode and tooling

Project structure

ConceptWhat it is
Project.xcodeproj — files, targets, settings
TargetOne buildable output (the app, a test bundle, an extension)
SchemeWhich targets to build and how to run them
ConfigurationDebug vs Release — different optimisation and flags
Build settingsHundreds of knobs. Use the search field; never scroll.
Info.plistApp 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 someVariable prints an object; p prints 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.

Spoke never sends your voice, your text, or anything else off this Mac. Not a promise in a privacy policy — a property of the binary.