Watchman is built for a single user on a trusted network. By deliberate design it has no authentication, no CSRF protection, and no HTTP rate limiting (see ADR-017 and ADR-025 — trusted-network security model). The WebSocket only caps handshakes at 30 per IP per minute and open connections at 10 per IP.
Consequence: anyone who can reach the backend port can read everything and change Watchman's configuration for every monitored service (Watchman itself only reads from those services; see ADR-032). 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.
Watchman is no longer actively maintained (October 2026). No versions receive guaranteed
security fixes. The current main branch was last brought to a clean dependency audit
(no known HIGH or CRITICAL advisories) in October 2026. Advisories published after that date
are not tracked. Review the dependencies yourself before you deploy, and keep the deployment
inside the trusted-network model above.
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 unmaintained, a report may not receive a response or a fix. If you still report one, 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.