Repository navigation
Rename to TeamRouter (tracking) #72
Description
Activity
I think adopting some non-brandable name like
claude-multiloginwon't be an issue given there are thousands of otherclaude-<whatever>repositories.Reacted by SomeoneKongOr add codex support and make it teamagent? <- hidden feature request ;)
Reacted by Mark Karpelès, aymericlocalimus, Nicolas Bontempo, Jon, Ibraheem Amin, Nirvana and DooeeCARL - Code Agent Routing Layer
Reacted by aymericlocalimus, jooles, Nicolas Bontempo, Craig Adam, Diogo Aleixo, Luis Grau Martín Maldonado, Henry, Denis, Alfarish Fizikri, Aleksei Sviridkin and 2 moreI like this a lot. CARL.
Claude-LB,Simple and clear
Another brilliant one
claude-multiauthsincemultilogincan conflict with https://multilogin.com/Hi @MagicalTux, with the new #246 not sure you should be looking into the project name again and/or extend the support to other vendors.
As another suggestion, perhaps
team-router.Two things to know before picking it. The GitHub org isn't available, and it belongs to a product that already uses the name (it has a user-feedback repo and teamrouter.com); a 2025 repo, eeshhwaq/TeamRouter, is also an LLM proxy for teams. On the other hand the npm names
team-routerandteamrouterare unpublished, and I assume you'd keep the repo on KarpelesLab, where the scope covers it.Reacted by Aleksei SviridkinRename plan: TeamClaude → TeamRouter
The name is decided: TeamRouter (
teamrouterin every machine-readable place,TeamRouterin prose). The rename is done across several releases so that nothing anyone has installed, scripted or configured breaks on the day it lands. This issue is the tracker; the checklists below are updated as PRs merge.Where the name lives today
A survey of master (152 files mention it; nothing here is a guess, each item is a place code or a user reads the name):
Surface Today Who depends on it npm package @karpeleslab/teamclaudeevery npm install -g, the self-updater (PKG_NAMEinsrc/updater.js), README badgesCLI binary / shell alias teamclaude;alias --installwritesalias claude='teamclaude run'(marker# teamclaude alias)every user, every rc file Config, state, crash log ~/.config/teamclaude.json,.state.json, crash log next to it;TEAMCLAUDE_CONFIGoverrideevery install MITM certificates teamclaude-ca.pem,teamclaude-leaf.pem/.keyin the config dir; CA subjectTeamClaude Local CAevery MITM user has this CA in an OS/browser trust store Environment variables 26 TEAMCLAUDE_*(_CONFIG,_HOST,_DISABLE_AUTOUPDATE, the timeouts and tunables)service units, Docker, nix module, user shells HTTP control plane /teamclaude/status,/reload,/switch,/disable,/priority,/threshold,/quota,/probe,/dashboard,/mcpstatus/attach/dashboard, DockerHEALTHCHECK,claude mcp add … /teamclaude/mcp, users' own scripts and samplers (#475 runs one)Log prefix [TeamClaude]on ~200 lines, asserted by testsanyone grepping journals Services systemd teamclaude.service, launchdcom.karpeleslab.teamclaude, log at~/.local/state/teamclaude.log/~/Library/Logs/teamclaude.logservice installusersContainer ghcr.io/karpeleslab/teamclaude(name derived fromgithub.repository),Dockerfilelabels,/data/teamclaude.jsoncompose files, k8s manifests Nix flake outputs packages.teamclaude,apps.teamclaude,nixosModules.teamclaude; moduleservices.teamclaude.*with user/group/StateDirectory defaultsteamclaudeNixOS users; the StateDirectory default decides /var/lib/teamclaudeGitHub KarpelesLab/teamclaude; issue links baked into source comments and docs; npm Trusted Publisher bound to repo name +publish.ymlcontributors, CI, publishing Docs & UI README, docs/*.md, screenshots, dashboard<title>, localStorage keys (teamclaude-dashboard-theme), TUI/terminal title, help textreaders Internal identifiers teamclaudeRef(), test fixtures,tc-acctpin prefix,TC_ACCTnobody outside the repo Things that deliberately do not change: the config file format and keys (none contain the name), account ids and the state file format, the
TC_ACCT//tc-acct/pin (still reads fine, and it is in users' shells), user-chosen header names such asx-teamclaude-project(they are the operator's own config), and the CA subject on existing installs (a regenerated CA would force everyone to re-trust it; only a freshly generated CA gets the new name).Decisions
- npm: unscoped
teamrouter. This is a community project with many outside contributors, not a KarpelesLab-internal one, so it leaves the@karpeleslabscope.teamrouteris reserved (placeholder 0.0.1 published 2026-09-29); npm's similar-name rule then blocksteam-routerfor everyone, so the near-miss cannot be taken either. - GitHub: stays under KarpelesLab, renamed to
KarpelesLab/teamrouter. TheTeamRouterorg is taken by an unrelated product, and GitHub redirects the old repo URL, git remotes included, so the rename is cheap. The repo rename happens in phase 2 together with the container image, since GHCR's image name followsgithub.repository. - Versioning. Phase 1 ships in 1.x. Phase 2, where the new name becomes canonical, is 2.0.0: nothing stops working, but the default install, the default paths and the package name all change, and a major is how that is announced. Removals wait for 3.0.
- Compatibility window. Every old name keeps working through all of 2.x. The
teamclaudebinary, theTEAMCLAUDE_*variables and the/teamclaude/*routes are removed no earlier than 3.0, with the cheap ones (/teamclaude/*, config-path fallback,TEAMCLAUDE_CONFIG) possibly kept for good since they cost one line each.
Phase 0 — reserve and prepare (no release)
- Publish
teamrouter@0.0.1to npm as a placeholder (README pointing here, no code). Done 2026-09-29.team-routerneeds no placeholder: npm refuses it as "too similar to existing package teamrouter", for anyone, now thatteamrouterexists. - Add a Trusted Publisher on npm for
teamrouter: ownerKarpelesLab, repoteamclaudefor now, workflowpublish.yml. Done 2026-09-29 (npm trust github, publish + stage publish, same as the old package). After the repo rename in phase 2, update the publisher of both packages to repoteamrouter, or the first publish after the rename fails with an OIDC claim mismatch. - Retitle this issue and pin it.
Phase 1 — the new name works everywhere, the old one stays canonical (1.2.0)
Implemented in #483.
Goal: a user, a script or a service can address the proxy as
teamrouterbefore anything is renamed, so phase 2 changes only defaults.-
src/brand.js: one module holding the display name, the CLI name, the package name, the env prefix, the route prefix, the config basename, the service names and the log prefix, plus the legacy values. Every later phase is an edit here plus the code that reads it. - Environment: a single
envVar('CONFIG')helper that readsTEAMROUTER_CONFIGfirst andTEAMCLAUDE_CONFIGsecond, applied to all 26 variables (tests included). Documented as "TEAMROUTER_*, orTEAMCLAUDE_*until 3.0". - HTTP:
/teamrouter/*served identically to/teamclaude/*for every control route, the dashboard and the MCP endpoint; the loopback/key gates and theattach/statusclients unchanged. The proxy's own clients keep calling/teamclaude/*this phase (so a 1.2 CLI still talks to a 1.1 server). - Config path:
~/.config/teamrouter.jsonis used when it exists, otherwise~/.config/teamclaude.json; state, crash log and certificates follow the config's basename. No file is moved yet. -
package.jsonbingainsteamrouternext toteamclaude(same entry point). Help text mentions both. - Docs: a "Renaming to TeamRouter" section in README linking here, and the new spellings listed beside the old ones where they are introduced.
Phase 2 — TeamRouter becomes canonical (2.0.0)
-
package.json: nameteamrouter, description, repository and bug URLs;publish.ymlpublishesteamrouter; README badges and install line. - Old package:
@karpeleslab/teamclaude's last release is a shim whosebin/teamclaudeexecs theteamrouterpackage it depends on, and whose updater installsteamrouterglobally (and uninstalls itself) when it finds it is a global install of the old name. Thennpm deprecate @karpeleslab/teamclaude "renamed to teamrouter".src/updater.js'sPKG_NAMEand its "run manually" hints move to the new name. - Log prefix
[TeamRouter], dashboard title, TUI/terminal title, help text,serviceunit descriptions — one sweep, tests updated with it. Release notes say the prefix changed, for anyone grepping logs. - Defaults flip: new installs get
~/.config/teamrouter.json,teamrouter-ca.pemetc.,teamrouter.service/com.karpeleslab.teamrouter,~/.local/state/teamrouter.log. Existing installs keep being found through the phase-1 fallback. -
teamrouter migrate: renames config, state, crash log and certificate files to the new basenames (the CA's contents are untouched, so trust stores stay valid), rewrites the shell alias line, and, when an old service unit is installed, installs the new one with the same config path and removes the old. Idempotent; prints what it did.service installon 2.0 does the unit part on its own when it finds the old unit. - Shell alias:
alias --installwritesteamrouter rununder a new marker and removes a line under the old marker. - GitHub repo renamed to
KarpelesLab/teamrouter;IMAGE_NAMEindocker.ymlnow resolves toghcr.io/karpeleslab/teamrouter; for the length of 2.x the workflow also pushes the same image toghcr.io/karpeleslab/teamclaude.Dockerfilelabels,/data/teamrouter.jsondefault (with the old path still honoured throughTEAMCLAUDE_CONFIG), healthcheck on/teamrouter/status, entrypoint messages. - Nix: outputs
packages.teamrouter/apps.teamrouter/nixosModules.teamrouterwith theteamclaudenames kept as aliases; moduleservices.teamrouterwithmkRenamedOptionModulefromservices.teamclaude. The user/group/StateDirectory defaults change only for a system that never set the old options; a renamed option carries its old default so/var/lib/teamclaudekeeps working. - npm Trusted Publisher records updated to the renamed repo (see phase 0) before the 2.0.0 tag.
- Docs, README, screenshots,
docs/assets: full sweep. Old names appear only in the compatibility section and in the migration guide. - Migration guide:
docs/migrating-from-teamclaude.md— what changed, what still works, whatmigratedoes, the Docker and Nix specifics.
Phase 3 — deprecation window (2.x)
-
teamclaudebinary prints one notice per day ("this command is nowteamrouter") and otherwise works. - Config found only at the old path: one notice per start suggesting
teamrouter migrate. -
TEAMCLAUDE_*read with a one-time notice;/teamclaude/*served silently. - The proxy's own clients (
status,attach, dashboard, MCP hint) switch to/teamrouter/*. - Old container image tag stops being pushed at the end of the window (announced in release notes two minors ahead).
- Internal identifiers (
teamclaudeRef, test fixtures, comments) renamed opportunistically as files are touched; no dedicated sweep.
Phase 4 — removal (3.0.0)
- Drop the
teamclaudebin, the old alias marker handling, the old service-unit detection andmigrate's file renames (a 2.x release exists for anyone who needs them). - Decide per item whether the free ones stay:
/teamclaude/*,TEAMCLAUDE_CONFIG, the old config-path fallback. Default position: keep them, they cost nothing. - Remove the compatibility section from the docs; keep the migration guide.
Risks worth naming
- Self-update across the package boundary is the one step that can strand people: an old global install only ever runs
npm install -g @karpeleslab/teamclaude@latest. The shim release must be published before the firstteamrouterrelease is announced, and be tested against a real global install on Linux and macOS, root and non-root, sinceupdater.jshandles both. - Trusted Publishing is bound to the repo name; the rename and the publisher update must be one coordinated step, with no version bump merged in between.
- The CA: never regenerate an existing CA during migration. Renaming the file is safe; a new subject is not.
- Nix StateDirectory: changing the default silently moves
/var/lib/teamclaudefor anyone who relied on the default. The renamed-option carry-over above is what avoids it, and it needs a test in the flake check.
- npm: unscoped
- changed the title
[-]Thinking of a new name[/-][+]Rename to TeamRouter (tracking)[/+]on Sep 29, 2026 - pinned this issue
on Sep 29, 2026 - added 2 commits that reference this issue
on Sep 29, 2026
This project was originally named TeamClaude, but considering Anthropic's general attitude toward protecting what is a fairly common first name, and the possibility TeamClaude could be useful for other use cases, I'm considering renaming the project and open to ideas.
Main concepts include routing and transparent proxying.