blog / models and tooling
Ox Alpha in your terminal
A free stealth model with a 1M-token context, reached through the CLI you already use, without your normal claude command quietly changing providers behind your back.
Stealth models are how a lab lets people hammer an unreleased model in public without putting a name on it. While they are in preview they are usually free, and Ox Alpha on OpenRouter is a good one: $0 in, $0 out, a 1M-token context, tool calling and images. That is a lot of capacity to leave on the table when your own subscription has a weekly ceiling.
The useful part is that no plugin, proxy or fork is needed to reach it.
Why this works at all
Two facts meet in the middle:
- Claude Code speaks the Anthropic Messages API, and every part of that is configurable through environment variables.
- OpenRouter exposes an Anthropic-compatible endpoint at
https://openrouter.ai/api.
So the entire integration is: point the CLI at a different base URL, hand it a different key, name a different model. There is no adapter layer because none is needed.
The one thing most guides get wrong
The obvious move is to export those variables in your shell profile. Do not. Top-level exports send every claude session to a third party for as long as those lines exist, and they do it silently. Your Anthropic subscription keeps billing while going completely unused, and the first sign of trouble is a bill or a leak, not an error.
Scope them to one process instead. A shell function sets the variables only for the command it wraps:
# Ox Alpha (OpenRouter) - only inside `oxclaude`; plain `claude` stays on Anthropic
oxclaude() {
local key="${OPENROUTER_API_KEY:-$(cat ~/.config/openrouter/key 2>/dev/null)}"
if [ -z "$key" ]; then
echo "No OpenRouter key: put it in ~/.config/openrouter/key" >&2
return 1
fi
ANTHROPIC_BASE_URL="https://openrouter.ai/api" \
ANTHROPIC_AUTH_TOKEN="$key" \
ANTHROPIC_API_KEY= \
ANTHROPIC_MODEL="stealth/ox-alpha" \
ANTHROPIC_SMALL_FAST_MODEL="stealth/ox-alpha" \
ANTHROPIC_CUSTOM_MODEL_OPTION="stealth/ox-alpha" \
ANTHROPIC_CUSTOM_MODEL_OPTION_NAME="Ox Alpha" \
ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION="OpenRouter stealth - free - 1M context" \
command claude "$@"
}
Now there are two commands with two providers and no ambiguity: claude goes to Anthropic, oxclaude goes to OpenRouter. Nothing else in your environment changes.
Three details in there are load-bearing:
ANTHROPIC_API_KEY=is blanked deliberately. If a real key is set anywhere it wins over the auth token, and you get a confusing401.- The base URL is
/api, not/api/v1. Claude Code appends/v1/messagesitself. Getting this wrong is the other half of all the 404s. command claudeskips function lookup, so the wrapper cannot recurse into itself.
Getting the model to show up in the picker
The last four variables are the ones nobody documents together. ANTHROPIC_CUSTOM_MODEL_OPTION and its friends register the model as a real entry in /model, with a name and a description, instead of forcing you to type the id every session. It needs Claude Code 2.1 or newer; on older versions typing the model name still works.
oxclaude # in any project
/status # base: https://openrouter.ai/api - model: stealth/ox-alpha
/model # "Ox Alpha" is a pickable entry
Letting an agent install it
The repo also ships the whole thing as an Agent Skill. Drop SKILL.md into your skills folder, type /init-oxclaude, and the agent does the setup: detects your shell, writes the function into the right profile, and tells you exactly which command to run to store the key.
mkdir -p ~/.claude/skills/init-oxclaude
curl -fsSL https://raw.githubusercontent.com/Ege-BULUT/oxclaude/main/SKILL.md \
-o ~/.claude/skills/init-oxclaude/SKILL.md
The agent never handles the key. It prints the command; you paste your own key into your own terminal. A skill that asks you to hand it a credential is a skill you should not install, and that includes mine.
What to keep out of it
A stealth model is a model whose provider you do not know. That is the trade. Prompts may be retained by whoever is behind it, so client code, credentials and anything under NDA stay on the account you actually have a contract with. OpenRouter has logging controls in its privacy settings, and they are worth reading before the first run rather than after.
The other constraint is per-process: one session, one provider. You cannot mix an Anthropic model and an OpenRouter model inside the same running CLI. Start oxclaude for one, claude for the other.
Stealth models get renamed and retired without notice. If the id stops resolving, check the model page first. That is a feature of the arrangement, not a bug in the wrapper.
Where I actually use it
Bulk work where a 1M context is worth more than the last few points of quality: reading a large repository end to end, first-pass migrations, throwaway exploration, anything I would otherwise not start because of what it would cost. The wrapper cost twelve lines and has stayed correct through several CLI updates, which is roughly the ideal ratio for a piece of personal tooling.
Full setup, the Windows PowerShell variant and a troubleshooting table live on the guide.