BLAID · Bridge for Local AI Dispatch

Your AI models, for every app you choose.

BLAID is a small service you install once. It holds your model providers and API keys, and gives games, websites and desktop apps one API to use them. Apps never see a key: you approve each one once, and pick the model it gets.

  • 1.0.0-rc.1
  • Windows · macOS · Linux
  • Chrome · Firefox
  • Apache-2.0
BLAID's consent window: Tavern Tales asks for an npc-dialogue role, pre-filled with Qwen3 8B on this computer, an optional summaries role, and two tools, with Deny and Allow buttons
The first time an app asks, BLAID shows this. Nothing happens until you press Allow.

AI in apps is stuck between two bad options.

Either each app asks for your keys, or it ships its own model. BLAID is the third option: the apps you approve share the models you already have, on your terms.

Every app wants your API key

Adding AI to an app today usually means pasting a paid key into it, or trusting the app's own servers with your prompts. BLAID keeps keys in your system keychain. Apps get a grant you can narrow or revoke, never the key.

Every game ships its own model

Bundling gigabytes of model weights in each game ignores the models and GPU you already have. With BLAID a game asks for a role such as npc-dialogue, and gets whichever model you mapped to it.

Web pages can't reach your machine

Browsers keep tightening access to localhost: Chrome added local-network prompts in 142 and a separate loopback permission in 145. BLAID's extension relays pages to the service over Native Messaging, one site at a time.

How it works

  1. 1

    Install BLAID and point it at your models

    It runs in the tray. Ollama on this computer is picked up on its own. Add LM Studio, llama.cpp or any OpenAI-compatible server by address, a model server on another PC, or OpenAI and Anthropic with a key that goes straight into your OS keychain.

    Providers tab: Ollama models on this computer, LM Studio on a PC on the network, OpenAI online, and an offline Ollama
  2. 2

    An app asks; you approve it once

    The app names the roles it needs, like npc-dialogue, and what each one requires. BLAID pre-selects the best model that qualifies, greys out the rest with the reason (missing feature: tools), lists the tools the app's model may ask for, and says plainly if a choice would send prompts online.

    Pick a paid online model and BLAID shows its price, says the prompts will leave your computer, and pre-fills a budget for that app. The same approval then covers every route the app arrives by: its website, its desktop build, a new game world.

    Consent window for Quill & Quest: GPT-4o chosen at $2.50 / $10 per million tokens, a notice that prompts will be sent to OpenAI, and a budget of 200,000 tokens a day, 20 requests a minute and $5 a month
    Choosing an online model: price, a plain warning, and a budget before anything is sent.
  3. 3

    The app talks to your models, whatever pipe it has

    Here a Luanti mod with no network access streams the innkeeper's lines through files in its own world folder, and she hands over torches and bread with a tool call. Below, a web page reaches the same models through the extension.

    Luanti game: Mara the innkeeper says 'Here are your three torches and one loaf of bread!' and the chat log shows she handed them over
    A sandboxed game mod, over the file transport.
    A web chat page showing 'ready (extension)' and a streamed answer from role:chat
    A website, through the browser extension.

Watch it end to end

50 seconds, two apps: a website asks for access through the extension and streams a reply, then a sandboxed game mod does the same with no network at all.

Recorded on Linux with an early build, before the rename to BLAID, on 2026-11-04.

One service in the middle. Thin pieces around it.

BLAID owns every key, approval and model choice. Apps reach it by whichever route their platform allows; the messages are the same on all of them.

For developers: about ten lines, and no key handling

Declare your roles and tools once. Show whatever state you get. Ask for access from a button. Then prompt, stream, run multi-turn sessions and tool calls like any Open Responses client.

import { Bridge } from "@local-model-bridge/sdk";

const bridge = await Bridge.connect({
  app: { id: "com.example.tavern", name: "Tavern Tales" },
  roles: {
    "npc-dialogue": {
      description: "Speaks for the innkeeper",
      require: { features: ["tools"], minContextTokens: 8192, general: { min: "ref:gpt-4o-mini" } },
    },
  },
  tools: [{ name: "give_item", description: "Hands the player an item" }],
});

bridge.addEventListener("statechange", () => render(bridge.state, bridge.ui()));
if (bridge.state === "no_grant") await bridge.requestAccess(); // from a button

for await (const chunk of bridge.promptStreaming("Good evening!", { role: "npc-dialogue" })) {
  showText(chunk);
}

Node, Electron and browser pages share one SDK. Its names follow Chrome's Prompt API, and it falls back to Chrome's built-in model when no BLAID is installed.

Package names are from 1.0.0-rc.1 and change with the rename to BLAID; nothing is on npm, PyPI or NuGet yet.

Your UI is a switch statement

Detection always returns exactly one of seven states, and every SDK ships ready-made wording for each, so “BLAID isn't installed” and “this site isn't enabled” never look like errors.

  1. not_installedNo BLAID on this machineOffer the download
  2. extension_missingWeb: no extensionInstall BLAID and its extension
  3. not_enabledWeb: site not enabledEnable this site from the toolbar
  4. not_runningInstalled, not answeringStart BLAID
  5. no_grantRunning, not approvedAsk for access (opens consent)
  6. no_modelApproved, no model fitsSay what the role needs
  7. readyGood to goPrompt away

Ask for capability, not a model name

A role says what it needs: features (tools, vision, structured_output), context length, and a capability floor. The floor is a reference model (ref:gpt-4o-mini, “at least this good”) or a number on the Epoch Capabilities Index, an open scale where Claude 3.5 Sonnet is 130 and GPT-5 is 150.

