llms.txt
Search Documentation
Search through all documentation pages
v4.x

v4.1.5 Changelog

See what's new in Kener v4.1.5, including new features, improvements, and bug fixes

Release date: September 6, 2026

This release also carries everything that shipped in v4.1.4, which had no changelog of its own.

Important

Kener now requires Node.js 24.14 or newer (previously 20). The official Docker image already ships Node 24. If you run Kener from source on Node 20 or 22, upgrade Node before upgrading Kener.

New features

Docker container monitors

A new Docker Container monitor type reads container state from the Docker Engine API and maps it to a Kener status, including the container's HEALTHCHECK result when it has one. A running container with a healthy or absent healthcheck is UP, a starting healthcheck or a restarting container is DEGRADED, and unhealthy, paused, exited, or missing containers are DOWN with the exit code or last probe output attached. Set checkType to daemon to ping the daemon itself, which makes a useful parent monitor for a host.

The daemon connection lives on the monitor: local socket, plain tcp, or tls with an optional client certificate. The three PEM fields accept $SECRET references, so the client key stays in an environment variable instead of the database. A Browse button lists containers from the daemon so you do not have to type the name. See Docker Monitors. Thanks to @kensac.

Read the security note before mounting the socket: anything that can reach the Docker socket is root on the host, a :ro mount does not restrict the API, and Kener only needs three GET endpoints, so put a deny-by-default socket proxy in front of it.

CAPTCHA on the subscribe form

The public subscribe form can now require a CAPTCHA before Kener sends the verification email. Configure a provider under Manage → Captcha Providers: hCaptcha, Google reCAPTCHA (v2 checkbox), or Cloudflare Turnstile. One provider is active at a time, enabling one disables the others, and the token is verified server-side before the OTP goes out. With no provider enabled the form behaves exactly as before. Changes apply immediately, no restart. See Captcha. Thanks to @otherwiseGG.

Outbound HTTP proxy

Kener can route its outbound traffic through a forward proxy. HTTP_PROXY, HTTPS_PROXY, and NO_PROXY cover API and Prometheus checks, webhook, Discord and Slack triggers, Resend email, and OIDC discovery, with HTTPS targets tunnelled through CONNECT. API and Prometheus monitors also take a per-monitor Proxy URL that overrides the environment for that monitor, with $SECRET substitution for the credentials.

NO_PROXY accepts exact hosts, host:port, .suffix, *.host, and IPv4 ranges; CIDR is not supported. Put LAN Prometheus servers and Docker daemons there. Proxy credentials go in the URL and reserved characters have to be percent-encoded. See Environment Variables.

Improvements

Trigger failures say what actually failed

A failed fetch throws TypeError: fetch failed and buries the real cause two levels down, so testing a webhook, Discord, or Slack trigger only ever reported "fetch failed". Errors now unwrap to the innermost cause, so a refused proxy tunnel reads as Proxy response (403) !== 200 when HTTP Tunneling instead.

Proxy URLs are validated on save

Node silently ignores a proxy URL whose scheme is not http:// or https:// and throws on a malformed authority, both at check time rather than at save time. Saving a monitor now rejects a proxy URL that is not a valid http(s) URL, so a typo fails where you made it.

RepoCloud deploy button

The README gained a one-click Deploy on RepoCloud button. Thanks to @cosark.

Bug fixes

  • {{alert_name}} is the monitor tag again. It expanded to a whole sentence (Alert <tag> for <for> <value> <status> at <time>), so custom webhook bodies using {{alert_name}} got the full headline instead of the tag. It is now just the tag, and the shipped templates compose the headline from the separate placeholders, so default triggers render unchanged. A trigger created before this change whose stored template still uses a bare {{alert_name}} as a headline, in the email subject, email heading, Discord embed title, or Slack section text, now shows only the tag there. See Templates for the headline string to paste back.
  • Docs styling no longer leaks onto the status page and admin. Bundling every route group's CSS into one file let the docs typography, prose rules, and admin overrides apply everywhere. Each sheet is now scoped to its own route group, and the docs font loads only on the docs.
  • Embedded widgets use your status colors. A .body selector that should have been body meant the custom UP, DEGRADED, and DOWN colors never reached embeds.
  • Test files stay out of the production bundle. The Express API handler auto-loader globbed ./*/*.ts, so a co-located test file in an action folder was eagerly imported into the build. It now matches only get, post, put, and delete.
  • Outdated documentation links. Stale links in the contributing guide, the v3 monitor examples, and the admin users page now point at the right pages. Thanks to @ilyhalight.