> ## Documentation Index
> Fetch the complete documentation index at: https://vibex.peatboy.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# v0.1.0-rc.9

> A local model gateway with failover routes, a rebuilt Provider workspace, SSH and WSL remote runtimes, self-hosted headless server artifacts, and a timeline that reads like a document.

## Highlights

* **A local model gateway** — One loopback endpoint now fronts every shared Provider. It speaks OpenAI Chat Completions, OpenAI Responses, Anthropic Messages and Google Generative AI, translates between them, and forwards each call to whichever Provider serves the requested model.
* **Routes that fail over** — A route is one selectable model. Compose it from `(Provider, model)` pairs, pick one of seven strategies, and let the gateway move to the next member when one cannot answer.
* **A rebuilt Provider workspace** — Providers, route groups and the gateway now share one workspace with a foldable sidebar, identity headers and in-place editing. A Provider you configured by hand became a reusable template, and preset model lists come from the `models.dev` catalogue.
* **SSH and WSL remote runtimes** — The desktop can put its authoritative runtime on another machine: install `vibex-server` over SSH, open a tunnel, pair automatically, and upgrade with a rollback that keeps the runtime's identity.
* **Self-hosted artifacts that ship themselves** — Headless server tarballs for Linux x86\_64/aarch64 and macOS are built in a pinned Debian 12 builder, the release mirrors stable images to Docker Hub and CNB, an AUR package republishes the Linux `.deb`, and the Linux payload is a third smaller.
* **The timeline reads like a document** — Tool calls render as structure rather than JSON: path and value fields, todo checklists, questions as lists, and edits as diffs. Headers lead with intent, outcome and timing.
* **Every printed key is a button** — In the TUI, a `key label` legend is now a control: clicking it presses exactly the key it names, through the same dispatcher the keyboard uses.
* **Ten more guardians** — The new-session arena grew from six encounters to sixteen, each with its own entrance, lane rhythm and companion effect.

## New Features

**Local model gateway**

* One loopback endpoint serves the four wire APIs coding Agents already speak and forwards each request to the shared Provider that serves the requested model; protocol translation happens through a single intermediate representation, including tool calls re-encoded across streaming shapes (`6e7d1513`, `69dcf747`, `5c23390a`)
* A conversation stays on the Key that holds its prompt cache, so pinning never costs a cache miss; routing state (cooldowns, pins, rotation, inflight) never enters an Agent process fingerprint, so replacing a Key never restarts a process (`237034e1`, `054348ec`)
* Concurrency and request rate are bounded per Key: a lane caps in-flight requests, a full lane waits in a bounded FIFO queue and only then answers 429, and a rolling minute caps starts (`41956368`, `c166d3b8`)
* Seven strategies — ordered, round-robin, least-used, smart, lowest-latency, weighted and manual — are all computable from local observations; a route may set a first-token deadline that bounds both the response headers and the first streamed token (`3bec21f2`, `19bdd7e0`)
* Circuit breakers are scoped to a route group rather than to a Provider, and an undeclared protocol is probed instead of being refused (`019922e3`, `f98f9be9`)
* The request ledger records which route a request actually took: members skipped because they were unavailable are separate from attempts that failed, and the trace carries ids and failure kinds only (`60974688`, `b255f3dd`, `6f7d634b`)
* The Gateway page is a workspace of its own: a live route map that replays each request, expandable request history, p50/p95 traffic with selectable ranges, alert thresholds, default timeouts, upstream ordering, and a clear action that states its retention window and asks first (`37193353`, `2701cf66`, `660808e9`, `bcfcd751`)
* A route named in a session is what the Agent asks for, and a direct Provider stays a one-member route on the same code path (`93bad62e`, `d952318e`, `24bbf895`)

**Providers**

