Skip to content
Conduit

skill

durindoor

DurinDoor is a self-hosted AI gateway that gives developer tools and applications one stable API in front of many upstream AI providers.

bloodf/durindoorcommunitylistedunreviewed

Set up

Skills are installed by placing their folder where your agent loads skills.

The download comes from github.com/bloodf/durindoor itself, not from our server, so what you get is exactly what its author published.

Install instructions come from the README

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 25, 2026

One gateway for the tools you already use

DurinDoor connects your AI clients to provider subscriptions, API keys, and local models. Send OpenAI chat completions or Responses, or Anthropic Messages. The gateway resolves the model, chooses a connection, translates supported formats, and records the result.

Use a provider/model ID for a direct route, an alias for a reusable name, or a combo for a configured fallback order. Manage connections and keys in the bundled dashboard.

DurinDoor is a fork of 9router. Its name comes from Durin's Door, the entrance to Moria in The Lord of the Rings. The new identity uses an emerald gate, silver lettering, and dark forest stone.

What you needWhat DurinDoor provides
Connect different providersOAuth accounts, API keys, browser cookies, and compatible endpoints
Keep a stable model nameModel aliases and ordered fallback combos
Recover from account limitsAccount selection, cooldowns, and quota-aware fallback
Inspect requestsUsage, monitoring, and an optional redacted proxy timeline
Connect MCP serversA gateway with scoped keys for upstream MCP instances
Run on your infrastructureSQLite by default, optional Postgres, and Docker deployment

Credentials, configuration, and usage records are stored on your machine or server. Requests still go to the upstream providers you select. Support for each endpoint and model depends on that provider.

Try the dashboard

Open the live demo to explore the real DurinDoor dashboard with sample data. The demo intercepts requests in your browser and does not connect real provider accounts.

For an installed instance, the dashboard is at http://localhost:20128/dashboard. Connect a provider, create a key, configure model aliases or combos, and inspect usage from the same interface.

Quick start

Use Node.js 20.20.2 and npm 10.8.2. The Docker image includes the required runtime.

1. Start the gateway

Set a session-signing secret and your initial dashboard password before the first boot. Replace the password below with your own.

export JWT_SECRET="$(openssl rand -hex 32)"
export INITIAL_PASSWORD="CHANGE_ME_STRONG_PASSWORD"
npx durindoor --host 127.0.0.1

Keep JWT_SECRET in your deployment environment for subsequent starts. For daily use, install the CLI globally:

npm install -g durindoor
durindoor --host 127.0.0.1

The dashboard opens at http://localhost:20128/dashboard. Sign in with your initial password. The explicit host flag keeps this example bound to your machine.

2. Connect a provider and create a key

In Providers, add an OAuth account, a provider API key, or a compatible local or remote endpoint. In API Keys, create a DurinDoor key and copy its secret.

Choose an available model in the dashboard or list the models exposed by your instance. This catalog request does not verify your gateway key:

export DURINDOOR_API_KEY="YOUR_DURINDOOR_API_KEY"

curl http://localhost:20128/v1/models \
  -H "Authorization: Bearer $DURINDOOR_API_KEY"

3. Send a request

Replace PROVIDER/MODEL with a model ID from your instance. A name such as coding-default works after you create that alias or combo.

curl http://localhost:20128/v1/chat/completions \
  -H "Authorization: Bearer $DURINDOOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "PROVIDER/MODEL",
    "messages": [{"role": "user", "content": "Say hello."}],
    "stream": true
  }' \
  -N

Installation covers npm, source builds, Docker, environment variables, and the data directory. First request covers both API formats, SDKs, streaming, and errors.

Use OpenAI or Anthropic APIs

Your client's request format determines the route. DurinDoor translates it to the selected provider's supported format.

Client formatRoute
OpenAI Chat CompletionsPOST /v1/chat/completions
OpenAI ResponsesPOST /v1/responses
Anthropic MessagesPOST /v1/messages

