- macOS 14+
- Xcode 26+ (Swift 6 and the macOS 26 SDK)
- Zig (install via
brew install zig) - Rust with Cargo for the shared application core. Add
aarch64-apple-darwinandx86_64-apple-darwintargets when building a universal macOS release. The Xcode build compiles and links the core automatically.
For the native WinUI frontend, use Windows with the .NET SDK and Rust MSVC
toolchain described in windows/README.md. Its build script
produces the rolling .exe artifact. Windows interaction validation is covered
in docs/windows-testing.md.
-
Clone the repository with submodules:
git clone --recursive https://github.com/darkroomengineering/programa.git cd programa -
Run the setup script:
./scripts/setup.sh
This will:
- Initialize git submodules (ghostty, homebrew-programa)
- Build the GhosttyKit.xcframework from source
- Create the necessary symlinks
-
Build the debug app:
./scripts/reload.sh --tag my-feature
The script prints the
.apppath. Cmd-click to open, or pass--launchto open automatically.
| Script | Description |
|---|---|
./scripts/setup.sh |
One-time setup (submodules + xcframework) |
./scripts/reload.sh --tag my-feature |
Build Debug app (pass --launch to also open it) |
./scripts/reloadp.sh |
Build and launch Release app |
./scripts/reload2.sh --tag my-feature |
Reload both Debug and Release |
If you make changes to the ghostty submodule, rebuild the xcframework:
cd ghostty
zig build -Demit-xcframework=true -Doptimize=ReleaseFastRun tests through GitHub Actions or the designated VM. See the testing layout for the four harnesses and their scope. Do not point socket tests at your everyday Programa instance.
Run the CI suite on your pushed branch:
gh workflow run ci.yml --ref my-featureRun the focused notification UI regression on the macOS 26 lane:
gh workflow run ci.yml --ref my-feature -f notification_ui=trueThe ghostty submodule points to a fork of the upstream Ghostty project maintained by Darkroom Engineering.
cd ghostty
git checkout -b my-feature
# make changes
git add .
git commit -m "Description of changes"
git push darkroom my-featurecd ghostty
git fetch origin
git checkout main
git merge origin/main
git push darkroom mainThen update the parent repo:
cd ..
git add ghostty
git commit -m "Update ghostty submodule"See docs/ghostty-fork.md for details on fork changes and conflict notes.
By contributing to this repository, you agree that:
- Your contributions are licensed under the project's GNU General Public License v3.0 or later (
GPL-3.0-or-later). - You grant Darkroom Engineering a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license to use, reproduce, modify, sublicense, and distribute your contributions under any license, including a commercial license offered to third parties.