Pilot is source-available under BSL 1.1. Contributions are welcome and appreciated. This guide covers how to set up a development environment, submit changes, and follow project conventions.
- Go 1.22+ — go.dev/dl
- Claude Code CLI — Required for running Pilot's executor
- GitHub CLI (
gh) — For testing issue/PR workflows - Make — Build automation
git clone https://github.com/qf-studio/pilot.git
cd pilot
make buildThe binary is output to bin/pilot.
make testmake lintmake fmtOpen a GitHub Issue with:
- Steps to reproduce
- Expected vs actual behavior
- Pilot version (
pilot --version) - OS and architecture
Open a GitHub Issue with the enhancement label. Describe the use case and why it matters. Feature discussions happen in issues before implementation starts.
- Open an issue first for non-trivial changes. This avoids duplicated effort and ensures alignment on approach.
- Fork the repository
- Create a feature branch from
main - Make your changes
- Run
make test && make lint— both must pass - Submit a pull request
Documentation lives in two places:
docs/— Nextra docs site (MDX pages)README.md— Project overview
PRs for documentation improvements follow the same process as code changes.
- Formatting:
go fmt(enforced by CI) - Linting:
golangci-lint(enforced by CI) - Testing: Table-driven tests are the standard pattern
- Indentation: Tabs (Go standard)
Follow Conventional Commits:
type(scope): description
feat(executor): add timeout configuration
fix(autopilot): refresh HeadSHA before CI check
refactor(dashboard): extract card renderer
test(controller): add merge state transition tests
docs(readme): update installation instructions
chore(ci): upgrade Go version in workflow
Types: feat, fix, refactor, test, docs, chore
Never use realistic API key patterns in test code. GitHub push protection blocks them.
// Bad — will be blocked by push protection
token := "xoxb-123456789012-1234567890123-abcdefghij"
// Good — use test utilities
import "github.com/alekspetrov/pilot/internal/testutil"
token := testutil.FakeSlackBotTokenSee internal/testutil/tokens.go for all available fake tokens.
- CI must pass — Tests, linting, and formatting are checked automatically
- One approval required — A maintainer reviews all PRs
- Keep PRs focused — One logical change per PR. Split large changes into smaller PRs.
- Update tests — New features need tests. Bug fixes need regression tests.
- Update docs — If your change affects user-facing behavior, update the relevant documentation.
pilot/
├── cmd/pilot/ # CLI entrypoint
├── internal/
│ ├── adapters/ # GitHub, Telegram, Linear, Slack, Jira
│ ├── alerts/ # Alert engine and channels
│ ├── config/ # Configuration loading
│ ├── dashboard/ # Terminal UI (bubbletea)
│ ├── executor/ # Claude Code process management
│ ├── gateway/ # WebSocket + HTTP server
│ ├── memory/ # SQLite persistence
│ └── testutil/ # Test helpers and fake tokens
├── docs/ # Nextra documentation site
└── configs/ # Example configuration files
Pilot is licensed under BSL 1.1 (Business Source License). By contributing, you agree that your contributions will be licensed under the same terms.
What BSL 1.1 means for contributors:
- Your contributions are source-available, not open source (by OSI definition)
- The code converts to Apache 2.0 after the change date specified in the LICENSE
- Free for internal use, self-hosting, evaluation, and development
- The license restricts offering Pilot as a competing hosted service
If you have questions about the license, open an issue or reach out to the maintainers.
- GitHub Issues — Bug reports and feature requests
- GitHub Discussions — Questions and community conversations
- Email — hello@quantflow.studio
Thank you for contributing.