velofy® Windows · macOS · Linux

kestrel

An interactive coding CLI in one static binary. Bring the agent CLI you already run, or bring a key. $99, once.

kestrel 0.1.0 The whole thing, below

Thesis

The harness stays. The model is yours to swap.

kestrel is a coding CLI of the Claude Code class, shipped as one static Rust binary. It drives the agent CLIs already installed on your machine, or it talks straight to an API key. Six harness packs, detected from the repo, go in with whichever engine runs.

So the conventions, the review rubric and the post-edit checklist do not change when the model does. You change the engine. The standard stays bolted to the repository.

Ships as
one static binary
Written in
Rust, no runtime
Agent CLIs driven
5
API presets
6, plus any base URL
Harness packs
6, auto-detected
Tools in the loop
7, each permissioned
Keys kept in
the OS keychain
Price
$99 lifetime

Session / one ticket, start to finish

What a run looks like

Transcript: kestrel greps and reads app/api/refunds.py, edits it, asks permission before running a shell command, generates an Alembic migration, runs ruff, mypy and pytest, clears the FastAPI and Postgres post-edit checklist, then a four-way fan-out returns a ship verdict and the merge command.

kestrel anthropic:claude-sonnet-4-5 ~/work/payments-api

Seven tools sit in the loop: read, write, edit, glob, grep, shell and git. The three read-only ones never prompt. Everything that writes asks first, and answering a once writes the rule into .kestrel/settings.toml so it never asks again.

Engines / 5 CLIs, 6 presets, any endpoint

It runs on what you already have

Agent CLIs it drives

Found on your PATH, probed for a version, then handed the task with the harness prepended.

  • claudeClaude Code
  • cursor-agentCursor
  • kimiKimi CLI
  • geminiGemini CLI
  • codexCodex CLI

Endpoints it speaks

Three wire protocols, six presets you name with one word, and a base URL field for everything else.

  • anthropicapi.anthropic.com
  • openaiapi.openai.com
  • openrouteropenrouter.ai/api
  • geminigenerativelanguage.googleapis.com
  • moonshotapi.moonshot.ai
  • ollamalocalhost:11434, no key
  • any OpenAI-compatible base URLGroq, DeepSeek, Together, vLLM, LM Studio, your own proxy. One line of config, which puts every open-weight model in reach.

Keys resolve in one order: environment variable, then smbk, then the OS keychain. kestrel auth writes to the keychain only. A key never lands in a plaintext file and is never echoed back to the terminal.

Harness / 6 packs, read off the repo

Opinions that travel with the task

Each pack is a set of conventions, a review rubric and a deterministic post-edit checklist. kestrel reads the repository, picks the packs that apply, merges them into one document, and injects it into whichever engine runs the task.

FastAPI

detectsfastapi in pyproject or requirements

  • Async DB session per request, no sync I/O in handlers. No handler calls a blocking driver or requests inside an async def path.
  • Pydantic models at every boundary. Request bodies, query params, and response bodies are typed models, never a raw dict. response_model is set on every route.
  • No business logic in route functions. A route parses input, calls a service function, and shapes the output.

Django

detectsmanage.py

  • select_related/prefetch_related on every list endpoint that touches a foreign key or reverse relation. An N+1 query is a bug, not a performance nit.
  • No signals for business logic. post_save/pre_save are for cross-cutting concerns like cache invalidation, never for charging the customer.
  • Migrations committed in the same PR as the model change, and makemigrations --check is clean.

Rust

detectsCargo.toml

  • thiserror in libraries, anyhow in binaries.
  • No .unwrap()/.expect() outside tests, main's outermost boundary, or a comment proving the invariant that makes panic impossible.
  • Clippy runs in CI with warnings denied (cargo clippy -- -D warnings), not just run locally and ignored.

Go

detectsgo.mod

  • Errors wrapped with %w, never %v or %s, when the caller might need errors.Is/errors.As on the cause.
  • context.Context is the first parameter of every function that can block, call out, or be cancelled, named ctx, never stored on a struct.
  • go vet and staticcheck (or golangci-lint) run clean in CI, not just go build.

Postgres

detectspostgres in docker-compose, or a migrations directory

  • Every foreign key is indexed. No SELECT * in application code.
  • timestamptz always, never bare timestamp. Migrations reversible, or explicitly and permanently not, with a comment saying why.
  • EXPLAIN (ANALYZE, BUFFERS) is run on every new or materially changed list query before it ships.

Design

detectspackage.json, or any .html or .css

  • Body text >= 4.5:1 contrast; large text and interactive borders >= 3:1 (WCAG 2.1 AA). A palette that cannot meet these floors is rejected outright, never shipped with a caveat.
  • No gradients, ever. Flat colors only. Every surface, background, button, badge, and chart fill is a flat solid color.
  • Zero em-dash characters (U+2014) anywhere, in copy, code, comments, or commit messages. Use a comma or a colon instead.

