Speak, friend, and enter.

Your AI providers. One gateway. OpenAI and Anthropic APIs, subscriptions, and local models — connected on your terms.

npm install -g durindoor

Walk through the dashboard, no install

The demo runs the real DurinDoor interface against mocked data, so you can click every page before you run it yourself.

Open the live demo ↗

Mocked data. Nothing leaves your browser.

One door, every provider

Nine kinds of model call, one key.

The same key and base URL cover chat, embeddings, speech, images, video, search, and fetch.

238providers in the registry
  • 195 providers

    Chat & code

    /v1/chat/completions
  • 14 providers

    Embeddings

    /v1/embeddings
  • 13 providers

    Text to speech

    /v1/audio/speech
  • 7 providers

    Speech to text

    /v1/audio/transcriptions
  • 20 providers

    Image generation

    /v1/images/generations
  • 12 providers

    Vision

    image input
  • 4 providers

    Video

    /v1/video/generations
  • 17 providers

    Web search

    /v1/search
  • 6 providers

    Web fetch

    /v1/web/fetch

Provider counts come from the DurinDoor provider registry. Support for each modality depends on the provider.

How it works

Every request passes one door

Clients post OpenAI /v1/chat/completions or /v1/responses, or Anthropic /v1/messages. DurinDoor translates, picks a healthy account, and records the outcome.

Compatible tools

  • Claude Code
  • Codex
  • Cursor
  • Cline

DurinDoor

OpenAI / Anthropic APIs

/v1/chat/completions/v1/responses/v1/messages

Providers

  • OpenAI
  • Anthropic
  • Gemini
  • OpenRouter
  • DeepSeek
  • Ollama
providers in the registry ↗
  1. 01

    Knock

    A tool sends a /v1 request with a DurinDoor key and a model string.

  2. 02

    Resolve

    The key is checked, the model resolved, and a healthy connection chosen.

  3. 03

    Translate

    Formats are bridged both ways; the upstream call uses stored credentials.

  4. 04

    Record

    Usage, latency and outcome land in local SQLite. Switch the engine to Postgres when you outgrow the file.

model resolution

"model": "

  • resolve provider model
  • provider openai
  • upstream gpt-4.1
  • 200 OK stream · 412 ms

You choose the fallback order

A combo gives your client one model name. DurinDoor tries its configured members in order, retrying eligible accounts before moving to the next model.

Example configuration

Modelcoding-default
  1. 1cc/claude-sonnet
  2. 2openrouter/qwen3-coder
  3. 3ollama-local/qwen3

This order is an example, not a built-in subscription, API, or local-model priority.

Providers

OAuth plans, API keys, cookies, and local runtimes

Claude Code, Codex, Gemini CLI, Kiro, Cursor, and GitHub Copilot log in through OAuth. Compatible URLs and local runtimes sit next to them.

OAuth
Claude, Codex, Gemini CLI, Kiro, Cursor, Copilot
Custom nodes
Any compatible URL
Local
No remote account
DurinDoor

Compatible tools

Connect your tools

Claude Code, Codex, Cursor, Cline, Roo, and Continue have setup pages. Anything that speaks OpenAI uses the same base URL.

Token savers

Say less. Mean the same.

Opt-in compression trims prompts after translation and before they leave your machine. It fails open: if an engine errors, the original request goes through untouched.

