From 329cbccf750b39a218da91fe58db846a0c8d7764 Mon Sep 17 00:00:00 2001 From: alberta Date: Thu, 9 Jul 2026 16:09:05 +0200 Subject: [PATCH 1/5] Handle follow rediretc or not --- src/lib/server/services/apiCall.ts | 7 ++++++- src/lib/server/types/monitor.ts | 2 ++ .../monitors/[tag]/types/monitor-api.svelte | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/server/services/apiCall.ts b/src/lib/server/services/apiCall.ts index 75f32b4b..b42fa586 100644 --- a/src/lib/server/services/apiCall.ts +++ b/src/lib/server/services/apiCall.ts @@ -64,13 +64,18 @@ class ApiCall { console.log(e); } } + const followRedirects = + this.monitor.type_data.follow_redirects ?? true; + + const maxRedirects = + this.monitor.type_data.max_redirects ?? 5; const options: AxiosRequestConfig = { method: method, headers: axiosHeaders, timeout: timeout, transformResponse: (r: string) => r, - maxRedirects: 5, + maxRedirects: followRedirects ? maxRedirects : 0, validateStatus: () => true, maxContentLength: Infinity, maxBodyLength: Infinity, diff --git a/src/lib/server/types/monitor.ts b/src/lib/server/types/monitor.ts index d038292c..aa14210d 100644 --- a/src/lib/server/types/monitor.ts +++ b/src/lib/server/types/monitor.ts @@ -26,6 +26,8 @@ export interface ApiMonitorTypeData { timeout?: number; eval?: string; allowSelfSignedCert?: boolean; + follow_redirects?: boolean; + max_redirects?: number; } export interface DnsMonitorTypeData { diff --git a/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte b/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte index 77eab225..6bf99d52 100644 --- a/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte +++ b/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte @@ -25,6 +25,10 @@ if (!data.eval) data.eval = DefaultAPIEval; if (data.allowSelfSignedCert === undefined) data.allowSelfSignedCert = false; + if (data.follow_redirects === undefined) data.follow_redirects = true; + if (data.max_redirects === undefined) data.max_redirects = 5; + + const methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]; function addHeader() { @@ -103,6 +107,23 @@ +
+ + +
+ +
+ + +
+ +
From 86490909ec3ba93a699cd2b2d48cfb5dfd9233fa Mon Sep 17 00:00:00 2001 From: alberta Date: Fri, 10 Jul 2026 11:46:37 +0200 Subject: [PATCH 2/5] fixe max and step value --- .../(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte b/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte index 6bf99d52..97580267 100644 --- a/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte +++ b/src/routes/(manage)/manage/app/monitors/[tag]/types/monitor-api.svelte @@ -118,6 +118,8 @@ id="api-max-redirects" type="number" min="0" + max="20" + step="1" bind:value={data.max_redirects} disabled={!data.follow_redirects} /> From 7c297fce41a0db73cd6353154f6a5c66fd2d0214 Mon Sep 17 00:00:00 2001 From: Logesh K <90227668+lokiee0@users.noreply.github.com> Date: Sun, 12 Jul 2026 18:51:12 +0530 Subject: [PATCH 3/5] Refactor chartId to use $derived for reactive updates --- .../components/ui/chart/chart-container.svelte | 2 +- .../ui/toggle-group/toggle-group.svelte | 18 +++++++++++++----- src/lib/server/dns.ts | 4 +--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/lib/components/ui/chart/chart-container.svelte b/src/lib/components/ui/chart/chart-container.svelte index 93523b2f..d9b8b9da 100644 --- a/src/lib/components/ui/chart/chart-container.svelte +++ b/src/lib/components/ui/chart/chart-container.svelte @@ -17,7 +17,7 @@ config: ChartConfig; } = $props(); - const chartId = `chart-${id || uid.replace(/:/g, "")}`; + const chartId = $derived(`chart-${id || uid.replace(/:/g, "")}`); setChartContext({ get config() { diff --git a/src/lib/components/ui/toggle-group/toggle-group.svelte b/src/lib/components/ui/toggle-group/toggle-group.svelte index 106561c5..fe81878a 100644 --- a/src/lib/components/ui/toggle-group/toggle-group.svelte +++ b/src/lib/components/ui/toggle-group/toggle-group.svelte @@ -5,8 +5,10 @@ type ToggleVariants = VariantProps; - interface ToggleGroupContext extends ToggleVariants { - spacing?: number; + interface ToggleGroupContext { + get variant(): ToggleVariants["variant"]; + get size(): ToggleVariants["size"]; + get spacing(): number | undefined; } export function setToggleGroupCtx(props: ToggleGroupContext) { @@ -33,9 +35,15 @@ }: ToggleGroupPrimitive.RootProps & ToggleVariants & { spacing?: number } = $props(); setToggleGroupCtx({ - variant, - size, - spacing, + get variant() { + return variant; + }, + get size() { + return size; + }, + get spacing() { + return spacing; + }, }); diff --git a/src/lib/server/dns.ts b/src/lib/server/dns.ts index 6533f740..7d58c058 100644 --- a/src/lib/server/dns.ts +++ b/src/lib/server/dns.ts @@ -2,7 +2,7 @@ import dns2 from "dns2"; import dgram, { type Socket } from "dgram"; import tls from "tls"; import { Resolver as NodeResolver } from "node:dns/promises"; -import { AllRecordTypes, IsValidHost, ValidateIpAddress } from "../clientTools"; +import { AllRecordTypes, IsValidHost } from "../clientTools"; interface DNSAnswer { name: string; @@ -135,7 +135,6 @@ class DNSResolver { const port = options.tlsPort ?? DEFAULT_DOT_PORT; const timeoutMs = options.timeoutMs ?? DEFAULT_QUERY_TIMEOUT_MS; const servername = this.resolveTlsServername(nameserver, options.tlsServername); - const ipType = ValidateIpAddress(nameserver); return new Promise((resolve, reject) => { let responseBuffer = Buffer.alloc(0); @@ -146,7 +145,6 @@ class DNSResolver { port, servername, rejectUnauthorized: !options.allowSelfSignedCert, - family: ipType === "IP6" ? 6 : ipType === "IP4" ? 4 : undefined, }); const timeoutId = setTimeout(() => { From fd1f21cad4b2d20db4c238476867310f78188c2f Mon Sep 17 00:00:00 2001 From: Raj Nandan Sharma Date: Mon, 13 Jul 2026 11:00:40 +0530 Subject: [PATCH 4/5] Create changelog for version 4.1.2 with new features, improvements, and bug fixes --- src/routes/(docs)/docs.json | 4 ++ .../docs/content/v4/changelogs/v4.1.2.md | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/routes/(docs)/docs/content/v4/changelogs/v4.1.2.md diff --git a/src/routes/(docs)/docs.json b/src/routes/(docs)/docs.json index db919e73..139954d7 100644 --- a/src/routes/(docs)/docs.json +++ b/src/routes/(docs)/docs.json @@ -311,6 +311,10 @@ "group": "v4.x", "collapsible": false, "pages": [ + { + "title": "v4.1.2", + "content": "v4/changelogs/v4.1.2" + }, { "title": "v4.1.1", "content": "v4/changelogs/v4.1.1" diff --git a/src/routes/(docs)/docs/content/v4/changelogs/v4.1.2.md b/src/routes/(docs)/docs/content/v4/changelogs/v4.1.2.md new file mode 100644 index 00000000..2a4a8213 --- /dev/null +++ b/src/routes/(docs)/docs/content/v4/changelogs/v4.1.2.md @@ -0,0 +1,41 @@ +--- +title: v4.1.2 Changelog +description: See what's new in Kener v4.1.2, including new features, improvements, and bug fixes +--- + +## New features {#new-features} + +### DNS-over-TLS for DNS monitors {#dns-over-tls} + +DNS monitors can now query resolvers over an encrypted connection. A new **`transport`** option (`UDP`, default, or `TLS`) enables DNS-over-TLS (RFC 7858) with supporting fields: + +- **`tlsPort`** (default `853`) — the DoT port on the resolver. +- **`tlsServername`** — TLS SNI hostname, needed when pointing at an IP-based resolver like `1.1.1.1`. +- **`allowSelfSignedCert`** — skip TLS verification for private resolvers. + +UDP lookups with a blank `nameServer` also got smarter: Kener now walks the zone's authoritative nameservers before falling back to `8.8.8.8`. See [DNS Monitor](/docs/v4/monitors/dns). + +### Redirect control for API monitors {#api-follow-redirects} + +API monitors gained a **Follow Redirects** toggle (default on) and a **Max Redirects** limit (default 5, up to 20). Turn the toggle off to evaluate the redirect response itself — its `3xx` status code and headers — instead of the destination, useful for monitoring that a redirect is in place or catching unexpected ones. + +## Improvements {#improvements} + +### Self-signed TLS for gRPC monitors {#grpc-insecure-tls} + +gRPC monitors with TLS enabled can now set **`insecure`** to skip certificate verification — the equivalent of `grpcurl -insecure` — for servers with self-signed certificates. See [gRPC Monitor](/docs/v4/monitors/grpc). + +### `external_url` in the monitors API {#external-url-api} + +The monitors API now accepts `external_url` in `POST` and `PATCH /api/v4/monitors` requests and returns it in monitor responses, so API-managed monitors can set their public link without a dashboard visit. + +### New and updated translations {#translations} + +Two new locales: **Traditional Chinese (Hong Kong)** `zh-HK` and **Traditional Chinese (Macau)** `zh-MO`. Simplified Chinese, Traditional Chinese (Taiwan), and Vietnamese translations were also refreshed. + +## Bug fixes {#bug-fixes} + +- **Incident comments notify subscribers.** Incidents created or updated from the dashboard or API never reached email subscribers — only alert-driven incidents did. Posting a comment on an incident now notifies "incidents" subscribers regardless of where the incident came from, and alert-driven incidents notify exactly once through the same path. Notification subjects now carry the incident state (e.g. `INVESTIGATING`). +- **Site theme respected on first visit.** The default color scheme configured in site settings is now applied to first-time visitors instead of only after they toggle the theme. +- **Favicon works with `KENER_BASE_PATH`.** The favicon now resolves correctly when Kener is served from a sub-path, and pages no longer break when no favicon is configured. +- **Charts re-render on id changes.** Chart container ids are now reactive, fixing stale chart styling when a chart's id changes after mount. From e5b745ebbeda0cc8cba13c7cd93f3f69aa98b6d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 13 Jul 2026 05:31:55 +0000 Subject: [PATCH 5/5] chore(release): bump version to 4.1.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 72a16d3c..6fdbe0ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kener", - "version": "4.1.1", + "version": "4.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kener", - "version": "4.1.1", + "version": "4.1.2", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.4", diff --git a/package.json b/package.json index 315f0c27..d3eaaab7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kener", - "version": "4.1.1", + "version": "4.1.2", "type": "module", "private": false, "license": "MIT",