Claude Code, running on OpenAI models served through a ChatGPT subscription, without modifying Claude Code.
proxenos is a local daemon. It presents an Anthropic Messages API to Claude Code and serves each turn from the account you choose: a Codex subscription or an OpenAI API key through a translation layer, or an Anthropic account relayed untranslated.
- Keeps Claude Code's built-in tools working.
Readon images and PDFs,WebSearch,WebFetch, tool search and the context meter all depend on behaviour the server provides. A translator that only maps messages breaks each of them silently, with a 200 and plausible output. Preserving them is the point of this project. - Borrows the accounts you already have. A subscription stays in the
profile directory of the program that signed in (
codex login,claude auth login). The daemon reads the grant there and never holds a copy. - Switches accounts per daemon or per session.
accounts usemoves every turn;exec --accountserves one session as another account. - Maps Claude Code's tiers to models.
opus,sonnet,haikuandfableeach point at a model, with an optional effort ceiling, globally or per account. - Reports quota.
usageshows what is left per account, andstatuslinemerges it into your own status-line script.
Released, with binaries for macOS, Linux and Windows. The upstream endpoint is not a published or supported API: it may change or be withdrawn without notice, and using a subscription this way is each operator's own decision.
- A Codex subscription signed in with
codex login, an OpenAI API key, or an Anthropic account signed in withclaude auth loginor held as a key. - Claude Code.
curl -fsSL https://raw.githubusercontent.com/husniadil/proxenos/main/install.sh | shThe script picks the release for your platform, verifies it against the
release's SHA256SUMS, and installs into ~/.local/bin. It has no flag to
skip the checksum. --version <tag>, --bin-dir <dir> and --target <triple>
override its choices, and --dry-run downloads nothing. Windows binaries are
on the releases page; the
script does not install them.
By hand, from the same release:
target=aarch64-apple-darwin # x86_64-apple-darwin, x86_64-unknown-linux-gnu,
# aarch64-unknown-linux-gnu, x86_64-pc-windows-msvc
base=https://github.com/husniadil/proxenos/releases/latest/download
curl -fLO "$base/proxenos-$target.tar.gz"
curl -fLO "$base/SHA256SUMS"
shasum -a 256 --ignore-missing -c SHA256SUMS # sha256sum on Linux
tar -xzf "proxenos-$target.tar.gz"
install "proxenos-$target/proxenos" ~/.local/bin/From source:
cargo install --git https://github.com/husniadil/proxenos --locked proxenosproxenos doctor # capability probes against recorded fixtures; no credentials, no quota
proxenos start # the daemon, on 127.0.0.1:8787, in the background
proxenos accounts # the accounts it found; * marks the one serving turns
proxenos exec claude # Claude Code, pointed at the daemonWith no [profiles] in the configuration, the daemon uses the stock profile
of each program (codex and claude). To name profiles yourself, or add one:
proxenos accounts login work --provider codex # runs `codex login` into a new directory and declares it
proxenos accounts login work --provider codex --relogin # signs a declared profile back in
proxenos accounts add-key api --provider codex < key.txt # stores a key, read from stdin
proxenos accounts use work--device-auth prints a URL and a code instead of opening a browser; it is
for --provider codex only. accounts rename OLD NEW and accounts remove NAME manage the rest.
exec exists because part of what Claude Code needs lives in its settings
file, not its environment. eval "$(proxenos env)" sets routing only, and
proxenos settings prints the whole document for a settings file you merge
it into.
Claude Code warns that it does not recognise the model ids and suggests a
200,000-token compaction window. Ignore it: env already sets the model's real
window.
The file is ~/.config/proxenos/config.toml ($XDG_CONFIG_HOME/proxenos, or
$PROXENOS_HOME). A missing file is a first run, and the first command that
writes it starts from a fully commented example. A short one:
port = 8787
effort = "high" # a ceiling on what the client asks for; unset means none
[tiers]
opus = "gpt-6.1-sol" # these four are the defaults
sonnet = "gpt-6.1-terra"
haiku = "gpt-6-luna" # WebFetch and WebSearch run on haiku
fable = "gpt-6-astra"
[profiles.work]
provider = "codex"
path = "/Users/me/.codex-work"
[accounts.work.tiers] # overrides for one account; unnamed tiers fall through
opus = "gpt-5.6-sol"The daemon validates each tier against the account's catalog and refuses a
model that is not there; proxenos models lists what is. Credentials never go
in this file.
A running daemon takes changes without a restart:
proxenos reload # re-reads config.toml, says what needs a restart
proxenos tiers set opus gpt-5.6-sol # add --persist to write it to config.toml
proxenos effort set medium # or none to remove the ceilingdocs/api.md §4 documents every key, including [transport],
[instructions], [client] and [listen].
proxenos supervisor install # a launchd agent on macOS, a systemd user unit on Linux
proxenos supervisor status
proxenos status # connection, serving account, tier mapping
proxenos stop # under a supervisor, replaces the daemon with the build on disk
proxenos update --version 0.31.0 # under a supervisor, installs that release and restarts on itupdate works on a daemon installed by install.sh into ~/.local/bin and
kept by the supervisor. It checks the release against its SHA256SUMS and
keeps the old binary as proxenos.previous. With PROXENOS_DAEMON set it
updates that machine's daemon.
The daemon always serves 127.0.0.1 without a token. Setting
[listen] address opens a second listener that demands a token on every
request, and the daemon refuses to start with a reachable address and no
token. On the other machine, set PROXENOS_DAEMON and PROXENOS_TOKEN (or
PROXENOS_TOKEN_FILE) and use the CLI as usual. proxenos terminates no TLS,
so put a private overlay network or a reverse proxy in front. See
docs/api.md §2.7 and SECURITY.md.
| If you want to | Read |
|---|---|
| Every verb, flag, config key and error | docs/api.md, or proxenos <verb> --help |
| How translation, transports, sessions and token counts behave | docs/proxy-behavior.md |
| Quota bars in the herdr sidebar | herdr-plugin/ |
| Report a vulnerability | SECURITY.md |
| Work on the code | CONTRIBUTING.md and CLAUDE.md |
- Check the CLI before quoting it.
proxenos <verb> --helpmatches the installed build;docs/api.md§2 matches this checkout. - Launching Claude Code through it, or a second opinion from another model
family: read
skills/proxenos/SKILL.md. - A setup problem: run
proxenos statusandproxenos doctorand read their output before suggesting a fix. - Do not spend quota unasked.
doctor --live,usage --refresh, andrecord upstream/record surfacecontact the providers. - Ask the person first before
proxenos stop,proxenos update,accounts use,accounts remove, or anything with--persist. They affect every session on the machine. - Never put a key or token in argv. Keys go on stdin; tokens go in
PROXENOS_TOKEN_FILE. - Changing the code: read
CLAUDE.md, then the section ofdocs/proxy-behavior.mdyou are touching.
Apache License 2.0; see LICENSE. Not affiliated with, endorsed by, or sponsored by Anthropic or OpenAI. All trademarks belong to their owners.