diff --git a/autoqa/checklist.md b/autoqa/checklist.md
index cc48f170d..6742f881e 100644
--- a/autoqa/checklist.md
+++ b/autoqa/checklist.md
@@ -98,6 +98,7 @@ In Remote Model Providers:
- [ ] Anthropic
- [ ] Cohere
- [ ] OpenRouter
+ - [ ] OrcaRouter
- [ ] Mistral
- [ ] Groq
- [ ] Gemini
diff --git a/docs/src/pages/docs/desktop/remote-models/_meta.json b/docs/src/pages/docs/desktop/remote-models/_meta.json
index a21422d9d..f0932dfeb 100644
--- a/docs/src/pages/docs/desktop/remote-models/_meta.json
+++ b/docs/src/pages/docs/desktop/remote-models/_meta.json
@@ -20,6 +20,9 @@
"openrouter": {
"title": "OpenRouter"
},
+ "orcarouter": {
+ "title": "OrcaRouter"
+ },
"huggingface": {
"title": "Hugging Face"
}
diff --git a/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx b/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx
new file mode 100644
index 000000000..cf0310a33
--- /dev/null
+++ b/docs/src/pages/docs/desktop/remote-models/orcarouter.mdx
@@ -0,0 +1,101 @@
+---
+title: OrcaRouter
+description: A step-by-step guide on integrating Atomic Chat with OrcaRouter.
+keywords:
+ [
+ Jan,
+ Customizable Intelligence, LLM,
+ local AI,
+ privacy focus,
+ free and open source,
+ private and offline,
+ conversational AI,
+ no-subscription fee,
+ large language models,
+ OrcaRouter integration,
+ OrcaRouter,
+ ]
+---
+
+import { Callout, Steps } from 'nextra/components'
+import { Settings, Plus } from 'lucide-react'
+
+# OrcaRouter
+
+## Integrate OrcaRouter with Atomic Chat
+
+[OrcaRouter](https://www.orcarouter.ai) is an AI gateway that routes every
+request to the best model for the job — mixing frontier models, open-weight
+models, and long-context specialists behind one unified, OpenAI-compatible
+API. It also runs gateway-level, zero-trust security for AI agents on the same
+endpoint — screening every prompt/response and governing every tool call on a
+default-deny basis, with no application code changes.
+
+Atomic Chat supports the OrcaRouter API, so you can use one key to reach any
+of the 150+ models OrcaRouter routes to (Anthropic, Google, DeepSeek, MiniMax
+and more) without juggling a separate API key per provider.
+
+## Integrate OrcaRouter with Atomic Chat
+
+
+
+### Step 1: Get Your API Key
+1. Visit [OrcaRouter](https://www.orcarouter.ai) and sign in
+2. Create & copy a new API key (keys are prefixed `sk-orca-`) or copy your existing one
+
+
+`orcarouter/auto` is OrcaRouter's smart routing model: send every request to
+it and the gateway picks the cheapest model that satisfies the request, so
+you get frontier quality without the frontier price.
+
+
+### Step 2: Configure Atomic Chat
+
+1. Navigate to the **Settings** page ()
+2. Under **Model Providers**, select **OrcaRouter**
+3. Insert your **API Key**
+
+### Step 3: Start Using OrcaRouter Models
+
+1. Pick any existing **Chat** or create a new one
+2. Select any model from **model selector** under OrcaRouter
+3. Start chatting
+
+
+
+## Available Models Through OrcaRouter
+
+Atomic Chat automatically lists OrcaRouter's available models via its
+`/v1/models` endpoint. For custom configurations:
+
+**Model Field Settings:**
+- Leave empty to use your account's default model
+- Specify a model using the format: `orcarouter/` or
+ `/`
+- The full model catalog is available at [https://www.orcarouter.ai/models](https://www.orcarouter.ai/models)
+
+**Examples of Model IDs:**
+- Smart router: `orcarouter/auto`
+- Claude via OrcaRouter: `anthropic/claude-sonnet-4.6`
+- Gemini via OrcaRouter: `google/gemini-3-flash-preview`
+
+## Troubleshooting
+
+Common issues and solutions:
+
+**1. API Key Issues**
+- Verify your API key is correct and starts with `sk-orca-`
+- Check you have sufficient credits in your OrcaRouter account
+- Ensure you have access to the model you're trying to use
+
+**2. Connection Problems**
+- Check your internet connection
+- Verify the API base URL is `https://api.orcarouter.ai/v1`
+- Look for error messages in [Atomic Chat's logs](/docs/desktop/troubleshooting#how-to-get-error-logs)
+
+**3. Model Unavailable**
+- Confirm the model is currently available on OrcaRouter
+- Check if you're using the correct model ID format (`orcarouter/` prefix for routers)
+- Verify the provider is currently operational
+
+Need more help? Join our [Discord community](https://discord.com/invite/8wGSsvmg4V) or check the [OrcaRouter documentation](https://docs.orcarouter.ai).
diff --git a/tests/checklist.md b/tests/checklist.md
index 7e843bdb8..e06ae1a5d 100644
--- a/tests/checklist.md
+++ b/tests/checklist.md
@@ -113,6 +113,7 @@ In Remote Model Providers:
- [ ] [0.7.0] Azure
- [ ] Cohere
- [ ] OpenRouter
+ - [ ] OrcaRouter
- [ ] Mistral
- [ ] Groq
- [ ] Gemini
diff --git a/web-app/public/images/model-provider/orcarouter.svg b/web-app/public/images/model-provider/orcarouter.svg
new file mode 100644
index 000000000..7a331df6a
--- /dev/null
+++ b/web-app/public/images/model-provider/orcarouter.svg
@@ -0,0 +1,3 @@
+
diff --git a/web-app/src/constants/models.ts b/web-app/src/constants/models.ts
index 0b86a494b..aac0b12b4 100644
--- a/web-app/src/constants/models.ts
+++ b/web-app/src/constants/models.ts
@@ -777,6 +777,15 @@ export const providerModels = {
supportsToolCalls: true,
supportsN: true,
},
+ 'orcarouter': {
+ models: true,
+ supportsCompletion: true,
+ supportsStreaming: true,
+ supportsJSON: true,
+ supportsImages: true,
+ supportsToolCalls: true,
+ supportsN: true,
+ },
'nvidia': {
models: ['moonshotai/kimi-k2.5', 'minimaxai/minimax-m2.5', 'z-ai/glm5'],
supportsCompletion: true,
diff --git a/web-app/src/lib/__tests__/models.test.ts b/web-app/src/lib/__tests__/models.test.ts
index 5cfe28888..49043c9e2 100644
--- a/web-app/src/lib/__tests__/models.test.ts
+++ b/web-app/src/lib/__tests__/models.test.ts
@@ -418,6 +418,13 @@ describe('getModelCapabilities', () => {
expect(capabilities).not.toContain(ModelCapabilities.VISION)
})
+ it('handles orcarouter like other OpenAI-compatible providers', () => {
+ const capabilities = getModelCapabilities('orcarouter', 'orcarouter/auto')
+ expect(capabilities).toEqual([ModelCapabilities.COMPLETION])
+ expect(capabilities).not.toContain(ModelCapabilities.TOOLS)
+ expect(capabilities).not.toContain(ModelCapabilities.VISION)
+ })
+
it('handles model not in capability list', () => {
const capabilities = getModelCapabilities('xai', 'grok-2-vision-1212')
expect(capabilities).toContain(ModelCapabilities.COMPLETION)
diff --git a/web-app/src/lib/__tests__/utils.test.ts b/web-app/src/lib/__tests__/utils.test.ts
index 70d38845a..770587b8d 100644
--- a/web-app/src/lib/__tests__/utils.test.ts
+++ b/web-app/src/lib/__tests__/utils.test.ts
@@ -23,6 +23,9 @@ describe('getProviderLogo', () => {
expect(getProviderLogo('openai')).toBe('/images/model-provider/openai.svg')
expect(getProviderLogo('gemini')).toBe('/images/model-provider/gemini.svg')
expect(getProviderLogo('nvidia')).toBe('/images/model-provider/nvidia.svg')
+ expect(getProviderLogo('orcarouter')).toBe(
+ '/images/model-provider/orcarouter.svg'
+ )
})
it('returns undefined for unknown providers', () => {
@@ -36,6 +39,7 @@ describe('getProviderTitle', () => {
expect(getProviderTitle('llamacpp')).toBe('llama.cpp turboquant')
expect(getProviderTitle('openai')).toBe('OpenAI')
expect(getProviderTitle('openrouter')).toBe('OpenRouter')
+ expect(getProviderTitle('orcarouter')).toBe('OrcaRouter')
expect(getProviderTitle('gemini')).toBe('Gemini')
expect(getProviderTitle('nvidia')).toBe('NVIDIA NIM')
})
diff --git a/web-app/src/lib/model-factory.ts b/web-app/src/lib/model-factory.ts
index cb60d4bd4..249d75685 100644
--- a/web-app/src/lib/model-factory.ts
+++ b/web-app/src/lib/model-factory.ts
@@ -767,6 +767,7 @@ export class ModelFactory {
case 'moonshot':
case 'minimax':
case 'openrouter':
+ case 'orcarouter':
case 'huggingface':
case 'nvidia':
case 'ollama':
diff --git a/web-app/src/lib/utils.ts b/web-app/src/lib/utils.ts
index 05f6f2aac..2801f8fff 100644
--- a/web-app/src/lib/utils.ts
+++ b/web-app/src/lib/utils.ts
@@ -93,6 +93,8 @@ export function getProviderLogo(provider: string) {
return '/images/model-provider/mistral.svg'
case 'openrouter':
return '/images/model-provider/open-router.svg'
+ case 'orcarouter':
+ return '/images/model-provider/orcarouter.svg'
case 'groq':
return '/images/model-provider/groq.svg'
case 'cohere':
@@ -176,6 +178,8 @@ export const getProviderTitle = (provider: string) => {
return 'OpenAI'
case 'openrouter':
return 'OpenRouter'
+ case 'orcarouter':
+ return 'OrcaRouter'
case 'gemini':
return 'Gemini'
case 'huggingface':