Thanks for your interest in contributing! Here's how to get started.
- Go 1.26+
- Docker (for integration tests and local services)
- golangci-lint
- Fork and clone the repository
- Copy the environment file:
cp .env.example .env
- Start local services:
make docker-up
- Install dependencies:
make deps
- Run the tests:
make test-short # Unit tests only (<2s, no Docker) make test # Full suite with integration tests (~15s)
- Create a branch from
main - Make your changes
- Run the checks:
make fmt make lint make test - Commit with a clear message describing why the change was made
- Open a pull request against
main
- Follow existing patterns in the codebase
- Run
make fmtandmake lintbefore committing - golangci-lint is configured in
.golangci.yml— CI will enforce it
- Unit tests:
<feature>_test.goalongside the code - Integration tests:
<feature>_integration_test.gousing testcontainers - Aim to test behavior, not implementation details
- Use
make test-shortfor fast feedback during development
The project follows a layered architecture with strict dependency rules:
Domain ← Platform ← App ← Adapter ← Main
- Domain (
internal/domain/): Interfaces and types only — no internal dependencies - Platform (
internal/platform/): Cross-cutting infrastructure — stdlib only - App (
internal/app/): Business logic — depends on Domain + Platform - Adapter (
internal/adapter/): External integrations — depends on Domain + Platform + App - Main (
cmd/): Wiring only
See CLAUDE.md for detailed architecture documentation.
- Use GitHub Issues for bugs and feature requests
- Include reproduction steps for bugs
- Check existing issues before opening a new one