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.