Route Claude Code through Lynkr proxy → Kilo Gateway free models.
Zero Anthropic billing. Zero OpenRouter billing.
How it works
Claude Code / Cursor / Codex / Cline / Continue ← Your Prompt
↓
Lynkr (localhost:8081) ← intercepts Anthropic-format request
↓
Ollama | Bedrock | Databricks | OpenRouter | Azure | OpenAI | llama.cpp | Kilo Gateway ← routes to free model
↓
LLM response ← streamed back to Claude Code
ANTHROPIC_API_KEY is just a dummy value — Lynkr ignores it and uses your Kilo key internally.
Prerequisites
-
Node.js 20+ → check with
node --version, install from nodejs.org - Linux / macOS / WSL (Windows works via WSL)
Step 1 — Get a Kilo Gateway API Key (Free)
- Go to app.kilo.ai and sign up (Google login works)
- Navigate to API Keys in the dashboard
- Click Generate API Key → copy it (a long JWT token)
Free models available on Kilo (no credit card needed):
| Model ID | Best for |
|---|---|
kilo-auto/free |
Auto-picks best free model |
nvidia/nemotron-3-super-120b-a12b:free |
Large, capable (120B) |
arcee-ai/trinity-large-thinking:free |
Reasoning tasks |
x-ai/grok-code-fast-1:optimized:free |
Coding tasks |
openrouter/free |
OpenRouter's best free model |
Step 2 — Install Claude Code CLI
npm install -g @anthropic-ai/claude-code
claude --version # verify
Step 3 — Install Lynkr
npm install -g pino-pretty
npm install -g lynkr
lynkr --version # verify
Step 4 — Create Lynkr config folder and .env
mkdir ~/Desktop/lynkr && cd ~/Desktop/lynkr
nano .env
Paste this into .env (replace YOUR_KILO_KEY with your actual key):
# ── Provider ──────────────────────────────────────────────────
MODEL_PROVIDER=openai
# ── Kilo Gateway (OpenAI-compatible) ──────────────────────────
OPENAI_API_KEY=YOUR_KILO_KEY_HERE
OPENAI_ENDPOINT=https://api.kilo.ai/api/gateway/chat/completions
OPENAI_MODEL=kilo-auto/free
# ── REQUIRED: All 4 tiers must be set (format = provider:model)
TIER_SIMPLE=openai:kilo-auto/free
TIER_MEDIUM=openai:kilo-auto/free
TIER_COMPLEX=openai:kilo-auto/free
TIER_REASONING=openai:kilo-auto/free
# ── Server ────────────────────────────────────────────────────
PORT=8081
NODE_ENV=development
LOG_LEVEL=info
# ── Disable features that need extra setup ────────────────────
SEMANTIC_CACHE_ENABLED=false # Caches similar prompts, needs an embeddings model configured
FALLBACK_ENABLED=false # If Kilo fails, automatically retries with a backup provider
MEMORY_ENABLED=false # Gives the AI persistent memory across sessions, needs extra DB/vector setup
HEADROOM_ENABLED=true # Reserves token budget to avoid hitting context limits mid-conversation
AGENTS_ENABLED=true # Enables Lynkr's built-in agent system (web search, code exec, etc.)
Save and exit (Ctrl+O, Enter, Ctrl+X in nano).
Step 5 — Start Lynkr
cd ~/Desktop/lynkr
lynkr start
You'll see logs ending with:
Claude→Databricks proxy listening on http://localhost:8081
Config watcher started ...
The "Databricks" label is just a hardcoded display string in Lynkr's source — it doesn't mean it's routing to Databricks. Your
.envcontrols the actual provider.
Leave this terminal running.
Step 6 — Verify it works (new terminal)
curl -X POST http://localhost:8081/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: dummy" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-3-5-sonnet-20241022",
"max_tokens": 50,
"messages": [{"role": "user", "content": "say hi"}]
}'
Expected response:
{
"content": [{"type": "text", "text": "Hi there! How can I help you today?"}],
"_routingMeta": {
"provider": "openai",
"model": "kilo-auto/free",
"tier": "SIMPLE"
}
}
If you see _routingMeta with "model": "kilo-auto/free" — everything is working. ✅
Step 7 — Connect Claude Code to Lynkr
export ANTHROPIC_BASE_URL=http://localhost:8081
export ANTHROPIC_API_KEY=dummy
claude "say hello"
ANTHROPIC_API_KEY=dummyworks because Lynkr ignores whatever value Claude Code sends — it uses your Kilo key from.envfor all actual API calls.
Step 8 — Make it permanent
Add to your ~/.zshrc or ~/.bashrc:
# Lynkr / Claude Code proxy
export ANTHROPIC_BASE_URL=http://localhost:8081
export ANTHROPIC_API_KEY=dummy
# Quick start alias
alias lynkr-start="cd ~/Desktop/lynkr && lynkr start"
Reload:
source ~/.bashrc # or source ~/.zshrc
Now every session:
-
Terminal 1:
lynkr-start -
Terminal 2:
claude "anything"— free, forever
Step 9 — VS Code Claude Code Extension
The VS Code extension launches the Claude Code CLI in its own managed environment — it does not inherit export variables you set in your terminal. So even if your terminal has ANTHROPIC_BASE_URL set, the extension won't see it unless you configure it system-wide.
VS Code Extension
↓
launches CLI internally
↓
CLI checks → ANTHROPIC_API_KEY env var ← terminal exports don't reach here
OR
~/.claude/credentials ← extension's own auth storage
Option A — Set it in VS Code settings (per-user)
Open VS Code → Ctrl+, → search terminal env → click Edit in settings.json and add:
"terminal.integrated.env.linux": {
"ANTHROPIC_BASE_URL": "http://localhost:8081",
"ANTHROPIC_API_KEY": "dummy"
}
Use
"terminal.integrated.env.osx"on Mac,"terminal.integrated.env.windows"on Windows.
Restart VS Code after saving.
Option B — Set it system-wide in /etc/environment (recommended)
This makes the env vars available to every app on your system — VS Code, terminals, everything — without any per-app config.
sudo nano /etc/environment
Add these two lines at the end:
ANTHROPIC_BASE_URL=http://localhost:8081
ANTHROPIC_API_KEY=dummy
Save (Ctrl+O, Enter, Ctrl+X), then log out and log back in (or reboot).
Verify it worked:
printenv ANTHROPIC_BASE_URL # should print http://localhost:8081
Workflow with VS Code extension
-
Terminal 1:
lynkr-start(keep running) - Open VS Code → Claude Code extension → it now routes through Lynkr automatically ✅
> The extension may still show "Claude Sonnet 4.6" as the model name — that's normal. Lynkr returns that label to satisfy the extension's auth check. Your actual model is
kilo-auto/freerunning on Kilo Gateway.
Troubleshooting
| Problem | Fix |
|---|---|
[WARN] Missing tier configuration |
All 4 TIER_* vars must be set in .env
|
is not a valid model ID |
Remove kilo/ prefix — correct format is kilo-auto/free not kilo/kilo-auto/free
|
Connection refused |
Lynkr isn't running — start it first |
Claude→Databricks in logs |
Normal — just a hardcoded label, doesn't affect routing |
| Model says "Claude Sonnet 4.6" | Normal — Lynkr returns a fake model name to satisfy Claude Code; real model is in _routingMeta
|
| Slow first response | Free-tier cold start — second request is faster |
Reference: Lynkr GitHub
Top comments (0)