Contributing

Thanks for poking at this. Issues and pull requests are welcome.

#Local checks

sh
make check         # fmt + clippy + tests; same gate CI runs
make coverage      # llvm-cov summary, matches CI exclusions
make coverage-html # per-line HTML report at target/llvm-cov/html/index.html
make app           # build a Mac .app bundle for the host arch
make app-universal # universal lipo-merged bundle (Intel + Apple Silicon)
make dmg           # wrap the host .app in a drag-to-Applications .dmg
make icon          # rasterise icon/icon.svg into AppIcon.icns (rerun only when SVG changes)

make check is the same gate CI runs. PRs that fail it get sent back automatically.

#Test policy

Every feature ships with a test. Coverage is tracked on the testable surface. Two regions are excluded, both locally and in CI, with the reason documented in the file's header comment:

If a feature can be tested it must be. Exclusions are for code that physically cannot be exercised, not for skipping work.

When adding code, prefer:

New code lands covered.

#Visual smoke tests

scripts/simulate.py fires every realistic mail scenario at the running app — transactional, marketing, attachments, calendar invites, unicode, dark-mode-aware HTML, and so on:

sh
make run &           # debug build of the app
./scripts/simulate.py --list      # see every scenario
./scripts/simulate.py marketing   # send one
./scripts/simulate.py burst -n 200 # ring-buffer stress test

Stdlib only, no Python dependencies. Useful for eyeballing UI changes before opening a PR.

#Style

#Versioning and release flow

Semantic Versioning, conventional commits.

When you commit a user-visible change, do all four in the same commit:

  1. Bump version in Cargo.toml. feat: → minor, fix: / no prefix → patch, [major] or BREAKING CHANGE: → major.
  2. Add a top entry to CHANGELOG.md. Keep it terse and user-facing.
  3. Run make check.
  4. After merging to main, push the matching tag:
sh
git tag "v$(grep -m1 '^version' Cargo.toml | sed -E 's/.*"([^"]+)".*/\1/')"
git push --tags

The release workflow watches for v* tags and builds the macOS .app bundles (Intel, Apple Silicon, universal), wraps each in a .dmg, publishes the GitHub release, and uploads the archives + .sha256 sums. The site workflow redeploys the docs on every push to main.

#Where things live

#Code of conduct

Be kind. We have a zero-tolerance policy for harassment. Disagreements about technical decisions are welcome; ad-hominem attacks are not.