mit community project

kiroxy

The self-hosted Kiro proxy.

Stand up a local Anthropic + OpenAI compatible endpoint backed by your own multi-account Kiro pool. One Go binary, one config file, zero telemetry.

throughput
23,810rps
binary size
22MiB
telemetry
0bytes out
docker image
~30MiB distroless
  • healthy
  • 8 accounts
  • last request 1.2s ago
  • v0.3.0
  • 0 crashes
what it is

A proxy, not a platform.

You have a Kiro subscription. You want Claude Code, Cursor, Continue, opencode, or any Anthropic-compatible client to use it without sending code through a third party. kiroxy stands that endpoint up in five minutes.

It speaks the Anthropic Messages API and the OpenAI Chat Completions API on the inbound side, and routes to your own Kiro accounts on the outbound side. One Go binary. One config file. That's the product.

features

What lives in the binary.

No surprises. Read the source, audit the wire, run a benchmark — every tile here is grounded in code shipped on main.

  • Multi-account pool

    LRU rotation across N accounts with per-account cooldowns and proactive refresh.

  • Anthropic compatible

    /v1/messages with full streaming SSE and count_tokens. Drop-in for Claude Code.

  • OpenAI compatible

    /v1/chat/completions translation shim. Cursor, Continue, Cline, aider — same key.

  • Prometheus + Grafana

    /metrics endpoint, 12-panel starter dashboard JSON, request + error + latency histograms.

  • Streaming SSE fidelity

    message_startcontent_block_deltamessage_stop, framed correctly across retries.

  • Single Go binary

    22 MiB native build. Distroless Docker image at ~30 MiB, nonroot, read-only rootfs.

  • Onboarder sidecar

    Optional Python tool with Camoufox for batch account onboarding when device-code is closed.

    optional · python · camoufox
  • Open source, MIT

    Donor projects credited in NOTICE. Every ported file carries an origin header.

  • Self-hosted only

    Loopback by default. No telemetry, no phone home. The vault stays on your disk.

scope

Who it's for. Who it isn't.

kiroxy is small on purpose. Smaller scope = smaller blast radius = software you can keep on your machine for years.

For

  • Solo dev with a Kiro subscription
  • Small trusted group (≤ 5 engineers)
  • Self-host enthusiasts on a home server, VPS, or Fly.io
  • Operators who want every request logged on their own disk

Not for

  • Multi-tenant AI gateway with billing — use LiteLLM or Portkey
  • Team collaboration tool with SSO + RBAC — use a team account
  • Pay-per-use customers — Kiro's web interface is the right shape
  • Anyone who needs SOC 2 / HIPAA / SSO — kiroxy ships none of that
install

Five minutes, three paths.

Pick the one your machine is closest to. Each path ends with curl /healthz returning 200.

Build from source

Go 1.26+ · recommended for contributors
shell
$ git clone https://github.com/nopperabbo/kiroxy.git
$ cd kiroxy
$ make build
$ ./kiroxy serve
# verify
$ ./kiroxy version

Run with Docker

distroless, nonroot, ~30 MiB
shell
$ cp .env.example .env
$ make docker-compose-up
$ docker compose logs -f kiroxy
# verify
$ curl -sS http://127.0.0.1:8787/healthz

Pre-built binary

homebrew or release tarball · macOS + linux
shell
# option a — homebrew (macOS + linux)
$ brew install nopperabbo/tap/kiroxy

# option b — release tarball
$ VERSION=0.3.0 OS_ARCH=Darwin_arm64
$ curl -sSL -o kiroxy.tar.gz \
    https://github.com/nopperabbo/kiroxy/releases/download/v${VERSION}/kiroxy_${VERSION}_${OS_ARCH}.tar.gz
# verify
$ shasum -a 256 kiroxy.tar.gz | diff - kiroxy.sha256
$ tar -xzf kiroxy.tar.gz && ./kiroxy version

Then send your first request

shell
$ curl -sS http://127.0.0.1:8787/v1/messages \
    -H "X-Api-Key: $KIROXY_API_KEY" \
    -H "Content-Type: application/json" \
    -H "anthropic-version: 2023-06-01" \
    -d '{"model":"claude-sonnet-4-5","max_tokens":1024,"messages":[{"role":"user","content":"kiroxy"}]}'
dashboard

A live feed, not a stat grid.

The home page is the LiveRequestStream: reverse-chron blocks of actual requests as they happen. ⌘K on any block opens per-request actions — replay with a different model, copy permalink, view upstream raw.

