Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"anthropic",
"claude",
"claude-code",
"load-balancer",
"multi-account",
"nodejs",
"oauth",
"proxy"
],
"is_fork": false,
"size_kb": 1246,
"has_wiki": true,
"homepage": null,
"languages": {
"Nix": 16871,
"JavaScript": 604455
},
"pushed_at": "2026-07-23T08:17:44Z",
"created_at": "2026-03-24T14:49:08Z",
"owner_type": "Organization",
"updated_at": "2026-07-23T08:17:13Z",
"description": "Multi-account Claude proxy with automatic quota-based rotation",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "JavaScript",
"significant_languages": [
"JavaScript"
]
},
"owner": {
"blog": "https://klb.jp",
"name": "Karpelès Lab Inc.",
"type": "Organization",
"login": "KarpelesLab",
"company": null,
"location": "Tokyo, Japan",
"followers": 18,
"avatar_url": "https://avatars.githubusercontent.com/u/58999683?v=4",
"created_at": "2019-12-18T00:55:18Z",
"is_verified": null,
"public_repos": 233,
"account_age_days": 2409
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.1.9",
"kind": "patch",
"published_at": "2026-07-23T08:17:44Z"
},
{
"tag": "v1.1.8",
"kind": "patch",
"published_at": "2026-07-22T13:50:30Z"
},
{
"tag": "v1.1.7",
"kind": "patch",
"published_at": "2026-07-12T20:04:07Z"
},
{
"tag": "v1.1.6",
"kind": "patch",
"published_at": "2026-07-08T04:12:25Z"
},
{
"tag": "v1.1.5",
"kind": "patch",
"published_at": "2026-07-06T09:56:25Z"
},
{
"tag": "v1.1.4",
"kind": "patch",
"published_at": "2026-07-04T11:04:09Z"
},
{
"tag": "v1.1.3",
"kind": "patch",
"published_at": "2026-07-03T16:01:27Z"
},
{
"tag": "v1.1.2",
"kind": "patch",
"published_at": "2026-07-02T23:37:52Z"
},
{
"tag": "v1.1.1",
"kind": "patch",
"published_at": "2026-07-01T01:56:03Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-06-27T06:14:27Z"
},
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2026-06-27T03:25:36Z"
}
],
"recent_commits": [
{
"oid": "7dfd47af62663f81c123a74463cc412675e84eb8",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.9 (#132)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-23T08:17:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b81d91f462684afd9c74ed0bafe2e1d0f8259496",
"body": "The routes editor asked users to type account names, with every loaded\naccount listed inline in the footer prompt. On a wide terminal with many\naccounts that hint overflowed past the edge, pushing the input buffer\noff-screen — \"I can type but I can't see what I'm typing\" (#130).\n\nReplace the three f\n[…]\n\n\nName and model-glob stay typed, since they're arbitrary strings and their\nprompts are short. Tests updated to drive the pickers.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(tui): replace typed route fields with pickers (#130) (#131)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-23T05:03:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a7aba29b346a83825fb312df976e819f0b21b8c5",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.8 (#129)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T13:49:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2b0a67001c97c8ded5515b3e0030b08445fa3cdf",
"body": "Once a model leaves the base plans (e.g. Fable), requests for it can't be\nserved by any account, so they get rate-limited upstream and hang the whole\npipeline ~60s. New `blockedModels` config (array of globs, e.g. [\"*fable*\"]):\na request whose model matches is rejected right at the proxy with a fast\n[…]\nn-blocked forwarded, empty list blocks nothing) + TUI editor\nadd/delete/dedup. Live-verified: a blocked model returns 400 in ~6ms.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: model blocklist to reject unwanted models (issue #116) (#127)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T11:50:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b46008ec1b24ad0e6db245c05b9425639cdcd025",
"body": "Two problems surfaced once #123 routed every direct request through\nmakeResponse (previously only the sx path did):\n\n1. Readable.toWeb(res) double-closes the web-stream controller on Node 18\n (ERR_INVALID_STATE \"Controller is already closed\" when the socket's 'close'\n fires after 'end'), crashin\n[…]\n Rather than chase\n an EOL-node quirk, drop Node 18 from the CI matrix and require Node >=20\n (package.json engines + README).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(upstream): Node-18 stream crash; require Node >=20 (#128)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T11:49:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d4a8930616ae77168fe40e4bd1b2ef0c186d5a14",
"body": "…#126)\n\nClaude Code fires high-volume telemetry at /api/event_logging/* that floods the\nactivity log. New config `eventLogging` (default `hide`) with a live TUI toggle\n(settings screen → Event logging, ←→ to cycle):\n\n- hide (default): forwarded upstream, but kept out of the activity log/TUI.\n- block\n[…]\n-navigation test helpers now locate rows by field id\ninstead of a hardcoded index, so adding a settings row no longer shifts them.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: eventLogging mode (hide/block/show) for Claude Code telemetry (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T10:28:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7b1e9e587edd53a2eb9f8cbc917a7fcb9a1d34a7",
"body": "…st (#125)\n\nPrinciple: teamclaude's account logic (rotation, exhaustion, token injection)\nshould apply ONLY to hosts it manages (the Anthropic upstream). Anything else\nmust be forwarded transparently, never hijacked into \"all accounts exhausted\".\n\nFor HTTPS this already holds — the CONNECT tunnel bl\n[…]\n hang) on an unreachable target — each with an accountManager whose\ngetActiveAccount throws, proving Anthropic is never consulted.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(proxy): only apply account logic to managed hosts; forward the re…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T10:27:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "61f18a5879aaec28f5aef7acec0fca5bf8797573",
"body": "…tion (#106) (#123)\n\nNode's global fetch multiplexes every request to api.anthropic.com over a\nSINGLE HTTP/2 connection. Under many concurrent large uploads (Claude Code\nPOSTs ~1MB of context per turn) that one connection serializes on HTTP/2's\nshared flow-control windows — api.anthropic.com adverti\n[…]\no body-watchdog tests hold a ref'd handle (they relied\n on global fetch's incidental one, which the pooled path correctly drops).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(upstream): pool HTTP/1.1 connections to fix concurrency serializa…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T10:26:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "332ef7a6bf33042269af63a643a47bb123cc9656",
"body": "…(#122)\n\n* feat: session-aware routing to distribute concurrent sessions (#109)\n\nRotation was purely quota-driven, so many parallel Claude Code sessions all\npiled onto the current account while equal-priority siblings sat idle — one\naccount queued behind its upstream concurrency ceiling (timeouts) w\n[…]\n --activity-log file gets the plain short id too.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: session-aware routing to distribute concurrent sessions (#109) …",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T08:31:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ed5be7ce53d2b119ad5f22572b5f4fe2d7c9e79f",
"body": "In server mode, keep the terminal title in sync with which account is\ncurrently active — e.g. \"teamclaude 2/4 work\" — so a backgrounded or tabbed\n`teamclaude server` is glanceable without switching to it. Works in both TUI\nand headless modes.\n\nTTY-only: gated on process.stdout.isTTY so escapes never\n[…]\nped so a crafted name can't escape the sequence.\n\nTitle formatting/escaping lives in a pure src/terminal-title.js with unit tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(server): set terminal title to the active account (#121)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T07:52:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0044c4d40a93839f1e4be53aa06304fa03aadf40",
"body": "…#120)\n\n`teamclaude env` previously emitted only base-URL mode plus ANTHROPIC_API_KEY.\nThat didn't match `teamclaude run` (which defaults to MITM forward-proxy so\nhardcoded api.anthropic.com endpoints like the Claude Design MCP are\nintercepted), and the API key both was unnecessary for loopback clie\n[…]\nt multiplexers that\nspawn claude themselves (issue #108).\n\nLine-building is extracted to a pure src/claude-env.js with unit tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(env): default `teamclaude env` to MITM mode; make it eval-safe (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T06:18:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "61bceb154cdd1155fb35038adf7de54a3dac5ac3",
"body": "…live (holdSeconds) (#113)\n\nWhen all accounts are quota-exhausted, teamclaude normally returns a 429\nimmediately, causing Claude Code to abort the current task. With holdSeconds\nset, the proxy holds the HTTP connection open instead and polls silently\n(every ~60s) until an account's quota resets — th\n[…]\ners the full hold\nwindow. Default holdSeconds=0 preserves existing behavior unchanged.\n\nApplies to both MITM (default) and base-URL routing modes.\n\nCo-authored-by: Mark Karpeles <magicaltux@gmail.com>",
"is_bot": false,
"headline": "feat: hold HTTP connection on exhaustion to keep long-running tasks a…",
"author_name": "Bingwei Peng",
"author_login": "imnuke",
"committed_at": "2026-07-22T06:09:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "82af66c92de948cc5beb9196862f8944021b1bda",
"body": "…112)\n\nAdd --activity-log <file> to teamclaude server. Activity lines — request\ncompletions (method, path, model, account, status, duration), account\nswitches, quota resets, and rate-limit events — are appended to the file\nin addition to normal TUI or console output.\n\nWorks in both modes:\n- TUI mode\n[…]\n it renders\n- Headless mode: request lifecycle hooks capture completions; console.log\n and console.error are teed to the file for system messages\n\nCo-authored-by: Mark Karpeles <magicaltux@gmail.com>",
"is_bot": false,
"headline": "feat: --activity-log flag to persist the activity stream to a file (#…",
"author_name": "Bingwei Peng",
"author_login": "imnuke",
"committed_at": "2026-07-22T06:08:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25233bab48a4b58f073bce4c3738c88321b90ec8",
"body": "* Add Nix package, modules, and automation\n\n* Trim Nix PR for upstream: drop fork-maintenance, keep CI matrix\n\nAdjustments for merging into upstream rather than the fork:\n\n- Remove .github/workflows/update-upstream.yml — a scheduled job that\n fetches/merges KarpelesLab/teamclaude and pushes master \n[…]\neply@anthropic.com>\n\n---------\n\nCo-authored-by: Eugene Bogorad <bogorad@gmail>\nCo-authored-by: Mark Karpeles <magicaltux@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Nix flake package and service modules (#117)",
"author_name": "Eugene bogorad",
"author_login": "bogorad",
"committed_at": "2026-07-22T06:03:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "baf2b360e034b8ee158c8ce9dfc11319eadbd69b",
"body": "Recurring questions (#107, #115) about how TeamClaude relates to\nAnthropic's Terms warrant a canonical, linkable answer in the README.\nCovers the self-hosted-proxy framing, user responsibilities (real CLI,\nhuman present, own subscriptions), and the multi-subscription question —\nnoting Claude Code's own /extra-usage flow already offers switching\naccounts on limit. Framed as good-faith understanding, not legal advice.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add Compliance & Terms of Service section to README (#119)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T04:21:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "53c7c2ccf59aa1462824df359c21520a4b53d9ea",
"body": "…#118)\n\nsanitizeToolPairs (added in #105) ran a full JSON.parse + tree walk on\nevery /v1/messages body, including the common well-formed case, which on\nlarge contexts is real per-request CPU. An orphan can only exist if the\nbody contains a tool_use or tool_result block, so gate the parse behind a\ncheap Buffer scan for those markers and return the same Buffer instance\n(no-op) when neither is present.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf(sanitize): skip tool-pair parse for bodies with no tool blocks (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-22T04:12:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d634ab20336c1fd43ac3c27b2c867541d0a45ce3",
"body": "…#110)\n\nRemote Control's real-time channel is a WebSocket\n(wss://api.anthropic.com/v1/session_ingress/ws/{session_id}), which fires\nNode's 'upgrade' event, never 'request' — teamclaude had no handler for it on\neither the base HTTP server or the MITM terminating server, so the connection\nnever reache\n[…]\ne-Session: https://claude.ai/code/session_01TBZBcLSWspMVPVpctnuiTz\n\nCo-authored-by: José Volmei Dal Prá Junior <jose.dalprajunior@loadsmart.com>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: relay Remote Control's WebSocket upgrade to upstream untouched (…",
"author_name": "José V. Dal Prá Junior",
"author_login": "jrdalpra",
"committed_at": "2026-07-22T04:08:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a974be9e21d06a51894088a19fb2310c2dea239f",
"body": "* fix(server): sanitize orphaned tool_use/tool_result before forwarding\n\nAnthropic rejects any request where a tool_use block isn't answered by a\nmatching tool_result in the next message, with a non-retryable 400:\n\n messages.N: tool_use ids were found without tool_result blocks\n immediately after:\n[…]\n\nexpose the next orphan, and coalesces same-role neighbors so roles still\nalternate. Well-formed bodies still pass through as the same Buffer.\nAdds a separated-pair regression test and a cascade test.",
"is_bot": false,
"headline": "Sanitize orphaned tool_use/tool_result blocks before forwarding (#105)",
"author_name": "Victor Dozal",
"author_login": "viiqswim",
"committed_at": "2026-07-22T04:08:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a4beaa23065008900577b3562feb8b691251bec6",
"body": "…p (#103)\n\nA tunnel-mode CONNECT (any host other than the upstream) only wrote its\n200 status line inside the net.connect success callback. On upstream\nconnect failure — DNS blip, refused, reset, or the 30s timeout — teardown\ndestroyed the client socket with no status line, so the client reported\n\"P\n[…]\ng.\nAdd a diagnostic log line for pre-establish tunnel failures.\n\nRegression test: a tunnel CONNECT to a dead port now returns 502.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(mitm): return 502/504 on CONNECT failures instead of a silent dro…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-13T04:17:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5e6340cd8f40549557777c9795e363f495748b44",
"body": "…a --auto-fallback (#102)\n\nPreviously `teamclaude run` (and the plain `claude` shell alias) silently\nlaunched claude directly when the proxy was down. That transparent fallback\nhides that requests are bypassing the proxy — no rotation, spending the user's\nown quota. Now `run` errors and exits 1 when the proxy is down; pass\n--auto-fallback to keep the direct-launch behavior.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(run): require a live proxy by default; opt into direct launch vi…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-13T02:29:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "da355d48875bccbb79d30c58a3fce03b70d9a5c7",
"body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.7 (#101)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-12T20:03:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "85231a7d234cd05c256562e77b48bf9707412ac6",
"body": "…gs (#100)\n\n- New `p` shortcut probes every OAuth account's zero-spend usage endpoint\n once, whether or not the periodic quota probe is enabled (Prober.probeAll\n on demand); progress and failures land in the activity log, with an\n in-flight guard so a held key doesn't stack probes.\n- The `a`dd / \n[…]\nect mode gains a return-mode (selReturn) so remove-from-settings\n comes back to settings while s/d from the dashboard still return to\n normal.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(tui): on-demand quota refresh (p) + account management in settin…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-12T19:51:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6f2e9aeb9a4cbb7d091f7128c587f30c358a9d31",
"body": "…) (#99)\n\nClaude Code's /advisor keeps the executor in the top-level `model` field\nand nests the advisor's model inside tools[] (type advisor_*), so advisor\nrequests were routed as plain executor requests: fable routes/pins never\nmatched, and an account with a spent (or absent) Fable bucket could\nre\n[…]\nthrottled log) so the main request keeps flowing.\n- server.js: parse the advisor model once per request and thread it\n through retries via ctx.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(routing): make account selection see the advisor model (issue #98…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-12T19:51:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f85cf29eee28df7bb8cadd5067ac3f00ab536de3",
"body": "…#97)\n\nThe inline routing markers added in #94 drew a ► next to the F7/S7 bar on\nevery account that was a \"member\" of the Fable/Sonnet route — i.e. every\naccount eligible to serve that model. Since every Max account meters its own\nFable/Sonnet weekly bucket, they are all eligible, so the marker appe\n[…]\nwith fallback, and returns null when nothing can serve the model;\na TUI render test asserts exactly one F7 marker across accounts.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: mark the single account each secondary quota routes to (F7/S7) (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-09T07:05:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "366f9ec6204cb2c9df56a0170a706d8c450d1875",
"body": "… (#96)\n\natomicConfigUpdate is a read-modify-write with no serialization, so two\nconcurrent callers each read the same config and then save in turn, and the\nlater save silently drops the earlier caller's change.\n\nThis bites hardest on startup, when more than one OAuth account refreshes its\ntoken at \n[…]\nest config before writing, so concurrent updates\nqueue instead of clobbering each other, and a failed update does not block the\nones behind it. No API change: callers still await the returned promise.",
"is_bot": false,
"headline": "Serialize atomicConfigUpdate to prevent concurrent token-refresh loss…",
"author_name": "Victor Dozal",
"author_login": "viiqswim",
"committed_at": "2026-07-09T06:16:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fbabfbfacf8e555f8a01231b0df9739118f8567f",
"body": "…UI) (#94)\n\nReplace the separate TUI \"Routing\" list with inline ► markers on the account\nrows: family routes (Fable/Sonnet) sit next to the F7/S7 bar, general routes get\na stable start-of-row column each. A marker is bold on a route's pinned account,\ndim when that member is ineligible, and keeps the\n[…]\noute reload.\n\nTests: route-pin bias/fallback/reject/remap, TUI color prompt + Tab pinning,\nstatus-renderer color + pin annotation.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: inline routing markers + per-route colors and manual pinning (T…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T06:06:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1a9d554cf6374e40674a5c6b6b3a40cbfe24c084",
"body": "Ships two fixes merged since 1.1.5:\n- #91 code-quality cleanup: fixes addAccount hanging runtime-added accounts,\n relayRaw dropping content-encoding/length, and the missing Fable weekly line;\n removes dead code and dedups.\n- #92 shutdown fix: TUI q / ctrl-c no longer hangs and no longer leaks server\n 'close' listeners.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.6 (#93)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T04:11:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cc92bf9bd790f59872fb991bce706433f8534b16",
"body": "…eners (#92)\n\nPressing `q` (or ctrl-c) in the TUI called server.close() with no force-exit\ntimeout. Node's server.close() waits for every open connection (keep-alive\nclient sockets, streaming responses, the warmer subprocess) to end before its\ncallback runs, so with any connection live the process h\n[…]\nth too.\n\nVerified over a real PTY: q / ctrl-c with a live connection exit in ~0.01s;\nthe pre-fix q path hangs > 6s. Lint clean, 231 tests pass.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: quitting could hang forever (TUI q / ctrl-c) and leak close list…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T04:08:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2e0891610233d49317cacffc76d992177b237913",
"body": "…p (#91)\n\nGlobal quality pass across src/. Fixes three correctness bugs, removes\norphaned dead code, and collapses duplicated constants/comments. Net -162\nlines; lint clean, 231 tests pass (+1 regression test).\n\nBugs:\n- account-manager: addAccount omitted inFlight/rampStartedAt/pausedUntil, so\n adm\n[…]\nUTH_TOKEN into the identical\n DEFAULT_CLIENT_ID/DEFAULT_TOKEN_ENDPOINT.\n- server: move an orphaned JSDoc back onto createProxyRequestListener.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: code-quality cleanup — fix latent bugs, remove dead code, dedu…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T03:08:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0489565e906c5243f4d664e3dc309ef9875d29a2",
"body": "…429 (#89)\n\n* feat: storm control — ramp up requests onto a just-switched account\n\nWhen many agents run at once and the active account runs out, every\nin-flight request fails over to the next account at the same instant. The\nherd (with large contexts) can spend a big slice of the fresh account's\nquo\n[…]\nthat referenced markRateLimited on the (now pause-based)\n rate-limit path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: storm control — no thundering-herd on switchover or rate-limit …",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T02:51:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "94d4ca95e8f18ef7c705304dcfea6a65ec244690",
"body": "Adds a \"Prompt caching across rotation\" section (next to keep-warm) covering a\ngap the README didn't address, but accurately:\n\n- context is preserved across a switch (transcript resend + account_uuid rewrite);\n- the prompt cache is org-scoped and short-lived, so the first turn after a\n switch is a \n[…]\nly notes keep-warm is unrelated (it warms the 5h session timer, not the\nprompt cache) to avoid conflating the two. Supersedes #87.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: explain prompt caching across account rotation (#88)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-08T02:00:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "440888830d84b74cfae58697653850e0fc6d1a1f",
"body": "* feat: per-model routing with configurable routes\n\nRoute requests by model family so an account is gated and ranked on the\nquota bucket that actually governs each request, not a blanket max across\nall buckets. A spent Fable/Sonnet weekly bucket now bars only that family;\nthe account keeps serving O\n[…]\ninputReturn) so routes/settings stay visible with the prompt in the\nfooter.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: per-model routing with configurable routes (#86)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-07T12:19:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d72341718ab6d2c52e3f9898553074d8314ed2b0",
"body": "…t's own credential (#83)\n\nImages attached to a message for a teleoperated Claude Code session are\nuploaded to the backend under the user's claude.ai identity; the CLI then\ndownloads them via GET /api/oauth/files/<uuid>/content using its own OAuth\ntoken. This path is not covered by the /v1/code/ pas\n[…]\niles/ and /api/oauth/file_upload through relayStream,\nsame as the Remote Control channel.\n\nCo-authored-by: Artem Shtanov <artemshtanov@gmail.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Pass attachment transfers (/api/oauth/files/*) through with the clien…",
"author_name": "Apfelbaum",
"author_login": "iamapfelbaum",
"committed_at": "2026-07-07T09:47:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ea6f6a97662569ec6a80fe3b1dd8ad043e828b5c",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.5 (#82)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-06T09:55:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4fc849a2ff501666540ff83e39353b82e0bd6a56",
"body": "…e (#81)\n\n* fix: harden proxy security, account selection, and scheduler lifecycle\n\nFindings from a full-codebase review (fanned out across subsystems, each\nfinding verified against the code before fixing).\n\nSecurity (MITM/CONNECT path):\n- Gate the CONNECT handler with the proxy apiKey, mirroring th\n[…]\nst/TEAMCLAUDE_HOST bind + remote-auth requirement\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: harden proxy security, account selection, and scheduler lifecycl…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-06T09:53:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b448e48efcd3c9cc2f5095ec0ce95a7140f3dd59",
"body": "…#76) (#80)\n\nIdle accounts' rolling 5h session window only starts on real usage, so a\ncold account's timer begins exactly when rotation reaches it — right when\nits full headroom is needed. Keep-warm starts that timer ahead of time.\n\n- src/warmer.js: opt-in Warmer (mirrors Prober). On an interval it \n[…]\n\nrotation override) and warmer (eligibility, spawn spec, status, error paths,\nscheduling). 180 tests pass, lint clean.\n\nCloses #76\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: opt-in keep-warm for idle accounts + per-account pin endpoint (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-06T08:07:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "24231bb629dc443a8c799aa3c9cbec6e71161a1e",
"body": "#74 shipped the third-party-backend feature (per-account upstream/modelMap/\nmodels) with no tests. Add coverage for both surfaces:\n\n- Model-ownership routing in AccountManager: ownership is inert until some\n account declares a `models` list; an owned model routes only to owning\n accounts; the [Nm]\n[…]\n, a non-JSON\n body, or a body with no model field.\n\n163 tests pass, lint clean. No behavior change beyond exporting rewriteModel.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: cover third-party backend routing and model rewrite (#74) (#79)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-06T07:28:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "462c057e52d05b388affc465089f02becf6903e9",
"body": "…dels) (#74)\n\n- Per-account `upstream` URL routes requests to any Anthropic-compatible\n API (e.g. DeepSeek, GLM) instead of the global upstream\n- `modelMap` rewrites the request body's model name before forwarding,\n with Content-Length updated to match the new body size\n- `models` array declares m\n[…]\nessions\n- Third-party accounts set to a higher priority value act as transparent\n fallbacks when all Claude accounts are exhausted\n\nCo-authored-by: Mark Karpelès <MagicalTux@users.noreply.github.com>",
"is_bot": false,
"headline": "feat: add third-party backend account support (upstream, modelMap, mo…",
"author_name": "Bingwei Peng",
"author_login": "imnuke",
"committed_at": "2026-07-06T07:10:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3cefdf13ffd389d195a15385454785dee4ad744c",
"body": "A 429 with a long retry-after puts an account into an in-memory hold, and\nfailover means one client request during a 429 burst can throttle every\naccount at once. While a hold lasts nothing revalidates it, so when the burst\nwas transient (e.g. retries piling up after a network drop and reconnect) th\n[…]\nart.\nAfter: self-recovers on the first request past the floor.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nCo-authored-by: Mark Karpelès <MagicalTux@users.noreply.github.com>",
"is_bot": false,
"headline": "Revalidate throttled accounts instead of trusting stale 429 holds (#77)",
"author_name": "teocns",
"author_login": "teocns",
"committed_at": "2026-07-06T07:09:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ac5bd7de74a50b3c9a091b65feb07a4511cd3f01",
"body": "After a host network drop/reconnect, Node's shared fetch connection pool\nholds dead keep-alive sockets. With no time limit on a request, a retry\nlands on a dead socket and hangs forever — every account and retry hits\nthe same poison, so the proxy stays wedged until a manual restart.\n\nBound each stag\n[…]\nl alternative would add the undici\nruntime dep and miss the sx-tunnel path).\n\nCloses #73\n\nCo-authored-by: teocns <teocns@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: recover from network drops without restarting (#78)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-06T05:53:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1286c5642ab44d4239d628ef21dad038784091cb",
"body": "Previously NO_PROXY was set to empty string, forcing all traffic\n(including plain-HTTP requests to local services such as MCP servers\nat 127.0.0.1) through the proxy. This caused fetch failures for local\nMCP SSE connections (e.g. http://127.0.0.1:15001/sse) that appear in\nClaude Code's activity log \n[…]\nated \"Upstream error: fetch failed\".\n\nSet NO_PROXY to localhost,127.0.0.1,::1 so local connections bypass\nthe proxy while external traffic (api.anthropic.com) still goes\nthrough the MITM interception.",
"is_bot": false,
"headline": "fix: exclude localhost from NO_PROXY in MITM mode (#75)",
"author_name": "Bingwei Peng",
"author_login": "imnuke",
"committed_at": "2026-07-06T02:41:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e7050de46e2f769449b1fbfd388a3ccf23bf7995",
"body": "Also allow AbortSignal as an eslint global — test/server-429.test.js\n(added in #68) uses AbortSignal.timeout, which the flat config did not\ndeclare, turning master's Lint job red.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.4 (#71)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-04T11:03:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e5b3a7580a53977dec18e56068791772e0d5814f",
"body": null,
"is_bot": false,
"headline": "Add rich status output (#69)",
"author_name": "Rick van Hattem",
"author_login": "wolph",
"committed_at": "2026-07-04T11:00:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7688523b567b677c380e92464390dcdb3612bfeb",
"body": null,
"is_bot": false,
"headline": "Bound 429 retry recovery (#68)",
"author_name": "Rick van Hattem",
"author_login": "wolph",
"committed_at": "2026-07-04T11:00:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fcfea1ed3dd7afa3ecab7f2b8c5405c53a20d1b2",
"body": null,
"is_bot": false,
"headline": "Stabilize Fable quota reset test (#70)",
"author_name": "Rick van Hattem",
"author_login": "wolph",
"committed_at": "2026-07-04T11:00:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "079d36c15592264756c0bbf7f7a8227da95ccd3d",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.3 (#67)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-03T16:01:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e2101eaa4da75555e5f6e3ee3cd4fce386ca8ccb",
"body": "Requests that carry a `model` now display it in the activity feed, e.g.\n`POST /v1/messages (claude-fable-5) → acct@x (200, 1.2s)`. The model is already\nparsed into ctx.model for routing; thread it through the onRequestEnd hook and\nrender it after the path when present (omitted for requests with no model).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: show the requested model in the TUI query log (#66)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-03T15:57:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "15ae02b6834bbfa9e1aff6fee4b0e519691744dc",
"body": "…y (#65)\n\n* feat: MITM as a terminating proxy with transparent cross-account retry\n\nMITM mode was a transparent byte-relay: it streamed the upstream response to\nclaude verbatim BEFORE decoding it, so a quota 429 was already on the wire by the\ntime we knew what it was — there was no way to retry it o\n[…]\ned for model-aware routing off the buffered body.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: MITM as a terminating proxy with transparent cross-account retr…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-03T15:53:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d3cb09e9319518933cfd49f60c26d685794db9ca",
"body": "…ed accounts for Fable only) (#64)\n\nSurfaces the per-model (Fable) weekly limit everywhere the Sonnet bucket is\nshown, and — the reason it matters — stops routing Fable requests to accounts\nwhose Fable weekly cap is spent while still using those accounts for every other\nmodel.\n\nQuota tracking\n- oaut\n[…]\n 429 headers, model-scoped selection, and end-to-end h1/h2\nrelay peek (body relayed byte-for-byte, routed on the top-level model).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: track Fable weekly quota and route by model (skip Fable-exhaust…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-03T14:56:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "351959d5971e5c30f01881340608bb8da9039312",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add Star History chart to the README (#63)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-02T23:50:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b5efc184eec9749a6daf74bfc97cbd7b5cdb9d4d",
"body": "Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.2 (#62)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-02T23:37:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "51351869e09fc34c580890587b9072e57ddc2dc6",
"body": "teamclaude now detects how it was installed and, for a global npm install,\nself-updates in the background: checks the npm registry at most once a day\n(cached next to the config, so the common invocation does zero network I/O),\nand when a newer version is published runs `npm install -g` and applies i\n[…]\np note.\n- test/updater.test.js: 12 unit tests (compare, detection, throttle, install).\n- eslint: allow the AbortController global.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: npm-global self-update in the spirit of Claude Code (#61)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-02T15:05:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8904ea7ed65bde0c2822cb1dfddb1c2416427e19",
"body": "…t per tunnel) (#60)\n\n* fix: select account per-request in MITM mode instead of pinning per-tunnel\n\nIn MITM forward-proxy mode the account was chosen once per CONNECT tunnel\nand captured for the tunnel's whole life. Claude's keep-alive pool reuses\none tunnel for many requests, so once that account h\n[…]\nmock account managers gain getActiveAccountFresh.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: select account per-request in MITM mode (stop pinning one accoun…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-02T14:45:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "113f04e70d39d4023e4f09871085305467e6aab3",
"body": "Patch release for the Remote Control fix (#58): the MITM auth rewrite now\npasses Claude Code's /v1/code/* control channel through untouched, so\nRemote Control no longer drops with a 403 across account rotation.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.1 (#59)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-07-01T01:55:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f04ab90c5eadd7f6bcab23d4242603641847195e",
"body": "…ed (#58)\n\nClaude Code's Remote Control control channel (/v1/code/*) is bound to the\nclaude.ai identity the session is paired with. The MITM auth rewrite injects\nthe active (rotated) account's token onto these requests too, which makes the\nupstream reject GET /v1/code/sessions/<id>/worker/events/str\n[…]\nRemote Control stays connected across a forced account rotation.\n\nFixes #57\n\nCo-authored-by: Artem Shtanov <artemshtanov@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: pass Remote Control control channel (/v1/code/*) through untouch…",
"author_name": "Apfelbaum",
"author_login": "iamapfelbaum",
"committed_at": "2026-07-01T01:53:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5dbb7547e8fa3c2624d73305bcdfb9d9a0daaf60",
"body": "MITM forward-proxy mode is now the default for `teamclaude run` (and the\nalias), so hardcoded api.anthropic.com endpoints are intercepted too.\nDocument the change under \"Run Claude Code through the proxy\" with a\nsince-1.1.0 note and the `--no-mitm` opt-out.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 1.1.0 and document MITM-default change (#56)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-27T06:14:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2780a4835f4862096c3a2503af3ebd627d7d3591",
"body": "* Make MITM forward-proxy mode the default for `run`\n\n`teamclaude run` (and the shell alias that wraps it) now routes claude\nthrough the HTTPS forward proxy + local CA by default, so hardcoded\napi.anthropic.com endpoints (e.g. the Claude Design MCP) are intercepted\nwithout an extra flag. Add --no-mi\n[…]\ntyle used elsewhere in the file). `eslint .` is now\nclean with no warnings.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make MITM forward-proxy mode the default for run (#55)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-27T04:30:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e05e2deeb859d9104de4caffd419e90b02ae8ae5",
"body": "npm provenance (attached automatically under Trusted Publishing) is\nrejected with a 422 unless package.json declares its repository.url that\nmatches the building repo. Add repository, bugs, and homepage fields.\n\nThis unblocks publishing 1.0.9: merging this changes package.json, which\nfires the publish workflow's push trigger and publishes the version.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add repository metadata to package.json (#54)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-27T03:25:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cef87095a4aff7b1e3ad1c1ed610b2bd538e1dd2",
"body": "The push trigger only fires when package.json changes, so a version that\nwas bumped before the workflow existed (1.0.9) can never publish — there\nis no qualifying push to trigger it. Add workflow_dispatch so the current\nmaster version can be published on demand. The npm-view gate is unchanged,\nso a manual run on an already-published version remains a no-op.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add manual workflow_dispatch trigger to the publish workflow (#53)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-27T03:21:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "defaa4d04ae877b0917e805193d7c86ab98aec47",
"body": "* Add workflow to publish to npm on version bump\n\nWhen a version bump lands on master, compare package.json's version to\nnpm and, if it's new, run the tests, npm publish (with provenance), then\ncreate the v<version> git tag and a GitHub release with generated notes.\n\nThe npm-view check makes this id\n[…]\nns trusted\npublisher for this repo + publish.yml on the package's settings.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Publish to npm automatically on version bump (#52)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-27T03:06:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b40d6d0be900783d28ebe73e127affc4d76720dc",
"body": "The settings screen previously required memorizing a distinct letter key\nper setting (t/p/m/k/x). Replace that with cursor navigation:\n\n- Up/Down (or j/k) move a highlight cursor between settings\n- Left/Right change the selected value in place (threshold +-1%,\n probe +-30s, sx.org mode cycles off -\n[…]\ner and a contextual hint, making the controls discoverable. Left/right\narrow parsing was added to _onData. Existing apply/save logic is reused.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the settings screen keyboard-browseable (BIOS-style) (#51)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-26T16:27:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f0b407794d55e58a6f1724bc4586d6bac6163206",
"body": "Fix /api/oauth/usage utilization parsing: it is a 0-100 percentage, so\nvalues <=1% were inflated up to 100% (#49).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "1.0.9 (#50)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-25T12:59:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "95d1904ac88d9b542f14ac7f24db7f6de3454f2a",
"body": null,
"is_bot": false,
"headline": "oauth usage always is 0-100, not 0-1 (#49)",
"author_name": "Simon Cheng",
"author_login": "binary-person",
"committed_at": "2026-06-25T12:59:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ccad404650bcfe9d8b19d5f0473b1c6c30b9048",
"body": "Release the stale-state recovery + account-sidelining fixes merged in #47.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "1.0.8",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-24T15:22:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "80f10e5ba4a6d399ff41db9200775566754b13e9",
"body": "…#46) (#47)\n\n* Re-probe instead of permanently refusing on stale quota (#46)\n\nOnce every account read as over the switch threshold, getActiveAccount\nreturned null and the proxy emitted its synthetic \"All N accounts\nexhausted\" 429 without ever calling upstream. A stale cached\nutilization (e.g. a 0.98\n[…]\ne refreshFn (mirrors Prober.probeFn) for\ntesting.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Recover from stale state & stop wrongly sidelining healthy accounts (…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-24T15:15:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "913b0ccb484186de7465128a279be46fc4dbc239",
"body": "…een (#45)\n\nThe settings screen (`g`) previously held only the sx.org proxy controls. Add\nthe two other runtime-tunable settings so they're editable without hand-editing\nthe config or restarting:\n\n - t Switch threshold — enter 1–100%, stored as switchThreshold (0–1) and\n applied to the runni\n[…]\ntchThreshold/quotaProbeSeconds, not just accounts + sx). The settings screen\nnow renders Rotation / Quota probe / sx.org sections.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add rotation threshold + quota-probe interval to the TUI settings scr…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-22T02:44:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ea03739543a9eac4a19e653bfbddc2c71916a3da",
"body": "* Add sx.org residential-proxy mode to work around IP-based 429s\n\nteamclaude's transient 429s key on the proxy's outbound IP, not the account\n(see issue history / memory), so account failover can't clear them — a\ndifferent egress IP can. This adds optional routing of upstream traffic through\nan sx.o\n[…]\nrovider ever returns a hostname instead of an IP.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "sx.org residential-proxy mode (IP-based 429 workaround) (#43)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-22T02:27:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b68b764d63aa02f871f063162a1cc8e393075b44",
"body": "The TUI activity list was fed only by the reverse-proxy request path\n(hooks.onRequestStart/End in server.js). The --mitm CONNECT path relayed\nvia h2Relay/h1Relay and only wrote to disk (when logDir was set) + observed\nquota — so successful MITM requests produced zero TUI entries.\n\nAdd makeActivityTa\n[…]\ndOpen, but h2 left mid-flight streams unclosed, which\nwould leave a stuck \"in-flight\" entry in the TUI (and an unclosed disk log).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show MITM forward-proxy traffic in the live TUI activity feed (#44)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-21T21:16:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "654ace18158965109cfccdabcdb4188d994df5a7",
"body": "…gging (#42)\n\nThe h1 MITM relay parsed only the first request head on a connection, then\ntreated all subsequent bytes as that request's body. claude-cli reuses one\nkeep-alive h1 connection for many requests, so on every request after the\nfirst this caused three real bugs (observed in a live MITM cap\n[…]\ns. Response bytes are still\nwritten to the client verbatim before parsing, so a framing miss can never\ncorrupt the relayed stream.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix h1 keep-alive relay: per-request framing, auth rewrite, masked lo…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-19T03:04:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7e7a9afa1999001b35384ed06222a258c85af69c",
"body": "Now that quota survives a restart, the daemon should start on the account the\nrotation logic would prefer — not blindly on index 0. getActiveAccount() is\nsticky (it keeps the current account unless a strictly higher-priority one is\navailable), so without this it would sit on account 0 even when a sa\n[…]\nsted quota everything is still \"probing\" and the pick collapses to\nthe first priority-0 account (index 0) — unchanged from before.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Select the best account on daemon launch using restored quota (#41)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T14:17:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "01f38fbe7301b346938b4833c06f8b9843d897d8",
"body": "run --mitm broke for real claude clients: #38 dialed the upstream first and\nmirrored the upstream's negotiated ALPN onto the client-facing leaf. The\nupstream (offered both) picks h2, so the leaf advertised only h2 — but claude's\nclient (undici, tunnelling through the proxy) offers only http/1.1, lea\n[…]\nm that must negotiate http/1.1 end-to-end. Verified\nlive against the real api.anthropic.com over both an h1-only and an h2 client.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix MITM ConnectionRefused: faithfully mirror the client's ALPN (#40)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T14:11:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0158c36ea22c7c6f751f05cc65a9a933302a2805",
"body": "…bodies (#39)\n\nThe reverse-proxy (ANTHROPIC_BASE_URL / fetch) path accumulated the entire SSE\nresponse into an in-memory array (streamLog) and built giant pretty-printed\nstrings for request/response bodies before writing one file at the end — holding\nthe whole body (up to ~1M tokens) in memory.\n\nNow\n[…]\nassthrough\nbody bytes and corrupted any non-ASCII content. Strings are now written as latin1\nso original bytes round-trip exactly.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Stream reverse-proxy request logs to disk instead of buffering whole …",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T13:49:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6ff0559dc90d5102a62cfdb896581f8c682b7689",
"body": "…th + account_uuid) (#38)\n\n* Add pure-JS HPACK codec (RFC 7541) for the MITM h2 bridge\n\nFoundation for the faithful HTTP/2 MITM proxy: a dependency-free HPACK\nencoder/decoder so we can decode an h2 header block, rewrite only the\nauthorization field, and re-encode it — node:http2 is intentionally not\n[…]\nrtial body on disk so you can see how far it got.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Transparent h2/h1 MITM forward-proxy (faithful relay, rewrite only au…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T13:24:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "74b9ace9b11d3ebbe1afde06a9730f5d46eeb5cb",
"body": "…) (#37)\n\n* Add opt-in MITM forward-proxy mode (useMitmProxy)\n\nSome Claude Code features (e.g. the Claude Design MCP) hit a hardcoded\napi.anthropic.com URL that ignores ANTHROPIC_BASE_URL, so they bypass the proxy\nand fail when the local claude carries a placeholder token. This adds an\nopt-in HTTPS \n[…]\nt, so the experimental flag isn't surfaced there.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Opt-in MITM forward-proxy mode (intercept hardcoded api.anthropic.com…",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T10:39:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2239d4343ff6f911187125046f546c270438aa1d",
"body": "Passive remains the default; this adds an explicitly opt-in active quota refresh\nfor users who need idle accounts' quota kept fresh.\n\n- src/prober.js: reschedulable background probe, OFF by default. When on, reads\n each OAuth account's utilization from the zero-spend /api/oauth/usage endpoint\n (no\n[…]\nefault stays passive (quotaProbeSeconds 0). The probe is the one sanctioned\nactive-upstream feature, gated behind explicit opt-in.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add opt-in background quota probe (+ Sonnet 7d bar)",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T09:48:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dd309a6649d485cac0cf7f8bc6f8165802f557b4",
"body": "Completes the passive-compatible parts of the #18 upstreaming stack (#14),\nwithout the active background prober (which would violate the passive-only\ndesign).\n\n- `teamclaude server --headless` (alias `--no-tui`) runs the proxy without the\n interactive TUI, for backgrounding / running as a service.\n\n[…]\nber, usage-endpoint quota, and probe-on-add from #14/#16.\n\nTests for the reload endpoint (success/501/500); README + help updated.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add headless mode and a local reload endpoint (#35)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T09:23:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a7ef201ee511e0534a2002545906da2843b2d8b8",
"body": "Bump patch version and add CI / npm / node / license badges to the README header.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "1.0.7 — add README badges (#34)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T09:14:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0f00e8fd6ea951fcd98dd6fe7f542d7746f2f31d",
"body": "* run: probe the proxy and fall back to direct; add `claude` alias\n\nMakes plain `claude` route through the proxy without a heavy PATH shim.\n\n- `teamclaude run` now probes the proxy port: if it's up, it routes Claude Code\n through it (as before); if it's down, it launches claude directly with a shor\n[…]\nill cleans up if the embedded path later differs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Smart `run` (proxy probe + fallback) and a `claude` alias (#33)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T09:12:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d826ab74c9f4e56375b3fa3ad23750fb1a98f073",
"body": "Accounts can now be temporarily excluded from rotation and brought back later,\ninstead of having to remove and re-add them.\n\n- account-manager.js: a `disabled` flag (persisted in config); _isAvailable\n skips disabled accounts, so rotation/selection ignore them. setDisabled()\n toggles it, and re-en\n[…]\nts for skip/rotate-away/re-enable, error-clear on enable, all-disabled,\n and getStatus exposure. README + config.example updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add enable/disable to pause an account without removing it",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:57:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8e149326630b16cec8148f1ea20cc242bc8f60f5",
"body": "We advertise \"Node.js 18+\" (README + package.json engines) but only tested on\n24. Run the suite on a matrix of 18/20/22/24 so the minimum-supported claim is\nactually verified. Lint runs once (on 24) since it's version-independent.\n\nA small aggregate `test` job gates on the matrix, so branch protecti\n[…]\ntable `test` check regardless of matrix size; it uses\n`if: always()` and fails explicitly if any matrix job fails (never skipped).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "CI: test across the supported Node range (18, 20, 22, 24) (#31)",
"author_name": "Mark Karpelès",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:49:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a8dac06cfc381fc0bd41fc59ffe44b517ed5b864",
"body": "Quota learned passively from upstream responses was lost on every restart,\nforcing the proxy to re-probe and mis-rotate until it re-learned each account's\nwindow. It now persists that state and restores it on startup — no API calls,\nfully consistent with the passive-only design.\n\n- config.js: getSta\n[…]\n-persistence half of #4, reworked to a separate state\nfile; the account-reorder half of #4 is dropped as superseded by `priority`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Persist observed quota across restarts (state file)",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:46:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7b176a99203fb856a2ed966cde46f4ef63524338",
"body": "The `priority` field (added in #28) was only consulted when a switch was\nforced (current account exhausted/throttled). A healthy lower-priority current\naccount was never preempted, so a recovered preferred account wouldn't be\nresumed until the in-use one ran low.\n\ngetActiveAccount now switches to a \n[…]\nhrashes, since no account is strictly higher than\nanother. Exhaustion-switching and the soonest-weekly-reset heuristic are intact.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Preempt to a higher-priority account when one is available",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:42:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "28e8c2b04c7a8ee50a17c4c4df0525bde0704eb0",
"body": "One Anthropic account (email/accountUuid) can hold multiple subscriptions\nacross different organizations — e.g. a corporate Pro org and a personal Max\norg. The old identity model keyed only on accountUuid (with name as fallback),\nso adding the second org overwrote the first (#6) and --name couldn't \n[…]\n#13 (429 account-failover) intentionally not taken —\nthe throttle is IP-based, so the merged #25 back-off is the correct behavior.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Org-aware account identity, removal, and rotation priority (#6, #7)",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:29:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6218c8bbbc51508776c7a8e8010b4eae8dd638d0",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "CI: bump checkout and setup-node to v6",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:05:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bb069903c3830707e96afee7f6e8d47e2f47221d",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "CI: use Node 24 instead of 20",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:05:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5e18ea871c6c88c8e988de9d4d83c381dfe62f26",
"body": "Runs `node --test` and eslint on pushes and PRs to master, so the\nsuite added in #25 actually gates changes. Adds `test`/`lint` npm\nscripts and eslint as a devDependency (runtime stays dependency-free;\npackage-lock.json remains gitignored, so CI uses `npm install`).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add GitHub Actions CI (tests + lint)",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:05:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "79e0b0ff47afdc7e1dc796fa24c3ad7824c259b7",
"body": "- Add MIT LICENSE file so GitHub license detection works and legal/\n procurement review stops flagging the project as unlicensed (#11).\n- Add SECURITY.md with a private vulnerability-reporting channel and a\n section on verifying the genuine project / canonical sources (#9).\n- Add a Security note to the README warning about malware soft-forks\n that bundle a downloadable archive, and link LICENSE + SECURITY.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add LICENSE and SECURITY.md, document canonical sources",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-18T08:02:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8e212ce0bddf6cb867d169970d41714f8724f4e1",
"body": "* Bound upstream 429 retries so a throttled account can't loop forever\n\nA persistent 429 retried the same account indefinitely (retryCount was never\nincremented on that path), tying up the client connection. Now each 429 retry\ncounts toward maxRetries; once exhausted the account is marked rate-limit\n[…]\nis swapped for a benign runtime handler so a later\n'error' is logged rather than thrown. Adds clearTimeout to eslint globals and a\ntest that the CLI exits cleanly when the configured port is occupied.",
"is_bot": false,
"headline": "Bound 429 retries and handle listen errors gracefully (#25)",
"author_name": "Hugh Kim",
"author_login": "jung-wan-kim",
"committed_at": "2026-06-18T07:58:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0436d4f58b9da0a8743e0b466192ccda3c727713",
"body": "On Windows, `claude` is installed as a `.cmd`/`.ps1` shim rather than\na bare `.exe`. Since Node.js v18.20.2 / v20.12.2 / v21.7.2 (mitigation\nfor CVE-2024-27980), `child_process.spawn(Sync)` no longer resolves\n`.cmd`/`.bat` targets through PATH unless `shell: true` is set, so\n`teamclaude run` fails w\n[…]\ns `shell: process.platform === 'win32'` to `spawnSync`. No-op on\nPOSIX; on Windows it routes through cmd.exe so the shim is found.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Resolve `claude` shim on Windows in `run` command (#24)",
"author_name": "Maestro_BS",
"author_login": "maestrobs77",
"committed_at": "2026-06-18T07:57:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "de0c99b3ab13f4b13156c5d7be57febd15c0dec4",
"body": "When an account's 5-hour session quota resets, it may have become the\nbetter choice. _clearExpiredQuotas now reports session resets, and\nrefreshExpiredQuotas switches to a reset account when its weekly limit\nexpires sooner than the current account's and it still has weekly quota\nto spend. getActiveAccount calls refreshExpiredQuotas so this holds on\nthe request path too (headless mode), not just the TUI render loop.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Switch on session reset to a sooner-expiring weekly account",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T12:28:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8e4997e5e540537442296a486cd2c43e3cbb6e53",
"body": "No quota is known when the daemon starts (or when an account is added at\nruntime), so initialize every account with probing=true. The first\nresponse for each reveals its weekly limit and triggers re-evaluation,\nso the daemon probes each account in turn to discover all quotas before\nconverging on the soonest-expiring-weekly choice.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Start accounts in probing mode",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T11:12:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6102f432c72bc59f74b349da14088817f2c4e477",
"body": "Extract expired-quota clearing into refreshExpiredQuotas() and call it\nfrom the TUI render loop, so the 5-hour session quota (and any other\nexpired window) clears in the display the moment it lapses instead of\nwaiting for the next request. render() gains a re-entry guard since the\nreset log triggers\n[…]\nat soonest-expiring weekly selection only targets\naccounts whose 5h quota is below the switch threshold, enforced by\n_isAvailable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reset display instantly when a quota window expires",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T09:58:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8f2e1efcb2e56ba02018270114b827d3d9edb7cd",
"body": "When switching, an account whose weekly limit is still unknown is now\nflagged as probing. Once a response reveals its weekly reset, updateQuota\nclears the flag and marks it for requalification so getActiveAccount\nre-runs selection and picks the best account by soonest-expiring weekly\nlimit. Selection now also considers the current account so it can stay\nput if it is genuinely the best choice.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Probe accounts with unknown weekly quota, then re-evaluate",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T09:54:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "219e417d019db4b372615441994750e25ee08191",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add package-lock.json to .gitignore",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T06:43:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9bc63f2a5d692879f30c708dc7decb42bbc75b3c",
"body": "When the active account hits its limit, pick the next account by weekly\nquota reset instead of round-robin: accounts with no known weekly limit\nare chosen first (to discover their quota), then the one whose weekly\nwindow resets soonest, so quota that is about to refresh is spent first.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Switch to account with soonest-expiring weekly limit",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-06-14T06:42:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e80b34305c923538890a57d65095ab7c7bdc06c0",
"body": "Allows passing OAuth tokens directly on the command line instead of\nreading from a credentials file, useful for scripted/automated setups.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add --json flag to import command for inline credential input",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-04-08T12:48:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "33c5a03f1f93a4fb64f0faab2b946f88fd64d855",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Clarify token refresh only happens when nearing expiry",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-04-02T05:51:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "612909dea8de5a39b83b62a8e9066ab0703745bf",
"body": "- Document both OAuth and API key account types\n- Add TUI keyboard shortcuts table\n- Add config field descriptions table\n- Document verbose flag for accounts command\n- Update token management description (ensureTokenFresh, no interception)\n- Document error handling behavior (429 retry vs account switch vs transient)\n- Note client token refresh passthrough architecture\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update README to reflect current project state",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-04-02T05:50:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7af3fffa0307bee728ff1ab42c7bc9281ff810cd",
"body": null,
"is_bot": false,
"headline": "1.0.6",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-04-02T05:45:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84bb0554f1febaa011c3402fe36220da01618ada",
"body": "Three related issues:\n\n1. handleTokenRefresh was intercepting client /v1/oauth/token requests,\n substituting the proxy's own refresh token, and writing the rotated\n token back using currentIndex (which could shift). Replaced with\n relayRaw passthrough — the proxy manages its own tokens via\n \n[…]\now refreshes tokens first and shows specific error details (e.g.\n HTTP 401: token expired) instead of a generic failure message.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix token rotation bugs causing refresh tokens to be lost",
"author_name": "Mark Karpeles",
"author_login": "MagicalTux",
"committed_at": "2026-04-02T05:45:16Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 11,
"commits_last_year": 159,
"latest_release_at": "2026-07-23T08:17:44Z",
"latest_release_tag": "v1.1.9",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 9,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@karpeleslab/teamclaude",
"exists": true,
"license": "MIT",
"keywords": [
"claude",
"anthropic",
"proxy",
"load-balancer",
"multi-account"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@karpeleslab/teamclaude",
"is_deprecated": false,
"latest_version": "1.1.9",
"repository_url": "https://github.com/KarpelesLab/teamclaude",
"versions_count": 20,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 2,
"monthly_downloads": 2587,
"first_published_at": "2026-03-24T18:04:03.135000Z",
"latest_published_at": "2026-07-23T08:17:42.708000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 51,
"stars": 164,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-03-25",
"count": 1
},
{
"date": "2026-04-07",
"count": 1
},
{
"date": "2026-04-08",
"count": 1
},
{
"date": "2026-05-03",
"count": 1
},
{
"date": "2026-05-05",
"count": 1
},
{
"date": "2026-05-07",
"count": 1
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-22",
"count": 1
},
{
"date": "2026-05-30",
"count": 1
},
{
"date": "2026-06-10",
"count": 1
},
{
"date": "2026-06-11",
"count": 1
},
{
"date": "2026-06-12",
"count": 3
},
{
"date": "2026-06-14",
"count": 1
},
{
"date": "2026-06-15",
"count": 1
},
{
"date": "2026-06-21",
"count": 1
},
{
"date": "2026-06-22",
"count": 1
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
},
{
"date": "2026-07-03",
"count": 1
},
{
"date": "2026-07-04",
"count": 1
},
{
"date": "2026-07-05",
"count": 1
},
{
"date": "2026-07-06",
"count": 1
},
{
"date": "2026-07-07",
"count": 3
},
{
"date": "2026-07-08",
"count": 1
},
{
"date": "2026-07-10",
"count": 1
},
{
"date": "2026-07-12",
"count": 1
},
{
"date": "2026-07-17",
"count": 1
},
{
"date": "2026-07-19",
"count": 1
},
{
"date": "2026-07-21",
"count": 1
}
],
"complete": true,
"collected": 36,
"total_forks": 51
},
"star_history": null,
"open_issues_and_prs": 5
},
"ai_readiness": {
"has_nix": true,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 64163,
"source_files_sampled": 69,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"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": [],
"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": 2,
"merged_prs": 88,
"open_issues": 3,
"closed_ratio": 0.87,
"closed_issues": 20,
"closed_unmerged_prs": 20
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "MagicalTux",
"commits": 144,
"avatar_url": "https://avatars.githubusercontent.com/u/333658?v=4"
},
{
"type": "User",
"login": "imnuke",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/17084130?v=4"
},
{
"type": "User",
"login": "wolph",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/270571?v=4"
},
{
"type": "User",
"login": "iamapfelbaum",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/110834187?v=4"
},
{
"type": "User",
"login": "viiqswim",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/2517461?v=4"
},
{
"type": "User",
"login": "bogorad",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/2777398?v=4"
},
{
"type": "User",
"login": "jung-wan-kim",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/2568504?v=4"
},
{
"type": "User",
"login": "jrdalpra",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/221431?v=4"
},
{
"type": "User",
"login": "maestrobs77",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/248420127?v=4"
},
{
"type": "User",
"login": "binary-person",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/16139772?v=4"
}
],
"contributors_sampled": 11,
"top_contributor_share": 0.894
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.js"
],
"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": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 8,
"reason": "25 out of 30 merged PRs checked by a CI test -- score normalized to 8",
"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": 2,
"reason": "Found 6/30 approved changesets -- score normalized to 2",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 3 contributing companies or organizations -- score normalized to 10",
"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": 0,
"reason": "no 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": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
"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": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file 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": "7dfd47af62663f81c123a74463cc412675e84eb8",
"ran_at": "2026-07-23T13:29:40Z",
"aggregate_score": 5.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T08:33:53Z",
"oldest_open_prs": [
{
"number": 95,
"created_at": "2026-07-08T06:16:32Z",
"last_comment_at": "2026-07-15T14:56:09Z",
"last_comment_author": "SebastienGllmt"
},
{
"number": 133,
"created_at": "2026-07-23T08:31:54Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-23T08:17:09Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 72,
"created_at": "2026-07-04T13:42:50Z",
"last_comment_at": "2026-07-07T09:39:55Z",
"last_comment_author": "MagicalTux"
},
{
"number": 104,
"created_at": "2026-07-14T13:02:46Z",
"last_comment_at": "2026-07-22T12:35:42Z",
"last_comment_author": "MagicalTux"
},
{
"number": 111,
"created_at": "2026-07-17T19:57:20Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/KarpelesLab/teamclaude",
"host": "github.com",
"name": "teamclaude",
"owner": "KarpelesLab"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"security": 57,
"vitality": 82,
"community": 52,
"governance": 65,
"engineering": 82
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 82,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"commits_last_year": 159,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 9
},
"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": "9/52 weeks with commits",
"points": 6.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 9
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "159 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 159
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"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": 100,
"inputs": {
"releases_count": 11,
"latest_release_tag": "v1.1.9",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "11 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 11
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2.9
}
}
],
"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": "moderate",
"name": "Community & Adoption",
"value": 52,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"forks": 51,
"stars": 164,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "164 stars",
"points": 35.9,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 164
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "51 forks",
"points": 14.2,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 51
}
}
],
"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": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"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": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"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": "moderate",
"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": 57,
"inputs": {
"packages": [
"@karpeleslab/teamclaude"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 2587
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,587 downloads/month across npm",
"points": 45.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2587,
"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": "moderate",
"name": "Sustainability & Governance",
"value": 65,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 35,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 11,
"top_contributor_share": 0.894
},
"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 89% of commits",
"points": 2.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 89
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "11 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 11
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"merged_prs": 88,
"open_issues": 3,
"closed_issues": 20,
"issue_closed_ratio": 0.87,
"closed_unmerged_prs": 20
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "87% of issues closed",
"points": 40.7,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 87
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "88/108 decided PRs merged",
"points": 31.2,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 88,
"decided": 108
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 6/30 approved changesets -- score normalized to 2",
"points": 3,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"followers": 18,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "KarpelesLab",
"public_repos": 233,
"account_age_days": 2409
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "18 followers of KarpelesLab",
"points": 9.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 18,
"login": "KarpelesLab"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "233 public repos, account ~6 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 233
}
},
{
"code": "account_age_years",
"params": {
"years": 6
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@karpeleslab/teamclaude"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 0
},
"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 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "20 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 20
}
}
],
"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": 82,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"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": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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.js",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"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": "25 out of 30 merged PRs checked by a CI test -- score normalized to 8",
"points": 16,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"anthropic",
"claude",
"claude-code",
"load-balancer",
"multi-account",
"nodejs",
"oauth",
"proxy"
],
"has_wiki": true,
"homepage": null,
"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": null,
"points": 0,
"status": "missed",
"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": "8 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 8
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 57,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5.7
},
"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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "25 out of 30 merged PRs checked by a CI test -- score normalized to 8",
"points": 2,
"status": "partial",
"details": [],
"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 6/30 approved changesets -- score normalized to 2",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 3 contributing companies or organizations -- score normalized to 10",
"points": 2.5,
"status": "met",
"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": "no update tool detected",
"points": 0,
"status": "missed",
"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.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"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": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"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
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 15
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 49,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.95,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"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": "95 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 95,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"has_nix": true,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.88,
"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.js",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Nix",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Nix"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "88 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 88,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"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": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"primary_language": "JavaScript",
"largest_source_bytes": 64163,
"source_files_sampled": 69,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "JavaScript without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "JavaScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/69 source files over 60KB",
"points": 54.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 69,
"oversized": 1
}
}
],
"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",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@karpeleslab/teamclaude@1.1.9; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-23T13:30:01.956831Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/KarpelesLab/teamclaude.svg",
"full_name": "KarpelesLab/teamclaude",
"license_state": "standard",
"license_spdx": "MIT"
}