Contributing
How to contribute to Watchfire — code, docs, bug reports, ideas, and community help.
Watchfire is open source under Apache-2.0, and contributions of every size are appreciated — a typo fix, a sharper sentence in the docs, a reproducible bug report, or a fully-baked feature PR. If you've used Watchfire enough to notice something off, you already have everything you need to contribute.
Ways to contribute
You don't have to write Go to help out. Pick whichever of these fits the energy you have today:
- Report a bug — open an issue from the bug report template. Steps to reproduce + what you expected to happen are enough.
- Suggest a feature — start a thread in GitHub Discussions so the idea can be shaped before it becomes an issue.
- Improve the docs — every page on this site has an "Edit this page on
GitHub" link in the right sidebar that drops you straight into the MDX
source on GitHub. The docs live in the
website repo under
content/docs/. - Write code — the
good first issuelabel marks issues that are scoped small enough to land without deep daemon knowledge. Thehelp wantedlabel is the next step up. - Help others — answering a question in Discussions or triaging a stale issue is just as load-bearing as code.
Code contribution workflow
Quick version of the flow — for the canonical version see
CONTRIBUTING.md
in the repo:
- Fork
watchfire-io/watchfireand clone your fork locally. - Branch off
main:git checkout -b my-feature. - Change the code, run
make testandmake lint, commit with a meaningful message. - Push the branch to your fork.
- Open a PR against
main. Fill out the PR template, link the issue if there is one, and request review.
Read the source
This page is a starting point, not a substitute. The
CONTRIBUTING.md
in the repo is the canonical reference and is kept in sync with the build
— if anything here disagrees with that file, that file wins.
Development setup
Watchfire is written in Go. To build it from source you need:
- Go 1.23+
- Make
- Protocol Buffers compiler (
protoc)
The three Make targets that cover day-to-day work:
make build # Build daemon + CLI into ./build/
make test # Run the test suite
make lint # Run golangci-lint
For the rest — installing dev tools, running the daemon under air,
generating protobuf code, packaging — see the
CONTRIBUTING.md
and the Makefile
in the repo. The Installation page
also has a short build-from-source block aimed at users rather than
contributors.
Code guidelines
- Run
gofmt(orgoimports) before committing. - Keep functions focused and small; favour readability over cleverness.
- Write meaningful commit messages — explain the why, not just the what.
- Add tests for new functionality, especially anything touching the daemon or the agent runner.
make lintmust pass before you open a PR.
Website performance budget
The marketing and docs site (this site, in the
website repo) has a small set
of performance targets. They are targets, not promises — measured at
build time on a production build, and they will drift slowly as the site
grows.
| Surface | Target |
|---|---|
Landing page (/) initial JS | ≤ 210 KB gzipped (≤ 700 KB raw) |
Long doc page (e.g. /docs/changelog) initial JS | ≤ 260 KB gzipped (≤ 830 KB raw) |
Largest Contentful Paint on / | < 2.5 s on simulated Slow 4G |
Cumulative Layout Shift on /, /docs, /docs/recipes | < 0.05 |
| Public PNG screenshots | None — use WebP via <img> with explicit width and height |
Run npm run perf from the website repo to print the per-route initial JS
payload from a clean production build. The script wraps next build,
boots the production server, and tallies the unique
/_next/static/chunks/*.js files referenced by each route's HTML — so
adding a new client component, eagerly importing a heavy library, or
swapping a server component for a client one will surface in the diff.
When working on the site:
- Keep components server-rendered by default. Reach for
"use client"only when you need state, effects, or browser APIs. - Defer heavy client components below the fold with
next/dynamic(ssr: falseif no SEO content depends on the component). - New images go in
public/as WebP, referenced via<img>(ornext/image) with explicitwidthandheightto keep CLS at zero. - Wrap any new continuous animation in a
@media (prefers-reduced-motion: reduce)opt-out. - The site has no runtime dependencies beyond what's in
package.jsontoday. If you genuinely need a build-time tool to measure or analyze, add it as adevDependencyonly and call it out in the PR description.
Code of Conduct
Watchfire follows the Contributor Covenant v2.1. The pledge in one sentence:
We as members, contributors, and leaders pledge to make participation in our community a positive experience for everyone, regardless of background or identity.
Conduct concerns can be reported privately to info@watchfire.io.
Community
Watchfire's project conversations happen on GitHub:
- GitHub Issues — bug reports and tracked work.
- GitHub Discussions — open-ended questions, design conversations, and Q&A.
There is no Discord, Slack, or mailing list yet. If those become useful they'll be linked from this page.
Where to find me
Watchfire is primarily authored by Nuno Coração. Every PR opened against the repo gets a response — even a small one — so don't worry about whether your change is "big enough." If something is blocking you, ping the PR or open a discussion and it will get picked up.
How Watchfire compares
Honest comparison of Watchfire to adjacent AI coding tools — Aider, Cursor agents, Claude Code on its own, GitHub Copilot Workspace, and Devin/Codegen-style autonomous agents.
Security
Watchfire's threat model — sandbox guarantees, signature verification, secret storage, network exposure, and how to report a vulnerability.