Source checked: 27 September 2026. Your account's Downloads determine the released build you can use; source changes may not be available in that build.
Start here
One local control point, four separate proofs
ClientCodex, Claude Code, OpenCode, Cursor, or another compatible client sends a route key and the proxy client API key.
ProxyModelWarden authenticates, routes, evaluates tool calls, and relays the provider response.
DashboardThe local admin UI edits policy and shows audit, errors, health, and licensed features.
Portalmodelwarden.ai supplies downloads and signed licenses. It is not the local proxy dashboard.
A green /health proves only that the process is serving. Separately verify client authentication and upstream routing. To prove tool-call protection, use a harmless controlled tool-call fixture, check the actual enforcement result, correlate the configured audit/event evidence, and confirm what the intended client receives. A normal text reply is not that proof.
Default boundary:Keep the listener on 127.0.0.1. ModelWarden is a policy proxy, not an operating-system sandbox, and it cannot undo effects after an allowed tool executes.
For AI agents and automation
Agent-safe operating contract
Treat every observation as belonging to one exact state. Source support, a released download, the binary currently running, its saved JSON, and its effective licensed policy can all differ. Name the state behind a claim instead of collapsing them into “ModelWarden supports it.”
Default authority: read-only.An AI agent may mutate only when the operator has named the exact instance and bounded action. Require explicit approval before changing credentials or a license, stopping or restarting an existing process, restoring a backup, contacting a real provider or OAuth service, running a tool-capable prompt, changing non-loopback/TLS access, or rolling out to a fleet, staging, or production. Permission to inspect or explain is not permission to perform those actions.
Preflight before a mutation
Identify the exact process, its own --version output, executable hash, active --config path, listener, and license lifecycle. Check for an existing listener before starting another instance. Do not assume the default path or port when startup flags are present.
Start with masked or read-only surfaces. Never print tokens, credential-reference contents, provider secrets, session cookies, or a raw secret-bearing config into logs or chat.
Preserve an owner-only copy of the active config and every referenced credential source needed for rollback on a trusted filesystem, never in a shared temporary directory. A JSON file without its adjacent <config-filename>.credentials directory may be incomplete.
Use the dashboard UI for mutations unless the exact route-specific API contract for this binary version has been reviewed. Refresh immediately before the change and let the UI carry its current revision, authentication, and origin checks. There is no general public “admin write API” contract; do not invent one or replay a captured request.
Read the state back after every write. A timeout or lost response is ambiguous: the operation may have committed.
Verify the affected layer, then audit/event truth, dashboard truth, and the intended client. A 200 from /health is not enforcement evidence.
Read-only identity checks for a released Linux binary
Replace PID with the observed process ID. These commands do not select a target for you; if several instances appear, stop and ask which one is in scope. Inspect command lines locally because operator-supplied arguments may contain sensitive values.
On Linux, /proc/PID/exe identifies the executable attached to that live process, even if its pathname was replaced. Recheck the process start time; a reused PID or vanished process invalidates the observation.
An explicit --config, --host, or --port in that process command line overrides the normal assumption. Without --config, use the platform-default path below. For other operating systems, record the equivalent process path, command line, listener, version, and file hash; the signed-in Downloads page remains the release authority.
ModelWarden does not expose a durable public instance ID. Bind an observation to the base URL, observed executable/version/hash, command line, listener, and active configuration. A PID, port, configuration revision, or license reference is useful evidence but is not a permanent identity by itself.
Authoritative reads before a write
Use the narrowest redacted status surface for the family you intend to change. Administrative reads require the authority described below and return no reusable secret bytes.
Read surface
What it establishes
Important limit
GET /health
That an HTTP process returned a successful liveness response.
No instance, route, license, or enforcement identity.
GET /v1/models
The effective public route catalog for the serving process.
No client authentication, upstream inference, or safety proof.
GET /admin/api/v1/provider-config
Redacted provider/routing document, saved revision, and matching ETag.
This is the provider read-before-write surface.
GET /admin/api/v1/credentials
Credential modes, saved and family revisions, sources, and backup inventory.
Status only; existing secret bytes are never returned.
GET /admin/api/v1/license/credentials
Saved and runtime license-credential revisions plus storage capability.
No token, source path, or environment-variable name.
Its revision applies only to this mutation family.
Not a CAS surface:GET /admin/json_api/config is useful as a redacted full-config view, but it returns no revision or ETag. Do not use it as the basis for an automated write. The generic PUT /admin/api/v1/config is a low-level bearer-only full replacement without the route-specific compare-and-swap contract; do not use it for normal agent automation. An experimental, unverified management facade in local development is not a released API contract.
Authentication authority by surface
Surface
Credential or authority
Do not infer
GET /health
No client credential; liveness only
No proof of routing, license, audit, or enforcement
GET /v1/models
No client credential; public route catalog
A successful listing does not validate the proxy client key
Dashboard pages
Browser session created with the dashboard password
A browser cookie does not automatically authorize every admin API
Administrative APIs
Current session or administrator bearer as required; selected endpoints are bearer-only
The proxy client key is not a protected admin bearer
/v1/chat/completions, /v1/responses
Proxy client key in Authorization: Bearer …
Never substitute an upstream provider key
/v1/messages
Proxy client key in x-api-key
OpenAI header conventions do not carry over to this route
Upstream provider
Provider credential resolved inside ModelWarden
Clients should not receive this secret
Dashboard API routes accept a valid browser session or administrator bearer unless a route is explicitly bearer-only. Browser-session writes must remain same-origin. A non-browser bearer client should omit Origin unless it can send the exact dashboard origin; a bearer does not bypass origin checks. After a write waits for the configuration lock, ModelWarden revalidates its original authority, so a concurrent credential rotation can turn it into 401 authentication_required.
Why writes are dashboard-only by default
This page is not an invocation contract for administrative writes. The binary has several route-specific mutation families, each with its own method, request body, revision headers, entitlements, and response. A partial request recipe is unsafe, so use the dashboard unless the operator supplies a separately versioned contract for the exact binary and authorizes the exact mutation.
Providers and routing: separate account, transport, model, route, alias, schedule, migration, and security endpoints use the provider document revision. The generic full-config writer is not a safe substitute.
Credentials: tagged actions use the saved-document revision; several action families also need a distinct wrapper, drain, notification, or provider revision. Save newly generated administrator tokens when shown. The proxy key leaves the result panel after reload, but authenticated Copy Config can retrieve the active client key.
License credentials: mutations compare both the saved-document revision and the runtime license-credential revision, then require status and lifecycle read-back.
Advanced settings and onboarding: settings compare both document revision and expected row value; onboarding compares revision plus complete expected state and enforces browser origin.
When an exact, version-matched contract is supplied, use the current authoritative read for that family and its exact quoted or bare 64-hex revision. Never treat revisions from different families as interchangeable, synthesize a value, use a weak ETag, or blindly replay a rejected or timed-out mutation.
Classify every write result
Observed result
Agent action
Expected 2xx response
Reread the authoritative saved and effective surfaces, compare the new revision, and verify only the intended delta before continuing.
401 or authentication_required
Stop. Authority may have been rotated while the request waited. Obtain fresh authorization; do not retry with cached credentials.
403 csrf_rejected or origin rejection
Do not weaken origin checks. Use the same-origin dashboard flow, or a correctly authorized non-browser bearer request that omits Origin.
402, upgrade_required, or license_required
Read effective license/entitlement state. Do not disable the feature gate or downgrade policy to force the write.
428 revision_required or malformed revision
Reread the correct family surface and use its exact current revision. Never guess one.
409 stale_…
Discard the stale draft, reread current state, review concurrent changes, and deliberately build a new mutation. Do not replay the old body.
400 validation failure
Reread current state and correct the candidate; repeated submission of the same invalid body is not recovery.
500 write_failed or persistence failure
Assume nothing. The previous state is generally intended to remain active, but reread before deciding whether a new write is needed.
500 apply_failed, action_interrupted, durability warning, timeout, disconnect, or an unreadable response
Treat the outcome as ambiguous: saved state may have changed while runtime publication is uncertain. Do not repeat the write.
After an ambiguous credential or license operation, read in this order: /admin/api/v1/credentials, /admin/api/v1/license/credentials, /admin/api/v1/license, and—if providers or routes were involved—/admin/api/v1/provider-config. Compare saved and runtime revisions before choosing a new action.
Preferred inert probes
Use public GET /v1/models to inspect effective route discovery without inference spend. It does not authenticate the client key.
After confirming client authentication is enabled, send a structurally valid inference request with an intentionally invalid placeholder key and expect 401 before upstream forwarding. If authentication is disabled, that request is not an inert rejection probe. Prove successful authentication only through a fake/test or explicitly approved upstream.
Use Debug, where entitled, to evaluate a harmless synthetic tool call without executing it. Evaluation can contact the configured judge and incur cost; the mounted Debug evaluator does not create a normal enforcement Audit event.
Use mw-proxy --check-allocation … to inspect saved command decisions without writes or command execution.
For routing proof, send one ordinary text prompt through a fake or explicitly approved upstream with client tools disabled. Verify enforcement separately with an inert tool-call fixture. Never execute a destructive command merely to prove that a detector blocks it.
Stop condition:If the active config path, revision, credential authority, target instance, or rollback source is uncertain, remain read-only and ask the operator. Do not “repair” uncertainty by disabling authentication or protection.
Security-critical
Credentials: three jobs, three secrets
Credential
Used by
Purpose
Dashboard password
Your browser
Signs into /admin/.
Administrator token
Admin API tooling
Authorizes bearer-only administrative endpoints. It is shown once when created or rotated.
Proxy client API key
AI clients
Authorizes model requests. It is not an upstream provider key.
Legacy fallback:Without protected dashboard authentication, a non-empty dashboard.password is the dashboard credential; otherwise the proxy client API key is also the dashboard password. Protect dashboard authentication before rotating the client key.
In that legacy mode, the human signs in with the selected password or raw client key. The legacy administrator bearer is its SHA-256 hex digest, not the raw value. Protecting credentials can deliberately retain that bearer for compatibility, so protection alone is not rotation.
Open Config → Credentials while the dashboard is still accessible.
Choose Protect credentials. When authentication was disabled, the form asks for a new password and may show a new administrator token once. In legacy mode it instead preserves the current dashboard sign-in and administrator bearer for compatibility. Either save ends the current browser session.
For the legacy path, sign in once more with the same password or raw client key, choose Change dashboard password, set a distinct password, and sign in again. This second save also ends current sessions. Do not rotate the client key until this separate password works.
If the page says the administrator token was derived from a dashboard password or proxy client key, rotate it when API clients are ready. Rotation is mandatory when the prior credential was exposed or its provenance is uncertain. Save the one-time result, update every admin API client, and confirm the old bearer no longer authenticates without logging either token.
Only then protect, import, or rotate the proxy client key.
Changing the dashboard password or administrator token invalidates current browser sessions. After dashboard protection, client-key replacement is separate from browser sign-in; it affects new proxy requests, so update every client that uses the old key.
Platform boundary: protected local credential migration is supported and documented for the current released Linux builds. Do not infer Windows or macOS support from a platform path in this guide; use the Downloads page and that build's credential-status capability before planning a migration.
Recover dashboard access
If neither the expected password nor the former client key works, stop retrying. Recovery changes live authentication: an AI agent must remain read-only until the operator approves the exact instance and exact snapshot.
Use the identity checks above to bind the PID, executable, listener, and active config path. After approval, stop that exact process; never stop by a broad name match.
On a trusted filesystem, create an owner-only recovery copy of the current failed config, its adjacent <config-filename>.credentials directory, and every neighboring backup. Preserve them as one set. Never use a shared temporary directory, paste their contents into chat, or delete/edit the credential files.
Choose a <config-name>.provider-backup-… candidate whose basename matches the active config and whose timestamp predates the failed change. Do not choose “the newest” blindly. Confirm every referenced credential source needed by that candidate still exists; stop if the config, timestamp, ownership, or source pairing is ambiguous.
Preserve the active file's owner and mode. Use the operator's OS/service procedure to replace the config atomically on the same filesystem. Do not combine a config snapshot with unrelated credential material.
Restart the same executable with the same --config path. Confirm the expected listener and /health, sign in with the credential belonging to that snapshot, and review dashboard password, admin-token authority, and client-key state under Config → Credentials before any further mutation.
There is no safe unattended “reset auth” shortcut. If the exact target, matching snapshot, file ownership, atomic replacement procedure, or external credential source is uncertain, preserve everything and contact support. Do not remove dashboard.authentication or hand-edit password verifiers.
Configuration
Paths, dashboard editing, and raw JSON
Configuration is JSON. With no arguments, mw-proxy uses the platform path and creates a valid default file when it is missing.
Linux
$XDG_CONFIG_HOME/modelwarden/config.json, falling back to ~/.config/modelwarden/config.json.
A missing explicit path requires --init. The optional TUI selects basic startup settings; the dashboard remains the clearer editor for a running installation.
Dashboard editing
Providers owns upstream identities, credentials, formats, model discovery, health, and basic route assignment.
Judge owns contextual review providers and tuning. Config owns safety, network, operations, and advanced JSON.
Credentials is the safe place to move secrets into owner-only files or external references.
Use the narrow dashboard controls, which validate their candidate, enforce licensed feature gates and reject stale revisions where required by that mutation family. Ordinary policy changes can publish to the running process; see Apply and restart for exceptions. Check the saved result and backup inventory. If a response is lost, reload before retrying: the first operation may already have committed.
Illustrative JSON shape
This is a small fragment, not a published JSON Schema. The generated config and dashboard validation are authoritative.
Prefer protected credential controls over keeping real secrets inline. JSON values do not interpolate environment variables; explicit credential-reference fields provide file or environment sources where supported.
Routing
Providers, routes, aliases, and failover
A route key is the model name sent by the client. A route points to one or more upstream provider bindings, ordered by priority. A binding can map that route to a different upstream model.
For a first route, open Providers → Add Endpoint, configure the endpoint and upstream model, then use the model's Assign action. Configure contextual review separately under Judge → Provider chain → Add Provider; assigning a route does not also configure a judge.
Provider formats
openai, openai_responses (alias responses), anthropic, gemini, bedrock, ollama, and mcp.
Basic route
Every profile can configure a one-provider route.
Ordered failover
Professional and Enterprise can add multiple providers, schedules, and aliases where entitled. Retries are bounded and stop once response bytes have started.
Image-aware routing
Capability-aware selection can keep image requests away from bindings that do not support them.
Use provider health as evidence about the upstream connection, not as proof that safety evaluation is active. Test one normal request through the exact route and client you intend to use.
Clients
Connect clients without sharing provider secrets
Clients receive only the ModelWarden base URL, a route key, and the proxy client API key. Provider credentials stay in ModelWarden.
API clients
curl --fail http://127.0.0.1:3758/v1/models
This catalog is public and does not validate a client key. Authenticated OpenAI-compatible inference routes use http://127.0.0.1:3758/v1 and Authorization: Bearer …. Anthropic-compatible clients use http://127.0.0.1:3758; /v1/messages expects the same key in x-api-key.
Claude Code CLI
In Bash, load the proxy client key without putting its value in shell history. Start Claude Code from this same terminal.
ModelWarden's Messages route expects the client key in x-api-key, so use ANTHROPIC_API_KEY, not ANTHROPIC_AUTH_TOKEN. Claude Code may ask once before an environment API key takes over. Run /status and require the ModelWarden base URL plus ANTHROPIC_API_KEY before trusting the route; see Anthropic's gateway connection guide.
These are CLI instructions. Saved or managed settings can take precedence; the editor extension and desktop app have separate configuration surfaces. Verify each surface rather than assuming terminal exports configure all of them.
Cursor through a protected HTTPS endpoint
Cursor is not a loopback-only integration. Its documentation says requests pass through its backend for final prompt building. That backend cannot reach your machine's 127.0.0.1 or private LAN address; use an operator-approved HTTPS endpoint reachable from that service.
Use Cursor only after deliberately deploying a protected HTTPS client endpoint. Do not expose ModelWarden's combined listener directly as a shortcut: put it behind a trusted reverse proxy or equivalent network boundary, allow only the exact client paths Cursor needs, and deny /admin/, administrative APIs, and unneeded diagnostics. Non-loopback access requires the corresponding ModelWarden entitlement. Treat the proxy client key as shared with Cursor's backend; never substitute the dashboard password, administrator bearer, or upstream provider key. If that trust boundary is unacceptable, do not connect Cursor.
After that deployment is verified, configure the custom base URL ending in /v1, proxy client key and route key in the installed version's model settings. Check the override's scope before switching models; a saved override is not proof that every request uses this endpoint.
Custom keys cover chat models, not Tab completion. The proxy client key is sent to Cursor's backend with requests. Verify the actual route and enforcement path for each intended feature; a missing Audit row alone does not prove bypass because event capture is conditional. See Cursor's BYOK documentation.
Codex
The local Plugins page is preferred because it tracks ModelWarden routes and activation. A manual Codex provider can use:
This is TOML, not a shell command. Merge it into the user-level Codex configuration, preserving unrelated settings, and supply MODELWARDEN_API_KEY to the actual Codex process. Current proxy source has Responses HTTP, SSE and WebSocket paths, but each needs verification against the installed binary and client. Enable supports_websockets only when that path is verified; an HTTP success does not verify WebSocket. Check OpenAI's configuration reference for the installed client.
OpenCode
Use the generated package and instructions on the local Plugins page. That path carries current route metadata and avoids hardcoding a client-specific provider shape here.
Protection
Know which safety mode is actually active
Setting
Behavior
Use it for
enabled: false
Transparent pass-through: no heuristic, judge, block, or audit evaluation.
Short, explicit bypass testing only.
audit_only: true
Evaluates and records ordinary Deny/Ask outcomes but permits them; the repeated-call circuit breaker remains an exception.
Measuring a policy before enforcement.
heuristics_only: true
Uses heuristics and skips the contextual judge.
Local, predictable protection without judge cost.
Judge enabled
Flagged or configured tool calls receive contextual review. Hard heuristic Blocks still win over a judge Allow.
Context-sensitive decisions.
Configure these under Config → Safety → General. on_error defaults to allow and applies after a judge attempt; an unjudged Flag follows unjudged_flag_action, also allow by default. For sensitive use, review both settings instead of assuming one fail-closed switch covers every path.
No available judge: current effective policy falls back to heuristics-only when no judge can be used. Free and Professional use your own judge credentials; Enterprise Managed uses managed review only when the signed contract supplies it. Check the effective policy, not just the saved toggle.
DLP and detector limits
Request-side DLP is off by default. It can block, redact, or flag configured secret and injection patterns before an upstream call. It does not promise to identify every secret, does not generally scan model output, and inputs beyond the configured scan cap are flagged and allowed. The heuristic engine is Linux-first and cannot replace least privilege or an OS sandbox.
Decisions
Judge review, human approvals, and allocations
Judge: configure a separate provider chain under Judge. Review can cover every non-trusted tool or only heuristically flagged calls.
Approvals: entitled HTTP flows can hold an Ask decision for a human response. Holds have a timeout, concurrency bound, and expiry action.
MCP stdio: has no in-band human hold surface. An Ask is denied, so design MCP policy to make safe Allow/Deny decisions without waiting.
Allocations: saved exact, per-part, and template command decisions are enforced when enabled. They can displace ordinary flags, but never mandatory hard Blocks.
The typed approvals default is hold, while an unentitled effective Free configuration projects approval flow off. Always read the effective controls shown by the dashboard for the active license.
Evidence
Audit, replay, errors, and monitoring
Use the surfaces in this order when proving behavior:
Proxy result: did the request allow, deny, ask, or fail?
Audit/event truth: does the event identify route, tool, heuristic/judge outcome, and enforcement?
Dashboard truth: does Audit, Logs, or Errors display the same event?
Client smoke: does the intended client behave correctly end to end?
Audit persistence depends on the effective licensed configuration. Hash-chained audit is opt-in, disabled by default, and requires a signing-key path. Session replay persistence is also opt-in; set retention and disk limits deliberately. Additional pages cover tracing, alerts, uptime, cron monitoring, profiling, source control, issue tracking, and provider health.
No row is not a verdict. Plain text may contain no tool call to evaluate, allowed-event logging can be off, and Debug evaluation deliberately skips enforcement Audit recording. Correlate a controlled tool-call result with the configured event source before diagnosing missing protection.
Privacy checklist
Decide whether allowed as well as denied events should be stored.
Confirm the log directory owner, retention, and disk ceiling.
Review redaction and request-body capture before enabling replay.
Treat exported diagnostics as sensitive even when fields are redacted.
Privacy
Secret redaction: what is hidden from the logs
ModelWarden hides secrets in tool arguments before an audit record is written. The record keeps the tool, the decision and the useful values; each secret becomes <redacted>. It works out of the box.
Fields hidden by name
A field is hidden when its name is, or ends with, a word such as password, secret, API key, access token, refresh token, authorization, cookie or private key. Case and punctuation don't matter, so DEPLOY_API_KEY and db_password are both hidden.
Secret-looking values anywhere in a command
Private-key blocks, such as -----BEGIN PRIVATE KEY-----.
Provider keys: sk-…, GitHub ghp_… and github_pat_…, GitLab glpat-…, Slack xox… and AWS AKIA….
Login tokens (eyJ…).
Bearer … and Basic … headers.
token=… and password: … pairs, and flags such as --token ….
Passwords inside URLs, such as postgres://user:pass@host.
Secret URL parameters, such as ?token=….
Cookie headers.
Add your own
"redact_keys": ["ticket_ref"]
This hides any field whose name starts or ends with ticket_ref, ignoring case and punctuation.
Changes apply to new records. Records already written stay as they are, and the dashboard applies the same rules again whenever it shows them.
Current source
Capability map
Ingress
OpenAI Chat Completions, Anthropic Messages, OpenAI Responses over HTTP/SSE/WebSocket, model discovery, and an MCP stdio gateway.
Protection
Tool-call parsing, heuristics, contextual judge review, trust and deny rules, request-side DLP, approvals, circuit breaking, and saved allocations.
Routing
Provider catalog, aliases, schedules, model mapping, image capability selection, bounded retry, and entitled multi-provider failover.
Operations
Audit, optional signed chains, errors, logs, replay, tracing, alerts, uptime, cron, profiling, notification delivery, and log drains.
Credentials
Separate dashboard, admin API, client, provider, license, wrapper, notification, drain, and MCP launch credential controls.
Integrations
Generated helpers or plugins for Codex, OpenCode, ZCode, and pi, plus compatible base-URL clients such as Claude Code and Cursor.
Exact client-facing routes in current source
Method and path
Role
Notes
GET /health
Process liveness
Unauthenticated; deliberately weak evidence
GET /v1/models
Effective model/route discovery
Public catalog; does not validate a client key
POST /v1/chat/completions
OpenAI Chat Completions ingress
Supports ordinary and streaming responses
POST /v1/messages
Anthropic Messages ingress
Uses x-api-key
POST /v1/responses
OpenAI Responses HTTP/SSE ingress
Tool calls use the normal safety pipeline
GET /v1/responses with WebSocket upgrade
OpenAI Responses WebSocket ingress
Current source support; confirm the downloaded build
GET /admin/
Local dashboard
Separate dashboard authentication after protection
Dashboard surface map
Setup and control: Home/onboarding, Config (Overview, Safety, Network, Operations, Advanced), Providers, Routing, Judge, License, Credentials, Approvals, Allocations, and Plugins.
Evidence and operations: Audit with live/review views, Logs, Errors, Replay, charts, Tracing, Alerts and history, Uptime, Cron monitoring, Profiling, source-control and issue-tracking integrations, and About.
Visibility and mutability depend on configuration and entitlement. A page being present proves neither that its runtime is enabled nor that a request traversed it.
Availability varies by signed entitlement and purchase type. See Features for the public profile comparison; the running License and Config pages show what this installation can actually use.
Entitlements
License activation, heartbeat, and offline behavior
Paste the complete signed token on the local License page. The proxy prefers the trusted portal URL signed into the token; set license.heartbeat_endpoint only when that URL is absent. Leaving the machine ID blank on first activation lets the proxy create a stable local identity.
Signed issued_at and expires_at describe token validity; they do not by themselves redefine lifetime ownership.
Activation receipts, concurrent-operation limits, heartbeat budgets, purchase type, and grace rules all participate in effective access.
Free, Professional, and Enterprise BYOK keep provider and judge credentials local. Enterprise Managed can receive contracted managed material from the portal.
When licensing looks wrong, inspect the License page's lifecycle and entitlement details before editing config. A heartbeat success alone does not prove a model request or safety feature is active.
Contract-authorized offline operation is an Enterprise BYOK entitlement, not a promise of unlimited disconnected use. It still requires valid token/activation-receipt state and trusted-time checks; upstream models may still need network access. Enterprise Managed retains its separate heartbeat and grace policy. Disabling heartbeat is not a way to acquire offline entitlement.
Release state
Check for an update without confusing source with a download
About → Check for Updates is advisory. It asks the configured portal for the running binary's recognized artifact platform, when available, validates the returned release description, and shows a download link only when that description is internally consistent and uses a safe HTTP(S) URL. The check contacts that portal and may refresh an owner-only local update-cache sidecar; it never changes the main config, downloads, installs, replaces, or restarts the binary.
The check uses the portal URL from effective license state, falling back to the configured heartbeat endpoint. Without either source, it reports that no portal URL is configured.
Results are isolated by portal origin and exact platform and cached briefly. A malformed, contradictory, oversized, withdrawn, or legacy response cannot become a trusted download link; a previously seen version may remain only as stale diagnostic text.
The signed-in Downloads page remains the artifact authority. A platform name in current source is not proof that a package exists, was natively tested, is signed or notarized, or is available to this account.
Operator-approved upgrade checklist
Bind the operation to the exact executable, version, file hash, listener, process command line, active config path, and service owner. Preserve an owner-only config/credential snapshot and a rollback copy of the current executable or package.
Download only the platform offered by the signed-in Downloads page. Verify its displayed SHA-256 before installation. Do not substitute an artifact for another operating system or architecture.
Use the installation or service procedure approved for that machine. An AI agent must not replace a running executable, alter a service, or roll out to other machines from an update notice alone.
After the approved restart, re-identify the executable and hash, run mw-proxy --version, confirm the intended listener and /health, then repeat one authenticated route/upstream check and the relevant Audit/safety check. A newer version string by itself is not end-to-end acceptance.
Current limitation: local source recognizes Linux x86-64/ARM64, Windows x86-64/ARM64, and macOS Intel/Apple-Silicon/Universal 2 release identities. That source support does not claim that Windows or macOS artifacts have completed native build, packaging, signing, notarization, installation, or runtime acceptance. Use Downloads for the actual release set.
Change control
What applies now, and what needs a restart
Change
Applied now
Restart?
Ordinary dashboard policy, providers, judge, credentials and license
Through the family's validated save/publication path; read saved and effective state back
Usually no; verify the affected runtime
Direct JSON edit with the config watcher running
Validated and entitlement-checked hot-apply; invalid candidates keep the last-known-good runtime
Startup-only settings still require restart
Enable config_watch after starting with it disabled
The watcher task was not started at boot
Yes
proxy.host, proxy.port, or TLS
Saved policy changes can apply, but the existing listener does not move
Yes
CLI --host or --port
Process-start override; not persisted
Start-time only
MCP child command or environment
Existing child keeps its startup snapshot
Reconnect/restart that gateway process
Config writers retain owner-only neighboring snapshots according to their mutation path; a no-op is not a new backup. Check the backup inventory rather than assuming every dashboard action created one. Ordinary config backups are bounded, so preserve a separate owner-only config/credential set before a bulk migration.
Fast diagnosis
Start with the symptom
Symptom
Meaning
Next check
Exec format error
Binary architecture does not match the machine.
Run uname -m and download the matching artifact.
Explicit config not found
Only the platform-default path auto-creates.
Add --init once, or correct the absolute path.
/health works, client gets 401
Process is up; client authentication is wrong.
Use the proxy client key, not dashboard, admin, license, or provider credentials.
Dashboard password stopped working
A credential change invalidated sessions, or the prior login relied on the legacy client-key fallback.
Try the intended protected password once, then use snapshot recovery.
Route missing from /v1/models
Route was not saved or is not effective.
Review Providers, Routing, license gates, and the saved revision.
Request routes but no audit event appears
Text-only replies, disabled allowed-event capture and Debug evaluation may legitimately have no enforcement row; protection/capture may also be disabled.
Use a controlled tool-call fixture; check effective audit settings, enabled, config path and listener.
Stream fails after output begins
Failover cannot safely replace a partially emitted response.
Inspect Errors/provider health; retry from the client only when safe.
Save reports a conflict
The draft used an old config or runtime revision.
Reload, review the new state, and reapply deliberately.
models-dev import fetches and persists catalog advertisements; a running proxy uses the CLI import after restart, while the authenticated dashboard API can import at runtime.
--check-allocation is inert: it inspects saved matches without executing the command.
mcp -- launches a configured stdio child and gates tool calls through the same pipeline. A disabled gateway is transparent passthrough.
Fleet deployment
Render a reviewed JSON file and credential sources with owner-only permissions. Keep machine identities and machine-specific secrets unique where required.
Start one canary with an explicit path: mw-proxy --config /etc/modelwarden/config.json.
Verify process, public model discovery, client authentication, provider response and license lifecycle separately. Then correlate an inert enforcement fixture with its configured event evidence, dashboard display and intended client.
Roll out in batches while watching Errors, Audit, provider health, and client success. Retain the previous config plus every referenced credential file for rollback.
Remote access:A non-loopback listener requires the relevant entitlement and careful authentication. Use native TLS or a trusted reverse proxy; do not expose plain HTTP merely because a client key is set.