This guide walks you from a fresh clone to a running Crow app with GitHub (or GitLab) authentication and a scaffolded workspace.
git clone --recurse-submodules https://github.com/radiusmethod/crow.git
cd crowIf you already cloned without --recurse-submodules:
git submodule update --init vendor/ghosttyThe one-shot build path uses the Makefile:
make buildThis runs setup (initializes submodules and checks prerequisites), ghostty (builds the GhosttyKit XCFramework with Zig), and app (runs swift build). The result is two binaries in .build/debug/:
CrowApp— the main macOS applicationcrow— the CLI used by Claude Code sessions
| Target | Purpose |
|---|---|
build |
Full build: submodules + ghostty + swift build (default) |
setup |
Init submodules and verify build prerequisites (Zig 0.15.2, Metal toolchain) |
check |
Verify all build and runtime prerequisites (includes gh, claude) |
ghostty |
Build the GhosttyKit.xcframework only |
app |
Run swift build (debug) without touching ghostty |
release |
Release build + .app bundle via scripts/bundle.sh |
sign |
Sign, create DMG, and notarize (requires DEVELOPER_ID_APPLICATION) |
test |
Run all package tests |
clean |
Remove .build/ (keeps the ghostty framework) |
clean-all |
Remove .build/ and Frameworks/ (full rebuild) |
help |
Print the target list |
If you need finer-grained control, you can run the individual steps that make build orchestrates:
# Build the Ghostty framework only (writes Frameworks/GhosttyKit.xcframework)
./scripts/build-ghostty.sh
# Debug build
swift build
# Release build
swift build -c release
# Create the .app bundle from a release build
./scripts/bundle.sh
# Sign and notarize the bundled .app
./scripts/sign-and-notarize.shBuild troubleshooting:
- Check Zig:
zig versionmust show0.15.2 - Check Metal toolchain:
xcrun -sdk macosx metal --version - Install the Metal toolchain if missing:
xcodebuild -downloadComponent MetalToolchain - If
swift buildfails with linker errors, run./scripts/build-ghostty.shfirst (or justmake build)
If you have mise installed, the predefined tasks in mise.toml wrap the same operations:
| Task | Runs |
|---|---|
mise dev |
swift run CrowApp |
mise build |
make build (full build) |
mise build:release |
swift build -c release |
mise build:ghostty |
bash scripts/build-ghostty.sh |
mise test |
swift test |
mise bundle |
bash scripts/bundle.sh |
mise sign |
Depends on bundle, then sign + notarize |
mise clean |
rm -rf .build .derived-data Crow.app |
mise xcode:generate |
swift package generate-xcodeproj |
Crow uses the gh CLI to read issues, PRs, and GitHub Projects (V2) board status, and to write project board status (moving tickets to "In Progress" / "In Review") via the updateProjectV2ItemFieldValue GraphQL mutation.
gh auth login
gh auth refresh -s project,read:org,repo
gh auth status # verify the scopes above are listed| Scope | Why it's needed | Used by |
|---|---|---|
repo |
Read/write issues, PRs, branches, commit statuses | gh issue view/edit, gh pr view/create, gh search issues |
read:org |
Resolve org membership so @me assignee queries work across org repos |
gh search issues --assignee @me |
project |
Read AND write GitHub Projects V2 board status — required to update Status to "In Progress" / "In Review" | IssueTracker.swift updateProjectStatus(), the /crow-workspace skill when starting a session |
Important:
read:projectis not sufficient. The in-code error messages will tell you to rungh auth refresh -s project— this is the writeprojectscope, which is a superset ofread:project. SeeSources/Crow/App/IssueTracker.swift:691-692and:768-769.If you see
[IssueTracker] GitHub token missing 'project' scopein stderr orINSUFFICIENT_SCOPESfrom a GraphQL call, re-rungh auth refresh -s projectand retry.
Crow shells out to several CLIs at runtime. This table consolidates what each one needs:
| Tool | Auth / Scopes | Notes |
|---|---|---|
gh |
repo, read:org, project (see above) |
Set via gh auth login and gh auth refresh -s project,read:org,repo |
glab |
api, read_user, read_repository (verify for your instance) |
Only required for GitLab workspaces. Issue/MR reads. Write scopes needed if you expect MR status updates. |
git |
Local only — no external auth | Ships with Xcode Command Line Tools |
claude |
No network auth; binary must be on PATH |
Install from claude.ai/download |
If any of your workspaces use self-hosted GitLab:
glab auth login --hostname gitlab.example.comCrow will invoke glab with GITLAB_HOST set from the workspace config. The app does not enforce specific scopes on the GitLab token; check your instance's documentation for what your user account needs.
.build/debug/CrowAppOn first launch, the setup wizard asks for:
- A development root directory (e.g.
~/Dev) — where Crow scaffolds workspaces and stores worktrees. - One or more workspaces — each is a subdirectory under the dev root with a name, provider (
githuborgitlab), and (for GitLab) a host.
When you finish the wizard, Crow scaffolds the following under the dev root (see Sources/Crow/App/Scaffolder.swift):
{devRoot}/
├── {workspace}/ # one directory per workspace
├── crow-reviews/ # temporary clones for PR reviews
└── .claude/
├── CLAUDE.md # manager-tab context (crow CLI reference)
├── settings.json # pre-approved permissions for crow/gh/git
├── config.json # workspace config (workspaces + defaults)
├── prompts/ # prompt files for crow-workspace sessions
└── skills/
├── crow-workspace/ # /crow-workspace skill + setup.sh
├── crow-review-pr/ # /crow-review-pr skill
└── crow-batch-workspace/ # /crow-batch-workspace skill
Alternatively, you can scaffold without launching the GUI by running the CLI setup wizard:
.build/debug/crow setup # prompts interactively
.build/debug/crow setup --dev-root ~/Dev # skip the devRoot prompt- CLI reference — every
crowsubcommand and its flags - Configuration — file locations, workspace config schema, directory layout
- Architecture — packages, key components, data flow
- Troubleshooting — common errors and fixes