Puts non-Claude models into Claude Code's /model picker through the user's own provider logins, with an Anthropic guard on every routed request.

A Claude Code mod that puts models from other providers (OpenCode Go, ClinePass, ChatGPT/Codex, xAI and more) into Claude Code's /model picker alongside Claude, so one Claude Code toolchain drives every model.
Claude models keep using your own Claude login, sent straight to Anthropic by Claude Code itself. Other models are answered by the mod through each provider's own credentials. The mod never handles Claude credentials.
Status: early development.
Provider credentials are kept only in the places below. They never go into Claude Code's settings, logs, fixtures or the mod's own store. Anthropic and Claude credentials are never stored, and the mod never reads them.
Where credentials are kept:
nmg-router.nmg-router:<provider>/<account>.secret-tool from libsecret.The encrypted vault is used only when no supported keyring is found: on Linux when secret-tool or a desktop session bus is missing, and on any other platform. A locked or failing keyring is reported as an error, and the mod never falls back to the vault.
The vault stores each credential as AES-256-GCM ciphertext in vault.json. It is decrypted with a random 256-bit key in vault.key, which sits beside it. The key file is protected only by file permissions, so the vault is exactly as safe as the permissions on its directory and the security of your user account.
The vault directory for each OS:
~/Library/Application Support/nmg-router${XDG_DATA_HOME:-~/.local/share}/nmg-router%LOCALAPPDATA%\nmg-routerTo keep the vault secure:
vault.key from backups and sync, such as Time Machine exclusions, iCloud Drive, Dropbox or OneDrive. A copy of vault.key together with vault.json lets anyone decrypt the credentials.secret-tool and a keyring such as GNOME Keyring or KWallet) so the mod uses the keyring and not the vault.secret-tool clear.See CONTRIBUTING.md for the issue, spec and verification workflow.
hooks/register.ts 5 lines1import type { Register } from "claude-code";
2
3// Hooks arrive with the issues that need them; this foundation registers none.
4export const register: Register = () => {};
5