Packs stack. A Django service with a migrations/ directory gets both layers, merged under one header. Run kestrel harness export and the merged document lands at .kestrel/HARNESS.md, readable by you and by any other agent you point at the repository.

Design / 11 aesthetics, 13 pairings

It has taste, and it shows its working

/design review [path]

Runs the design rubric over the files you name and prints a scored ledger. Every criterion gets a score from 0.0 to 1.0 and one line of justification anchored to a path:line or to command output, because a score without a pointer is an opinion. The verdict ends with the judge naming the score it would need to see to reverse itself.

Deterministic checks run first and are final. If the grep finds an em-dash, or the page scrolls sideways at 390px, no judge gets to argue it away.

Eleven named aesthetics

Ask for one by name and get the real pattern, built in flat colour.

  • Glassmorphism
  • Neumorphism
  • Claymorphism
  • Brutalism
  • Neon glow
  • Grain and noise
  • Bento grid
  • Swiss
  • Color-block
  • Duotone and halftone
  • Terminal

Thirteen curated pairings

Display, body and mono, chosen together, all free for commercial use. Five of the thirteen:

  • EditorialPlayfair Display / Crimson Pro / Space Mono
  • Developer labBricolage Grotesque / Work Sans / JetBrains Mono
  • Luxury fintechBodoni Moda / EB Garamond / Martian Mono
  • Neo-brutalistUnbounded / Archivo / Space Mono
  • Freight and logisticsAnton / Albert Sans / Fragment Mono

summit.js 0.4.3 ships inside the design pack, 17KB gzipped. Behaviour composed directly in HTML, no build step, no virtual DOM, no eval, so it passes a strict CSP. Scaffolds come wired to the local copy, which means a generated page makes zero external requests on first load.

Fan-out / many attempts, one verdict

When one attempt is not enough

One judge reading four diffs is a single point of failure, so --ultra replaces the judge with a court. Your working tree is never touched. Every attempt settles on its own branch, and you merge the one that won.

Taskone ticket, dispatched once
claude-1 claude-2 cursor-1 codex-1

Fleet / every agent CLI on the machine, each in its own git worktree

correctness skeptic architecture critic completeness auditor

Panel / three judges read every diff, one lens each, in parallel

Chieftallies the votes, breaks ties on correctness first, merges the panel caveats into one actionable list
Repairthe winner goes back into its own worktree and fixes those caveats, as a second commit on the same branch
Ship: yes / nothe chief reads the final cumulative diff and answers

And every commit crosses one desk. ak refuses to commit on main, never force-pushes, holds the history to conventional commits, and opens the pull request from the same place.

Price / once, not monthly

$99, and that is the whole story

$99LifetimeAll updates included

  • The binary for macOS arm64 and x64, Windows x64, and Linux x64. No runtime to install, no bash required.
  • Every release after this one, through kestrel update. One purchase, forever.
  • All six harness packs, and the design assets with summit.js inside.
  • Multi-agent fan-out, the ultra judge court, and the commit desk.
  • Your own download link, minted for you on the call.
  • No subscription, no seats, no telemetry, no account to create.
Book the call

Book the call, that is the checkout.
Thirty minutes with the person who built it. You watch it run against a repository of your choosing, ask whatever you want, and leave with a personal download link.

Status: v1 in build. Buy now and you are on the list from the first release onward, at this price, for good.

FAQ / six answers

Before you book

Windows or macOS?
Both, plus Linux. One static binary for macOS arm64, macOS x64, Windows x64 and Linux x64. Nothing to install alongside it and no bash dependency anywhere, so Windows is a first-class target rather than an afterthought. Remote fan-out over SSH is macOS and Linux in v1.
Are updates included?
kestrel update checks a version file, compares the sha256, and pulls the new binary from your own link. Every release, for as long as there are releases. There is no renewal to forget.
Which models can I use?
Whichever you already pay for. It drives claude, cursor-agent, kimi, gemini and codex when they are on your PATH, and it speaks Anthropic, OpenAI, OpenRouter, Gemini, Moonshot and Ollama by name. Anything else with an OpenAI-compatible base URL is one line of config, which covers Groq, DeepSeek, Together, vLLM, and any open-weight model you host yourself.
Where do my keys live?
In the OS keychain. Lookup order is environment variable, then smbk, then the keychain. Keys are never written to a config file and never printed back to you. Ollama needs no key at all.
Refunds?
Say the word on the call or after it and you get your money back. There is no form to fill in and no window to miss. The call exists so that almost nobody needs this answer.
Do I get the source?
No. You get the binary and every update to it. The multi-agent fan-out that kestrel grew out of stays open source at github.com/anishfyi/kestrel, alongside everything else velofy publishes.