Watchman is built for a single user on a trusted network. By deliberate design it has no authentication, no CSRF protection, and no rate limiting (see ADR-017 and ADR-025 — trusted-network security model).
Consequence: anyone who can reach the backend port can read everything and reconfigure every monitored service. Therefore:
- Do not expose the backend beyond your trusted network. Bind it to a private
interface and/or firewall the port (default
3001). Do not port-forward it or put it on the public internet. - Browser cross-origin access is gated by an origin allow-list (shared by CORS
and the WebSocket upgrade): desktop
watchman://, loopback, and anything inCORS_ALLOWED_ORIGINS. A web deployment on a non-loopback origin must setCORS_ALLOWED_ORIGINSexplicitly.
This model is a feature, not a gap — but it only holds if the network boundary is real. If you need multi-user or untrusted-network access, Watchman is not currently designed for that.
- Secrets live only in
.env.local(gitignored) and are encrypted at rest in the DuckDB config store usingWATCHMAN_MASTER_KEY. - Secrets and PII are never logged — pino redaction is configured; keep it intact.
- All inputs are validated server-side (Zod). Service configs follow least privilege.
This is a solo-maintained project. Security fixes target the latest release
and the current main branch only. Older versions are not patched.
Please do not open a public issue for security vulnerabilities.
Use GitHub's private vulnerability reporting: Security → Report a vulnerability on this repository. (If private reporting isn't enabled, open a minimal public issue asking for a private contact channel — without vulnerability details.)
Because the project is solo-maintained, response is best-effort. Please include:
- affected component and version / commit,
- a clear description and impact,
- reproduction steps or a proof of concept,
- any suggested remediation.
Given the trusted-network threat model above, please note in your report whether the issue is exploitable within that model (e.g. it would affect a correctly firewalled, single-user deployment) — those are the highest priority.