Thank you for your interest in contributing to Kannon! We welcome all contributions—bug reports, feature requests, documentation improvements, and code changes. Kannon is an open-source, community-driven project, and your input helps make it better for everyone.
- Cloud-native: Designed for scalable, containerized, and distributed environments.
- Reliability: Robust email delivery and observability.
- Modularity: Decoupled components for easy extension and maintenance.
- Open Collaboration: All contributions are welcome!
git clone https://github.com/kannon-email/kannon.git
cd kannongo build -o kannon .You will need a running PostgreSQL and NATS instance. You can use Docker Compose:
docker-compose -f examples/docker-compose/docker-compose.yaml upThen, in another terminal:
./kannon --run-api --run-smtp --run-sender --run-dispatcher --config ./examples/docker-compose/kannon.yamlmake testmake test-e2emake lint- Follow idiomatic Go (gofmt, goimports).
- Use clear, descriptive names for variables, functions, and types.
- Write unit and integration tests for new features and bug fixes.
- Keep functions small and focused.
- Document exported functions and types.
- Prefer composition over inheritance.
- Avoid breaking backward compatibility unless necessary (discuss in an issue first).
- Use GitHub Issues for bugs, enhancements, and questions.
- For feature requests, describe the use case and proposed solution.
- For bugs, include steps to reproduce, expected vs. actual behavior, and environment details.
- Fork the repository and create your branch from
mainor the relevant feature branch. - Make your changes, following the code style guidelines.
- Add or update tests as needed.
- Run all tests and linters locally.
- Push your branch and open a PR against the main repository.
- Fill out the PR template, describing your changes and motivation.
- Participate in the code review process—respond to feedback and make necessary changes.
- PRs are merged after passing CI and review.
- All PRs are automatically tested via GitHub Actions.
- PRs must pass all tests and linters before merging.
The project uses several GitHub Actions workflows:
-
ci.yaml: Main CI pipeline that runs on all PRs and pushes tomain- Unit Tests: Runs
make testwith Go module caching for faster builds - E2E Tests: Runs
make test-e2ein a separate job - Docker Build: Builds and pushes Docker images with layer caching (only on
mainand tags) - Includes concurrency management to cancel outdated builds
- Unit Tests: Runs
-
golang.yaml: Runsgolangci-linton all PRs with Go module caching -
dependabot-auto-merge.yaml: Automatically merges Dependabot PRs for minor/patch updates after CI passes -
release.yaml: Manages release drafts using release-drafter
- Go module caching: CI workflows cache
~/go/pkg/modand~/.cache/go-buildto speed up builds - Docker layer caching: Docker builds use GitHub Actions cache for faster image builds
- Concurrency control: Outdated builds are automatically cancelled when new commits are pushed
- For questions, join the discussion on GitHub or open an issue.
- See the README for more information about the project.
- We welcome all contributors—thank you for helping make Kannon better!
Happy hacking! 🚀