OpenAI SDK

Point the SDK at the gateway and use a DurinDoor key. Replace the example model with one exposed by your instance.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "http://localhost:20128/v1",
  apiKey: process.env.DURINDOOR_API_KEY,
});

const response = await client.chat.completions.create({
  model: "PROVIDER/MODEL",
  messages: [{ role: "user", content: "Say hello." }],
});

console.log(response.choices[0].message.content);

Anthropic Messages

The Messages route accepts Anthropic-shaped requests, including the required max_tokens field. Use a model your connected provider can serve.

curl http://localhost:20128/v1/messages \
  -H "Authorization: Bearer $DURINDOOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "PROVIDER/MODEL",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "Say hello."}]
  }'

Tool-specific settings matter. Follow the guides for Claude Code, Codex, Cursor, and other clients.

Choose your providers and fallback order

The provider catalog lists registry IDs, authentication methods, and model counts for the build. GET /v1/models lists what your running instance exposes.

Connection typeExamples
Provider API keysOpenAI, Anthropic, Gemini, OpenRouter, DeepSeek
Subscription and tool accountsClaude Code, Codex, Gemini CLI, Kiro, GitHub Copilot
Cloud platformsAWS Bedrock, Azure, Vertex, Cloudflare AI
Compatible endpoints and local modelsOpenAI or Anthropic nodes, Ollama, LM Studio, vLLM
Media and search providersImage, speech, video, embeddings, search, and fetch providers

A combo exposes one name to your client and tries its configured model members in order. For example, you can put a subscription model first, a paid API second, and a local model last. That order is your configuration. It is not a built-in pricing hierarchy. Account fallback tries eligible connections for the current member before advancing to the next model.

Read Connecting accounts, Combos, and Smart routing for setup and strategy details.

Beyond chat

The gateway also has endpoints for images, speech, embeddings, reranking, moderation, video, music, web search, and web fetch. Model support varies by provider. Use the API reference for exact request bodies and response formats.

  • The MCP gateway connects several MCP servers behind scoped gateway keys.
  • Realtime relays supported native provider protocols, including audio where available. Chat models use a text-only facade.
  • Media routes configure fallback order for calls that omit a model or use auto.
  • The proxy timeline records redacted request hops when enabled. It is off by default.

Run it with Docker

Set JWT_SECRET and INITIAL_PASSWORD as shown in the quick start, then:

docker run -d --name durindoor \
  -p 127.0.0.1:20128:20128 \
  -v "$HOME/.durindoor:/app/data" \
  -e DATA_DIR=/app/data \
  -e JWT_SECRET \
  -e INITIAL_PASSWORD \
  ghcr.io/bloodf/durindoor:latest

This example persists data in $HOME/.durindoor and publishes the port on loopback. Pin a release tag for production. Native installs retain the ~/.9router default data directory for compatibility unless you set DATA_DIR.

SQLite is the default database. The dashboard supports an optional Postgres cutover. See Docker deployment, Environment variables, and Security before exposing a shared gateway.

Documentation

TaskGuide
Install and make your first callGetting started
Add provider accounts or local modelsProviders
Configure an AI clientIntegrations
Set up routing and capabilitiesFeatures
Host a gatewayDeployment
Back up, upgrade, or manage accessOperations
Look up routes, flags, or settingsReference
Diagnose a failed requestTroubleshooting

The docs site covers installation, everyday use, deployment, and API reference.

Contribute

Internal references contain AI implementation context, feature porting procedures, and brand rules. These files are not published on the docs site.

Issues and pull requests are welcome. Pair behavior changes with a doc update and a test. Read Contributing, the Code of Conduct, and the security policy.

License and acknowledgments

MIT. See LICENSE.

DurinDoor is a fork of 9router, created by decolua. Upstream documentation and branding remain the property of their respective authors.

↑↓ navigate openesc close