English Deutsch

Linux · Six steps

ModelWarden Quickstart

Run the proxy locally, connect one model, and check the path from your client to your provider.

Have ready: a Linux build for your architecture, your ModelWarden license, and your own model and judge credentials unless your Enterprise contract supplies them.

Source checked 27 September 2026. Your account's Downloads determine the build you can use; a released build can lag behind these instructions.

Step 1

Download the build for this machine

For the current released support path, sign in to the customer portal, open Dashboard → Downloads, and choose the covered Linux build shown for your account. Check the machine architecture first:

uname -m
# x86_64  → Linux x86-64
# aarch64 → Linux ARM64

In Bash, open the folder containing the downloaded executable. Set BINARY to its actual filename, for example ./mw-proxy or ./mw-proxy-arm64. For an archive, compare its checksum before extracting, then select the extracted executable. Renaming a file does not change its architecture.

BINARY=./mw-proxy
sha256sum "$BINARY"

Stop if the checksum differs from Downloads. Only after it matches, allow execution and check the version:

chmod +x "$BINARY"
"$BINARY" --version
Done when: the SHA-256 matches the value in Downloads, and --version prints ModelWarden Proxy without an architecture error.
Windows and macOS: development only

Windows/macOS support is currently development tooling only. The public portal has no native support-qualified Windows or macOS artifact. A test MSI or PKG, cross-built executable, emulated run, or fixture attestation is development evidence and is not a supported release.

  • Windows uses two different MSI artifacts: modelwarden-<version>-windows-x86_64.msi for windows-x86_64 and modelwarden-<version>-windows-aarch64.msi for windows-aarch64. Windows 11 25H2, build 26200 or later, is the planned floor. An x64 executable under Windows-on-ARM emulation remains x64 evidence.
  • macOS uses modelwarden-<version>-macos-universal2.pkg for macos-universal2. It is assembled from separately built Intel and Apple Silicon slices; selecting a thin macOS row never silently substitutes Universal 2. macOS 15.0 or later is the planned floor.
  • When a development fixture supplies one of these rows, verify the exact package filename, artifact kind (msi or pkg), SHA-256, and size from that fixture. The row is inactive/private until the channel and acceptance gates pass, and fixture evidence cannot establish public support.

Step 2

Start the proxy on loopback

In the same Bash terminal, start the downloaded executable:

"$BINARY"

A first run creates a missing default configuration and listens on 127.0.0.1:3758. An existing configuration is reused, including its listener settings. Follow the address in the startup output; do not start a second proxy on an occupied port.

Leave that terminal running. In a second terminal, check the default listener:

curl --fail http://127.0.0.1:3758/health
Done when: the startup output names the active config path and listener, and /health succeeds. This confirms the process, not protection.
Using an explicit configuration path?

A missing explicit path is not created unless you pass --init:

"$BINARY" --init --config /absolute/path/config.json

On Linux, the default is $XDG_CONFIG_HOME/modelwarden/config.json, falling back to ~/.config/modelwarden/config.json.

Per-user background helper semantics for the development lanes

The planned first desktop release is per-user. A Windows MSI installs under %LOCALAPPDATA%\Programs\ModelWarden and an opt-in mw-proxy background command may register that user's logon task; it does not install an SCM service or a pre-login system daemon. A macOS Universal 2 PKG installs the shared executable under /usr/local/libexec/modelwarden/mw-proxy with a root-owned /usr/local/bin/mw-proxy link, while the same opt-in command installs only that user's ~/Library/LaunchAgents/ai.modelwarden.proxy.plist and uses that user's Application Support, Logs, and $TMPDIR.

These packages are not support-qualified or publicly available yet. Keep one configured loopback listener per host, retain application authentication for dashboard, control, and diagnostic routes, and do not infer cross-user endpoint isolation or multi-endpoint lifecycle support.

Step 3

Protect dashboard access, then activate the license

Open the proxy's local dashboard at http://127.0.0.1:3758/admin/. Keep it on loopback. Your customer-portal password is not the local dashboard password.

Dashboard password
Your browser sign-in to the local dashboard.
Proxy client API key
Your coding client's credential for model requests.
Admin API token
Privileged automation only. Never use it as a client key.
  1. For a new setup, open Config → Credentials → Protect credentials. Set a dashboard password, save the one-time admin token privately, and sign in again. Use a password distinct from the client key.
  2. Open License. Paste the complete token from Customer Dashboard → Licenses.
  3. Leave the heartbeat endpoint blank when the signed token already supplies its trusted portal URL. Otherwise use https://modelwarden.ai/api/v1/license/heartbeat. Leave the machine ID blank on first activation.
Done when: you can sign in with the dashboard password, and License shows the expected tier, lifecycle state, and entitlements.
Already have a configuration or a legacy login?

Keep these two credentials distinct. On legacy setups, the client key also becomes the dashboard password when dashboard.password is blank. Sign in with the configured dashboard password, or that current client key if no password was set.

If Protect credentials preserves the legacy sign-in, protect first, sign in with that same credential, then use Change dashboard password. If protection is already configured, do not repeat setup. Protecting credentials and changing a password end existing browser sessions.