match ranks the user's models against it and explains every miss (context 4096 < 8192), so your app or the consent screen can say exactly what to install. Scores come from a signed catalog that updates without a BLAID release; users can enter their own for models it doesn't know.

Scores dialog: a number box over a colour-graded tier scale with reference models such as gpt-4o-mini and gpt-5 marked
Setting a score by hand, against reference models on the same scale.

You stay in charge after you say yes

Approval is once per app, never forever. Remap a role, cap spending, turn tool use off, block one route or revoke the app entirely; it finds out at once.

An approved app's page: role-to-model mapping, tool switch and routes
Each approved app has one page: which model fills each role, whether its model may call tools, and every route it has arrived by. Change any of it and the app updates without a restart.

Built for a service that holds keys that cost money

Default deny

An app gets nothing until you approve it in BLAID's own window, and then only the roles, models, tools and spending you approved.

Loopback only

BLAID never listens on your network, and rejects any request whose Host header isn't localhost (a DNS-rebinding guard).

Browser-verified websites

Pages arrive through the extension, which attaches the origin the browser reports, never what the page claims.

Keys stay put

Provider keys live in the OS keychain. No endpoint returns them; apps and the extension never see them.

No content logging

Logs keep times, app, model, token counts, tool names and errors. A CI check enforces it. There is no telemetry.

Hostile input

A small hand-written HTTP loop with size caps, fuzzed nightly along with the SSE parsers, native-messaging framing and request JSON.

The service is Rust, with a public threat model and a 22-item security self-review. What it can't do: protect you from malware already running as you, or prove a desktop app's identity (it shows the program's path instead). An outside security review comes before 1.0.

Standards first; new parts only where none exist

BLAID invents only what no standard covers: capability descriptors, requirement matching, roles, grants and detection states.

Open Responses
Requests, streaming and tool calls use the multi-vendor standard built on the OpenAI Responses API, pinned to 2026-04-24.
OpenAPI 3.1 + JSON Schema
The /bridge/v1 contract is frozen; CI rejects anything but additive changes. SDK types are generated from it.
Chrome Prompt API shape
prompt(), promptStreaming(), create(): web developers reuse what they already know.
Native Messaging
How pages reach BLAID in Chrome and Firefox, without CORS or localhost permission prompts.
Server-Sent Events
Streams and change events, resumable with Last-Event-ID.
OS keychains
macOS Keychain, Windows Credential Manager, Linux Secret Service. No keys in config files.
Ed25519 signatures
The model-score catalog is signed and checked against a key compiled into BLAID.
Epoch Capabilities Index
One open-ended capability scale, so a requirement written today means the same in three years.

Where it stands: 1.0.0-rc.1

All five v1 milestones are built and merged, and the API is frozen. What's left before 1.0 needs people and machines more than code.

PartCoversWorking todayStill to do
Service and desktop appWindows, macOS, LinuxBuilt; conformance suite runs on all three in CIReal installs on a Mac and a Windows PC
Browser extensionChromePer-site enable, consent and streaming workStore listing
Browser extensionFirefoxBuilds and passes web-ext lintA first real run
Local providersOllama, llama.cpp, LM Studio, vLLM, LocalAI, JanOllama tested against a real server; the others against documented responsesLive runs beyond Ollama
Online providersOpenAI, AnthropicAdapters, keychain and budgets builtRecorded live fixtures
SDKsTypeScript, Python, C# + Unity, Lua (Luanti)All v1; Luanti mod streams on a Luanti 5.10 serverUnity Editor builds; package publishing

Before 1.0

  • Outside security review, and signed installers for Windows and macOS
  • First-time users on all three systems reaching “ready” in under two minutes
  • Extension store listings for Chrome and Firefox
  • Two developers outside the project reviewing the spec
Help test it

Questions

What does BLAID stand for?
Bridge for Local AI Dispatch. It sits between your apps and your models and routes each request to the model you chose. Screenshots on this page still show its working name, Local Model Bridge.
Do my prompts leave my computer?
Only when you map a role to an online provider such as OpenAI or Anthropic, and the consent screen says so in plain words. Local and LAN models never leave your network, and BLAID itself sends no telemetry.
Why not let apps call Ollama directly?
Ollama has no idea which app is asking, can't hold keys for paid providers, and browsers increasingly block pages from reaching it. BLAID adds consent, roles, budgets and one API over Ollama and everything else.
Does it download models or need a GPU?
No to both. BLAID uses whatever you already run (Ollama, LM Studio, llama.cpp) or the online providers you add a key for. It never pulls models in v1.
How does an app pick a model it has never heard of?
It doesn't. It states what a role needs: features like tools or vision, context length, and a capability floor such as "at least as good as gpt-4o-mini". BLAID ranks your models against that and you confirm.
Which games can use it?
Anything that can make an HTTP call: Unity, Godot, Unreal, Minecraft Java, SMAPI, SKSE. Sandboxes that only allow files, like Luanti, use the file transport. Roblox and WoW add-ons are out of reach.
Can a model run tools on my computer?
Not in v1. Tools are defined by the app and run inside the app ("give the player a torch"). BLAID only lets a model call tools the app declared and you approved, and you can switch tool use off per app.
Is it open source? When can I install it?
It is Apache-2.0 licensed and at 1.0.0-rc.1: every v1 milestone is built and the API is frozen. Join the list to hear when signed installers are ready to download.

Get 1.0 when it ships, or help it get there

Leave your email for the release. Tell us what you'd build, and tick the box if you'll try the release candidate on your machine.