README.md
August 30, 2026 Β· View on GitHub
π§ Unreleased β documents the v0.11.0-rc dev build. The install snippets below stay pinned to the latest stable; the preview build has its own section. Removed automatically at release.
π New to Kubernetes? No problem.
kwatch delivers alerts that explain themselves β what broke, why, the logs and events β straight to your team chat, 24/7.
β¨ 60 seconds to install. No backend. No dashboards. No YAML spaghetti.
β° kwatch is the alarm, not the dashboard β it doesn't collect metrics or store logs. It reads your cluster and pings you with the reason.
π§ What is kwatch?
kwatch is a smart alarm for your Kubernetes cluster β every alert explains itself:
- π₯ Something crashes β you get a message that says why (not just "pod is broken").
- π Smart about noise β groups related issues into a single notification, ignores flapping.
- β‘ No Prometheus, no Grafana, no 50-step setup. Just alerts that make sense.
π kwatch vs the DIY stack
| β¨ kwatch | π° Prometheus + Alertmanager | |
|---|---|---|
| β±οΈ Setup time | 60 seconds | hours of YAML |
| π¦ Footprint | 1 small pod, no storage | full monitoring stack + TSDB |
| π¬ Alerts | Self-explaining: "OOMKilled β raise the memory limit, here are the logs" | Whatever PromQL rules you hand-wrote |
| π Learning curve | One ConfigMap | PromQL + alert rules |
π¨ Before vs After
| Raw kubectl output π€· | kwatch tells you π‘ |
|---|---|
CrashLoopBackOff | π¨ OOMKilled (memory limit: 512Mi) β try raising limits.memory Β· here are the logs + events |
Error | π¨ HTTP probe failing on :8080/healthz (exit 137) β container ran out of memory |
Pending | β³ Unschedulable for 10m β none of the 5 nodes match the SSD pool request of db-0 Β· scheduling events included |
π¬ This is what you get
One real alert, as it lands in Slack (same shape in every provider):
π¨ OOMKilled β production / orders-api
Pod: orders-api-7ffc9d4f9-x9p4t Node: worker-3 severity: high
π‘ Hint: memory limit is 512Mi. Try raising limits.memory.
Recent logs + events below.
π Logs:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.example.OrdersResource.list(OrdersResource.java:41)
π Events:
Killing container ... because it exceeded its memory limit (OOMKilled)
That's the resulting pod crash β explained, with the fix hinted, logs included, zero digging. β¨
β‘οΈ 60-second install
π¦ Helm (easiest π)
helm repo add kwatch https://kwatch.dev/charts
helm install [RELEASE_NAME] kwatch/kwatch --namespace kwatch --create-namespace --version 0.10.5
More details in the chart docs
To upgrade later: helm upgrade [RELEASE_NAME] kwatch/kwatch --namespace kwatch --reuse-values
(or bump the image tag of the Deployment).
π kubectl
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.10.5/deploy/config.yaml -o config.yaml
# βοΈ Edit config.yaml with your team-chat webhook
kubectl apply -f config.yaml
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.5/deploy/deploy.yaml
config.yaml is the only file you edit. One small block per place you want alerts:
alert:
slack:
webhook: "https://hooks.slack.com/services/T00000000/B00000000/xxxxxxxx"
discord:
webhook: "https://discord.com/api/webhooks/123456/xxxxx"
All 56 providers, with every parameter and example, are in everything about providers.
Everything you need: any modern Kubernetes cluster, cluster-wide read access plus the permission to send alerts (kwatch ships its own RBAC in
deploy.yaml), and a single pod β 1 replica, no storage. Running several clusters? Run one kwatch per cluster.
β First alert in 60 seconds
kwatch lint --checkβ validates your config and tests your provider credentials.curl -X POST http://<kwatch-pod>:8060/test-alertβ sends a test alert (enablehealthCheck.diagnostics: true).- Crash a test pod, the classic proof:
kubectl run boom --image=busybox:1.36 --restart=Always -- sh -c "sleep 5 && exit 1"
π§ͺ Release candidate
Want the preview build?
Current preview: v0.11.0-rc.7 β not for production.
No Helm chart is published for release candidates, so install from the manifests at the RC tag. They already pin the preview image, so this is all you need:
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0-rc.7/deploy/config.yaml -o config.yaml
# βοΈ Edit config.yaml with your team-chat webhook
kubectl apply -f config.yaml
kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0-rc.7/deploy/deploy.yaml
Already running kwatch? Switch an existing install straight to the preview:
kubectl -n kwatch set image deployment/kwatch kwatch=ghcr.io/abahmed/kwatch:v0.11.0-rc.7
Check what you actually got:
kubectl -n kwatch get deployment kwatch -o jsonpath='{.spec.template.spec.containers[0].image}'
To go back to stable, re-run the install commands at the top of this page.
RC builds never get the latest tag, and the in-app upgrader stays quiet on them β you
opted into the dev channel, so kwatch won't nag you back toward stable.
π― What does it catch?
Nearly everything, out of the box β zero config. Highlights:
| Signal | Default | What you get |
|---|---|---|
| π₯ Pod crashes (CrashLoop, OOM, ImagePull) | β on | Container state + logs + events β tells you why |
| β³ Pods stuck Pending / Unschedulable | β on | Alerts with how long the scheduler has been stalling |
| π₯οΈ Node issues (NotReady, Disk/Memory pressure) | β on | Per-condition severity |
| πΎ PVC running out of space | β on | Warn at 80%, critical at 90% |
| π Stuck rollouts & unavailable deployments | β on | Missed the deploy window? You'll know. |
| π HPA stuck at max replicas | β on | After 20 minutes sustained |
| π Service/Ingress backends with no healthy pods | β on | Traffic would fail β alerted before users notice |
| ποΈ Broken control-plane components | β on | apiserver, scheduler, etcd, coredns |
| π TLS certs expiring | β off | Enable this one if you want |
| π Heartbeat | β off | Periodic "still alive" ping (default: every 5 min) |
β TLS and heartbeat are the only ones off β everything else just works. The full list β failed Jobs, stuck CronJobs, admission webhooks, PDBs, network-policy blocks, node overcommit, repeating OOMs and more β lives in the configuration reference.
β¨ Feature highlights
- π§ Alerts that explain themselves β every alert names the cause, the impact, and what recently changed (insight engine + dependency graph)
- π Incident memory β the same crash updates one thread instead of spamming; it resolves after a hold-down and revives silently past a cooldown
- π Smart grouping β related failures coalesce into one notification, re-notified on a gentle cooldown, batch-resolved together
- π Mass-failure detection β 30% of a shared dependency down β one blast-radius alert that replaces the per-workload alerts rather than arriving alongside them, auto-resolved when it recovers
- π¨ Escalation & re-notify β repeated crashes climb severity, and long-lived incidents nudge you again so nothing is forgotten
- π Audit log β every decision (create / update / resolve / skip) as structured JSON, with suppressions recorded on change rather than on every poll
- π³οΈ Knows when it was blind β kwatch stamps its own liveness, so if it was down while your cluster wasn't, the next startup message says how long nobody was watching
- β»οΈ Live config β change severity via
KwatchConfigCRDs without restarting - π Delivery resilience β per-provider routes, retries, and fallback, with a dead-letter view for the rare message that can't be sent
- π©Ί Observable itself β health endpoints and Prometheus metrics
π£ Alerts go anywhere
kwatch delivers to any of 56 alert providers β your team chat, email, SMS, paging system, or a plain webhook:
| Provider | Needs |
|---|---|
| π¬ Slack | webhook or bot token |
| π¬ Discord | webhook |
| πΌ Microsoft Teams | webhook |
| π§ Email (SMTP) | SMTP creds + recipient |
| π¨ PagerDuty | integration key |
| βοΈ Telegram | bot token + chat ID |
| π Opsgenie | API key |
| π Datadog | API key |
| βοΈ Twilio | account SID + phone numbers |
| π Jira | URL + token + project |
| π HomeAssistant | token + URL |
| π Custom Webhook | any URL (+ headers) |
β¦and 44 more β GitLab, Gitea, Matrix, Zulip, Splunk, SendGrid, AWS SNS/SES, GoAlert, FeiShu, WeCom, n8n and more. Every parameter, example config, and routing/retry/fallback options are in everything about providers.
βοΈ Configuration in a nutshell
The most useful knobs (everything else has a sensible default):
| Setting | What it does |
|---|---|
namespaces | π½ Watch a few namespaces, or !kube-system to exclude |
reasons | π½ Alert on specific reasons only, or exclude with ! |
silences | π Silence whole rules β namespace, reason, pod/container name, log pattern |
templates | π Custom message text per reason |
smartGrouping | π§Ή Coalesce duplicate notifications (on by default) |
correlation | π§ Group incidents, escalate repeat crashes, re-notify emergencies |
app.clusterName | π·οΈ Name your cluster so alerts say which one failed |
includeEvents / includeLogs | π Toggle events/logs in alerts |
healthCheck | π©Ί Health endpoints + optional /incidents, /test-alert, pprof |
upgrader.disableUpdateCheck | π Stop the "new version available" nags |
The complete reference β all monitors, thresholds, templates, correlation, audit log, and live-config CRDs β is in the configuration reference.
π§ Why alerts make sense
- πΊοΈ kwatch maps pods to nodes, owners, services, PVCs, ConfigMaps, and Secrets β so an alert explains the root cause, not just the symptom.
- π If a whole node or shared ConfigMap fails at once, kwatch detects the mass failure and tells you the blast radius instead of firing thousands of alerts.
- π£ Every alert arrives with the logs and events already attached β no digging through dashboards to find out what happened.
Under the hood it's all explained in how kwatch thinks.
π οΈ CLI commands
| Command | What it does |
|---|---|
kwatch | βΆοΈ Run the main monitor |
kwatch --version | βΉοΈ Print version |
kwatch lint | β Validate your config |
kwatch lint --strict | β β Strict check (catches typos!) |
kwatch lint --check | β β β Validate + test provider credentials |
kwatch replay < events.jsonl | π¬ Replay a saved event stream to test your setup |
π§Ή Clean up
kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.5/deploy/config.yaml
kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.10.5/deploy/deploy.yaml
Installed with Helm instead? helm uninstall [RELEASE_NAME] --namespace kwatch
π Not a monitoring platform β and proud of it! π
kwatch is not a metrics collector, dashboard, or observability backend. No TSDB, no dashboards, no log storage. kwatch is the alarm β when something breaks, it tells you right now, with a reason. Pair it with Prometheus + Grafana for metrics and Loki for logs; those tell you what happened, kwatch is the one that wakes you up. β°
π Contribute & Support
- β Give us a star β it really helps!
- π‘ Suggest features
- π Report bugs
- π§ Contributing guidelines
- π How versioning and releases work β see RELEASES.md
π Documentation
- βοΈ Configuration reference
- π£ Alert providers
- π§ How kwatch thinks
- π¦ Helm chart
- π Versioning & releases
π Who uses kwatch?
kwatch is trusted by:
Want to add your company? Open an issue!
π» Contributors
βοΈ Stargazers
π Get in touch
Questions? Suggestions? Chat with us on Discord β we're friendly! π
β οΈ License
kwatch is MIT Licensed β use it, fork it, share it! π