If the admin token still comes from a legacy password or client key, rotate it when admin API clients are ready. If exposed or of uncertain origin, rotate it before continuing and store its one-time replacement privately. Protection alone does not rotate credentials or erase old backups.

Locked out already? Do not guess credentials repeatedly. Stop the proxy and follow Recover dashboard access.

Step 4

Connect a model and a judge

Open Providers → Add Endpoint. Enter your provider's endpoint, format, credential, and upstream model. Save it, then use the model's Assign action to create the client-facing route my-model.

  • The route key is the model name your client sends to ModelWarden.
  • The upstream model is the model name ModelWarden sends to the provider.
  • Start with one provider. Professional and Enterprise can add ordered providers, schedules, aliases, and failover from Routing.

Configure contextual review

Open Judge → Provider chain, select a judge-eligible model, and choose Add Provider. Free and Professional use your own judge credentials. Enterprise Managed uses a managed judge only when your signed contract includes it and it is configured.

No judge configured? Current source falls back to heuristics-only operation when no judge is available. A working model route does not mean contextual judging is active. Judge calls can incur provider costs.

Done when: Providers shows my-model assigned, and Judge shows your intended provider chain or entitled managed judge. Confirm the effective mode in step 6.

Step 5

Create a client key and connect one client

Return to Config → Credentials → Generate new proxy key after separating dashboard access. Store the displayed key privately and update every client using an older key. The result panel clears when you leave; authenticated Copy Config on Providers or Routing can also retrieve the active client key.

Use this proxy key as MODELWARDEN_API_KEY, never your upstream provider key or admin token. Run the following in the second Bash terminal, then start your client from that terminal.

Bash: read the key without echoing it. Do not paste it into command history, logs, or chat.

read -rsp 'ModelWarden client key: ' MODELWARDEN_API_KEY
export MODELWARDEN_API_KEY
printf '\n'

OpenCode

Use the generated setup or plugin from the local Plugins page. It uses the routes currently saved by ModelWarden and avoids copying stale model metadata by hand.

Claude Code

export ANTHROPIC_BASE_URL=http://127.0.0.1:3758
export ANTHROPIC_API_KEY="$MODELWARDEN_API_KEY"
claude --model my-model

Run /status to confirm the base URL and credential source. Existing settings can override shell exports; see the official gateway setup if they differ.

Cursor (HTTPS)

Not part of this loopback quickstart. Current Cursor versions send custom-model requests through Cursor's backend, so Cursor cannot reach 127.0.0.1 or a private LAN endpoint directly. Complete this local test with OpenCode, Claude Code, Codex, or another local client.

For Cursor, first deploy a deliberately protected, externally reachable HTTPS client endpoint that does not expose the dashboard or admin APIs. See Cursor's API-key documentation and the deployment notes.

Codex

Use the ModelWarden package from the local Plugins page for route discovery, profiles, and credential handling. For a manual custom provider, see Client integrations.

Other clients

OpenAI-compatible base URL
http://127.0.0.1:3758/v1
Anthropic-compatible base URL
http://127.0.0.1:3758
Model
my-model, or the route key you saved.
Authentication
OpenAI-style routes use Authorization: Bearer …. Anthropic /v1/messages uses x-api-key: ….
Done when: the client lists or accepts the saved route key without using your provider credential directly.

Step 6

Verify each layer, not only health

curl --fail http://127.0.0.1:3758/health

curl --fail http://127.0.0.1:3758/v1/models
  1. Process: /health succeeds.
  2. Routing catalog: /v1/models includes your route key. This catalog endpoint is public and does not prove that the client key is correct.
  3. Client authentication and upstream: with a fake/test or explicitly approved provider, use the intended client key to send one harmless text-only prompt with tools disabled. A real provider may incur cost. Success proves the key was accepted and the route reached its upstream. As a negative check, a deliberately invalid placeholder key must receive 401 without reaching the upstream; do not reuse an old real secret for this test.
  4. Safety configuration: in Config → Safety → General, check Enabled, Audit only, and Heuristics only. Ordinary blocking requires protection enabled and Audit only off; contextual review also needs an available judge and Heuristics only off. Review On error: its default is allow, not fail-closed.

A text reply is not a blocking test. With no tool call, a normal text request does not prove tool-call enforcement or require an Audit row. Audit also depends on logging settings. On entitled profiles, Debug evaluates an inert tool-call sample without executing it; it may call the judge, but it does not create an enforcement Audit event. Full protection acceptance needs a controlled tool-call test and matching client and audit evidence.

Exact tool-disabled OpenAI-compatible check

Run this only against a fake/test or explicitly approved provider. It sends no tools:

curl --fail http://127.0.0.1:3758/v1/chat/completions \
  -H "Authorization: Bearer $MODELWARDEN_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"my-model","messages":[{"role":"user","content":"Reply with OK only."}],"tools":[],"stream":false}'
Done when: the route answers with the intended key, rejects an invalid key, and you have checked the safety mode and judge availability. Record tool-call enforcement as a separate check, not an assumption.
Other transports and deeper verification

Current source supports OpenAI Responses over HTTP, SSE, and WebSocket. A chat-completions check does not test those transports. Verify the downloaded release and each client path you intend to use.

Next steps

Keep the first setup simple.

Recovery, policy, automation, and deployment belong in the full operator guide.

Open full guide