Installation and setup
Get BioRouter running in three steps: download, install, and connect an AI provider. The whole process takes about five minutes.
Download BioRouter
Download the installer for your platform from the Download page or from GitHub Releases.
- macOS: Open the
.dmgand drag BioRouter to/Applications - Windows: Unzip and run
BioRouter.exe - Linux (Debian):
sudo dpkg -i biorouter_*.deb - Linux (RPM):
sudo rpm -i BioRouter-*.rpm
chmod 755 ~/.config in Terminal and relaunch.
Connect an LLM provider
BioRouter will guide you on first launch. Choose the option that fits your needs:
- UCSF users: Select Azure OpenAI (UCSF ChatGPT) with endpoint
https://unified-api.ucsf.edu/general, deploymentgpt-5.2-2025-12-11, and your Versa API key. Or select Amazon Bedrock (UCSF Anthropic). Full details are in the UCSF setup guide. - Commercial API: Enter your Anthropic, OpenAI, or Google API key.
- Fully local: Install Ollama, pull a model (
ollama pull qwen3), and select Ollama in BioRouter. No API key, no data leaves your machine.
Verify and explore
Send a test message in the chat. If BioRouter responds, you're set. Open the Extensions sidebar to add agents, enable tools, and start building workflows.
macOS CLI installation
curl -fsSL https://github.com/BaranziniLab/BioRouter/releases/download/stable/download_cli.sh | bash
To update the CLI: biorouter update
Configuration file
All settings are stored in:
~/.config/biorouter/config.yaml # macOS / Linux
This file is shared between the Desktop app and the CLI. API keys are stored encrypted.
Troubleshooting
| Issue | Solution |
|---|---|
| No window on launch (macOS M-chip) | chmod 755 ~/.config then relaunch |
| Extension fails to activate | Ensure Node.js (npx) or Python/uv (uvx) is installed |
| API key not working | Verify the key is valid and has available quota |
| Logs | ~/.config/biorouter/logs/ |
UCSF setup guide
BioRouter is built for UCSF researchers. Use your institutional AI access for secure, compliant workflows with managed models.
Option A: UCSF Versa / Azure OpenAI (recommended)
UCSF's institutional AI platform, accessed via Azure OpenAI. Get your API key at:
ai.ucsf.edu/platforms-tools-and-resources/ucsf-versa
- In BioRouter, go to Settings, Models, Azure OpenAI, Configure
- Enter the endpoint and credentials below, then click Save
- Click Launch to start chatting
| Field | Environment variable | Value |
|---|---|---|
| Endpoint | AZURE_OPENAI_ENDPOINT | https://unified-api.ucsf.edu/general |
| Deployment Name | AZURE_OPENAI_DEPLOYMENT_NAME | gpt-5.2-2025-12-11 |
| API Version | AZURE_OPENAI_API_VERSION | 2025-01-01-preview |
| API Key | AZURE_OPENAI_API_KEY | Your UCSF Versa API key |
Data stays within UCSF's Azure tenant, safe for institution-approved use cases.
Option B: Amazon Bedrock (UCSF MuleSoft proxy)
UCSF provides access to Anthropic Claude models via Amazon Bedrock, routed through the UCSF MuleSoft gateway. Your data does not leave UCSF's infrastructure. BioRouter handles credential configuration for you; you only enter two values.
Step 1: Obtain your credentials
The UCSF Bedrock proxy uses a static AWS Access Key and Secret Key pair. These are not personal AWS SSO credentials. Obtain them from your lab's BioRouter onboarding document or contact the Baranzini Lab or UCSF Research IT for access.
| What you need | Notes |
|---|---|
| AWS Access Key ID | 32-character hex string provided by UCSF |
| AWS Secret Access Key | 32-character mixed string provided by UCSF |
us-west-2) and UCSF proxy endpoint, and handles credential persistence across shell, ~/.aws files, and the macOS system environment. You don't need to run any scripts.
Step 2: Enter credentials in BioRouter
- Go to Settings, Models, Amazon Bedrock, Configure
- Enter a Profile Name (any name, e.g.,
UCSF Bedrock) - Enter your AWS Access Key ID
- Enter your AWS Secret Access Key
- Click Save. BioRouter writes the necessary credential files and injects environment variables at the OS level.
Step 3: Launch and verify
- Set Model to
us.anthropic.claude-sonnet-4-6(default) - Click Launch and send a test message to verify
Available models
| Model | Model ID | Notes |
|---|---|---|
| Claude Sonnet 4.6 · default | us.anthropic.claude-sonnet-4-6 | Good speed and capability balance |
| Claude Sonnet 4.0 | us.anthropic.claude-sonnet-4-20250514-v1:0 | Previous generation Sonnet |
| Claude Opus 4.5 | us.anthropic.claude-opus-4-5-20251101-v1:0 | Highest capability, slower |
| Claude Opus 4.1 | us.anthropic.claude-opus-4-1-20250805-v1:0 | Previous Opus generation |
Only models permitted by UCSF's IAM policy are listed; selecting others returns an authentication error.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| "The security token included in the request is invalid" | BioRouter is hitting real AWS (not the UCSF proxy) because the endpoint variable is missing | Re-run the setup; quit and relaunch BioRouter |
| "invalid model identifier" | Model ID missing us. prefix or -v1:0 suffix | Use a model ID exactly as listed in the table above |
| Auth error in GUI, CLI works fine | launchctl vars not set; the GUI app doesn't inherit shell env | Re-run the script, then fully quit and relaunch BioRouter |
| "AccessDeniedException" on a specific model | Model not permitted by UCSF IAM policy | Switch to one of the four confirmed models above |
Option C: Local (Ollama, air-gapped)
For maximum privacy. Nothing ever leaves your device:
- Install Ollama from ollama.com/download
- Pull a model:
ollama pull qwen3 - In BioRouter, select Ollama as your provider. No configuration needed.
Other institutions
Check with your institution's IT or compliance office for approved AI hosting options. For institutions without managed AI services, commercial API keys (Anthropic, OpenAI) or local Ollama inference are options. Always verify compliance before processing any sensitive data.
Providers and models
BioRouter connects to a range of LLM providers. Switch providers any time from Settings → Models without changing your workflows. Defaults below reflect biorouter v1.75.2.
UCSF institutional providers
| Provider | Access | Default model |
|---|---|---|
| Versa Azure OpenAI (UCSF ChatGPT) | UCSF Versa API key · Setup guide → | gpt-5.2-2025-12-11 |
| Versa Bedrock (UCSF Anthropic) | UCSF Versa credentials · Setup guide → | us.anthropic.claude-sonnet-4-6 |
Commercial cloud providers
| Provider | Env variable | Default model | Get API key |
|---|---|---|---|
| Anthropic | ANTHROPIC_API_KEY | claude-sonnet-4-6 | platform.claude.com |
| OpenAI | OPENAI_API_KEY | gpt-5.2 | platform.openai.com |
| Azure OpenAI (own tenant) | AZURE_OPENAI_API_KEY | gpt-5.2-2025-12-11 | Your Azure portal |
| Google Gemini | GOOGLE_API_KEY | gemini-2.5-pro | aistudio.google.com |
| X.AI (Grok) | XAI_API_KEY | grok-code-fast-1 | console.x.ai |
| OpenRouter | OPENROUTER_API_KEY | anthropic/claude-sonnet-4 | openrouter.ai |
| Amazon Bedrock (own AWS) | AWS IAM credentials | us.anthropic.claude-sonnet-4-6 | Your AWS console |
Every provider exposes its full model list once configured — defaults above are what BioRouter selects when no model is specified.
Local models with Ollama
Install Ollama, pull any model, and select Ollama in BioRouter. Everything stays on your machine. Default model: qwen3.
ollama pull qwen3 # General-purpose default ollama pull llama3.2 # Fast lightweight option ollama pull deepseek-r1 # Strong reasoning model
Browse all available Ollama models →
Switching providers
Desktop: Settings → Models, select a provider card, Configure or Launch.
CLI: biorouter configure, then Configure Providers
Extensions, skills, and MCP
Extend BioRouter with built-in capabilities, third-party MCP servers, and reusable skill bundles. Defaults reflect biorouter v1.75.2 (ui/desktop/src/built-in-extensions.json).
Built-in extensions
Ship with BioRouter — no install needed. Enable or disable any of them from Settings → Extensions.
| Extension | What it does | Default |
|---|---|---|
| Developer | File operations, shell commands, code search, text editing | On |
| Computer Controller | General computer-control tools for non-developer workflows | Off |
| Auto Visualiser | Automatically render UI for the data BioRouter produces | Off |
| Memory | Persist preferences and context across sessions | Off |
| Tutorial | Interactive in-app tutorials and guides | Off |
Installing a .brxt extension
BioRouter extensions are distributed as .brxt bundles — a zipped manifest plus a Python MCP server entry point. Installation is drag-and-drop; no terminal needed.
- Download a
.brxtfile from the BAAM marketplace. - In BioRouter, open Settings → Extensions → Add Extension.
- Drag the
.brxtfile onto the drop zone (or click Browse file…). BioRouter validates the manifest and previews the extension's name, version, tool count, and any bundled skills. - Click Next: Configure → and fill in any required environment variables (API keys, endpoints). Secrets are stored in BioRouter's keyring; non-secret values are written into
config.yaml. - Click Install. BioRouter unpacks the bundle, runs it via
uv run --directory <installDir> <entry_point>, and enables it automatically.
Any bundled skills inside the .brxt are installed alongside the extension and appear under BioRouter → Skills.
Adding an external MCP server manually
Desktop: Settings → Extensions → Add custom extension. Pick the transport (stdio / SSE / streamable HTTP), then enter ID, name, command, args, and env vars.
Config file (~/.config/biorouter/config.yaml):
extensions:
github:
name: GitHub
cmd: npx
args: [-y, "@modelcontextprotocol/server-github"]
enabled: true
envs:
GITHUB_PERSONAL_ACCESS_TOKEN: "<your_token>"
type: stdio
timeout: 300
Skills system
A skill is a folder containing a SKILL.md file with YAML frontmatter (name, description, optional user-invocable) and freeform instructions. BioRouter loads every skill it finds under ~/.config/biorouter/skills/, ~/.claude/skills/, and ~/.config/agents/skills/.
Installing a skill (drag-and-drop)
- Download a skill
.zipfrom the BAAM marketplace (or write your ownSKILL.md). - In BioRouter, open Skills → Add Skill.
- Drag the
.zip(bundle of many skills) or a single.mdfile onto the drop zone. BioRouter parses the frontmatter, previews the skill(s), and on confirmation copies them into~/.config/biorouter/skills/<slug>/.
Auto-applied skills activate whenever BioRouter encounters a relevant file or task. To bypass the GUI entirely, unzip a bundle and copy the folder into ~/.config/biorouter/skills/ directly — BioRouter picks it up on next launch.
Skill folders are plain text and reproducible. Share them across a lab or institution to standardize analysis style without sharing any underlying data.
Workflows and automation
A Workflow is a portable YAML file that packages a prompt, the extensions and skills it needs, and an optional schedule. Workflows are the foundation of federated research collaboration in BioRouter — instructions travel between institutions, data does not. (Schema reference: crates/biorouter/src/workflow/mod.rs.)
Workflow YAML format
A minimum workflow needs three top-level fields: version, title, description, plus at least one of instructions or prompt. Everything else is optional.
version: 1.0.0
title: Literature review
description: Summarize recent papers on a research topic.
instructions: |
You are a scientific literature reviewer. Read the user-supplied
topic, search for relevant publications, and write a structured
summary focused on clinical relevance and methodology.
prompt: |
Summarize the past {{ years }} years of work on {{ topic }}.
# pin a provider/model/temperature for reproducibility
settings:
biorouter_provider: versa_bedrock
biorouter_model: us.anthropic.claude-sonnet-4-6
temperature: 0.2
# pre-enable extensions the workflow expects to use
extensions:
- type: builtin
name: developer
# activity pills shown while the workflow loads
activities:
- Fetch papers
- Summarize findings
- Cite sources
# typed parameters surfaced in the GUI / CLI
parameters:
- key: topic
input_type: string
requirement: required
description: Research topic to review.
- key: years
input_type: number
requirement: optional
default: 3
# compose larger flows from smaller ones
sub_workflows:
- name: cite-check
path: ./sub-workflows/cite-check.yaml
# retry policy for transient failures
retry:
max_attempts: 3
Running a workflow
Desktop: Sidebar → Workflows → select a workflow → fill parameters → Run. To import a workflow file, use Workflows → Import workflow.
CLI:
biorouter run --recipe workflow.yaml --params topic="SPOKE knowledge graph",years=5
Creating a workflow from a session
After an exploratory chat that produced a useful result, open Workflows → Create from session. BioRouter extracts the instructions, the extensions you actually used, and the model you ran on into a fresh YAML file you can edit, share, or schedule.
Scheduling workflows
Schedules are managed separately from the workflow file via BioRouter's scheduler (Sidebar → Schedules → New schedule). Pick a workflow, give it a cron expression, and BioRouter's background service runs it on cadence — even with the desktop app closed.
cron: "0 8 * * 1" # Every Monday at 8:00 AM
Sharing workflows
Workflow files are plain YAML text. Commit them to a shared repository, publish them on GitHub, or email them. Recipients open them with Workflows → Import workflow or biorouter run --recipe <file.yaml>. No data is embedded — only the instructions, extension list, and parameter schema travel.
Data privacy guide
BioRouter routes your inputs to an LLM provider. Privacy properties depend on which provider you use. Here's how to choose the right one.
Provider privacy properties
| Provider | Data stays within | Best for |
|---|---|---|
| Ollama (local) | Your device only, no network | Maximum privacy, air-gapped requirements |
| UCSF Azure OpenAI | UCSF's Azure tenant | Institution-approved clinical use cases |
| UCSF Amazon Bedrock | UCSF's AWS environment | Institution-approved clinical use cases |
| Commercial APIs (personal) | Provider's cloud infrastructure | De-identified or non-sensitive data only |
Best practices
- De-identify first. Remove names, dates of birth, MRNs, and other identifiers before any AI processing.
- Minimize data exposure. Provide only what's needed for the task.
- Prefer local models for exploratory work with real data.
- Protect your device. Session logs at
~/.config/biorouter/logs/may contain your inputs. - Never share sessions that contain patient or sensitive data.
- Always verify with UCSF IT or your compliance office before processing regulated data.
Architecture
BioRouter is a modular, plugin-based system with a Rust backend and an Electron and React frontend, connected via a local REST API.
Three-layer design
- Interface: Desktop GUI (Electron and React 19) or CLI. Accepts user input and renders responses.
- Agent Core: Rust reasoning loop managing LLM interaction, tool execution, context, and session state.
- Extensions: Pluggable MCP servers that provide tools: file system, databases, web, code execution, and custom agents.
Backend Rust workspace
| Crate | Role |
|---|---|
biorouter | Core agent library: loop, providers, sessions, workflows, scheduling |
biorouter-server | Local REST API server (biorouterd) the desktop communicates with |
biorouter-cli | CLI binary: biorouter session, biorouter configure, and so on |
biorouter-mcp | Built-in MCP servers (Developer, Computer Controller, and others) |
Key dependencies: tokio (async), axum (HTTP), rmcp (Model Context Protocol), serde/serde_json, tiktoken-rs (token counting), sqlx/SQLite (session persistence), minijinja (recipe templates), tokio-cron-scheduler.
Frontend Electron and React
Desktop app: Electron 39, React 19, TypeScript, built with Vite and Electron Forge. Communicates with the local biorouterd REST API.
Model Context Protocol (MCP)
All extensions use MCP, a standard protocol for LLM tool invocation. Any MCP-compatible server (local process or remote HTTP) can be added as a BioRouter extension. This enables a growing open ecosystem of research agents.
MCP agents
BioRouter connects to local and remote MCP agents for specialized research tasks. Browse the agent ecosystem in the BAAM marketplace.
Adding an agent via desktop UI
- Go to Sidebar, Extensions, Add custom extension
- Choose type: Command-line (stdio) for local agents or Streamable HTTP for remote
- Enter the agent name and command (e.g.,
uvx --from git+https://... agentname) - Add any required environment variables
- Click Add and enable the extension
Adding an agent via config YAML
extensions:
spokeagent:
name: SPOKE Agent
cmd: uvx
args:
- --from
- "git+https://github.com/BaranziniLab/SPOKEAgent"
- spokeagent
enabled: true
type: stdio
timeout: 300
Remote HTTP agents
extensions:
remote-agent:
name: My Remote Research Agent
url: https://my-agent.example.com/mcp
type: streamable_http
enabled: true
timeout: 300
Prerequisites
Most UCSF agents use uvx, which requires Python and uv. Install with:
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux # or: pip install uv
Playwright MCP uses npx, which requires Node.js: nodejs.org
Available agents
Browse all available agents, copy install commands, and find GitHub links in the BAAM marketplace →