Wayfinder Router 2026.6.3 - the "terminal-first" release
Everything since the last dated changelog lands together, and the headline is where Wayfinder now lives. Routing stopped being something you watch through response headers and became somewhere you can sit - a decision-first chat in your terminal, set up with one command, with keys that never leave your environment. The deterministic core is untouched; all of this is presentation and glue around the same offline scorer.
Routing you can sit inside
wayfinder-router chat is now a full-screen terminal app (built on Textual). A scrolling transcript headed by the wordmark, every prompt routed inline as ● LOCAL or ◆ CLOUD with the score, an expandable /why breakdown of the structural features behind the call, a /settings panel for thresholds and scope, and model replies streamed token-by-token. It talks to your models two ways: in-process via your [gateway.models], or over HTTP to a running gateway with --base-url. No model call is made to decide — the routing is still pure and offline.
pip install "wayfinder-router[tui]"
wayfinder-router chat
One command to set up
wayfinder-router init scaffolds a starter wayfinder-router.toml and a .env.example of variable names, from a preset. hybrid pairs a keyless local Ollama arm with an Anthropic cloud arm; openai is a two-tier gpt-4o-mini → gpt-4o. It then prints a per-model key check so you know exactly what's left to do.
pip install "wayfinder-router[gateway]"
wayfinder-router init
wayfinder-router init --preset openai
Pick your stack, step by step
For anything the presets don't cover, --interactive walks you through it: choose a provider for each tier (Ollama, OpenAI, Anthropic, or a custom OpenAI-compatible endpoint), name the arms, set the score cuts, mix as many tiers as you like. It writes explicit [[routing.tiers]] that load straight back through the parser — and still asks only for variable names, never a secret.
wayfinder-router init --interactive
Is it wired up?
wayfinder-router doctor checks the nearest config and whether each model's key resolves — ✓ set, ✗ not set, or keyless — with no server to start. It exits non-zero when a named key is missing, so it drops cleanly into a script or a pre-flight check.
wayfinder-router doctor
Keys stay in your environment
Wayfinder never stores a secret. A model names an env var via api_key_env; the key is read from your environment at request time and is never written to the config, the logs, or anywhere else. init and doctor only ever name the variables and tell you which to export — so there is nothing to install and nothing to leak.
Still in your browser
The browser demo lives on as wayfinder-router webchat — the gateway opened straight at /demo, with the live threshold slider and the same decision-first view. When no models are configured, both chat and webchat now point you at wayfinder-router init to get started.
wayfinder-router webchat --dry-run
Calendar versioning
Wayfinder moves to CalVer (YYYY.M.MICRO). This is the line the roadmap tracked as v0.3.0; from here, the version tells you when a release shipped. It's PEP 440-native, so the source attribute, the 2026.6.3 tag, and the published PyPI version all read the same.
Upgrading
pip install --upgrade wayfinder-router
uv tool upgrade wayfinder-router
Everything is additive for the core: the scorer, the JSON contract, the gateway, and exit codes work as before, and the package stays stdlib-only with no runtime dependencies. The terminal chat is an opt-in extra — [tui] now pulls in both rich and textual — imported lazily, so nothing changes for installs that don't use it.