Skip to main content
kRouter

Changelog

Every release.

What shipped, what was fixed, what was verified. The last 10 entries — pulled live from the kRouter repo CHANGELOG.md.

Latestv0.5.81
Releases on GitHub

July 2026

  1. v0.5.81

    Fix Cloudflare Array Syntax

    Hotfix for a compilation error introduced in 0.5.80 where stripping the hardcoded Cloudflare LLM array left a dangling image array without an opening bracket, causing the Next.js build to fail.

June 2026

  1. v0.5.80

    Dynamic Model Fetching for Cloudflare Workers AI

    - **Cloudflare Models**: Removed the hardcoded list of Cloudflare models from k‍Router. It now automatically fetches the live catalog directly from your Cloudflare account, meaning newly added models (like Llama 3.1) are instantly available in the dashboard without requiring a k‍Router update. - **Branding**: Added the official Cloudflare logo to the dashboard.
  2. v0.5.79

    Test Suite Alias Fix

    Added `vitest.config.js` to correctly map Next.js (`@/`) and custom (`open-sse/`) path aliases in the testing environment. Previously, running the full test suite failed on 24 files with `ERR_MODULE_NOT_FOUND`. The entire test suite (1000+ tests) now passes cleanly.
  3. v0.5.78

    Image URL Obfuscation Fix + Kiro Image Merging Fix

    Two fixes related to how k‍Router handles images: 1. **Kiro IDE Multiple User Messages Bug:** In `openai-to-kiro.js`, when consecutive user messages were merged into a single AWS CodeWhisperer format message, the text and tool results were merged correctly, but attached images (`images` array) from the second message were dropped. This is now fixed so images properly survive the merge. 2. **Obfuscation URL Corruption:** Added `"url"` to the `BINARY_DATA_FIELDS` blacklist in `antigravityObfuscation.js`. Previously, if a user provided an image via a URL (e.g. `https://example.com/claude-image.png`), the obfuscator would inject a zero-width joiner into the word "claude", breaking the URL entirely and causing a 404 image fetch error on Google's end. URLs are now passed through cleanly.
  4. v0.5.77

    Fully Wire Zenith Engine into Default Routing

    Fixes an oversight in 0.5.75 where the `zenith` routing strategy was added to `accountSelector.js` but the `auth.js` fallback loop still hardcoded the legacy `fill-first` logic inside an `else` block. Now, `auth.js` delegates all non-round-robin routing decisions directly to the central `accountSelector.js` engine. The default `fill-first` strategy is automatically upgraded to `zenith`, applying the latency + quota scoring algorithms to pick the healthiest account natively.
  5. v0.5.76

    Fix HealthCache Logger Import

    Hotfix: The 0.5.75 release contained an incorrect import path for the logger inside `HealthCache.js` (`open-sse/utils/logger.js` instead of `@/sse/utils/logger.js`), which caused the Next.js build to fail with a "Module not found" error. Corrected the path.
  6. v0.5.75

    Zenith Score Engine: Intelligent Failover Routing

    Architectural milestone: k‍Router now uses the `Zenith` scoring engine to intelligently rank and pick accounts. - **Before:** k‍Router used a 'dumb' fill-first or random loop. It would hammer an account until it hit a 429, then fall back to the next one, wasting precious milliseconds. - **After:** The new `Zenith` strategy evaluates every account based on live health data (TTFB latency, success rate) and quota headroom (remaining percentage). It mathematically pre-ranks accounts, heavily penalizing those under 30% quota, and selects the absolute best account to fulfill the request. This eliminates wasted rate-limited requests entirely. - Zenith is now the default routing strategy.
  7. v0.5.69

    Zenith RAM Layer: Sub-5ms Failover Routing

    Architectural milestone: k‍Router now uses an in-memory `HealthCache` for provider connections, completely eliminating SQLite reads/writes from the hot path during chat routing. - **Before:** When an account hit a 429, k‍Router did a synchronous SQLite write to lock it, then the `while (true)` loop did another synchronous SQLite read to find the next account. If 5 accounts were dead, the loop hit the disk 10 times, adding ~50ms of overhead per failure and visibly stalling the IDE. - **After:** All active connections and their locks are cached in RAM. When a 429 hits, the router instantly locks the account in memory and grabs the next one in < 1ms. The SQLite write is fired asynchronously in the background. This brings the core speed benefit of Zenith's pure-function routing engine into k‍Router without losing our provider coverage or MITM features.
  8. v0.5.74

    Fix Kiro MITM passthrough + tool ID sanitization + global MITM anti-loop

    Three fixes bundled from a full Kiro IDE debug pass. 1. **REQUEST_BODY_INVALID from Kiro IDE via MITM:** Removed Kiro from `NATIVE_PAIRS`. When MITM is active, Kiro IDE traffic flows: IDE → MITM (converts AWS → OpenAI) → k‍Router → openai-to-kiro translator → Kiro API. Passthrough was skipping the translator and sending OpenAI-format bodies directly to Kiro's AWS API, which rejected them. 2. **codeWhispererToMessages produced 0 messages:** k‍Router's own outbound Kiro requests were being intercepted by its own MITM proxy because child executors (Kiro, GitHub, C‍ursor) overrode `buildHeaders()` without including `x-request-source: local`. Now forced on ALL executors in `BaseExecutor.execute()` after `buildHeaders()` returns. 3. **String should match pattern '^[a-zA-Z0-9_-]+$':** Tool IDs from other providers (Gemini dots/colons, OpenAI slashes) passed through `openai-to-kiro.js` unsanitized into `toolUseId` fields. Kiro routes through Claude backends which enforce Anthropic's regex. Added `sanitizeToolId()` to all 4 places where `toolUseId` is set in the Kiro translator.
  9. v0.5.73

    MITM HTTP/2 Session Auto-Retry

    Fixes an issue where intermittent NGHTTP2_INTERNAL_ERROR drops (Google Cloud Load Balancer dropping stale multiplexed streams) caused the MITM proxy to fall back to HTTP/1.1, which Google's backend often rejects with a `socket hang up`. The proxy now immediately retries the request over a fresh HTTP/2 session before falling back to HTTP/1.1, eliminating the cascade of socket hang up errors.