−1,815bytes removed from this tool result
82%smaller: grouped by folder, long lists capped
find . -type f2,203 bytes
./open-sse/providers/registry/9router.js
./open-sse/providers/registry/agentrouter.js
./open-sse/providers/registry/aihorde.js
./open-sse/providers/registry/alibaba.js
./open-sse/providers/registry/anthropic.js
./open-sse/providers/registry/antigravity.js
./open-sse/providers/registry/assemblyai.js
./open-sse/providers/registry/azure.js
./open-sse/providers/registry/baidu.js
./open-sse/providers/registry/bedrock.js
./open-sse/providers/registry/black-forest-labs.js
./open-sse/providers/registry/brave-search.js
./open-sse/providers/registry/cartesia.js
./open-sse/providers/registry/cerebras.js
./open-sse/providers/registry/claude.js
./open-sse/providers/registry/cline.js
./open-sse/providers/registry/codex.js
./open-sse/providers/registry/cohere.js
./open-sse/providers/registry/copilot-web.js
./open-sse/providers/registry/cursor.js
./open-sse/providers/registry/deepgram.js
./open-sse/providers/registry/deepseek.js
./open-sse/providers/registry/elevenlabs.js
./open-sse/providers/registry/exa.js
./open-sse/providers/registry/firecrawl.js
./open-sse/providers/registry/fireworks.js
./open-sse/providers/registry/gemini.js
./open-sse/providers/registry/github.js
./open-sse/providers/registry/glm.js
./open-sse/providers/registry/groq.js
./open-sse/providers/registry/huggingface.js
./open-sse/providers/registry/kimi.js
./open-sse/providers/registry/kiro.js
./open-sse/providers/registry/minimax.js
./open-sse/providers/registry/mistral.js
./open-sse/providers/registry/nvidia.js
./open-sse/providers/registry/ollama.js
./open-sse/providers/registry/ollama-local.js
./open-sse/providers/registry/openai.js
./open-sse/providers/registry/openrouter.js
./open-sse/providers/registry/perplexity.js
./open-sse/providers/registry/qwen.js
./open-sse/providers/registry/together.js
./open-sse/providers/registry/vertex.js
./open-sse/providers/registry/xai.js
./open-sse/translator/index.js
./open-sse/translator/validate.js
./open-sse/translator/webTools.js
./open-sse/translator/formats.js
./open-sse/translator/formats/claude.js
./open-sse/translator/formats/gemini.js
./open-sse/translator/formats/responsesApi.js
./open-sse/translator/formats/openai.js
./open-sse/translator/formats/maxTokens.js
RTK
after RTK find filter388 bytes
54 files in 3 dirs:

./open-sse/providers/registry/  (45)
  9router.js
  agentrouter.js
  aihorde.js
  alibaba.js
  anthropic.js
  antigravity.js
  assemblyai.js
  azure.js
  baidu.js
  bedrock.js
  +35
./open-sse/translator/  (4)
  index.js
  validate.js
  webTools.js
  formats.js
./open-sse/translator/formats/  (5)
  claude.js
  gemini.js
  responsesApi.js
  openai.js
  maxTokens.js

Real output of DurinDoor's RTK find filter, using the sample file list.

  • RTK filters

    Condense tool output such as git status, git diff, ls, grep, find and build logs.

  • Caveman

    Rule-based prose compression with lite, full and ultra intensities.

  • Session dedup

    Drops blocks repeated across turns of the same conversation.

  • Headroom

    Optional adapter that only applies when it saves more than five percent.

Need the raw prompt for one call?X-DurinDoor-Token-Saver: off

The ledger

Know which account still has room

Quota views show provider limits, reset windows, and Codex reset credits.

Sample data
  • 82%used

    Claude Code

    subscription · resets in 1h 12m

  • 46%used

    Codex

    subscription · resets in 3d

  • 27%used

    Gemini

    free tier · resets daily

In the dashboard

  • Provider, model, tokens, cost estimate and latency for every request
  • Provider limits and reset windows side by side
  • Codex reset credits redeem against that account's exhausted windows

Quick start

Three steps to the other side

Connect a provider, choose a model, and configure your client for OpenAI or Anthropic APIs.

Requires Node.js 20.20.2 and npm 10.8.2. Serves on port 20128.
$ npm install -g durindoor
$ durindoor
  1. Install the CLI

    Node.js 20.20.2 and npm 10.8.2. One global package, no accounts.

    shell
    $ npm install -g durindoor
  2. Open the door

    First run creates DATA_DIR and the database, then serves the dashboard.

    shell
    $ durindoor
    ✓ dashboard  http://localhost:20128/dashboard
    ✓ api base   http://localhost:20128/v1
  3. Send a request

    Add a provider, create a key, and use any model, alias or combo name.

    curl
    curl http://localhost:20128/v1/chat/completions \
      -H "Authorization: Bearer YOUR_DURINDOOR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "MODEL_ID",
        "messages": [
          {"role": "user", "content": "Reply with one short sentence."}
        ],
        "max_tokens": 32
      }'
    

Connect your tools

Base URL
http://localhost:20128/v1
API key
your DurinDoor API key
Model
model ID, alias, or combo
Read the docs

Open the door

Open source · MIT · Self-hosted AI gateway

Read the docs ↗
npx durindoor

npx durindoor starts a local process. Docker and a global install are under Quick start.

Quick start ↗