---
title: v4.1.1 Changelog
description: See what's new in Kener v4.1.1, including new features, improvements, and bug fixes
---

## New features {#new-features}

### Display events inline {#display-events-inline}

A new **Display Events Inline** toggle in **Manage → Site Configurations** controls how active events surface on the public site.

- **On** — ongoing incidents, ongoing maintenances, and upcoming maintenances render as inline sections directly on the home, custom, and monitor pages, alongside a dedicated events list.
- **Off** (default) — events stay in the notifications popover in the top bar.

The two surfaces are mutually exclusive: when inline events are enabled the notifications popover is hidden so events aren't shown twice.

### Public RSS feeds {#rss-feeds}

Kener now publishes a public **RSS 2.0** feed of incidents and scheduled maintenance, so users can subscribe without email.

- Routes: `GET /rss.xml` (default page), `GET /{page_path}/rss.xml` (named page), and `GET /monitors/{monitor_tag}/rss.xml` (single monitor).
- The public layout emits a `<link rel="alternate" type="application/rss+xml">` in `<head>`, scoped to the current view, so browsers and readers auto-discover the right feed.
- An RSS icon button appears next to the Subscribe / share controls, gated on a new **`showRssFeed`** option (default on) under **Manage → Site Configurations → Monitor Sub Menu Options**.
- Coverage mirrors the events page — past (last 90 days) and upcoming maintenance windows — and site-wide maintenances show as `Affected: All monitors`. Responses are cached for 5 minutes.

## Improvements {#improvements}

### Path-based heartbeat URLs {#heartbeat-url-format}

Heartbeat monitors now use a path-separated endpoint, `/ext/heartbeat/{tag}/{secret}`, instead of the old `{tag}:{secret}` form. Legacy colon-style URLs are automatically rewritten, so existing heartbeats keep working without changes. See [Heartbeat Monitor](/docs/v4/monitors/heartbeat).

### "Started" column on incidents {#incident-started-column}

The **Manage → Incidents** table gained a **Started** column showing when each incident began, and date formatting across the incidents UI is now standardized for consistent display in cells and tooltips.

### Isolated web and worker database pools {#db-pool-isolation}

Background jobs can no longer starve page loads of database connections. The connection pool is split by execution context (routed via `AsyncLocalStorage`):

- **Web pool** — `DATABASE_POOL_MAX` (default 10) — serves HTTP requests.
- **Worker pool** — `DATABASE_WORKER_POOL_MAX` (default 5, new) — serves schedulers and BullMQ workers.

This fixes `KnexTimeoutError: Timeout acquiring a connection` errors seen when monitor bursts overlapped page loads. See [Environment Variables](/docs/v4/setup/environment-variables).

### Faster monitor-bars aggregation {#monitor-bars-index}

Added a covering index `(monitor_tag, timestamp, status, latency)` on `monitoring_data` so the daily status aggregation behind the status-page bars is served entirely from the index. This removes per-row table lookups and cuts multi-second queries on large instances (~1M+ rows) to near-instant.

## Bug fixes {#bug-fixes}

- **Redis writes recover after replica failover.** Clients now reconnect on `READONLY` errors, so after a primary failover writes resume without restarting Kener. Point `REDIS_URL` at the writer/primary endpoint when your provider exposes separate reader and writer URLs.