* The shared Provider record is the write authority: editing one place reaches every Agent bound to it, and a binding may deliberately name no Provider when the Agent authenticates itself (`80e59ec7`, `31304b00`, `ff2f31bb`)
* The Provider workspace was rebuilt from scratch: a left column folding the gateway, Providers and route groups under one New menu, a shared identity header, underline tabs and section cards, in-place settings, and route groups editing on their own page (`9c5f2498`, `e2b94939`, `bc2a7f0c`)
* Presets ship as data and no longer carry model ids: applying one reads the vendor's entry from the bundled `models.dev` catalogue, including limits and capability flags, so a preset does not age the moment a vendor ships a model (`f9dfd52c`, `c41fb0e4`, `e8cc0e5f`)
* A Provider you configured by hand becomes a reusable template under a **User-defined** heading; the template is projected from the record on every read, carries no secret-valued header, and is addressed with a `user:` prefix so it can never shadow a shipped preset (`c7e58564`, `14cb47e8`)
* Provider Key rows identify a credential by a masked fingerprint instead of a generated label, and an eye button reveals the value through an explicit read while ordinary snapshots carry only the mask (`74162862`)
* Request-header overrides are projected to native Agents and to the gateway; import previews one source at a time, pages large model lists, and tests a draft before it is saved; a draft address and Key fetch their models; per-key model scope and proxy are configurable (`969c147a`, `1a1693e0`, `351c58ae`, `a350748b`, `20536bb6`)
* Route groups compose `(Provider, model)` pairs only: the `ProviderGroup` shape retired, and existing rows migrated to model groups from each member's enabled catalogue (`c30f9d90`, `bffc1a37`, `429d97b4`)
* The route-group editor gained suggestion cards: a model several Providers serve appears as a one-click candidate (`aebf9582`, `19bdd7e0`)

**Remote runtimes (SSH and WSL)**

* The desktop installs `vibex-server` on a remote Linux host, starts it on loopback with a pinned TLS certificate, opens an `ssh -L` tunnel, claims the one-time pairing code over SSH itself and connects over Remote Protocol v2 (`4aa8b4a6`, `1fe5ad24`, `27403118`)
* A nine-step provisioning state machine owns the order, cancellation safe points, retry after failure and the invariant that a runtime id is exposed only once it is ready; a duplicate begin returns the attempt already running (`d4680f42`, `c94ffa38`, `a1aceab5`)
* An environment probe checks Linux, architecture, glibc, disk headroom, home write access, `sha256sum` and the target port with typed blocking errors, and reports Git, `SHELL` and an unknown port as warnings (`4aa8b4a6`)
* The tunnel is supervised: a watchdog checks the child every 500 ms and rebuilds the same tunnel spec once, surfacing the restart or the failure instead of leaving a silent dead loopback endpoint (`5bb1e065`)
* Upgrades are transactional: the new artifact is installed beside the current one, the runtime identity survives, and a runtime that will not start rolls back to the previous version, which is started and checked (`ec66c998`, `664923d3`, `613b0981`)
* Uninstall can preserve the home directory, and an SSH profile can be edited, removed and re-provisioned; a paired SSH connection can be removed even before it ever provisioned (`e0f05f7f`, `399ba89e`, `f4db1824`)
* macOS remote hosts are supported through a LaunchAgent, with arm64 and x86\_64 server artifacts published for them (`349d09bc`, `7472cb31`, `48fa8d6d`)
* WSL2 distros are provisioned with no sshd at all: upload, install, start, wait for actual localhost forwarding, claim pairing on loopback, and restore after `wsl --shutdown` (`6de4ca9e`, `812e1684`, `068c669f`, `4ccdd60a`)
* A documented root bootstrap script installs sshd for hosts that lack it without touching `PasswordAuthentication`, enabling root or changing the firewall, and a cloud-init template covers providers where the key is pasted at VM creation (`c5df1c5c`, `bb67ef78`, `7f98abed`)
* Remote script arguments are shell-quoted and hostile values reach the script verbatim; pairing codes are kept out of the server log; the remote server log is readable from diagnostics, and platform failures carry recovery guidance (`284581cb`, `44322620`, `d51c6b84`, `8c433e57`)
* Remote instances live under **Settings → Remote instances** in the workspace group and are always listed in navigation, search and the command palette; the earlier Developer switch and its environment variable are gone (`ce9d6afa`)
* The title-bar runtime panel became a switcher over the instances already paired, and its footer action opens Settings instead of carrying a second pairing form (`33571d2e`)

