DurinDoor
Getting started

Quick start

Install DurinDoor, sign in, mint an API key, and send one chat request.

Install a local gateway, sign in, mint a key, and send one /v1/chat/completions call. The other pages in this folder cover extra install methods, SDK samples, and the dashboard screens.

You need Node.js 20.20.2 and npm 10.8.2. The published CLI binary is durindoor.

Set your dashboard credentials, then start the CLI. Replace the initial password with your own and keep both signing secrets in your deployment environment for subsequent starts.

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

npx downloads the package for that run. For a machine you use every day:

npm install -g durindoor
durindoor --host 127.0.0.1

This example binds port 20128 on loopback and opens http://localhost:20128/dashboard. Without the host flag, the CLI defaults to 0.0.0.0 and also prints a LAN URL.

Sign in.

Sign in with the INITIAL_PASSWORD you set before starting. On a fresh data directory without that variable, the dashboard defaults to 123456. Loopback login with the built-in password does not issue a session cookie. The UI asks you to set a new password first. Remote clients using 123456 are refused.

Set JWT_SECRET before the first start (copy .env.example). Dashboard cookies are not signed without it, unless an older DATA_DIR/jwt-secret file already exists.

Add a provider.

Open Providers. Add one connection: OAuth (browser or device code), a provider API key, an OpenAI- or Anthropic-compatible URL, or a local URL with no remote account.

Create a DurinDoor API key.

Open API Keys and create a key. Copy the secret immediately. Later lists show a mask. A signed-in dashboard session can reveal a saved key.

Use the copied DurinDoor key in your client. A placeholder shown on a tool card is not a substitute when API-key enforcement is enabled.

Send one request.

Pick a model ID from the dashboard or GET /v1/models. Replace PROVIDER/MODEL below with that exact ID before sending the request.

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

A successful response contains the assistant's text in choices[0].message.content. Confirm the request on Usage. For a 401, check the client key; for a model or provider error, check the exact model ID and active connection.

Point OpenAI-compatible tools at http://localhost:20128/v1 with the same key. For Anthropic Messages, use POST /v1/messages. Client-specific base URLs and authentication settings are in the integration guides.