diff --git a/.github/assets/banner-dark.svg b/.github/assets/banner-dark.svg
new file mode 100644
index 0000000..37ffa37
--- /dev/null
+++ b/.github/assets/banner-dark.svg
@@ -0,0 +1,71 @@
+
diff --git a/.github/assets/banner-light.svg b/.github/assets/banner-light.svg
new file mode 100644
index 0000000..c65d50b
--- /dev/null
+++ b/.github/assets/banner-light.svg
@@ -0,0 +1,71 @@
+
diff --git a/.github/assets/demo.svg b/.github/assets/demo.svg
new file mode 100644
index 0000000..8803dec
--- /dev/null
+++ b/.github/assets/demo.svg
@@ -0,0 +1,84 @@
+
diff --git a/.github/assets/social-preview.png b/.github/assets/social-preview.png
new file mode 100644
index 0000000..89dce1a
Binary files /dev/null and b/.github/assets/social-preview.png differ
diff --git a/.github/assets/social-preview.svg b/.github/assets/social-preview.svg
new file mode 100644
index 0000000..6040a3e
--- /dev/null
+++ b/.github/assets/social-preview.svg
@@ -0,0 +1,69 @@
+
diff --git a/.github/release.yml b/.github/release.yml
new file mode 100644
index 0000000..dba677c
--- /dev/null
+++ b/.github/release.yml
@@ -0,0 +1,31 @@
+changelog:
+ exclude:
+ labels:
+ - dependencies
+ - chore
+ authors:
+ - dependabot
+ - github-actions
+ categories:
+ - title: "π Features"
+ labels:
+ - enhancement
+ - feat
+ - title: "π Bug Fixes"
+ labels:
+ - bug
+ - fix
+ - title: "π Security"
+ labels:
+ - security
+ - title: "π Documentation"
+ labels:
+ - documentation
+ - docs
+ - title: "ποΈ Infrastructure"
+ labels:
+ - ci
+ - infrastructure
+ - title: "π§Ή Other Changes"
+ labels:
+ - "*"
diff --git a/.goreleaser.yml b/.goreleaser.yml
index 337b32a..a59174b 100644
--- a/.goreleaser.yml
+++ b/.goreleaser.yml
@@ -128,4 +128,14 @@ release:
./kiroxy version
```
+ ```bash
+ # Or via Docker
+ docker pull ghcr.io/nopperabbo/kiroxy:{{ .Version }}
+ ```
+
Artefact checksums: `kiroxy_{{ .Version }}_checksums.txt` (SHA-256).
+ Signatures: each artefact has a `.sig` + `.cert` file for [cosign](https://docs.sigstore.dev/) verification.
+
+ ---
+
+ **Links:** [Documentation](https://nopperabbo.github.io/kiroxy/) Β· [Discussions](https://github.com/nopperabbo/kiroxy/discussions) Β· [Sponsor](https://github.com/sponsors/nopperabbo)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4531de4..2a6b834 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,142 +1,177 @@
# Contributing to kiroxy
-Thanks for taking interest. kiroxy is a single-user, self-hosted tool maintained by [@nopperabbo](https://github.com/nopperabbo); the project is public so others can audit, fork, and learn from it. Outside contributions are welcome but lightly gated β please read this document before opening a PR.
+
+
+ Thanks for taking interest in kiroxy.
+
+ Outside contributions are welcome but lightly gated β please read this document before opening a PR.
+
+
+
-## Project Philosophy
+---
-kiroxy does **one thing well**: turn a Kiro IDE subscription into an Anthropic Messages API endpoint. We deliberately **do not** want to become:
+## Philosophy
-- A multi-tenant gateway (use [LiteLLM](https://github.com/BerriAI/litellm) or [Portkey](https://github.com/Portkey-AI/gateway))
-- A multi-provider router (Gemini, OpenAI, etc.)
-- A SaaS service
-- A general-purpose proxy framework
+kiroxy does **one thing well**: turn a Kiro IDE subscription into an Anthropic Messages API endpoint.
-If your contribution moves the project toward those directions, it will likely be rejected. Open an issue first to discuss scope.
+We deliberately **do not** want to become:
+
+| β Not this | β Use instead |
+|:---|:---|
+| Multi-tenant gateway | [LiteLLM](https://github.com/BerriAI/litellm), [Portkey](https://github.com/Portkey-AI/gateway) |
+| Multi-provider router | [OpenRouter](https://openrouter.ai) |
+| SaaS service | β |
+| General-purpose proxy framework | [Kong](https://github.com/Kong/kong), [Envoy](https://github.com/envoyproxy/envoy) |
+
+If your contribution moves toward those directions, it will likely be rejected. **Open an issue first** to discuss scope.
+
+---
## Before You Open a PR
-1. **Open an issue first** for anything beyond a typo fix or one-line bug. Sync on the approach.
-2. **Check the BACKLOG.md** β your idea may already be planned, deferred, or explicitly rejected with reasoning.
-3. **Read `docs/ARCHITECTURE.md`** β the engineering overview explains the boundaries and constraints.
-4. **Read `CHANGELOG.md`** β recent changes reveal the project's current direction and conventions.
+1. **Open an issue first** for anything beyond a typo fix
+2. **Check [`BACKLOG.md`](BACKLOG.md)** β your idea may already be planned or explicitly rejected
+3. **Read [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)** β understand the boundaries
+4. **Read [`CHANGELOG.md`](CHANGELOG.md)** β recent changes reveal current direction
+
+---
## Development Setup
### Prerequisites
-- **Go 1.26+** with `GOEXPERIMENT=jsonv2` enabled
-- **Node 20+** + **pnpm 9+** (for the Mansion dashboard)
-- **Astro 5+** (for `web/landing/`)
-- **Python 3.10+** (only if working on the onboarder tool)
-- **Make** (or run commands directly from the Makefile)
+| Tool | Version | Purpose |
+|:---|:---|:---|
+| Go | 1.26+ | Backend (`GOEXPERIMENT=jsonv2` required) |
+| Node | 20+ | Dashboard + landing page |
+| pnpm | 9+ | Package manager |
+| Make | any | Build orchestration |
-### Build
+### Build & Run
```bash
# Backend
-GOEXPERIMENT=jsonv2 go build -o ./kiroxy ./cmd/kiroxy
-
-# Mansion dashboard (rebuild before binary if you change Svelte source)
-cd internal/server/mansion/client
-pnpm install
-pnpm run build
+make build # or: GOEXPERIMENT=jsonv2 go build -o ./kiroxy ./cmd/kiroxy
-# Landing page (independent of binary)
-cd web/landing
-pnpm install
-pnpm run build # output to web/landing/dist/
+# Dashboard (rebuild before binary if you change Svelte source)
+cd internal/server/mansion/client && pnpm install && pnpm run build
-# Run all tests
-go test ./...
+# Landing page
+cd web/landing && pnpm install && pnpm run build
-# Lint
-gofmt -d .
-go vet ./...
+# Run
+./kiroxy serve
+open http://localhost:8787/dashboard-mansion
```
-### Run Locally
+### Quality Gates
```bash
-./kiroxy serve -port 8787
-# Health check
-curl http://localhost:8787/healthz
-# Dashboard
-open http://localhost:8787/dashboard-mansion
+make gate # fmt + vet + build + test (required before commits)
+make test-race # race detector
+make lint # golangci-lint (25+ linters)
+make bench # performance benchmarks
```
+---
+
## PR Guidelines
### Commit Messages
-Follow conventional commits: `(): `
+[Conventional Commits](https://www.conventionalcommits.org/): `(): `
-Types: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`, `polish`
+**Types:** `feat` Β· `fix` Β· `docs` Β· `style` Β· `refactor` Β· `perf` Β· `test` Β· `chore` Β· `polish`
-Scopes vary by area:
-- `kiroclient`, `pool`, `messages`, `auth` β backend
-- `mansion` β dashboard
-- `landing` or `web` β landing page
-- `docs`, `ci`, `gitignore` β meta
+**Scopes:**
-Examples:
-- `feat(mansion): make logs histogram bins clickable`
-- `fix(pool): cool down failed accounts during rotation`
-- `polish(landing): hero topology pulse animation`
+| Scope | Area |
+|:---|:---|
+| `kiroclient`, `pool`, `messages`, `auth` | Backend |
+| `mansion` | Dashboard |
+| `landing`, `web` | Landing page |
+| `docs`, `ci` | Meta |
-### Commit Hygiene
-
-- **One logical change per commit.** Don't bundle a feature with a refactor.
-- **Keep dependencies minimal.** No new npm or Go modules without discussion in the issue.
-- **No build artifacts.** `dist/`, `node_modules/`, and binaries are gitignored β keep them that way.
+**Examples:**
+```
+feat(mansion): make logs histogram bins clickable
+fix(pool): cool down failed accounts during rotation
+polish(landing): hero topology pulse animation
+```
### Code Style
-**Go:**
-- `gofmt` everything (CI will fail otherwise)
-- Use `slog` for structured logging, not `fmt.Println`
-- Prefer typed errors with `errors.Is/As` over string matching
+
+Go
+
+- `gofmt` everything (CI enforces)
+- Use `slog` for structured logging
+- Prefer typed errors with `errors.Is/As`
- Tests live alongside source: `foo.go` + `foo_test.go`
-**TypeScript / Svelte:**
-- Run `pnpm exec svelte-check` before committing β 0 errors required
-- Use `$state` / `$derived` runes (Svelte 5), not legacy `let` / `$:` syntax
+
+
+
+TypeScript / Svelte
+
+- Run `pnpm exec svelte-check` β 0 errors required
+- Use `$state` / `$derived` runes (Svelte 5)
- No Tailwind, no shadcn, no icon libraries β inline SVG only
-- Brand identity is locked: warm charcoal + amber, JetBrains Mono + Inter, hairline borders, max border-radius 6px
+- Brand identity is locked (see below)
+
+
+
+
+CSS / Brand Identity
-**CSS:**
- Use `--c-*` design tokens from `tokens.css` β never hard-code colors
-- The amber budget has 5 roles: wordmark cursor, live dot, primary CTA, keyboard pills, section underlines. Adding a 6th requires retiring one and justifying the swap.
-- Motion budget: 4 ambient idle-loop animations max. See `motion-budget.css`.
+- **Palette:** warm charcoal + aged-brass amber
+- **Typography:** JetBrains Mono (display) + Inter (text)
+- **Borders:** hairline, max `border-radius: 6px`
+- **Amber budget:** 5 roles only (wordmark cursor, live dot, primary CTA, keyboard pills, section underlines). Adding a 6th requires retiring one.
+- **Motion budget:** 4 ambient idle-loop animations max
+
+
### Tests
-- **Backend:** Go unit tests for any logic change. Integration tests (using real or mocked Kiro endpoint) for protocol changes.
-- **Frontend:** Visual changes verified via Playwright DOM probes; the multimodal review path is encouraged but not required.
-- **Mobile:** Test at iPhone 13 emulation (390px viewport) β Pool view must stay under 6000px height.
+- **Backend:** Unit tests for any logic change. Integration tests for protocol changes.
+- **Frontend:** Playwright DOM probes for visual changes.
+- **Mobile:** Test at iPhone 13 (390px viewport).
-## What Counts as a Good First Issue
+---
-If you want to contribute but don't have a specific feature in mind:
+## Good First Issues
-- Check issues labeled [`good first issue`](https://github.com/nopperabbo/kiroxy/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
+- Issues labeled [`good first issue`](https://github.com/nopperabbo/kiroxy/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
- Add a missing test for a function in `internal/`
- Improve a documentation page in `docs/`
-- Translate a section of the landing page (currently English-only)
-- Add a sample integration in `docs/SAMPLE_RUN.md` for a client kiroxy hasn't been tested with
+- Add a sample integration for an untested client
+
+---
## What Will Be Closed
-- PRs that change the project scope (multi-tenant, multi-provider, SaaS direction)
-- PRs adding new dependencies without prior issue discussion
-- PRs introducing UI frameworks (Tailwind, shadcn, etc.)
-- PRs with build artifacts committed
-- PRs without a corresponding issue for non-trivial changes
-- PRs that violate the brand identity / motion budget without justification
+- β PRs that change project scope (multi-tenant, multi-provider, SaaS)
+- β PRs adding dependencies without prior issue discussion
+- β PRs introducing UI frameworks (Tailwind, shadcn, etc.)
+- β PRs with build artifacts committed
+- β PRs without a corresponding issue for non-trivial changes
+- β PRs violating brand identity / motion budget without justification
+
+---
## License
-By contributing, you agree your contributions will be licensed under the [MIT License](LICENSE). The `NOTICE` file tracks meaningful upstream attributions.
+By contributing, you agree your contributions will be licensed under the [MIT License](LICENSE).
-## Questions?
+---
-Open a [Discussion](https://github.com/nopperabbo/kiroxy/discussions) (Q&A category) or file an [Issue](https://github.com/nopperabbo/kiroxy/issues). For sensitive matters, see [SECURITY.md](SECURITY.md).
+
diff --git a/README.md b/README.md
index cb0a64c..4220125 100644
--- a/README.md
+++ b/README.md
@@ -1,513 +1,329 @@
-# kiroxy
-
-[](https://github.com/nopperabbo/kiroxy/actions/workflows/ci.yml)
-[](https://github.com/nopperabbo/kiroxy/actions/workflows/codeql.yml)
-[](https://scorecard.dev/viewer/?uri=github.com/nopperabbo/kiroxy)
-[](https://codecov.io/gh/nopperabbo/kiroxy)
-[](https://github.com/nopperabbo/kiroxy/releases/latest)
-[](LICENSE)
-[](go.mod)
-[](https://github.com/nopperabbo/kiroxy/pkgs/container/kiroxy)
-[](https://github.com/nopperabbo/kiroxy/issues)
-[](https://github.com/nopperabbo/kiroxy/discussions)
-[](https://github.com/sponsors/nopperabbo)
-
-A single-user, self-hosted proxy that exposes your Kiro IDE subscription (Amazon Q Developer / AWS CodeWhisperer) as an **Anthropic Messages API** endpoint. Point your Claude Code, Cursor, or any Anthropic-compatible client at kiroxy, and it forwards requests to Kiro using your own credentials.
-
-**Status:** v1.4.0 β public release, MIT-licensed. See [`CHANGELOG.md`](CHANGELOG.md) for release notes, [`ROADMAP.md`](ROADMAP.md) for what's next, [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for the engineering overview, and [`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md) for operator diagnostics.
-
----
-
-## What it looks like
-
-The bundled **Mansion** dashboard ships in the same binary at `/dashboard-mansion`. Seven views, dark + light themes, mobile-responsive, no external CDN.
-
-### Live request stream
-
-Real-time SSE feed of every request through the pool. Click a row for a 4-tab drill-down (request, response, account, timing). Time-range picker, sort, search-scope toggle, CSV export.
-
-
-
-### Metrics
-
-3 time-series charts (req/min, latency p50/p95/p99, error rate), 4 top-N tables (endpoints, slowest paths, errors, clients), status-code stacked bar, and 2 SLO gauges with zone gradients.
-
-
-
-### Account pool
-
-78-account density visualization with anomaly emphasis (amber border on accounts crossing 1% error rate), cooldown wash, idle dim. Pool minimap above for at-a-glance health.
-
-
-
-### Logs
-
-60-bin volume histogram (clickable to filter time window), multi-select level chips, facets sidebar, JSONL export, wrap toggle.
-
-
-
-### Light theme
-
-Token-driven theming with WCAG AA contrast in both schemes. Switch via Settings β Theme.
-
-
-
-### Mobile (iPhone 13)
-
-All 7 views adapt to 390px CSS viewport. Pool collapses to 2-line cards with sticky headers, Live stream uses vertical card layout, tap targets β₯44px, no horizontal scroll.
-
-
----
-
-## Installation
-
-Three ways to get kiroxy running. **Pre-built binary** is the fastest;
-**`go install`** is the most flexible.
-
-### 1. Pre-built binary (recommended)
-
-Pre-built tarballs for Linux and macOS (amd64 + arm64) attach to every
-[GitHub Release](../../releases/latest). Each archive ships the binary
-plus `LICENSE`, `NOTICE`, `README.md`, `CHANGELOG.md`,
-`docs/ARCHITECTURE.md`, `docs/TROUBLESHOOTING.md`, and `docs/OPENCODE.md`.
-A SHA-256 checksums file (`kiroxy__checksums.txt`) verifies
-download integrity.
-
-```bash
-# Pick the matching Os_Arch β Linux_amd64, Linux_arm64, Darwin_amd64, Darwin_arm64.
-VERSION=1.4.0
-OS_ARCH=Linux_amd64 # or Darwin_arm64, etc.
-
-curl -sSL -o kiroxy.tar.gz \
- "https://github.com/nopperabbo/kiroxy/releases/download/v${VERSION}/kiroxy_${VERSION}_${OS_ARCH}.tar.gz"
-curl -sSL -o checksums.txt \
- "https://github.com/nopperabbo/kiroxy/releases/download/v${VERSION}/kiroxy_${VERSION}_checksums.txt"
-
-# Verify the archive matches the published checksum.
-grep " kiroxy_${VERSION}_${OS_ARCH}.tar.gz$" checksums.txt | shasum -a 256 -c -
-
-tar -xzf kiroxy.tar.gz
-./kiroxy version
-```
-
-### 2. `go install`
-
-Requires [Go 1.26+](https://go.dev/dl/) (kiroxy uses `encoding/json/v2`
-via `GOEXPERIMENT=jsonv2`).
-
-```bash
-GOEXPERIMENT=jsonv2 go install github.com/nopperabbo/kiroxy/cmd/kiroxy@v1.4.0
-kiroxy version
-```
-
-The binary lands in `$(go env GOPATH)/bin/kiroxy` (typically
-`~/go/bin/kiroxy`). Make sure `$GOPATH/bin` is on your `$PATH`.
-
-### 3. Build from source
-
-For development work or if you want to inspect/modify the code first.
-Covered in the [Five-minute quickstart](#five-minute-quickstart) below.
-`make build` pins `GOEXPERIMENT=jsonv2` and stamps `main.version` from
-`git describe`.
+
-Covered in the [Run with Docker](#run-with-docker) section below. `gcr.io`
-or `ghcr.io` image hosting is on the roadmap; for now, build locally with
-`make docker-build`.
+
----
+## What is kiroxy?
-## Five-minute quickstart
+A single-binary, self-hosted proxy that exposes your **Kiro IDE subscription** as a standard **Anthropic Messages API** endpoint. Point Claude Code, Cursor, or any Anthropic-compatible client at kiroxy β it handles credential pooling, token refresh, and request routing transparently.
-### 1. Prereqs
+
-- **Go 1.26+** (kiroxy uses `encoding/json/v2` via `GOEXPERIMENT=jsonv2`)
-- **A Kiro account** β either:
- - the `kiro-cli` tool logged in (kiroxy can read its SQLite credentials directly), or
- - you're running Kiro IDE and have `~/.aws/sso/cache/kiro-auth-token.json`, or
- - you'll use `kiroxy add-account` to go through the AWS Builder ID device-code flow (M9, coming soon)
+