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 time60 secondshours of YAML
πŸ“¦ Footprint1 small pod, no storagefull monitoring stack + TSDB
πŸ’¬ AlertsSelf-explaining: "OOMKilled β€” raise the memory limit, here are the logs"Whatever PromQL rules you hand-wrote
πŸ“š Learning curveOne ConfigMapPromQL + 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 (enable healthCheck.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:

SignalDefaultWhat you get
πŸŸ₯ Pod crashes (CrashLoop, OOM, ImagePull)βœ… onContainer state + logs + events β€” tells you why
⏳ Pods stuck Pending / Unschedulableβœ… onAlerts with how long the scheduler has been stalling
πŸ–₯️ Node issues (NotReady, Disk/Memory pressure)βœ… onPer-condition severity
πŸ’Ύ PVC running out of spaceβœ… onWarn at 80%, critical at 90%
πŸš€ Stuck rollouts & unavailable deploymentsβœ… onMissed the deploy window? You'll know.
πŸ“ˆ HPA stuck at max replicasβœ… onAfter 20 minutes sustained
🌐 Service/Ingress backends with no healthy podsβœ… onTraffic would fail β€” alerted before users notice
πŸ›οΈ Broken control-plane componentsβœ… onapiserver, scheduler, etcd, coredns
πŸ”’ TLS certs expiring❌ offEnable this one if you want
πŸ’“ Heartbeat❌ offPeriodic "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 KwatchConfig CRDs 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:

ProviderNeeds
πŸ’¬ Slackwebhook or bot token
πŸ’¬ Discordwebhook
πŸ’Ό Microsoft Teamswebhook
πŸ“§ Email (SMTP)SMTP creds + recipient
🚨 PagerDutyintegration key
✈️ Telegrambot token + chat ID
πŸ”” OpsgenieAPI key
πŸ• DatadogAPI key
βœ‰οΈ Twilioaccount SID + phone numbers
πŸ“‹ JiraURL + token + project
🏠 HomeAssistanttoken + URL
πŸ”— Custom Webhookany 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):

SettingWhat 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

CommandWhat 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


πŸ“š Documentation


πŸš€ Who uses kwatch?

kwatch is trusted by:

Want to add your company? Open an issue!


πŸ’» Contributors


⭐️ Stargazers

Stargazers over time

πŸ‘‹ Get in touch

Questions? Suggestions? Chat with us on Discord β€” we're friendly! πŸŽ‰

⚠️ License

kwatch is MIT Licensed β€” use it, fork it, share it! 🎊