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.
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
README
synced Oct 25, 2026One 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 need | What DurinDoor provides |
|---|---|
| Connect different providers | OAuth accounts, API keys, browser cookies, and compatible endpoints |
| Keep a stable model name | Model aliases and ordered fallback combos |
| Recover from account limits | Account selection, cooldowns, and quota-aware fallback |
| Inspect requests | Usage, monitoring, and an optional redacted proxy timeline |
| Connect MCP servers | A gateway with scoped keys for upstream MCP instances |
| Run on your infrastructure | SQLite 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 format | Route |
|---|---|
| OpenAI Chat Completions | POST /v1/chat/completions |
| OpenAI Responses | POST /v1/responses |
| Anthropic Messages | POST /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 type | Examples |
|---|---|
| Provider API keys | OpenAI, Anthropic, Gemini, OpenRouter, DeepSeek |
| Subscription and tool accounts | Claude Code, Codex, Gemini CLI, Kiro, GitHub Copilot |
| Cloud platforms | AWS Bedrock, Azure, Vertex, Cloudflare AI |
| Compatible endpoints and local models | OpenAI or Anthropic nodes, Ollama, LM Studio, vLLM |
| Media and search providers | Image, 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
| Task | Guide |
|---|---|
| Install and make your first call | Getting started |
| Add provider accounts or local models | Providers |
| Configure an AI client | Integrations |
| Set up routing and capabilities | Features |
| Host a gateway | Deployment |
| Back up, upgrade, or manage access | Operations |
| Look up routes, flags, or settings | Reference |
| Diagnose a failed request | Troubleshooting |
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.