Other tools
Configure additional coding tools and compatible clients with a gateway URL, key, and model.
A client with a configurable OpenAI-compatible endpoint can use DurinDoor for the routes and capabilities its selected model supports. The client must send requests here, use a DurinDoor API key, and pick a model ID, alias, or combo from GET /v1/models.
Base URL: http://localhost:20128/v1
API key: YOUR_DURINDOOR_API_KEY
Model: MODEL_ID_OR_COMBOProduction bind is port 20128. npm run dev listens on 20127. Remote deployments need HTTPS and a host the client can reach. Include /v1 in the base URL unless the client adds it. Use a DurinDoor key, not the upstream provider key. SDK samples live on first request and SDK examples.
Dashboard versus auto-configure
CLI Tools (/dashboard/cli-tools) is the apply and guide path for coding agents. This section documents Claude Code, Codex, Cursor, Cline, Roo, and Continue. The same grid also lists OpenCode, Cowork, Hermes, Droid, Kilo, DeepSeek TUI, jcode, Grok Build, Pi, Crush, ForgeCode, Smelt, CodeWhale, Qwen Code, Open Claw, GitHub Copilot, Amp, and others. Open those cards at /dashboard/cli-tools/<toolId>.
Auto-configure probes local Headroom, PXPIPE, and Firecrawl services. Use CLI Tools for coding-tool settings.
Install commands
Each CLI Tools card shows How to install when it cannot find the tool on this machine. Install the tool, run its command once to verify, then reopen the card. Manual Config still works without a local install when DurinDoor runs on a remote server.
| Tool | Install | Verify |
|---|---|---|
| Claude Code | npm install -g @anthropic-ai/claude-code | claude |
| Codex | npm install -g @openai/codex | codex |
| Cline | VS Code extension or CLI, see docs.cline.bot | |
| OpenCode | npm install -g opencode-ai (macOS, Linux) | opencode |
| Droid | curl -fsSL https://app.factory.ai/cli | sh | droid |
| Kilo Code | kilocode.ai or the VS Code extension marketplace | |
| Pi | curl -fsSL https://pi.dev/install.sh | sh, or npm install -g --ignore-scripts @earendil-works/pi-coding-agent (pi.dev) | pi |
| Crush | brew install charmbracelet/tap/crush, or go install github.com/charmbracelet/crush@latest (repo) | crush |
| ForgeCode | cargo install forgecode (repo) | forge |
| Smelt | cargo install smelt (repo) | smelt |
| CodeWhale | cargo install codewhale (repo) | codewhale |
Amp has no supported custom inference connection. AMP_URL configures the Amp service, not a model inference endpoint, so Amp cannot point at DurinDoor.
GitHub Copilot
The Copilot card is a manual guide. It walks the 9Router for Github Copilot VS Code extension: install, run 9Router: Configure Server, then pick DurinDoor models in Copilot Chat.
The Copilot settings apply route writes VS Code's chatLanguageModels.json on the DurinDoor host. A missing file is created. An existing file that is unreadable, malformed JSON, or not a provider array aborts with refusing to overwrite it. Other providers in that array stay.
On success the DurinDoor entry is:
{
"name": "DurinDoor",
"vendor": "azure",
"apiKey": "YOUR_DURINDOOR_API_KEY",
"models": [
{
"id": "provider/model-id",
"name": "provider/model-id",
"url": "http://localhost:20128/v1/chat/completions#models.ai.azure.com",
"toolCalling": true,
"vision": false,
"maxInputTokens": 128000,
"maxOutputTokens": 16000
}
]
}Paths: macOS ~/Library/Application Support/Code/User/chatLanguageModels.json, Linux ~/.config/Code/User/chatLanguageModels.json, Windows %APPDATA%\Code\User\chatLanguageModels.json. Localhost with no pasted key uses sk_durindoor. Reset removes the DurinDoor entry only. Reload VS Code after a write.
The dashboard recognizes an entry named DurinDoor as configured.
Pi, Crush, ForgeCode, Smelt, and CodeWhale
These cards share one settings form: endpoint, API key, and model. Pi takes a list of models; the others take one default model. Apply writes the files below on the gateway host. If the tool runs on a different machine, copy Manual Config there.
| Tool | Card | Config file | What apply writes |
|---|---|---|---|
| Pi | pi | ~/.pi/agent/models.json (or ~/.pi/models.json if only that exists) | providers.durindoor with api: "openai-completions" and the model list |
| Crush | crush | $XDG_CONFIG_HOME/crush/crush.json, default ~/.config/crush/crush.json | providers.durindoor with type: "openai-compat" |
| ForgeCode | forge | ~/.forge/config.toml | [openai] table with api_key, base_url, model |
| Smelt | smelt | ~/.smelt/config.json | top-level baseUrl, apiKey, model, _managedBy: "durindoor" |
| CodeWhale | codewhale | ~/.codewhale/config.toml | [openai] table with api_key, base_url, model |
Other keys in each file are kept. An existing file that cannot be parsed, or is not an object, aborts with refusing to overwrite it. Localhost with no pasted key uses sk_durindoor. Status views redact API keys.
Reset removes only DurinDoor's part: the durindoor provider for Pi and Crush, and the endpoint keys or [openai] table for Smelt, ForgeCode, and CodeWhale. For those last three, reset only runs when the file carries the DurinDoor marker (_managedBy or the managed by DurinDoor header) or points at port 20128, so a hand-written [openai] table is left alone. A file left empty is deleted. Configs written by 9router (providers.9router, _managedBy: "9router", or a managed by 9Router header) count as configured, and apply or reset replaces them.
Oh My Pi keeps its guide card and the shipped omp-extension; it has no settings route.
Agent skills
The skills under skills/ teach agents how to call a running gateway as an OpenAI-compatible client. They are not the durindoor npm launcher.
Dashboard → Skills offers copy targets from the same endpoint sources as Endpoint: local, enabled tunnel URLs (including additional URLs), external tunnel, enabled Tailscale, external Tailscale, and the remote browser origin when it is not already listed. Targets are deduplicated and end in /v1; choose the address reachable by the agent that will use the snippet.
export DURINDOOR_URL="http://localhost:20128"
export DURINDOOR_KEY="YOUR_DURINDOOR_API_KEY"
curl -H "Authorization: Bearer $DURINDOOR_KEY" "$DURINDOOR_URL/api/health"GET /api/health returns { "ok": true } with no provider setup. Use discovery endpoints in each skill instead of copying model IDs from old examples.
Kind slugs on GET /v1/models/<kind>: image, tts, stt, embedding, image-to-text, web, rerank. Web entries identify kind as webSearch or webFetch. Search and fetch requests go to POST /v1/search and POST /v1/web/fetch.
Supported routes
Choose a client that supports the gateway route you need. Chat, Responses, Anthropic Messages, embeddings, images, audio, moderation, rerank, search, and fetch are separate endpoint families. See the API reference for request fields and compatibility limits.
Check it works
curl http://localhost:20128/v1/models \
-H "Authorization: Bearer YOUR_DURINDOOR_API_KEY"A 401 means the key is missing or rejected. A 200 list means the gateway is reachable. Then send a one-line prompt from the client and confirm the row on Usage. Test streaming, tool calls, images, or audio if that workflow needs them.