**Timeline and sessions**

* Tool calls render as readable structure instead of pretty JSON: `path: value` fields, todo lists as checklists, ask-user questions and answers as lists, harness output envelopes unwrapped, and edits or writes drawn as diffs with `+N/-M` (`a354a8c2`, `c408cf72`)
* Titles that only named the tool defer to the call's own command, path or query, and the `cd <absolute path> &&` prefix no longer pushes the command itself past the truncation point (`a354a8c2`)
* Activity headers lead with intent and outcome: a failed call shows the first line it printed while collapsed, settled commands and Agent calls show how long they ran, and fetches get their own kind and globe icon (`c408cf72`)
* Workspace images referenced from a message — relative, root-relative, absolute or `file://` — render inline, confined to the workspace, and open a full-window preview on click; transcript images became clickable thumbnails (`42f51cda`, `bcda7984`, `b83584b6`)
* Built-in tool panels are chosen per session rather than per Agent: the new-session page records an explicit on/off per panel, an absent entry follows the Agent, and a fork or delegation copies the map (`2acc9b7a`, `3866693d`, `7b30af79`)
* Long bodies are read through their own viewport, a running session opens onto its history rather than its live run, and the reader's place survives content landing above it (`702d42f3`, `6c605ea2`, `5238cd96`)
* The new-session composer gained a fullscreen control, and auto-continue became a shell-wide default that continues without an explicit opt-in (`a95049b4`, `21080cee`, `fafd85c4`)
* The sidebar narrows its session list with the same funnel posture menu the session row already draws — all, running, waiting for you, unread, failed and pinned — and batch work follows the visible rows (`d52669fe`, `125bea0c`)
* Open editor tabs follow a file that changed on disk, and the light theme was retuned to a cool neutral ladder with solid, opaque module fills (`e063cad7`, `f9e4bc2d`)

**Markets and management**

* The MCP market asks the registry the reader's own question instead of walking a capped background catalogue, so a name deep in the published order is reachable immediately; paging walks the registry cursor (`6ff5ddff`)
* Market entries now carry the publisher's own picture and a remote entry's required headers, which become install inputs routed to the server's headers rather than its environment (`c1c02062`, `6ff5ddff`)
* The Skill market reads a public catalogue that answers in about a second: a ranked home page parsed once and shared for six hours, a browse page that folds one repository to at most four entries, and installs lifted out of the repository the catalogue names (`be0ed3e3`, `8b799349`)
* Market cards install on click, search runs as you type across MCP servers and Skills, and per-feature Agent capsules choose which Agents receive a feature (`3dc52df9`, `c5892f51`, `57649617`, `7d0f9a35`)

**TUI**

* Every `key label` legend is a press target: the queue and dock bands, modal footers, the settings footer and the new-session page's bracketed hints publish their rect with the chord they name, and a press runs through the same `handle_key` path the keyboard uses (`7d031085`)
* `Chord::from_hint` reads a legend the way a reader reads it — `^S`, `Space`, `↑`, `J/K`, `Alt+↑↓` — and a paired arrow is split into two one-cell targets (`7d031085`)
* The queue band and the dock now scroll to keep their cursors visible, and a click maps through the window the band drew instead of counting lines from the top of the rect (`7d031085`)
* The Providers table can switch its gateway and shows plan presets with their prices; imported Keys are named by what they do rather than by a generic warning, and columns that cannot fit are dropped instead of being squeezed (`47147915`, `69fa7538`, `5e1c0e14`, `5c95e57a`)
* A settled tool call stays folded, the answer that lands in front of the reader stays open, and `Ctrl+C` interrupts only the session page (`8a03fd17`, `910913c6`, `080b26aa`)
* The prompt band is sized at the width the composer actually paints (`0a762e36`)

