Thanks for your interest in contributing to money.
money is a local-first, agent-friendly personal finance backend. Contributions should align with these principles:
- Stable JSON contracts above all. Breaking changes to the contract must be intentional and versioned.
- Keep the core boring. Simple, deep, deterministic modules over clever abstractions.
- No AI chat, model providers, hosted billing, telemetry, or required server behavior in the core.
- Provider adapters are replaceable. Provider-specific logic lives behind interfaces.
- Go 1.26 or later (see
go.modfor the exact version)
git clone https://github.com/thedavidweng/money.git
cd money
mise install # install tools pinned in mise.toml
go mod download# Format check (CI will fail if any files are unformatted)
test -z "$(gofmt -l .)"
# Static analysis
go vet ./...
# Run tests with race detector (matches CI)
go test ./... -race
# Run tests with coverage summary
go test ./... -cover
# Build the binary
go build ./cmd/moneyCI runs gofmt -l, go vet, go test -race, and go build on both ubuntu-latest and macos-latest for every push and pull request.
Releases are automated via GoReleaser and triggered by pushing a v* tag. The release workflow requires a HOMEBREW_TAP_GITHUB_TOKEN secret with push access to the Homebrew tap repository. To test the release process locally:
goreleaser release --snapshot --clean- Open an issue first to discuss the change.
- Keep PRs focused — one concern per PR.
- Update documentation (
docs/,README.md,AGENTS.md) alongside code changes. - Follow existing code style and Go conventions.
- Add tests for new behavior.
Follow Conventional Commits:
feat: add Plaid provider adapter
fix: handle null category in envelope serialization
docs: clarify encryption key rotation
Be respectful. This is a personal project but contributors are welcome.