PR flow
Branch naming
feat/<short-description>— new functionalityfix/<short-description>— bug fixeschore/<short-description>— internal / toolingdocs/<short-description>— site or README changes only
Commit messages
Conventional commits, lowercase scope:
feat(env_vars): add reveal option for plaintext access
fix(client): handle non-JSON responses defensively
chore(deps): bump typescript from 5.9.3 to 5.9.4
docs: clarify env-var masking behaviour in the gotchas pageThe CHANGELOG follows the same shape (### Added, ### Fixed, ### Changed, ### Security, ### Internal).
Before opening the PR
npm testpasses locallynpm run lintcleannpm run format:checkclean- CHANGELOG
[Unreleased]section updated with your change - README updated if tool count changed or new tool is user-facing
- If you can, run
/smoke-testagainst a live Coolify
PR description
Aim for:
- What changes — brief
- Why — link to the issue, or explain the bug / use case
- How verified —
npm test+ (ideally) live smoke results - Closes #N if applicable
The maintainer (currently @StuMason) reviews PRs on a best-effort basis. The repo also runs a Claude review bot on most PRs. Its feedback is advisory but often catches real issues.
After approval
The maintainer admin-merges (squash). Releases are bundled: a release PR follows shortly after notable changes, version bumps package.json, and the publish.yml workflow auto-publishes to npm via trusted publishing.
Contributor recognition
Every CHANGELOG entry credits the PR author (thanks @username). This is not a formality. These are real contributions that have shipped fixes affecting production users.
Stale PRs
If your PR sits without movement for two weeks, post a comment asking the maintainer for status. If it sits longer, the scope is probably stalled. Open a follow-up issue to discuss the blocker.