**Mobile**

* The text ladder is read at the size it paints, the connecting page carries the Vibex wordmark, sync badges draw as text, and the CBDT emoji font ships as an APK asset (`3220066c`, `1f498fa4`, `08ca01c3`, `b186ed66`)
* Files and commits search while typing, the reader's place is kept when the timeline scrolls, and a session that ends hands the screen to the reader (`161b650f`, `ca2400c6`, `465a65ab`)
* The resume path no longer aborts on a dead connection, new sessions open eagerly, and the terminal holds still while a keyboard closes (`2493a86b`, `b43bb055`, `aaef17d9`)

**Arena**

* Ten guardians joined the original six, for sixteen encounters in all: Cursor, Cline, Grok, ZCode, Kimi, CodeBuddy, Antigravity, Devin, Gemini and Hermes (`e5168da2`, `5645c96c`, `d6decc70`, `8061402d`, `4973757a`, `450af4d3`, `6b380f76`, `40c419ee`, `8fcdbc62`, `1b9225f4`)
* Each guardian owns its entrance, exit and lane rhythm, and each companion effect is unlocked by its own win (`f22f1fa4`, `99af3cd9`, `f724edac`)

## Fixes

* Fixed the gateway's records area: a whole record is clickable, centred and flush right, records stay readable under the route map, and the Members card still scrolls in a short window (`7125dbec`, `74bdc80a`, `5dbf5adb`, `55c44aa4`)
* Fixed the route map: the wheel no longer leaves the map, uncompiled references were repaired, and a picked request's replay moves on its own clock (`7124d834`, `8a138aff`, `95cd5545`)
* Fixed how the gateway reports failure: a gateway failure carries the gateway's own code, served models are named without route group ids, readable names replace internal ids, and protocol conversion plus full request metrics are visible (`a0e96be0`, `dc811559`, `aa5581b4`, `f88cd91f`)
* Fixed Provider import and drafts: the import picker starts empty and reports Keys honestly, the request-header editor opens on an empty object, a saved draft no longer looks unsaved, and `escape` still works after entering the form (`a9742023`, `3eb4cac3`, `a992d77f`, `dddfc731`)
* Fixed Provider presets: a preset starts on a protocol the Agent speaks, the gallery is stable, the hint names the applied preset, and a local Provider fetches models without a Key (`2acd1033`, `d01cfb4f`, `b6170ba0`, `a5bdabeb`)
* Fixed shared Providers: deletion tombstones are repaired, a template copy no longer becomes a template, and a Provider the Agent already uses is never offered (`ce94f22d`, `14cb47e8`, `cc39b24e`)
* Fixed SSH connections: an unpaired connection can be removed, SSH setup opens from the empty state, the add flows open as dialogs, and connection status uses the framework's status roles (`f4db1824`, `214c2a79`, `8e8e617e`, `08770715`)
* Fixed bootstrap: it asks for the Linux account the user names instead of assuming `ubuntu`, rejects locked accounts when sshd has no PAM, creates the sshd run directory on systemd-like hosts, and verifies the payload hash in the temp directory (`7f98abed`, `0b2aa0ec`, `e73a9032`, `600bd900`)
* Fixed WSL: forwarding is refused on a reserved port rather than a released one, and restore retries after `wsl --shutdown` (`81d0a35e`, `b29aeec6`)
* Fixed the timeline: a row toggling on the bottom edge no longer moves it, a fold control's press stays out of window-level selection, and an expanded reasoning row keeps its width beside the fold control (`c9a53a35`, `ed4a756f`, `ddbbca24`)
* Fixed auto-continue: a stopped turn pauses the next continuation (`36ffab18`)
* Fixed runtime switching: a switch waiting past its deadline still lands, and a selection change during initial preparation is accepted (`9fc56b16`, `0b825293`)
* Fixed the sidebar: a background refresh no longer fights the reader's scroll position, and deleting all on the archived page deletes every row (`189eab4a`, `5c9a3793`)
* Fixed the TUI: an imported Key is named by what it does, and Provider columns that cannot fit are dropped (`5e1c0e14`, `5c95e57a`)
* Fixed mobile: the text ladder reads its painted size, the resume path no longer aborts, and new sessions open eagerly (`3220066c`, `2493a86b`, `b43bb055`)
* Fixed the theme: an unchecked switch stays visible on module panels, and the light palette was retuned (`7f907c7b`, `f9e4bc2d`)
* Fixed security: the four open CodeQL and Dependabot alerts were cleared (`7f3cd8ab`)
* Fixed the browser: a desktop user agent is presented to bot checks, and one wheel notch scrolls as far as Chrome does (`a77f2550`, `3df31dd4`)
* Fixed macOS: the traffic lights stay visible when the window loses focus (`5a6618f5`)

