Thank you for your interest in contributing to Crow! This guide will help you get started.
Please note that this project is released with a Code of Conduct. By participating in this project you agree to abide by its terms.
Open a GitHub Issue with:
- macOS version and hardware (Intel/Apple Silicon)
- Xcode and Zig versions
- Steps to reproduce
- Expected vs actual behavior
- Relevant stderr logs (see Debugging)
Open a GitHub Issue describing the use case and proposed solution.
See README.md for full build instructions. The short version:
git clone --recurse-submodules https://github.com/radiusmethod/crow.git
cd crow
make buildAlways use
make buildfor full builds. It handles submodules, the Ghostty framework, and the Swift build. Useswift buildonly for quick iteration after the initial build.
Note: Code signing is not required for development. Unsigned builds work normally for local testing. Official releases are signed and notarized automatically via GitHub Actions.
make test # Preferred — runs all package tests
swift test # Also works (runs root package tests)
mise test # If using miseTests use the Swift Testing framework (@Test macros). Currently, tests exist
in CrowCore. When adding new functionality to any package, include a test
target in that package's Package.swift and add tests.
- Swift 6.0 with strict concurrency enabled
- SwiftUI for all views
- Follow existing patterns in the codebase
- Keep packages focused — each package under
Packages/has a single responsibility
New functionality should go in the appropriate existing package:
| Package | Scope |
|---|---|
CrowCore |
Data models, observable app state |
CrowUI |
SwiftUI views, theme |
CrowTerminal |
Ghostty terminal surface management |
CrowGit |
Git operations |
CrowProvider |
GitHub/GitLab provider abstraction |
CrowPersistence |
JSON store, config I/O |
CrowClaude |
Claude binary resolution |
CrowIPC |
Unix socket RPC protocol |
If a new package is needed, create it under Packages/ and add it to the root Package.swift.
- Fork the repo and create a feature branch from
main - Make your changes with clear, focused commits
- Include tests for new functionality where applicable
- Ensure
swift testpasses - Open a PR with:
- A description of what changed and why
- A link to the related issue
- Screenshots for UI changes
Crow follows Semantic Versioning:
- Major (X.0.0) — breaking changes to the CLI, IPC protocol, or config format
- Minor (0.X.0) — new features and capabilities
- Patch (0.0.X) — bug fixes and minor improvements
The VERSION file at the repo root contains the current version (e.g., 0.1.0). All build scripts read from this file. Never hardcode a version string elsewhere.
For CI, set the CROW_VERSION environment variable to override the file. The build number (CFBundleVersion) is derived automatically from git rev-list --count HEAD.
- Update
VERSIONwith the new version number - Move entries from
[Unreleased]inCHANGELOG.mdinto a new version section - Commit:
git commit -am "Release vX.Y.Z" - Tag:
git tag vX.Y.Z - Push:
git push origin main --tags
When submitting a PR, add a bullet under the [Unreleased] section of CHANGELOG.md describing your change. Use the categories from Keep a Changelog: Added, Changed, Deprecated, Removed, Fixed, Security.
We may adopt Conventional Commits and automated changelog generation (e.g., git-cliff) as the project matures. For now, the changelog is maintained manually.
Crow auto-generates certain files into {devRoot}/.claude/ on launch (see Scaffolder.swift):
CLAUDE.md— scaffolded from the rootCLAUDE.mdskills/crow-workspace/SKILL.md— scaffolded fromResources/crow-workspace-SKILL.md.templatesettings.json— always overwritten with pre-approved permissions
Do not edit the scaffolded copies. Instead, modify the source files in the repository root or Resources/ directory.