AntennaHead
Project 1 · Build from source

Set up the AntennaHead workspace

AntennaHead is a suite of separate GitHub projects that build on each other. The antennahead-workspace project is a small “umbrella”: a list of the projects plus a script that clones them all into one folder, laid out the way Xcode needs.

Why use it

AntennaHead and ControlBooth use several of the other projects as local Swift packages, found by relative path (for example ../PipelineHelpers). Those paths only resolve when every project sits in the same parent folder. Cloning the projects one at a time into random places makes Xcode fail to find them, or quietly fall back to a copy from GitHub instead of your local one. The workspace script builds the right layout for you.

You’ll need: a Mac running macOS 14 (Sonoma) or later, Xcode 15 or later, and git (it comes with Xcode’s command line tools). An RTL-SDR radio is optional for building; you only need one to tune over-the-air stations.

Step 1: Make the umbrella folder and run the script

Pick a place for everything. The folder name doesn’t matter; this example calls it antennahead-umbrella. The script clones each project as a sibling of antennahead-workspace, so the workspace project goes inside the umbrella folder first.

mkdir antennahead-umbrella
cd antennahead-umbrella
git clone https://github.com/dsward2/antennahead-workspace.git
./antennahead-workspace/bootstrap.sh

The script reads repos.txt and prints == AntennaHead: cloning == and so on for each project. It ends with Done. Repos are siblings of: …. Run it from anywhere; it puts the projects next to antennahead-workspace, not in your current folder.

Step 2: What you get

Each project is its own independent git repository with its own history, issues and pull requests. The workspace only holds the list.

antennahead-umbrella/
  antennahead-workspace/   the manifest and bootstrap script
  AntennaHead/             the sandboxed macOS app
  ControlBooth/            the unsandboxed companion app
  LiveAudioServer/         the streaming server
  PipelineHelpers/         shared pipeline tools
  SharedLogging/           shared log viewer
  AirPlayReceiver/         AirPlay audio receiver package
  antennahead-librtlsdr/   RTL-SDR driver build
  AntennaHeadAPI/          JSON API types for the native apps
  AntennaHeadTV/           Apple TV app
  AntennaHeadiOS/          iPhone, iPad and Apple Watch apps
  AntennaHeadUninstaller/  cleanup tool
  StationDirector/         station automation prototype

The two Mac apps

AntennaHead and ControlBooth are the ones most people build.

Shared packages

PipelineHelpers, SharedLogging, AirPlayReceiver and LiveAudioServer are used by the apps as local packages.

Clients and tools

AntennaHeadTV, AntennaHeadiOS (with the Apple Watch app), AntennaHeadAPI, the Uninstaller and StationDirector are optional extras.

Step 3: Open and build

AntennaHead

Open AntennaHead/AntennaHead.xcodeproj in Xcode, choose the AntennaHead scheme with your Mac as the destination, and press ⌘R. Swift Package Manager fetches the other dependencies on the first build.

ControlBooth

Open ControlBooth/ControlBooth.xcodeproj. The project’s SETUP.md explains its helper tools and the build phases that embed them.

The other projects

Each has its own README with build notes. Open the .xcodeproj or package in its folder.

If Xcode says a package can’t be found, check that the project folders really are siblings (ls in the umbrella folder should list them all).

Step 4: Keep it up to date

Run the script again any time. For a project that’s already cloned it fetches the latest changes without changing your files, so follow it with a pull in the projects you want to update:

./antennahead-workspace/bootstrap.sh
git -C AntennaHead pull --ff-only
git -C ControlBooth pull --ff-only

To update every project at once, run this in the umbrella folder. It skips any project with local changes it can’t fast-forward over:

for d in */; do git -C "$d" pull --ff-only; done

Changing or adding projects

Contributing

Because every project is its own repository, make changes and open pull requests in the project you changed, not in the workspace.

Adding a project

To add a project to the suite, add a line to repos.txt in the form name  url  ref, and the script will clone it too.

More reference

The workspace also holds NETWORK_PORTS.md, a map of every port the suite opens, and design notes.

antennahead-workspace on GitHub → All projects