Thanks for your interest in contributing! Bosun is designed to be simple and stay simple.
Before contributing, understand the project philosophy:
- Shell scripts over frameworks. ~100 lines of bash beats 10,000 lines of Go.
- Batteries included, batteries swappable. Defaults work. Replace any component.
- Escape hatches everywhere. Raw passthrough when abstractions don't fit.
- Guardrails matter. Manifest stays under 250 lines. Max 10 provisions.
- Check existing issues first
- Include: OS, Docker version, steps to reproduce, expected vs actual behavior
- Attach logs if relevant (
docker logs bosun)
- Open an issue with
[Feature]prefix - Explain the use case, not just the solution
- Consider: Does this fit the philosophy? Is there a simpler way?
- Fork the repo
- Create a branch:
git checkout -b feat/my-feature - Make your changes
- Test locally
- Commit with conventional commits:
feat:,fix:,docs: - Open a PR
- Shell: Use
shellcheck - Python: Use
rufffor linting, type hints everywhere - YAML: 2-space indent
- Markdown: Pass
markdownlint
- Bug fixes with tests
- Documentation improvements
- New provisions (if broadly useful)
- Cloudflare Tunnel integration
- Major refactors (unless discussed first)
- New dependencies
- Features that increase complexity
- Kubernetes support (use Flux/ArgoCD)
- Complex orchestration features
- Anything that breaks the "~100 lines" constraint
# Clone
git clone https://github.com/cameronsjo/bosun.git
cd bosun
# Test manifest
cd manifest
uv run manifest.py render stacks/apps.yml --dry-run
# Test bosun (requires Docker)
cd bosun
docker compose up -dSignificant changes require an ADR (Architecture Decision Record):
- Copy
docs/adr/TEMPLATE.mdtodocs/adr/NNNN-title.md - Fill in context, decision, consequences
- Submit with your PR
- ADR is accepted when PR merges
Open an issue with [Question] prefix or start a discussion.