kiroxy / live requests · 8 accts · 5 min
⌘K / search
acct-2 claude-sonnet-4-5 POST /v1/messages 200 1.4s
1,247 in · 389 out $0.012 stream 11:42:18
acct-5 claude-haiku-4.5 POST /v1/chat/completions 200 0.9s
412 in · 118 out $0.003 json 11:42:12
acct-1 claude-opus-4-7 POST /v1/messages 200 3.1s
3,820 in · 1,201 out $0.054 stream 11:42:07
acct-7 claude-sonnet-4-5 POST /v1/messages 429 0.22s
— in · — out err 11:41:58
acct-3 claude-haiku-4.5 POST /v1/messages/count_tokens 200 0.04s
— in · — out json 11:41:52
⌘↩ inspect ⌘C copy id ⌘R replay ⌘L view logs

The full Mansion operator dashboard, rendered by the same binary serving /v1/messages — no separate service, no external analytics. Mouse shortcuts above, keyboard shortcuts below, pool health and metrics on every surface.

kiroxy LIVE · 8 accounts · 2,147 req/h · p99 4.2s ⌘K
POOL · 6 ACTIVE · 2 COOLING
  • e3ba0c18 workspace 2.1k
  • 7f4a92c1 workspace 1.8k
  • 9ce4d7b3 workspace 1.6k
  • 3ab87e2f workspace 1.4k
  • 8d5f6b4a workspace 1.2k
  • 4a2b8f92 workspace 0
  • 6c9e1d73 kikirro 980
  • 2f7b4a5c workspace 0
LIVE STREAM · LAST 60s
  • /v1/messages opus-4.7 200 4.2s
  • /v1/messages opus-4.7 200 3.8s
  • /v1/chat/completions sonnet-4.6 200 1.1s
  • /v1/messages opus-4.7 200 5.6s
  • /v1/messages haiku-4.5 200 0.3s
  • /v1/messages sonnet-4.6 200 1.4s
  • /v1/chat/completions haiku-4.5 200 0.2s
  • /v1/messages opus-4.7 200 4.8s
METRICS · 24h
p50120 ms
p75340 ms
p90890 ms
p951.9 s
p994.2 s
INBOUND 2 api shapes · OUTBOUND 1 upstream · STATE SQLite vault · ⌘K cmd palette · / keyboard shortcuts
performance

Reference numbers, honest caveats.

Measured against a mock Kiro upstream on an M1 MacBookPro17,1 — the event-stream pipeline kiroxy sits inside. Reproducible locally via scripts/loadtest/. Not an SLA, just a floor to spot regressions.

benchmark · v0.3.0 · go 1.26 · darwin/arm64 · 5 scenarios · all latencies in ms
throughput latency · milliseconds envelope
scenario C concurrency rps requests/sec p50 median p95 95th p99 tail class
single request 1 6,566 0.15 0.18 0.18 warmup
10 concurrent 10 10,982 0.85 1.25 1.45 steady
100 concurrent burst 100 20,758 2.90 13.88 16.54 burst
sustained 60s 10 23,810 0.29 1.01 2.92 soak
realistic 20ms uplink 5 132 37.71 39.04 40.93 real
reference run — used in headlines realistic uplink — 20ms RTT amber number — same row as ★ (reference scenario)
soak run 1,428,651 requests · 0% err · single 83 ms GC spike at t=42s
telemetry egress 0 bytes. Scrape /metrics yourself.
faq

Questions that come up.

The first answer is open by default — most readers land here for it. Click any row to read the rest.

Is kiroxy an official Kiro product?

No. kiroxy is an independent community project with no affiliation to Amazon, AWS, or the Kiro team. It talks to the same endpoints your local Kiro IDE already talks to, using credentials you own.

Everything runs on your machine. The vault file lives at ~/.kiroxy/tokens.db (mode 0600). Audit the wire anytime with tcpdump -i lo0 port 8787.

Is this legal? Will my Kiro account get banned?

kiroxy is designed for single-user, self-hosted use against accounts you own. It doesn't resell access. That said — multi-account pooling against consumer Builder IDs can trigger AWS abuse detection. Stay reasonable: personal use, a handful of accounts, sane request cadence.

Does it support Gemini, OpenAI, or other providers?

No, and that's an anti-goal. kiroxy speaks Anthropic + OpenAI API shapes on the inbound side but only routes to Kiro upstream. If you want multi-provider, use LiteLLM or Portkey next to kiroxy — they speak the same shapes.

Is there a hosted version?

No. kiroxy is self-hosted only. There's no SaaS, no free tier, no waitlist. You run the binary on your machine or your own VPS.

Does kiroxy send telemetry anywhere?

No. Zero. The only outbound traffic is to the upstream Kiro endpoint you configured. Scrape your own /metrics endpoint for observability.

Need something specific? Open an issue on github.com/nopperabbo/kiroxy · we'll add the answer here if it comes up twice.