Contributing to EchoNote
April 18, 2026 · View on GitHub
Thanks for taking the time to contribute. This document is the single source of truth for how work lands in this repository.
If anything here is unclear or out of date, open a PR — improving the onboarding path is itself a valid contribution.
Table of contents
- Code of conduct
- Local setup
- Commit messages
- Branching model
- Pull requests
- Architecture Decision Records
- Tests and quality gates
- Security and privacy disclosures
- Releases
1. Code of conduct
All contributors are expected to follow our Code of Conduct. Report unacceptable behaviour via the channel listed in that document.
2. Local setup
Prerequisites
- macOS 13+ (primary dev target) or Linux (Ubuntu 22.04+ tested). Windows is supported via WSL2 only.
- Xcode Command Line Tools on macOS (
xcode-select --install). - Rust 1.88.0+ (pinned via
rust-toolchain.toml). - Node.js 20 LTS and pnpm 9 (needed from Sprint 0 day 4 onwards).
First run
git clone https://github.com/AlbertoMZCruz/echonote.git
cd echonote
./scripts/bootstrap.sh
bootstrap.sh is idempotent. It verifies your toolchain, wires up the
versioned git hooks in .githooks/, and prints actionable guidance for
anything missing. It never installs packages without your consent.
Day-to-day
cargo build --workspace # incremental build
cargo test --workspace # all tests
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all # auto-format
The Phase 0 CLI prototype lives in crates/echo-proto:
cargo run -p echo-proto -- --help
3. Commit messages
We use Conventional Commits and
enforce them via the commit-msg git hook.
<type>(<scope>)?!?: <subject>
<body>
<footer>
Allowed types
| Type | When to use |
|---|---|
feat | New user-facing capability |
fix | Bug fix observable by a user |
perf | Performance improvement |
refactor | Internal restructuring, no behavioural change |
docs | Documentation only |
test | Tests only (new, refactored or fixed) |
build | Build system, toolchain, Cargo manifests |
ci | GitHub Actions, Dependabot, repo automation |
chore | Housekeeping that does not fit the above |
deps | Dependency bumps (Dependabot uses this prefix) |
style | Formatting, whitespace, pure cosmetic |
revert | Reverts a previous commit |
Scope
Optional but encouraged. Use the crate, module, or subsystem:
audio,asr,diarize,llm,storage,app,domain,protoui,adr,toolchain,ci
Subject
- Imperative mood ("add", not "added").
- Start lower case, no trailing period.
- Hard limit of 100 characters; target 72.
Breaking changes
Append ! after the type/scope and add a BREAKING CHANGE: footer:
feat(domain)!: rename Segment.end to Segment.ended_at
BREAKING CHANGE: persisted meetings from before commit abcd1234 must be
migrated via `echo-proto migrate v2`.
Examples
feat(audio): capture system output via ScreenCaptureKit
fix: resume transcription after OS sleep
docs(adr): add ADR-0004 for llama.cpp runtime
ci: pin actions/checkout to v4.2.0
deps: bump tokio 1.47 -> 1.48
4. Branching model
We follow a simplified Git Flow:
mainis the production branch. Only tagged releases land here. Protected — no direct pushes, PR required, CI must be green, linear history, conversation resolution required.developis the integration branch and the default target for PRs.feat/*,fix/*,docs/*,chore/*are short-lived branches cut fromdevelop. Keep them under 5 days old or rebase ontodevelop.release/*branches are cut fromdevelopwhen we stabilise a version.hotfix/*branches are cut frommainfor emergency production fixes and merged back into bothmainanddevelop.
All merges are squash merges. History on main and develop is
linear.
5. Pull requests
- Target
developunless you are opening a hotfix. - Fill in the PR template completely.
- Keep PRs under ~400 changed lines when possible. Split larger changes.
- Link to the issue, ADR or ticket that motivates the change.
- Include a short demo (screenshot, asciicast, or sample command output) for user-visible changes.
- CI must be green. You may not merge around a red status check.
- Respond to review comments by either pushing a change or explaining why you disagree. Conversations must be resolved before merge.
Review expectations
- At least one approval from CODEOWNERS (currently the Tech Lead).
- Security-sensitive changes (crypto, IPC surface, storage format, update channel) require a second reviewer from the security rotation.
6. Architecture Decision Records
Any change that meaningfully alters the architecture deserves an ADR. See
docs/adr/README.md for the lifecycle, format
(MADR 3.x) and numbering rules.
If you are not sure whether a change needs an ADR, open a draft PR and ask. The cost of an unnecessary ADR is one file; the cost of a missing one is a team-wide argument six months later.
7. Tests and quality gates
Every PR must pass the full CI pipeline:
cargo fmt --all --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspace --all-targets --lockedcargo build --workspace --locked(macOS)cargo check --workspace --all-targets --locked(Linux)
Target test coverage per DEVELOPMENT_PLAN.md §6:
- Domain crate: 90 %+ line coverage, pure unit tests, no IO.
- Application crate: 80 %+ line coverage with mocked ports.
- Infrastructure crates: exercised via integration tests against real adapters when feasible, mocked otherwise.
- UI: component tests with Vitest + Testing Library, critical flows with Playwright end-to-end (Sprint 2 onwards).
The pre-commit hook runs fmt and clippy locally to catch issues before
they hit CI. Do not --no-verify routinely.
8. Security and privacy disclosures
EchoNote is a privacy-first product. Please do not file public issues
for security or privacy concerns. Follow the process in
SECURITY.md.
9. Releases
Releases are cut from release/* branches, tagged vX.Y.Z on main,
and distributed as signed installers. See DEVELOPMENT_PLAN.md §7 for
the full release checklist (to be expanded before v1.0).