JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 5507,
"has_wiki": false,
"homepage": "https://krouter.kodelyht.com",
"languages": {
"CSS": 17633,
"Shell": 157,
"Dockerfile": 1748,
"JavaScript": 5212389,
"PowerShell": 2581
},
"pushed_at": "2026-07-23T00:51:08Z",
"created_at": "2026-06-10T07:42:25Z",
"owner_type": "User",
"updated_at": "2026-07-23T00:51:11Z",
"description": "Universal AI router — save 20-40% tokens with RTK and never stop coding. Connect Claude Code, Cursor, Antigravity, Kiro, Copilot, Codex, Cline & any OpenAI-compatible client to 40+ providers & 100+ models via one local endpoint. Zenith sub-1ms failover, MITM, multi-account.",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": "NOASSERTION",
"primary_language": "JavaScript",
"significant_languages": [
"JavaScript"
]
},
"owner": {
"blog": "https://kodelyth.com",
"name": "Shofiqul Islam",
"type": "User",
"login": "sifxprime",
"company": "@Kodelyth-LLC ",
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/269868370?v=4",
"created_at": "2026-03-21T04:18:26Z",
"is_verified": null,
"public_repos": 4,
"account_age_days": 124
},
"license": {
"state": "custom",
"spdx_id": null,
"raw_spdx": "NOASSERTION",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.5.118",
"kind": "patch",
"published_at": "2026-07-18T00:50:09Z"
},
{
"tag": "v0.5.117",
"kind": "patch",
"published_at": "2026-07-17T21:25:51Z"
},
{
"tag": "v0.5.116",
"kind": "patch",
"published_at": "2026-07-17T19:31:46Z"
},
{
"tag": "v0.5.115",
"kind": "patch",
"published_at": "2026-07-17T19:17:36Z"
},
{
"tag": "v0.5.114",
"kind": "patch",
"published_at": "2026-07-17T18:51:48Z"
},
{
"tag": "v0.5.113",
"kind": "patch",
"published_at": "2026-07-17T18:44:41Z"
},
{
"tag": "v0.5.112",
"kind": "patch",
"published_at": "2026-07-17T18:02:53Z"
},
{
"tag": "v0.5.111",
"kind": "patch",
"published_at": "2026-07-17T17:47:47Z"
},
{
"tag": "v0.5.110",
"kind": "patch",
"published_at": "2026-07-17T10:38:07Z"
},
{
"tag": "v0.5.109",
"kind": "patch",
"published_at": "2026-07-17T10:22:28Z"
},
{
"tag": "v0.5.108",
"kind": "patch",
"published_at": "2026-07-17T09:45:03Z"
},
{
"tag": "v0.5.107",
"kind": "patch",
"published_at": "2026-07-17T09:04:39Z"
},
{
"tag": "v0.5.106",
"kind": "patch",
"published_at": "2026-07-16T22:17:18Z"
},
{
"tag": "v0.5.105",
"kind": "patch",
"published_at": "2026-07-16T22:03:56Z"
},
{
"tag": "v0.5.104",
"kind": "patch",
"published_at": "2026-07-16T21:51:29Z"
},
{
"tag": "v0.5.103",
"kind": "patch",
"published_at": "2026-07-14T18:38:42Z"
},
{
"tag": "v0.5.102",
"kind": "patch",
"published_at": "2026-07-13T11:41:52Z"
},
{
"tag": "v0.5.101",
"kind": "patch",
"published_at": "2026-07-13T11:33:47Z"
},
{
"tag": "v0.5.100",
"kind": "patch",
"published_at": "2026-07-13T11:10:18Z"
},
{
"tag": "v0.5.99",
"kind": "patch",
"published_at": "2026-07-13T11:02:46Z"
},
{
"tag": "v0.5.98",
"kind": "patch",
"published_at": "2026-07-13T10:44:06Z"
},
{
"tag": "v0.5.97",
"kind": "patch",
"published_at": "2026-07-13T10:28:14Z"
},
{
"tag": "v0.5.96",
"kind": "patch",
"published_at": "2026-07-13T10:16:20Z"
},
{
"tag": "v0.5.95",
"kind": "patch",
"published_at": "2026-07-13T09:55:59Z"
},
{
"tag": "v0.5.94",
"kind": "patch",
"published_at": "2026-07-13T09:33:19Z"
},
{
"tag": "v0.5.93",
"kind": "patch",
"published_at": "2026-07-11T07:20:13Z"
},
{
"tag": "v0.5.92",
"kind": "patch",
"published_at": "2026-07-03T13:19:39Z"
},
{
"tag": "v0.5.91",
"kind": "patch",
"published_at": "2026-07-03T12:26:51Z"
},
{
"tag": "v0.5.90",
"kind": "patch",
"published_at": "2026-07-03T12:04:25Z"
},
{
"tag": "v0.5.89",
"kind": "patch",
"published_at": "2026-07-03T11:44:34Z"
},
{
"tag": "v0.5.88",
"kind": "patch",
"published_at": "2026-07-03T01:32:13Z"
},
{
"tag": "v0.5.87",
"kind": "patch",
"published_at": "2026-07-03T01:27:25Z"
},
{
"tag": "v0.5.86",
"kind": "patch",
"published_at": "2026-07-03T01:18:05Z"
},
{
"tag": "v0.5.85",
"kind": "patch",
"published_at": "2026-07-03T01:02:22Z"
},
{
"tag": "v0.5.84",
"kind": "patch",
"published_at": "2026-07-03T00:38:52Z"
},
{
"tag": "v0.5.83",
"kind": "patch",
"published_at": "2026-07-02T20:47:06Z"
},
{
"tag": "v0.5.82",
"kind": "patch",
"published_at": "2026-07-02T20:37:07Z"
},
{
"tag": "v0.5.81",
"kind": "patch",
"published_at": "2026-07-01T02:04:13Z"
},
{
"tag": "v0.5.80",
"kind": "patch",
"published_at": "2026-07-01T02:00:28Z"
},
{
"tag": "v0.5.79",
"kind": "patch",
"published_at": "2026-06-29T16:41:12Z"
},
{
"tag": "v0.5.78",
"kind": "patch",
"published_at": "2026-06-29T10:13:19Z"
},
{
"tag": "v0.5.77",
"kind": "patch",
"published_at": "2026-06-29T09:54:04Z"
},
{
"tag": "v0.5.76",
"kind": "patch",
"published_at": "2026-06-28T20:59:11Z"
},
{
"tag": "v0.5.75",
"kind": "patch",
"published_at": "2026-06-28T20:42:42Z"
},
{
"tag": "v0.5.74",
"kind": "patch",
"published_at": "2026-06-28T18:56:12Z"
},
{
"tag": "v0.5.73",
"kind": "patch",
"published_at": "2026-06-28T18:02:41Z"
},
{
"tag": "v0.5.72",
"kind": "patch",
"published_at": "2026-06-28T17:46:52Z"
},
{
"tag": "v0.5.71",
"kind": "patch",
"published_at": "2026-06-28T10:39:47Z"
},
{
"tag": "v0.5.70",
"kind": "patch",
"published_at": "2026-06-28T10:31:40Z"
},
{
"tag": "v0.5.69",
"kind": "patch",
"published_at": "2026-06-28T07:28:57Z"
},
{
"tag": "v0.5.68",
"kind": "patch",
"published_at": "2026-06-27T20:51:58Z"
},
{
"tag": "v0.5.67",
"kind": "patch",
"published_at": "2026-06-27T20:19:24Z"
},
{
"tag": "v0.5.66",
"kind": "patch",
"published_at": "2026-06-27T20:13:01Z"
},
{
"tag": "v0.5.65",
"kind": "patch",
"published_at": "2026-06-27T19:55:18Z"
},
{
"tag": "v0.5.64",
"kind": "patch",
"published_at": "2026-06-27T13:37:24Z"
},
{
"tag": "v0.5.63",
"kind": "patch",
"published_at": "2026-06-27T13:20:06Z"
},
{
"tag": "v0.5.62",
"kind": "patch",
"published_at": "2026-06-26T11:55:03Z"
},
{
"tag": "v0.5.61",
"kind": "patch",
"published_at": "2026-06-26T11:38:04Z"
}
],
"recent_commits": [
{
"oid": "736ba9134aa45db218e35325e362163af3488d9c",
"body": "The capture-correction Stop hook re-appended the same handful of raw prompts\nevery session, ballooning the file to 577 lines of ~95% duplicates. Collapsed\nto the 6 unique entries, each kept under its earliest date. Pure dedupe — no\nentry text changed.",
"is_bot": false,
"headline": "chore: dedupe tasks/lessons.md (577 -> 27 lines)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-23T00:51:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e623202b8626802f9b127351cc0fe3de6672bf00",
"body": "…l error\n\nFive fixes so multi-account antigravity actually drains all accounts and fails\ninformatively instead of blocking on a dead one.\n\n- Park daily/weekly-exhausted accounts until their REAL reset. A 429 with a\n precise \"Resets in 104h\" was capped at 30 min, so fill-first re-selected the\n dead\n[…]\nluded from the pool (10/11 selectable); retired model -> clear 400.\n- Honest split: exhausted-account parking + all-unavailable derivation are\n unit-proven (couldn't force a real multi-day 429 live).",
"is_bot": false,
"headline": "fix: v0.5.119 antigravity rotation robustness + retired opencode mode…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-23T00:45:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "10d41411bae2a911d9d04723ac0bac2b1c42a4ad",
"body": "Kiro can now authenticate with a long-lived API key instead of OAuth/social.\n\n- KiroService.validateApiKey + listAvailableProfiles: validate a key via\n CodeWhisperer ListAvailableProfiles and resolve its account profileArn\n (accepts both arn and profileArn response fields).\n- POST /api/oauth/kiro/\n[…]\nfileArn parsing, OAuth\n unchanged), but no real ksk_ request was sent.\n\nFull suite: 1296 pass (+8). Build clean, route registered, recent-session\nsurface re-checked live (all 200, nothing regressed).",
"is_bot": false,
"headline": "feat: v0.5.118 Kiro API-key (ksk_) headless auth — last half of 706e6513",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-18T00:50:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ea7ce056788b1b651ce25086297dba80de1dc866",
"body": "…6513)\n\nClaude clients on Kiro now translate straight to/from Kiro's CodeWhisperer\nformat instead of the lossy claude->openai->kiro pivot.\n\nResolved the v0.5.116 deferral concern: re-reading translateResponse, the\ndirect-route short-circuit is provably equivalent for every existing pair\n(whenever ei\n[…]\n(was empty openai)\n- streaming/non-streaming openai->kiro: unchanged, no leaks\n\nStill deferred: kiro API-key (ksk_) auth — no key on this instance to verify.\n\nFull suite: 1288 pass (+10). Build clean.",
"is_bot": false,
"headline": "feat: v0.5.117 Kiro direct claude<->kiro route (deferred half of 706e…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T21:25:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "32c87252a937f0748e2b8e3414ad68854ccba091",
"body": "…fer kiro headless\n\nBUG FIX: v0.5.114 translated the Copilot /v1/messages Claude response back to\nOpenAI with translateResponse(OPENAI, CLAUDE) — backwards. Verified against the\nproduction streaming path: translateResponse is (targetFormat=PROVIDER,\nsourceFormat=CLIENT). The shim returns CLAUDE to a\n[…]\nng the arg-order bug above from the same class of reasoning.\nExploratory changes reverted; tree clean. It's a clean attended-session task.\n\nFull suite: 1278 pass (stable across two runs). Build clean.",
"is_bot": false,
"headline": "fix: v0.5.116 correct backwards arg order in v0.5.114 github port; de…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T19:31:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f01f2ceea48ba11c7b533e3c2b20463c739e0811",
"body": "Our fork shipped the Headroom UI (Token Saver card calling /api/headroom/*) but\nthe entire backend was absent — those routes 404'd and compression never ran.\nThis adds the backend and wires it into the pipeline.\n\nHeadroom is an external Python proxy (pip install headroom-ai[proxy][ml]) that\nde-dupes\n[…]\n installed extras (the base [proxy] extra reports 0%; [ml]/[code] do\nthe real work — exactly what extras install/uninstall manages).\n\nFull suite: 1278 pass (+11). Build clean, all 6 routes registered.",
"is_bot": false,
"headline": "feat: v0.5.115 complete the Headroom token saver (backend was missing)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T19:17:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f162cbc12283b0e25020cfcb0e394007c2955e6b",
"body": "…ges shim\n\nPort of upstream 542a088c. Claude models on GitHub Copilot now go to Copilot's\nAnthropic-native /v1/messages endpoint instead of /chat/completions — the only\nCopilot endpoint that surfaces prompt-cache token counts for Claude.\n\n- execute() detects Claude by name (/claude/i, not a registry\n[…]\n\nFull suite: 1271 pass (+4). NOT live-verified — no GitHub Copilot connection on\nthis instance, so no real /v1/messages round-trip; verification is static\n(build + logic + translator-signature match).",
"is_bot": false,
"headline": "feat: v0.5.114 GitHub Copilot — route Claude through native /v1/messa…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T18:51:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "862e406bb4d9bf125b6ca336510e69f36ecdc18f",
"body": "Six small upstream features/fixes we were missing:\n\n- searxng SEARXNG_URL env (e79f9edd): self-hosters can point at their own\n instance; override in runtimeConfig + buildSearxngRequest, only active when\n the env is set so the manifest default is unchanged.\n- bulk-delete connections (644bff4c): \"De\n[…]\n: kiro direct-session-cache (9c58ba64) — 400+ lines of kiro translator\ninternals, a perf opt not a correctness fix, gets its own careful pass.\n\nFull suite: 1267 pass (+8). Build clean, no regressions.",
"is_bot": false,
"headline": "feat: v0.5.113 upstream quick-wins batch",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T18:44:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c61b1bfefec568d3c8763dd445e9c89eb4decb53",
"body": "… allowlist\n\nCorrection to 0.5.111. PXPIPE shipped wired and fail-open but never compressed\na real request, and 0.5.111's verification missed it (every check exercised\nonly fail-open paths or the package's claude-fable-5 self-test).\n\nRoot cause: pxpipe-proxy@0.9.0 images ONLY claude-fable-5 by defau\n[…]\nirmed by provider billing, and the model read the imaged content\n(vision decode worked). Before the fix the same request returned\nunsupported_model and compressed nothing.\n\nFull suite: 1259 pass (+3).",
"is_bot": false,
"headline": "fix: v0.5.112 PXPIPE was inert for real traffic — configure the model…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T18:02:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7e8bce6f2d3222ca9b8f28b5f74c561dab3c5a88",
"body": "Two Tier B features, each verified against real endpoints on a live account.\n\ngrok-imagine-video (d6761c6f): new /v1/videos surface (generations/edits/\nextensions + polling) proxying xAI's async Grok Imagine jobs. videoCore is a\nbyte-exact transparent proxy (refresh-once on 401/403, never re-send a \n[…]\ntoken (was null), and a 401-ing grok-cli chat came back\nwith \"mango\". Scan confirmed grok-cli was the only provider with this gap.\n\nFull suite: 1256 pass (+49). Build clean, all new routes registered.",
"is_bot": false,
"headline": "feat: v0.5.111 Grok Imagine video + PXPIPE + two live-caught bugs",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T17:47:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "67b56a1e0e522780bd3846bc3813b5ddc22004b1",
"body": "…outing bugs\n\nAdds the fourth Tier C provider and fixes two bugs only a real request could\nfind. Unit tests passed the whole time; chatting through a live Grok Build\naccount is what surfaced both.\n\ngrok-cli (a11937cd + 7dfb3466 + 59b78282) — third Grok-family provider:\n xai -> api.x.ai \n[…]\n(+23). New guards: every published alias must resolve to\na real provider, and every executor forcing stream must be declared in chatCore\n(scans the executor dir rather than trusting a hand-kept list).",
"is_bot": false,
"headline": "feat: v0.5.110 Tier C complete — Grok CLI (Grok Build) + two silent r…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T10:38:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c0cd399c2b9337ac402b9806261caca4a1983ea",
"body": "…ai→claude fix\n\nThree of the four Tier C OAuth providers. Every endpoint probed live before\nwiring; that caught a dead config upstream had already moved past.\n\n- clinepass (b08751c4): derives its OAuth from one createClineOAuthFlow factory\n instead of upstream's verbatim 50-line copy. Caught that t\n[…]\n Grok CLI lands next — groundwork proven: xAI\ndevice-code returns a real code and cli-chat-proxy.grok.com answers 200 for\nmodels/billing on an existing xAI token (grok-4.5, 500k ctx, low/medium/high).",
"is_bot": false,
"headline": "feat: v0.5.109 Tier C part 1 — ClinePass, CodeBuddy CN, Kimchi + open…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T10:22:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c8cbca4fc8ce01a530d5670b5eb8b3a8845e5f7",
"body": "…mage model\n\nTwo defects that only surface against the real providers, both found by the\nend-to-end verification sweep:\n\n1. Featherless live-model fetch never worked. Their WAF 404s (\"Gone.\") any\n request with no User-Agent, which is Node fetch's default. Isolated by\n probing the same URL three \n[…]\n00-byte image; gemini-3-pro-image -> 502 NOT_FOUND. Removed from the\n published list; the executor still handles it if Google ever serves it.\n\nFull suite: 1120 pass (+3 User-Agent regression tests).",
"is_bot": false,
"headline": "fix: v0.5.108 massive-sweep findings — Featherless WAF block + dead i…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T09:45:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "faa8cef2b684376cd81b3d14211d62b79dd4c54e",
"body": "Generate images through existing Antigravity OAuth accounts — no separate\nimage provider or API key needed.\n\n- imageGenerationCore: new useExecutor branch for adapters that need the\n executor's full envelope (project/session/requestType) + auth headers.\n- imageProviders/antigravity.js: executor-del\n[…]\n' -> 200, valid 1024x1024 JPEG, visually confirmed correct.\nAspect ratio E2E: -16x9 suffix -> 1376x768 (exactly 16:9). 14 unit tests incl\nregressions proving chat models still stream. 1117 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.107 Antigravity native image generation (Tier B)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-17T09:04:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65aabea7cc5694af597dc8b101f15422333d3e38",
"body": "Ported quota visibility (upstream 4dadab9d) into our diverged Quota Tracker.\nHover a quota row → eye-off icon hides it; hidden rows collapse to a restore\nchip strip. Per-provider, persisted in settings.quotaVisibility.\n\n- utils.js: getQuotaVisibilityKey, filterQuotasByVisibility, getHiddenQuotaRows\n\n[…]\n hid Claude weekly(7d) → row gone, restore\nchip shown, settings persisted {claude:{hidden:[weekly (7d)]}}; restored →\nrow back, settings cleared. 1103 tests pass. Completes both deferred Tier A items.",
"is_bot": false,
"headline": "feat: v0.5.106 provider quota visibility — hide/restore quota rows",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-16T22:17:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c8459249662e5b622a514e14ca349e2307e747ca",
"body": "…heduler)\n\nGeneralized claudeAutoPing.js into provider-agnostic quotaAutoPing.js. Claude\npath preserved byte-for-byte; Codex added alongside via a HANDLERS table.\n\n- Claude handler: unchanged — waits for fixed reset, keeps disabled_reason skip.\n- Codex handler: pings when resetAt drifts (window inac\n[…]\ntoPing kept as backward-compat alias.\n\nVerified E2E: Claude auto-ping button still renders (no regression), codexAutoPing\npersists independently of claudeAutoPing, scheduler compiles. 1098 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.105 Codex opt-in auto-ping (generalized quota auto-ping sc…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-16T22:03:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3d8659045b854b84d2ab4a30d03d8662e39498cf",
"body": "…erwrite fix, GPT-5.6 context\n\nPorted the genuinely quick upstream parity items.\n\n1. X-9Router-Token-Saver: off header (upstream c9926897) — bypass all token\n savers (RTK/Caveman/Ponytail) for a single request without touching global\n toggles.\n2. Bulk-add no longer overwrites existing keys (upst\n[…]\nt actually quick): Codex auto-ping (757-line refactor replacing\nclaudeAutoPing) and provider quota visibility (185 lines across diverged UI).\n\nAll 3 verified end-to-end on dev server. 1094 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.104 Tier A parity — token-saver bypass header, bulk-add ov…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-16T21:51:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5fb3159241039cc780c0607d7dee3d627add3f1a",
"body": "…xity Agent + parseInt radix\n\nFound via codebase-memory graph audit.\n\nCRITICAL: the 3 providers added in v0.5.98 had a UI card + model catalog +\nvalidation, but NO backend chat-routing config — so chat requests had no\nbaseUrl and failed. Two-part fix:\n- open-sse/config/providers.js: added baseUrl + \n[…]\ner UI provider missing backend config is azure (intentional, dynamic).\n\nMinor: parseInt without radix in usage/request-details + profile page.\n\n1079 tests pass (+7 for the new-provider routing chain).",
"is_bot": false,
"headline": "fix: v0.5.103 wire backend chat routing for Featherless/Venice/Perple…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-14T18:38:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d702a5ecdda3e15b423c7a7fe6ed61de0e3e8ad",
"body": "The 3 providers added in v0.5.98 had no logo files so they fell back to plain\ntext badges, looking broken next to the 103 real provider logos our fork\nships. Added real PNGs:\n- featherless.png from featherless.ai apple-touch-icon (180x180)\n- venice.png from venice.ai apple-touch-icon (512x512)\n- per\n[…]\n28x128)\nWired the image field on all three + adopted upstream notice.text descriptions.\n\nVerified live: all 3 serve 200 image/png, Venice logo renders on the hero\ncard in the browser. 1072 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.102 real logos for Featherless, Venice AI, Perplexity Agent",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T11:41:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c32e6739ef5c1278b91b5b567644bc4047f5513a",
"body": "…+ Kiro multi-thinking\n\nFound via real-user end-to-end testing on dev server.\n\n1. Antigravity cache duplicate-reply bug was NOT fixed in v0.5.99. The\n CACHE_UNSAFE_PROVIDERS blocklist used provider ids {antigravity, gemini,\n gemini-cli} but model strings arrive as ALIASES (ag/..., gc/...). So\n \n[…]\ntion: logged into dev server, tested all 12 core APIs,\nQuota Tracker (claude/kiro/antigravity), Zenith leaderboard (22 accounts),\nreal chat routing, cache guard, settings persistence. 1072 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.101 actually fix Antigravity cache bug (v0.5.99 alias gap) …",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T11:33:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "83c8bb1284d33300ab75a9419b608eea696b73d5",
"body": null,
"is_bot": false,
"headline": "fix: v0.5.100 Kimi validation + Grok stale error badge (user report)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T11:10:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "482c742a93363f56e94a86a9f123eb5180bae868",
"body": "Two fixes.\n\n1. Response cache bug on Antigravity. User reported that turning on Response\n Cache caused Antigravity conversations to reply with duplicate answers\n Hi -> Hello, how can I help. Then next unrelated turn echoed the same\n Hello, how can I help.\n Root cause: Antigravity IDE fires s\n[…]\n 8 new regression tests, 5 existing tests updated to use realistic bodies.\n\n2. Perplexity Agent uses /providers/perplexity.png instead of a Material\n icon fallback (from v0.5.98).\n\n1066 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.99 response cache dup replies + Perplexity Agent branding",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T11:02:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "132823b75e734eb38eee3068c38fe7127bde8b90",
"body": null,
"is_bot": false,
"headline": "feat: v0.5.98 add Featherless + Venice AI + Perplexity Agent providers",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:44:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81778fce49fcf2276772377e35e3de739e368908",
"body": "TokenSaverClient imports WENYAN_LOCALES/CAVEMAN_LEVELS/PONYTAIL_LEVELS from\n../endpoint/endpointConstants but they only existed inline in EndpointPageClient,\nso production build failed with Module not found. Extract to a shared file;\nEndpointPageClient still uses the inline copies (no regression there).",
"is_bot": false,
"headline": "fix: add missing endpointConstants.js required by TokenSaverClient",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:30:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d443af8856f6761d819d308fca6a714d30b3fb91",
"body": null,
"is_bot": false,
"headline": "chore: v0.5.97 bump + CHANGELOG for Tier 3 audit",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:28:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a944e63feeb8b61d187b15112d7b289e310e0b8",
"body": "Adds /dashboard/token-saver with TokenSaverClient.js. Pairs with our v0.5.91\nZenith Visibility work — users get a dedicated dashboard for RTK/PXPIPE/etc\ntoken-reducing features instead of buried inside the Endpoint page.\n\nKept EndpointPageClient as-is (upstream extracted big chunks of logic into\nthe new page, but our fork has diverged Endpoint UI that would regress on\nblanket replacement). The new page is standalone and reachable via the\nsidebar link that landed cleanly.",
"is_bot": false,
"headline": "feat: add Token Saver dashboard page (from upstream cb65a45e)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:25:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b314cd61678eb594e6cc586e31aaf0b56c5e1d9",
"body": null,
"is_bot": false,
"headline": "feat(log): add nextTag + tagForSession helpers (from upstream a625ea9f)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:24:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9aa9136d3d411f414f40f9ac2539071a2f3f905",
"body": "Adds pickProxyPoolId(poolIds, strategy, providerId) — in-memory rotation state\nper provider — so no-auth free providers (OpenCode, etc.) can rotate across\nmultiple proxy pools to dodge per-IP rate limits.\n\nSkipped the NoAuthProxyCard UI + auth.js wiring from the same upstream commit\nbecause our v0.5.85 provider-page redesign moved that UI substantially. Helper\nis exported and available; UI wiring can layer on top later without breaking\nthis contract.",
"is_bot": false,
"headline": "feat: pickProxyPoolId round-robin/random helper (from upstream e1f3399b)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:22:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97edeb6a72ab0c53181147ec8500f7d2eea6b979",
"body": "…ext.config.mjs)\n\nKept our webpack-only dev script + port 20128. Brought in the two experimental\nNext.js flags that make dev startup faster and cut the client bundle:\n- serverComponentsHmrCache: reuse fetch responses across HMR\n- optimizePackageImports: tree-shake @xyflow/react, @dnd-kit/*, material-symbols, marked\n\nPlus small CSS + UsageStats tweaks that landed cleanly.",
"is_bot": false,
"headline": "perf: adopt upstream 0270f6ea — HMR cache + optimizePackageImports (n…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:21:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23a9be1c9d57f82ec06cda3281a295265452058a",
"body": "Audited the 7 Tier 2 auth/routing correctness fixes from upstream. Six were\nalready in our tree (either our own v0.5.84–v0.5.94 work or prior syncs).\nOne was missing:\n\n- EditConnectionModal now surfaces a Region <Select> for any provider that\n declares a regions array in the AI_PROVIDERS manifest (\n[…]\ntRegion → first).\n- Persists region into providerSpecificData on save via the existing\n advanced-PSD path so maxConcurrency/extraApiKeys stay intact.\n\nFull audit result in CHANGELOG. 1058 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.96 — Tier 2 audit + xiaomi-tokenplan region on Edit modal",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T10:16:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d6b3572581e81a393357707f994959a5699eb421",
"body": null,
"is_bot": false,
"headline": "chore: bump to v0.5.95 + CHANGELOG for Tier 1 security backport",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T09:55:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e317fdc7b780a7f7999f215e503aa3cf36ce051f",
"body": "…roxy validation, mitm hardening\n\n- src/lib/db/repos/usageRepo.js: maskApiKey() — never return raw apiKey in getUsageHistory().\n- src/lib/network/outboundProxy.js: validateProxyUrl() — scheme allowlist (http/https/socks4/5/h/a)\n + reject control-char injection (\\n, \\r, backtick, $). Kept our KROUTE\n[…]\n names.\n- src/lib/oauth/utils/server.js: OAuth server-side utils hardened.\n- src/mitm/manager.js: MITM cert/proxy manager hardening.\n- tests/unit/security-audit.test.js: 289 lines of regression tests.",
"is_bot": false,
"headline": "fix(security): 5 vulns audit (upstream d8c2298d) — api-key masking, p…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T09:52:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "199d6500516fd09729b786cf6ae0fd187dcaf6a6",
"body": "… #2158)\n\nKiro's Claude Sonnet 4.5 backend was leaking internal <thinking>...</thinking>\nblocks into the assistant content stream. Sanitize before forwarding so\ndownstream clients don't see the model's private reasoning traces.",
"is_bot": false,
"headline": "fix(kiro): strip leaked <thinking> tags from content stream (upstream…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T09:49:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7aa6798050660bb0aa521e1478486a715d9b8ad2",
"body": "…EXCEEDS_THRESHOLD)\n\nUser reported logs showing Zenith rotating through all 5 Kiro accounts on\na single oversize Claude Sonnet 4.5 request, burning credits on 400s that\nwould fail identically on every account.\n\nRoot cause: errorConfig.ERROR_RULES had no entry matching content-length /\ncontext-length\n[…]\nwnMs:0 — the client gets the 400 back\nimmediately and the account is not penalised; the same account will still\nhandle the user's next (smaller) request fine.\n\n7 new regression tests. 1035 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.94 — don't fan out on input-size 400s (Kiro CONTENT_LENGTH_…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-13T09:33:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "354d4602e38a78d84aa739ecc61d6e78ad0d76ff",
"body": "Fixes two user-reported behaviors from the antigravity multi-account\ndeployment.\n\n1. Round-Robin was silently overridden by conversation stickiness.\n chat.js now reads settings.providerStrategies[provider] and skips\n both the sticky-lookup AND the bind-on-success when the user chose\n round-rob\n[…]\nreset on next success\n - chronicallyBanned flag at 3+ consecutive locks\n - ConnectionRow shows red \"chronic ban ×N\" badge until success\n\n5 new unit tests lock the backoff formula. 1028 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.93 — multi-account fairness + exponential ban recovery",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-11T07:20:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71254c62b7cfb8e9f97f4efcc7954ccc21b9d068",
"body": null,
"is_bot": false,
"headline": "ci: test full dispatch chain end-to-end",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:55:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62651e6d4ee69bfd1262a043d92bac4a598f1529",
"body": null,
"is_bot": false,
"headline": "ci: test dispatch with clean ASCII workflow filename",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:52:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b0baadeda95ee510ce1c3d2cac274895eb0952b",
"body": "…yml so GitHub Actions picks it up",
"is_bot": false,
"headline": "ci: fix workflow filename - rename to ASCII-only notify-krouter-web.…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:52:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b279554aace823ac89f13dcb3c7ae7afb0bd75f",
"body": null,
"is_bot": false,
"headline": "ci: test clean dispatch URL",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:48:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "73189941470c0e55e046b6756b578d263e827ec3",
"body": null,
"is_bot": false,
"headline": "ci: fix API URL - remove ZWJ from krouter-web repo URL in dispatch curl",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:48:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61e4373fb30021e2ec0b1e44509d7830c472507d",
"body": null,
"is_bot": false,
"headline": "ci: test KDL_ROUTER_WEB_TOKEN dispatch",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:46:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea05d4f385f8a5a5c5301c432a3b9015d70ae398",
"body": null,
"is_bot": false,
"headline": "ci: use KDL_ROUTER_WEB_TOKEN to avoid ZWJ in secret name",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:46:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62c53541c85fef7ad453637247c50f26f0482499",
"body": null,
"is_bot": false,
"headline": "ci: verify KROUTER_WEB_TOKEN dispatch",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:41:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d97627d002a35998be20945494c55b61c9f3f03f",
"body": null,
"is_bot": false,
"headline": "ci: fix secret name - remove ZWJ from KROUTER_WEB_TOKEN",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:41:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e47a32317d619a40bcae941376a83c134cfe659f",
"body": null,
"is_bot": false,
"headline": "ci: test krouter-web dispatch trigger",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:37:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1239cb56b385c9f9b566b8b003fbbcd2c7d4764",
"body": null,
"is_bot": false,
"headline": "ci: trigger krouter-web sync & deploy on every push to main",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-06T00:23:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7143ef04f93df6e9bc5169abc9f9c193acda46a1",
"body": "…entry",
"is_bot": false,
"headline": "docs: restore CHANGELOG (was blanked by failed concat) + add v0.5.92 …",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T13:20:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17217de73953cec48218b1836447c5fffb52bffb",
"body": null,
"is_bot": false,
"headline": "chore: bump to v0.5.92 + CHANGELOG",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T13:19:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "137563c9891ab466c1ca6e9a77daee46e34b2eb1",
"body": "…ally fills\n\nv0.5.91 wired up the ring buffer and UI panel but chat.js:345 (the only\nproduction caller of recordOutcome) still used the old 3-arg signature.\nThe panel was rendering \"No decisions recorded yet\" forever because meta\nwas never emitted.\n\nFix: chat.js now passes { provider, model, strategy: \"zenith\" } as the 4th\nargument. Verified via codebase-memory graph audit that this is the only\nproduction caller.\n\nAll 1023 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.92 — pass meta to recordOutcome so Zenith decision log actu…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T13:18:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f438698dbadb9e2932fa15d73c55ce7bdf5f4f6",
"body": "…oard, decision log)\n\nMakes every layer of the Zenith routing decision visible in the UI.\n\n- /api/providers/zenith: full leaderboard endpoint with per-connection\n breakdown (healthScore, quotaFactor, quotaRemainingPct, priorityBonus,\n finalScore, ranking). Optional providerId + model query for sco\n[…]\n provider showing recent routing\n decisions. recordOutcome() now accepts optional meta and lazy-imports\n the ring-buffer writer so it never blocks the hot path.\n\n1023 tests pass (+5 for routingLog).",
"is_bot": false,
"headline": "feat: v0.5.91 — Zenith Visibility (score chip, route preview, leaderb…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T12:26:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "93375c83589115ee75a3674452d947e1c3b40b25",
"body": "openai-compatible-*/anthropic-compatible-* connections (user-configured\ncustom endpoints like DigitalOcean AI, LiteLLM) showed \"From API (0)\"\nbecause neither endpoint knew their provider IDs (dynamic UUIDs).\n\n/api/models/live-by-connection now detects the compatible-* prefix, reads\nconnection.provid\n[…]\nanthropic-compatible-* → x-api-key + anthropic-version header\n\nEnd-to-end probe against a real DigitalOcean AI compatible node confirms\nthe fetcher returns the full model catalog. All 1038 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.90 — live catalog for user-configured compatible nodes",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T12:04:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dc1faca253d001269dec864b64539d938977ec57",
"body": "v0.5.87's LiveModelsPanel duplicated the existing \"From API (N)\" section and\nadded liveModelIds component state that shadowed a pre-existing local const\ninside renderModelsSection. The duplicate JSX made the render tree fragile\nenough that model test buttons stopped responding on some renders.\n\n- De\n[…]\nisting \"From API (N)\" line.\n\nAvailable Models section renders exactly as it did before v0.5.87, only now\nthe counter is accurate across all 34+ providers. Model test buttons work.\nAll 1038 tests pass.",
"is_bot": false,
"headline": "fix: v0.5.89 — remove duplicate LiveModelsPanel that broke model tests",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T11:44:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bf2c9091187baf473199ded7aad6aed4202f510e",
"body": "- fetchLiveModels() now prefers the universal /api/models/live-by-connection\n (covers 34+ providers via LIVE_FETCH). Falls back to the legacy\n /api/providers/[id]/models only for providers whose OAuth flows need the\n custom resolver (kiro, qoder, antigravity, cloudflare-ai).\n- LiveModelsPanel no \n[…]\n the DB.\n\nResult: opening /dashboard/providers/atomesus now shows \"From API (1)\" with\natms/cipher populated from the live upstream, plus the freshness pill\n\"Live · 1 model · Updated Xs ago · Refresh\".",
"is_bot": false,
"headline": "fix: v0.5.88 — \"From API (0)\" on Atomesus + other newly-wired providers",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T01:32:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d598438f5c33b613f76984828bd5027db8afbb16",
"body": "- Fix Atomesus 0-models: change modelsFetcher.type from openrouter-free\n (required pricing/context_length fields Atomesus doesn't emit) to plain\n \"openai\". Also broaden openrouter-free filter to pass-through when it\n would return 0.\n- Add /api/models/live-by-connection: takes connectionId, uses s\n[…]\n Refresh\"). Silent 5-min background\n refresh. Renders nothing when no active connection or provider lacks a\n live fetcher.\n- Add \"openai\" filter type for explicit pass-through.\n\nAll 1038 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.87 — live catalog on Available Models + Atomesus fix",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T01:27:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee79e6df60680e083a8cb75da31564bbd6b1963b",
"body": "Every OpenAI-shaped API-key provider fetches its live model catalog the\nmoment you paste a key. Adds coverage for ~25 previously-missing providers.\n\n- Add src/shared/constants/liveFetch.js — universal LIVE_FETCH table with\n URL + auth-header + parse rules per provider. Newly covered: Kimi, GLM\n (b\n[…]\ny\"\n on 401/403, \"No live catalog\" for providers without a fetcher.\n\nBackward compatible — existing /api/providers/[id]/models endpoint stays\nfor stored-connection flows. All 1038 tests pass (+9 new).",
"is_bot": false,
"headline": "feat: v0.5.86 — live model catalog for every API-key provider",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T01:18:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5c4be906a7d4ec2dfb2015a43c913557d2236353",
"body": "Reshape /dashboard/providers/[id] from a 1874-line branchy monolith into a\nmanifest-driven layout that adapts per provider type.\n\n- Add getProviderCapabilities(id): single source of truth reading the 5\n existing category maps (OAUTH_PROVIDERS, APIKEY_PROVIDERS, FREE_PROVIDERS,\n FREE_TIER_PROVIDERS\n[…]\na tab strip above the active kit\n when authModes.length > 1.\n- Delete page.new.js — 1724-line stalled refactor with zero callers.\n\nAll 1029 tests pass. No CSS added — reuses existing Tailwind tokens.",
"is_bot": false,
"headline": "feat: v0.5.85 — manifest-driven provider page redesign",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T01:02:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7633bb6ea9784bbc70061f1383f4dab5b35d37d0",
"body": "…ad code cleanup\n\n- Add GET /api/providers/health exposing Zenith EWMA snapshot; dashboard connection\n cards now show a live colored dot (green/amber/red) with score/latency/success rate.\n- Cache /v1/models with 30s TTL + weak ETag; Codex/Cursor/Cline get 304 on repeat polls.\n- checkAndRefreshToken\n[…]\ner an OAuth round-trip.\n- Delete unreferenced setRoundRobinState (accountSelector), rankConnections, and\n resetHealth (connectionHealth) — superseded by the Zenith score engine.\n\nAll 1020 tests pass.",
"is_bot": false,
"headline": "feat: v0.5.84 — live health API, /v1/models cache, refresh de-dup, de…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-03T00:38:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "95783aad818d1732900c73747974d7e018cd0e40",
"body": "Same content as main README — just makes sure the npmjs.com landing\npage for @sifxprime/krouter shows the updated docs. No functional changes.",
"is_bot": false,
"headline": "docs(npm): sync polished README to CLI package (0.5.83)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-02T20:47:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43812e6eb054be585da9d19f4322d6ec6710bebe",
"body": "- Rewrote README to feature the new website (krouter.kodelyht.com) prominently\n- Added 'krouter -t' background/tray mode as the primary install path\n- Streamlined into: Quick Start · Why · How It Works · Features · Setup · Deployment · API · Uninstall · Troubleshooting\n- Moved 9router credit to a single 'Credits' section at the bottom (per user request)\n- Kept everything focused on the current NPM/Docker experience",
"is_bot": false,
"headline": "docs: polished README with website link + concise credits",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-02T20:46:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "363660396346b2c562692fb1f8c5476d2dc57d06",
"body": "…uffix) (0.5.82)\n\nOpenCode changed how their free-tier endpoint labels models — IDs no longer\nend in '-free'. The old suggested-models filter was matching zero of the 50\nupstream models, so users saw an empty OpenCode model list even though\nOpenCode had 50 fresh models available (Claude Fable 5, Opus 4.8, Sonnet 5,\nGPT-5.5 Pro, Gemini 3.5 Flash, and more).\n\nFix: filter now returns every model from the endpoint. Anything on the\nfree-tier URL is free by definition. New models appear automatically.",
"is_bot": false,
"headline": "fix(providers): match OpenCode's new model ID scheme (no more -free s…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-02T20:37:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62436c60ff242f5d4d86e282df79c966c33c440d",
"body": "The previous commit removed the LLM array for cloudflare-ai but accidentally\nleft the image array dangling without an opening bracket. This caused a Webpack\ncompilation failure during 'npm run build'.",
"is_bot": false,
"headline": "fix(providers): fix syntax error in cloudflare-ai array (0.5.81)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-01T02:04:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e091b742726c6de1b75224702b9abb346b1d7639",
"body": "…5.80)\n\nReplaced the hardcoded Cloudflare model list with a dynamic API fetcher.\nCloudflare's endpoint is now queried to fetch the\nlive catalog of Text Generation models available on the user's account.\nThis ensures newly deployed models are instantly usable without needing\nto update kRouter's config files.\n\nAlso added the official Cloudflare icon to replace the generic 'cloud'.",
"is_bot": false,
"headline": "feat(providers): dynamic model fetching for Cloudflare Workers AI (0.…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-07-01T02:00:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94dbaa68d0d45a398aeb6a364682929e67ab8c49",
"body": "Fixes an issue where running `npx vitest run` globally across the project failed on 24 test files with `Cannot find package '@/models/index.js'` or `Cannot find package 'open-sse/config/providerModels.js'`. Vitest requires explicit configuration to understand Next.js's `@/` and the custom `open-sse/` path aliases defined in jsconfig.json/tsconfig.json. All 1000+ tests now pass successfully.",
"is_bot": false,
"headline": "chore(tests): add vitest.config.js to resolve path aliases",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-29T16:41:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be9b02209a546d4927a1038479e8c59537aa285e",
"body": "Two fixes for image handling:\n1. openai-to-kiro.js now correctly merges the .images array when it\n combines consecutive user messages. Previously, images attached to\n the second message were silently dropped.\n2. antigravityObfuscation.js now skips injecting zero-width joiners into\n 'url' fields. If a user provided a URL containing a sensitive keyword\n (like 'claude' or 'cursor'), the injected ZWJ would break the URL and\n cause the upstream provider to 404 when fetching the image.",
"is_bot": false,
"headline": "fix: image urls surviving obfuscation and kiro message merging (0.5.78)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-29T10:13:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ba1775f8952ed724d54701f3bff0a47f06f0ae7f",
"body": "…h (0.5.77)\n\n0.5.75 added the zenith scoring engine to accountSelector.js, but auth.js\nstill had a hardcoded 'else' block for the fill-first strategy that bypassed\nthe selector entirely.\n\nFixed auth.js to delegate all strategies (except round-robin) to selectAccount().\nNow, the default 'fill-first' strategy correctly upgrades to 'zenith', evaluating\nlive health data and quota headroom before picking an account.",
"is_bot": false,
"headline": "perf(router): fully wire zenith score engine into default routing pat…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-29T09:54:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "997aad33e7648661d4f42e26428292ccce6291df",
"body": null,
"is_bot": false,
"headline": "fix(cache): correct logger import path in HealthCache (0.5.76)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T20:59:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a17a109d7983897d47739fb590f6471c071362b2",
"body": "…nt routing (0.5.75)\n\nPorted the core architectural benefit of Zenith (@zenith/core) into kRouter.\nThe while(true) routing loop previously hit SQLite synchronously on every\niteration (both to write locks and read the next available account) and used\na naive 'fill-first' strategy.\n\nFix: Added Health\n[…]\nthe SQLite update asynchronously.\n- The next iteration of the while(true) loop grabs the next best account\n from RAM without waiting for the disk.\n\nFailover is now near-instantaneous and intelligent.",
"is_bot": false,
"headline": "perf(router): implement Zenith RAM layer + Score Engine for intellige…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T20:42:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0246d7440a0804663198f81b17f66ed0e2d92d4e",
"body": "Ported the core architectural benefit of Zenith (@zenith/core) into kRouter.\nThe while(true) routing loop previously hit SQLite synchronously on every\niteration (both to write locks and read the next available account). When\nmultiple Antigravity accounts were quota-exhausted, the user experienced\na\n[…]\nnstantly and\n fires the SQLite update asynchronously.\n- The next iteration of the while(true) loop grabs the next account\n from RAM without waiting for the disk.\n\nFailover is now near-instantaneous.",
"is_bot": false,
"headline": "perf(router): implement Zenith RAM layer for sub-5ms failover (0.5.69)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T19:39:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5e9c0b556ce8fdd7128604ebf6734189532544a9",
"body": "…(0.5.74)\n\nThree fixes from a full Kiro IDE debug pass:\n\n1. Removed kiro from NATIVE_PAIRS + body-shape detection in\n detectClientTool. MITM converts AWS→OpenAI before chatCore sees it,\n so passthrough sent OpenAI bodies to Kiro's AWS API → rejected with\n REQUEST_BODY_INVALID. Translator must \n[…]\n0-9_-]. Kiro routes\n through Claude which enforces Anthropic's regex.\n\nE2E verified: Antigravity ✅, Kiro Claude ✅, Kiro+dirty-tool-IDs ✅,\nAtomesus ✅, Claude/Antigravity/Codex passthrough unchanged ✅",
"is_bot": false,
"headline": "fix: Kiro MITM passthrough + tool ID sanitization + global anti-loop …",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T18:56:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78d68c7a04e7873a1ee623e13547a12d44f24ee9",
"body": "….5.73)\n\nGoogle Cloud Load Balancer routinely drops idle or saturated HTTP/2\nsessions with a GOAWAY frame (NGHTTP2_INTERNAL_ERROR). Our fallback\nlogic caught this, but immediately fell back to an HTTP/1.1 request.\nGoogle's backend often rejects HTTP/1.1 requests on these endpoints\nwith a 'socket hang up'.\n\nFix: Instead of immediately falling back to HTTP/1.1, we now retry\nONCE on a brand new HTTP/2 pooled session. This eliminates the 'socket\nhang up' cascade in user logs.",
"is_bot": false,
"headline": "fix(mitm): retry dropped HTTP/2 streams over H2 before H1 fallback (0…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T18:02:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8155eaadc4895e763dd9d256260e28c624e9591e",
"body": "…0.5.72)\n\nUser reported Atomesus failing with 400 Bad Request:\n'\"auto\" tool choice requires --enable-auto-tool-choice...'\n\nRoot cause: Atomesus's vLLM-based backend is configured without tool-call\nparsing enabled. When Claude Code or other IDEs send standard tool definitions,\nthe upstream backend cr\n[…]\n: Added atomesus to the proactive modelStrip pipeline. tools and tool_choice\nare now silently removed before the request leaves kRouter, allowing the\nrequest to succeed as a standard text completion.",
"is_bot": false,
"headline": "fix(modelStrip): strip tools from Atomesus requests to prevent 400s (…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T17:46:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0c094f8ccac2edcb35deb0d529f22b0decaee50e",
"body": "User reported 'HTTP 503: No active credentials for provider: atms' when\nrequesting atms/cipher, despite having an active Atomesus connection.\n\nRoot cause: parseModel() checks ALIAS_TO_PROVIDER_ID, which was missing\nthe atms -> atomesus mapping. The router attempted to look up database\nconnections with provider='atms', but they are stored under provider='atomesus'.\n\nFix: Added atms -> atomesus mapping to ALIAS_TO_PROVIDER_ID in model.js.",
"is_bot": false,
"headline": "fix(model): map atms alias to atomesus provider ID (0.5.71)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T10:39:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "788ba27deb2764438e9b073fabf37f691c757536",
"body": "…s (0.5.66)\n\nUser reported that the newly added Atomesus provider (0.5.65) was\nnot validating API keys correctly.\n\nRoot causes fixed:\n- src/app/api/providers/[id]/models/route.js: Added Atomesus to the\n createOpenAIModelsConfig list to fetch available models in the UI.\n- src/app/api/providers/[id]/\n[…]\nApiKeyConnection switch statement so 'Test Connection' works.\n- open-sse/config/providers.js: Added atomesus routing endpoint mapping.\n- open-sse/config/providerModels.js: Added atomesus core catalog.",
"is_bot": false,
"headline": "fix(providers): add Atomesus missing API key tests and router binding…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T10:32:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "45475c9b38c6ee922bacb01a1f3b9e2c6cac9d79",
"body": "User requested adding Atomesus (atomesus.com) as a new provider.\n\n- Added to FREE_TIER_PROVIDERS requiring an API key.\n- Uses OpenAI-compatible endpoints (/v1/chat/completions).\n- Configured to auto-fetch models from /v1/models (e.g., 'cipher').\n- Added provider logo to public assets.",
"is_bot": false,
"headline": "feat: Add Atomesus as an API key provider (0.5.65)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T10:06:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c39ebc0d3d086f779d468b02680193e32949f853",
"body": "User log audit caught two Antigravity accounts spamming the same 429\n'Individual quota reached. Resets in 2h27m' error every ~90 seconds.\n\nRoot cause: 0.5.49 TPM disambiguation re-classifies 'quota reached' 429s\nas TPM when the cached daily-quota number is still healthy. The quota\ncache lags behind \n[…]\nsets in N hour(s)/day(s)'. TPM never resets that slowly. Also\nforce-invalidate the cached quota for the account+model so subsequent\npicks see fresh data instead of tripping the trap on the next model.",
"is_bot": false,
"headline": "fix(auth): don't downgrade hours/days quota resets to TPM (0.5.69)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-28T07:28:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d6acd4d4baf6b583fcbbc97c17f5ba032ab76b5e",
"body": "The HTTP/2 connection pool (0.5.67) keeps multiplexed sessions alive for\n30s idle. Each session attaches SIGTERM + exit + beforeExit listeners.\nWith 6+ accounts and parallel IDE traffic, 21+ sessions cross Node's\ndefault limit → false-positive MaxListenersExceededWarning. Raised from\n20 → 50.",
"is_bot": false,
"headline": "fix: raise process.setMaxListeners to 50 for h2 pool (0.5.68)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T20:51:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "160eb86def8bf7c520397258f069e7ad14f76986",
"body": "…5.67)\n\nUser log showed repeated cascades of NGHTTP2_INTERNAL_ERROR falling back to\nsocket hang up.\n\nRoot cause: the MITM server was calling `http2.connect()` for EVERY incoming\nrequest, opening a brand new HTTP/2 session to Google, sending one stream,\nand then immediately closing the entire session\n[…]\nses it), we evict it and automatically retry the request on a fresh connection.\n\nThis eliminates the TLS overhead per-request and stops Google from throwing\nanti-abuse GOAWAY frames at the MITM proxy.",
"is_bot": false,
"headline": "fix(mitm): connection pool for HTTP/2 to stop NGHTTP2 disconnects (0.…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T20:19:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0bc4eabe6e8bdafda065ccd2df6d7a5f356406cd",
"body": "…ction badge (0.5.66)\n\nTwo bug fixes for user-reported issues:\n\n1. Claude CLI Bash Safety Classifier (cx/gpt-5.5):\n Claude CLI's safety pre-check requests max_tokens=1. OpenAI/Codex\n backends now reject max_tokens < 16 with HTTP 400, which Claude CLI\n surfaces as 'model is temporarily unavaila\n[…]\nhasKRouter but omitted it from\n the JSON response. The CLI Tools index card defaulted to 'Not configured'\n even when the detail page showed 'Connected'. Added hasKRouter to the\n JSON response.",
"is_bot": false,
"headline": "fix: claude bash safety classifier max_tokens floor + cli-tools conne…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T20:13:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8c53987bcd283c316a4ea1069e3c22a643864c84",
"body": "Full kRouter debug pass identified four atomic bugs causing the\n'Kiro auto doesn't work on other IDEs' + 'Gemini doesn't know how to\nbe AI' user-reported chaos.\n\nA. Kiro native passthrough wiring (clientDetector.js).\n - Added 'kiro': ['kiro'] to NATIVE_PAIRS.\n - Added Kiro IDE detection branch (\n[…]\n\n\nLive verification:\n isNativePassthrough('kiro', 'kiro') === true\n injectSystemPrompt(body, FORMATS.KIRO, persona) prepends to user content\n conflict resolution produces exactly one system message",
"is_bot": false,
"headline": "fix: Kiro IDE first-class support + Caveman/Ponytail mutex (0.5.65)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T19:55:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "11204c692b95b4d4f127e125f7366b2b8d99c4d6",
"body": "The notify-krouter-web workflow targeted sifxprime/krouter-web on GitHub,\nbut that repo doesn't exist (and the user doesn't want to use it). The\nworkflow was just failing with HTTP 404 on every push. Removed both the\nworkflow file and any reference.",
"is_bot": false,
"headline": "ci: remove notify-krouter-web workflow (0.5.64)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T13:37:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b8465079dbc782b076297c99c9c8921491c90a0",
"body": "…ding to Claude (0.5.63)\n\nUser log showed Claude returning 400 invalid_request_error on\nmessages.81.content.0.tool_use.id with pattern \\\"^[a-zA-Z0-9_-]+$\\\". Traced\nto a cross-IDE pattern: conversation starts in Antigravity / Gemini (emits\nIDs with dots/colons/slashes), then continues on a Claude-com\n[…]\n we change nothing, preserving the byte-perfect prompt cache.\nWhen at least one ID is invalid, we run the existing ensureToolCallIds()\nsanitizer once. Wired both into chatCore.js's passthrough branch.",
"is_bot": false,
"headline": "fix(claude-passthrough): sanitize Gemini-style tool_use.id before sen…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T13:20:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5cc370fae070e60a95f13ad4663dd14687ec2231",
"body": "Fires repository_dispatch to sifxprime/krouter-web whenever providers.js,\nCHANGELOG.md, package.json, or public/providers/** change on main, so the\npublic website rebuilds with fresh data. No-op when KROUTER_WEB_PAT secret\nis absent.",
"is_bot": false,
"headline": "ci: notify krouter-web on provider/changelog changes",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-27T09:50:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7bd4538c7d18e1437f8495962826b4025a1dac7",
"body": "User requested removing the upstream badge/credit from the very first\nline of the README (it remains in the attribution section at the bottom)\nand changing the LICENSE copyright header strictly to Kodelyth AI\nInfrastructure.\n\nZero code changes in this commit.",
"is_bot": false,
"headline": "docs(0.5.62): update license and top-level branding",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-26T11:55:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "155c1d5a4e21f12dffe43447245d5bf12026a827",
"body": "… (0.5.61)\n\nUser successfully logged into Docker Hub as 'sifxprime'. Updated the CI\npipeline to build and push container images to sifxprime/krouter on\nDocker Hub and ghcr.io/sifxprime/krouter on GHCR.\n\n- .github/workflows/docker-publish.yml: Switched DOCKERHUB_IMAGE to sifxprime/krouter\n- README\n[…]\ning sifxprime/krouter:latest\n- DOCKER.md: Rewrote all container management instructions for sifxprime/krouter\n- Version bumped to 0.5.61.\n\nReleasing tag v0.5.61 to trigger the Docker build workflow.",
"is_bot": false,
"headline": "chore(release): configure Docker Hub publishing to sifxprime/krouter…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-26T11:38:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21d187f15f3aab989445d02163760307044dad4e",
"body": "Ensures the NPM package landing page reflects the updated Quick Start\n(npm install path) and uninstallation guide.",
"is_bot": false,
"headline": "docs(0.5.60): sync cli/README.md with primary docs",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-26T11:27:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "325c0e4c2eec2d9d21b5e07ac059133d3b5047d3",
"body": "User requested a documentation update prioritizing the NPM install path\nover the Git clone path, since the NPM package is now fully stable and\nincludes all the upstream parity features.\n\n- README: Rewrote 'Quick Start' into Option 1 (NPM) and Option 2 (Git).\n- README: Added explicit upgrade commands.\n- README: Added explicit uninstall commands (including ~/.krouter cleanup).\n- CHANGELOG: Added 0.5.59 entry.\n- Version bumped to 0.5.59.\n\nZero code changes in this commit.",
"is_bot": false,
"headline": "docs(0.5.59): NPM install, uninstall, and feature docs refresh",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-26T11:26:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea55f41ce02e2c85dc74556eac3176173ea0554b",
"body": "…elog\n\nUser asked for a full doc refresh.\n\nREADME adds an honest 'kRouter vs 9router vs OmniRoute' comparison table —\nside-by-side on Antigravity ban handling, quota accuracy, MITM stream layer,\nSSRF guards, auth race conditions, image support, thinking preservation, and\nupdate cadence. Removes a st\n[…]\nrapped usageMetadata extraction, auto-backfill on startup,\nhonest 'Exhausted • awaiting reset' rendering, and Antigravity thinking\npreservation.\n\nDocumentation only — zero code changes in this commit.",
"is_bot": false,
"headline": "docs(0.5.58): comparison table + dual-copyright + 0.5.35-0.5.57 chang…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-25T19:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5d1682fa53f3d834477ec8e038e1d2b5486d9c8c",
"body": "…(0.5.57)\n\nUser: 'kiro works through MITM but kiro maybe not thinking, get direct answer.'\n\nRoot cause: open-sse/executors/antigravity.js applies ANTIGRAVITY_REQUEST_BLACKLIST\nwhich strips top-level body fields {thinking, reasoning_effort, reasoning,\nenable_thinking, thinking_budget, thinkingConfig,\n[…]\neady\nset thinkingConfig (don't clobber explicit values).\n\nEffect: Kiro IDE through Antigravity MITM will now show reasoning content\nagain because we forward the correct Gemini thinking shape upstream.",
"is_bot": false,
"headline": "fix(antigravity): preserve thinking intent across the body blacklist …",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-25T10:17:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab08fc90b0da674173c7f1ba8db8d51d213a35ff",
"body": "…ed (0.5.56)\n\nUser pointed out that Antigravity desktop shows Claude quota deducting smoothly,\nwhile our dashboard renders Claude Opus/Sonnet as 100%-used red bars even on\nfresh accounts. Investigation: Google's fetchAvailableModels DOES expose\nquotaInfo for Claude, but ONLY remainingFraction is omi\n[…]\noviderLimitCard: passes exhaustedAwaitingReset through.\n\nNet effect: the dashboard now mirrors what the Antigravity desktop shows for\nthis exact case (account is out of Claude budget, awaiting reset).",
"is_bot": false,
"headline": "fix(quota): show 'Exhausted • awaiting reset' instead of fake 100%-us…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-25T10:11:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7075c46ba4adf15a67ca7290b69148c0b5757366",
"body": "… marker (0.5.55)\n\nUser reported a flood of NGHTTP2_INTERNAL_ERROR and 'socket hang up' from\nthe MITM after 0.5.54 ('before you update it was works verify perfect bro').\n\nRoot cause: 0.5.47 added 'x-request-source' to the antigravity header scrub\nlist, calling it a 'fingerprint leak'. That was a mis\n[…]\nest-source stays on outbound. Live end-to-end test through\nthe dev server now passes for all four Antigravity models: gemini-pro-agent,\ngemini-3.1-pro-low, claude-opus-4-6-thinking, claude-sonnet-4-6.",
"is_bot": false,
"headline": "fix(mitm): revert x-request-source scrub that broke our own anti-loop…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-25T03:47:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ef811887c301557eaba413a6eca3dfd14ac9b750",
"body": "….5.54)\n\nUser feedback: running 'krouter backfill-tokens' as a separate command\nis awkward. Make it automatic.\n\ninitializeApp() now invokes a silent autoBackfillTokensIfNeeded() once per\nprocess start. It walks any requestDetails rows where tokens.prompt_tokens=0\nAND providerResponse.response.usageM\n[…]\n burned 101,425\n upstream tokens; live Google quota moved 0.000% → 1.272% used.\n Dashboard quota tracker reads the same endpoint, so this is the actual\n number users will see decrement on their UI.",
"is_bot": false,
"headline": "feat(init): auto-backfill historical Antigravity tokens on startup (0…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T23:14:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d72c75e2c105c7387c6da448bba4a42546467762",
"body": "The 0.5.52 backfill loop inlined a 'sqlite3 db UPDATE ... data=' JSON ' command\nper row, and JSON's curly braces + embedded quotes broke the shell quoting so\nSQLite saw 'data=\\\"{id:...' instead of valid JSON. Result: 'Backfilled 0 rows'\non every run even though the loop iterated.\n\nNow: emit all UPDATEs into a temp SQL script and feed it to 'sqlite3 db <script'\ninside a BEGIN/COMMIT transaction. SQLite parses each statement itself so the\nJSON survives intact, and the whole batch is atomic.",
"is_bot": false,
"headline": "fix(backfill-tokens): stream UPDATEs via stdin (0.5.53)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T22:52:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "42202ad1d24ebb9fb077dc39910c2847e3bcb0a7",
"body": "Two cleanups bundled in one ship.\n\n1) 'krouter backfill-tokens' rewrites old requestDetails rows where\n tokens.prompt_tokens=0 but providerResponse.response.usageMetadata\n actually carries the real Gemini-shape counts. Lifts promptTokenCount,\n candidatesTokenCount, thoughtsTokenCount into the \n[…]\nals updated in localDb', and the chatCore handler's per-\n provider 'ANTIGRAVITY | refreshed'). Kept the last one (most useful)\n at info, dropped the other two to debug. Cuts ~67% of refresh noise.",
"is_bot": false,
"headline": "feat: backfill-tokens CLI + quiet duplicate token-refresh logs (0.5.52)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T22:49:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b2d644ee61fa492583f6714c4c672182d2dcdfab",
"body": "….5.51)\n\nAntigravity wraps the Gemini response shape inside {response: {usageMetadata}},\nso the top-level usageMetadata check in extractUsageFromResponse missed it and\nevery Antigravity row landed in the DB with tokens.prompt_tokens=0 even when\nGoogle billed thousands of real tokens.\n\nThe result: th\n[…]\nrapped shape and lift the usageMetadata up so\nextraction returns prompt_tokens / completion_tokens / reasoning_tokens.\n\nAfter this fix, Usage page totals will agree with the Google-side quota tracker.",
"is_bot": false,
"headline": "fix(tokens): record real Antigravity token usage in requestDetails (0…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T22:37:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5359d42dba54cb1a8225997d966cfbb85c461aff",
"body": "…dels (0.5.50)",
"is_bot": false,
"headline": "fix(antigravity-models): supply project + headers to fetchAvailableMo…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T22:24:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f443357091ec07823cb32f92d8298b0e60e995d",
"body": "…5.49)\n\nUser screenshot showed quota tracker reporting 98% remaining on gemini-3.1-pro-low\nfor itsshofiqulprivate@gmail.com, while a real chat call to the same model on the\nsame account returned 429 'Individual quota reached'. Two contradictory pieces of\ndata from Google about the same account at th\n[…]\nuota tracker shows instead of contradicting it.\n\nNet effect: accounts hit by transient TPM bursts come back into rotation in\n~90s instead of half an hour, and the dashboard stops contradicting itself.",
"is_bot": false,
"headline": "fix(auth): distinguish TPM rate limit from daily quota exhaustion (0.…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T21:56:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ef03179ce48321f0ab6e90715d63fe689103ce5",
"body": "User reported the quota tracker showed remaining % on accounts that the\nproviders page still marked as 'unavailable' with a 6-hour-old 429 quota\nerror. Inspection showed every per-model lock had EXPIRED but the\nsticky testStatus + lastError were left over from clearAccountError\nonly running on succe\n[…]\nactive' and drop\n the stale lastError so the dashboard matches reality\n\nNet effect: dashboard now matches the quota tracker, picker behaviour\nunchanged (it was already using live model-lock state).",
"is_bot": false,
"headline": "fix(providers): lazy-clear stale unavailable testStatus on read (0.5.48)",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T21:36:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c687ff7fd258f2764a29cd8c35075ab7e13f8dae",
"body": "…ag (0.5.47)\n\nTwo real bugs found during deeper investigation after user reported a\n4th account on the same IP works fine in the official Antigravity desktop\napp but fails through kRouter — meaning IP isn't the variable; client\nfingerprint is.\n\n1. x-request-source leak (the smoking gun)\n kRouter's\n[…]\ne flags when the account is genuinely\n usable again (user verified at Google's URL)\n Provides a clean signal for the UI to render permanent-ban accounts\n distinctly from short-cooldown ones.",
"is_bot": false,
"headline": "fix(antigravity): scrub x-request-source leak + wire permanent-ban fl…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T21:25:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "101386f618cb6a6577ceaf2eb5537fa1ba66ab03",
"body": "…(0.5.46)\n\nUser reports steady stream of '[403]: Verify your account to continue.'\non FRESH Antigravity accounts within seconds of first use. Investigation\nof upstream decolua/9router issue #270 and OmniRoute v3.8.35 source\nidentified the actual root cause + the proper escalation.\n\nROOT CAUSE — anti\n[…]\ncount has been suspended',\n 'this account is deactivated'.\n\nNet effect: new accounts no longer trip the bootstrap fingerprint\nmismatch, AND already-banned accounts stop wasting requests every hour.",
"is_bot": false,
"headline": "fix(antigravity): root-cause fix for Verify-your-account ban cascade …",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T21:08:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b5e18360a80316444d34685009660736542dd6d",
"body": "….5.45)\n\nReal user log on 0.5.44 showed two issues mixed together:\n\n1. Antigravity model-list endpoint was using the dead sandbox URL\n 'daily-cloudcode-pa.sandbox.googleapis.com/v1internal:models'\n which Google removed at some point. It returned a 5KB HTML 404\n page on every dashboard load, du\n[…]\nuter bug — Google's anti-abuse system is flagging fresh OAuth\ntokens within seconds of first use. That requires the user to verify\nin-browser and warm accounts on the official Antigravity desktop app.",
"is_bot": false,
"headline": "fix: antigravity models endpoint + truncate noisy 404 HTML in logs (0…",
"author_name": "Shofiqul Islam",
"author_login": "sifxprime",
"committed_at": "2026-06-24T20:51:49Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 58,
"commits_last_year": 224,
"latest_release_at": "2026-07-18T00:50:09Z",
"latest_release_tag": "v0.5.118",
"releases_from_tags": true,
"days_since_last_push": 0,
"active_weeks_last_year": 6,
"days_since_latest_release": 5,
"mean_days_between_releases": 0.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@sifxprime/krouter",
"exists": true,
"license": "MIT",
"keywords": [
"krouter",
"9router",
"kodelyth",
"cli",
"proxy",
"ai",
"llm",
"api"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@sifxprime/krouter",
"is_deprecated": false,
"latest_version": "0.5.118",
"repository_url": "https://github.com/sifxprime/krouter",
"versions_count": 112,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 16773,
"first_published_at": "2026-06-17T12:42:53.216000Z",
"latest_published_at": "2026-07-18T00:50:52.183000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 9,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"gitbook/jsconfig.json",
"jsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 87669,
"source_files_sampled": 852,
"oversized_source_files": 3,
"agent_instruction_files": [
"tests/translator/AGENTS.md"
],
"agent_instruction_max_bytes": 7246
},
"dependencies": {
"manifests": [
"cli/package.json",
"gitbook/package.json",
"package.json",
"tests/package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "enquirer",
"manifest": "cli/package.json",
"ecosystem": "npm",
"version_constraint": "^2.4.1"
},
{
"name": "node-forge",
"manifest": "cli/package.json",
"ecosystem": "npm",
"version_constraint": "^1.3.3"
},
{
"name": "node-machine-id",
"manifest": "cli/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.12"
},
{
"name": "react",
"manifest": "cli/package.json",
"ecosystem": "npm",
"version_constraint": "19.2.1"
},
{
"name": "react-dom",
"manifest": "cli/package.json",
"ecosystem": "npm",
"version_constraint": "19.2.1"
},
{
"name": "lucide-react",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "^0.563.0"
},
{
"name": "next",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "16.1.1"
},
{
"name": "react",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "19.2.3"
},
{
"name": "react-dom",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "19.2.3"
},
{
"name": "react-markdown",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "^9.0.1"
},
{
"name": "rehype-highlight",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.0"
},
{
"name": "rehype-slug",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.0"
},
{
"name": "remark-gfm",
"manifest": "gitbook/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.0"
},
{
"name": "@dnd-kit/core",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^6.3.1"
},
{
"name": "@dnd-kit/modifiers",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^9.0.0"
},
{
"name": "@dnd-kit/sortable",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^10.0.0"
},
{
"name": "@dnd-kit/utilities",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^3.2.2"
},
{
"name": "@monaco-editor/react",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^4.7.0"
},
{
"name": "@xyflow/react",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^12.10.1"
},
{
"name": "bcryptjs",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.3"
},
{
"name": "confbox",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.2.4"
},
{
"name": "express",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.1"
},
{
"name": "fs",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.0.1-security"
},
{
"name": "http-proxy-middleware",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.5"
},
{
"name": "jose",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^6.1.3"
},
{
"name": "marked",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^18.0.1"
},
{
"name": "material-symbols",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.44.6"
},
{
"name": "monaco-editor",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.53.0"
},
{
"name": "next",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^16.2.9"
},
{
"name": "node-forge",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^1.3.3"
},
{
"name": "node-machine-id",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.12"
},
{
"name": "open",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^11.0.0"
},
{
"name": "ora",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^9.1.0"
},
{
"name": "react",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "19.2.4"
},
{
"name": "react-dom",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "19.2.4"
},
{
"name": "react-is",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^16.13.1"
},
{
"name": "recharts",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^3.7.0"
},
{
"name": "selfsigned",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^5.5.0"
},
{
"name": "socks-proxy-agent",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^8.0.5"
},
{
"name": "sql.js",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^1.14.1"
},
{
"name": "undici",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^7.19.2"
},
{
"name": "uuid",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^13.0.0"
},
{
"name": "zustand",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.10"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "sifxprime",
"commits": 223,
"avatar_url": "https://avatars.githubusercontent.com/u/269868370?v=4"
},
{
"type": "User",
"login": "nkgotcode",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/58643031?v=4"
},
{
"type": "User",
"login": "0xSkybreaker",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/170517637?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.991
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"docker-publish.yml",
"gitbook-pages.yml",
"notify-krouter-web.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.mjs"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 9,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "736ba9134aa45db218e35325e362163af3488d9c",
"ran_at": "2026-07-23T10:33:21Z",
"aggregate_score": 4.3,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T00:51:18Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/sifxprime/krouter",
"host": "github.com",
"name": "krouter",
"owner": "sifxprime"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"security": 43,
"vitality": 70,
"community": 39,
"governance": 31,
"engineering": 80
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 70,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"commits_last_year": 224,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 6
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "6/52 weeks with commits",
"points": 4.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 6
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "224 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 224
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 58,
"latest_release_tag": "v0.5.118",
"releases_from_tags": true,
"days_since_latest_release": 5,
"mean_days_between_releases": 0.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "58 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 58
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 39,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 15,
"inputs": {
"forks": 0,
"stars": 9,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "9 stars",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 9
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "license file present, not a recognized license",
"points": 16.9,
"status": "partial",
"details": [
{
"code": "license_custom",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "good",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 70,
"inputs": {
"packages": [
"@sifxprime/krouter"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 16773
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "16,773 downloads/month across npm",
"points": 56.3,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 16773,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 31,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.991
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 99% of commits",
"points": 0.2,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 99
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "critical",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 22,
"inputs": {
"followers": 1,
"owner_type": "User",
"is_verified": null,
"owner_login": "sifxprime",
"public_repos": 4,
"account_age_days": 124
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of sifxprime",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "sifxprime"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "4 public repos, account ~0 yr old",
"points": 5.8,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 4
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@sifxprime/krouter"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "112 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 112
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 80,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 80,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": "eslint.config.mjs",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": "https://krouter.kodelyht.com",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://krouter.kodelyht.com",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 43,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 43,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.3
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 72,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"tests/translator/AGENTS.md"
],
"agent_instruction_max_bytes": 7246
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "tests/translator/AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "tests/translator/AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 59,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"gitbook/jsconfig.json",
"jsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": "eslint.config.mjs",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "gitbook/jsconfig.json, jsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "gitbook/jsconfig.json, jsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "dependency automation configured, none observed in the sampled commits",
"points": 5,
"status": "partial",
"details": [
{
"code": "dependency_bot_config_only",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "good",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"primary_language": "JavaScript",
"largest_source_bytes": 87669,
"source_files_sampled": 852,
"oversized_source_files": 3
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "JavaScript with type-check config (gitbook/jsconfig.json, jsconfig.json)",
"points": 27,
"status": "partial",
"details": [
{
"code": "typecheck_config_language",
"params": {
"files": "gitbook/jsconfig.json, jsconfig.json",
"language": "JavaScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "3/852 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 852,
"oversized": 3
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"Could not fetch npm package '9router-docs' from its registry",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@sifxprime/krouter@0.5.118; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-23T10:33:29.394611Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sifxprime/krouter.svg",
"full_name": "sifxprime/krouter",
"license_state": "custom",
"license_spdx": null
}