## Performance

* The gateway virtualizes the request ledger and pages history, and a request appears in the ledger while it runs rather than only once it has finished (`61bf758d`, `2bd33a4b`)
* Long transcript bodies are read in chunks through a viewport, and windowed bodies fade at their edges instead of laying out everything they hold (`2c4ea55f`, `d121cbc4`, `cd945082`)
* A settled body is drawn as its head until the reader opens it (`6d322215`)
* The model list virtualizes, and a draft's endpoint and Key are probed once rather than on every keystroke (`61bf758d`, `351c58ae`)
* The Skill market's search replaced an eight-to-thirteen-second round trip with roughly one second, and the MCP market no longer depends on a background walk finishing (`be0ed3e3`, `6ff5ddff`)
* Linux x86\_64 release links run through lld with `--icf=all`, folding duplicate monomorphised bodies (`59ff0e94`)

## Internal, Build & Docs

* Version numbers were bumped to `0.1.0-rc.9` across the workspace, the desktop packager inputs, the Android versionName fallback, the READMEs, the deployment docs and the reviewed asset bundles
* The license SBOM and third-party notices were regenerated for the current graph: 1080 Cargo packages, 10 asset and font bundles, and 5 native and installer inputs, all approved
* Two workspace members arrived — `crates/model-gateway` for the gateway and `crates/model-catalog` for the bundled catalogue — and the database schema moved from 63 to 87
* The workspace moved to `gpui-kit` `0.8.0`, and `rustls` to `0.23.46` and `zip` to `9.1.3`
* Release engineering: headless server artifacts are linked inside a digest-pinned Debian 12 builder and checked against a glibc 2.35 floor, macOS server artifacts are built and ad-hoc signed, stable container images are mirrored to Docker Hub and CNB by copying the index GHCR already published, and `vibex-bin` republishes the reviewed Linux `.deb` on the AUR with checksums and `namcap` verification
* The Linux `.deb` is repacked into xz and drops from 119.8 MB to 69.8 MB; the packaging host now needs `xz` and `ld.lld`
* macOS and Windows packaging remains build and package evidence, and PDFium distribution approval still covers linux-x86\_64 only
* The SSH and WSL specification, the remote runtime contract and the architecture notes were filled in alongside the implementation (`25ba2957`, `56e72c03`)

## Related links

* [View the full diff on GitHub](https://github.com/vibex-ai/vibex/compare/v0.1.0-rc.8...v0.1.0-rc.9)
* [Previous release: v0.1.0-rc.8](https://vibex.peatboy.com/docs/en/changelog/v0.1.0-rc.8.md)
* [Next release: v0.1.0-rc.10](https://vibex.peatboy.com/docs/en/changelog/v0.1.0-rc.10.md)
* [Back to the changelog](https://vibex.peatboy.com/docs/en/changelog.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.