Open-source proxy, spend governor, and operational dashboard for AI agents.
Route agent traffic through one endpoint, track real model costs, enforce budgets, and keep a live control plane in front of your providers.
AI agents are expensive, fast-moving, and easy to lose control of. Oberwatch puts a control layer in front of them:
- One proxy endpoint for agent traffic
- Per-agent spend tracking with real pricing tables
- Budget thresholds, alerts, downgrade paths, reject/kill enforcement
- Live dashboard for costs, agents, settings, and emergency controls
- SQLite-backed persistence for agents, costs, alerts, sessions, and runtime state
- First-run onboarding with single-user session auth
| Area | What you get |
|---|---|
| Proxy | OpenAI-compatible and Anthropic-style traffic routed through a single Oberwatch endpoint |
| Budgets | Per-agent and default budgets with alert, reject, downgrade, and kill actions |
| Alerts | Threshold alerts at configurable percentages, live dashboard toasts, webhook and Slack dispatch |
| Dashboard | Overview, Agents, Costs, and Settings pages with live SSE updates |
| Auth | First-run setup flow, login/logout, cookie sessions, password change |
| Persistence | SQLite storage for costs, alerts, agents, settings, and emergency stop state |
| Safety | Emergency stop that pauses agent traffic while keeping the management UI/API online |
| Pricing | Built-in pricing defaults plus config overrides, including streaming usage extraction |
Agent SDK / app
|
v
Oberwatch proxy
|
+--> identifies agent
+--> checks budget policy
+--> forwards to provider
+--> extracts token usage
+--> calculates cost
+--> stores spend + alerts + traces/state
|
v
Dashboard + API + SQLite
curl -fsSL https://raw.githubusercontent.com/OberWatch/oberwatch/main/scripts/install.sh | shThen open http://localhost:8080 to complete setup.
docker run -d -p 8080:8080 -v oberwatch-data:/data ghcr.io/oberwatch/oberwatch:betaFor preview testing, use the beta channel instead of the staging channel:
wget https://raw.githubusercontent.com/OberWatch/oberwatch/main/docker-compose.yml
# Edit to uncomment enterprise services and add license key
docker compose up -dgit clone https://github.com/OberWatch/oberwatch.git
cd oberwatch
make build
./bin/oberwatch servegit clone https://github.com/OberWatch/oberwatch.git
cd oberwatch
make devmake dev is the default local workflow. It runs:
- the Go backend with
airfor automatic rebuild/restart - the Svelte dashboard dev server with hot reload
- a proxy from
/_oberwatch/*tohttp://localhost:8080
Oberwatch is designed to boot cleanly on a fresh machine or hosted platform.
- Start the binary or container.
- Open the dashboard.
- Create the single admin account in the onboarding flow.
- Sign in.
- Point agents at the proxy URL shown by Oberwatch.
Management auth is session-based. After setup, the dashboard and management API use secure cookies instead of a shared dashboard token.
Use Oberwatch as the base URL your agent runtime talks to, and send an agent identity header.
Example OpenAI-compatible request:
curl http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Oberwatch-Agent: research-agent" \
-d '{
"model": "gpt-4.1-mini",
"messages": [{"role": "user", "content": "Summarize the latest sprint notes."}]
}'That agent name becomes the key for:
- budget enforcement
- cost tracking
- alerts
- dashboard visibility
- runtime controls such as reset, enable, rename, and kill
Oberwatch can enforce both shared defaults and per-agent overrides.
Supported actions when spend crosses policy limits:
alertrejectdowngradekill
Current behavior includes:
- configurable threshold alerts, commonly
50,80,100 - automatic live dashboard notifications when thresholds are crossed
- persistent kill state for manual and runaway kills
- automatic recovery after period reset for budget-exceeded kills
- emergency stop across all agent traffic without taking the control plane offline
The embedded dashboard is part of the main binary.
Current pages:
Overviewfor spend, active agents, alerts, uptime, and emergency stopAgentsfor runtime status, budget usage, edit panel, rename, kill/enable/resetCostsfor totals, breakdowns, charts, and CSV exportSettingsfor system health, provider status, pricing, and password change
The UI uses server-sent events for live updates, including:
- budget threshold toasts
- emergency stop changes
- cost refresh triggers
- live alert visibility
Oberwatch tracks real costs instead of raw token counts alone.
It currently supports:
- built-in pricing defaults for OpenAI, Anthropic, and Google models
- config-based pricing overrides
- extraction of usage from standard response bodies
- streaming usage accumulation for providers that emit final usage data
- fallback estimation when providers omit usage entirely
Very small non-zero amounts are displayed with higher precision so sub-cent spend does not collapse to $0.00.
Start with the example config:
You can run fully config-free, but a config file becomes useful when you want to define:
- explicit agent budgets
- downgrade chains
- alert thresholds
- upstream base URLs
- trace retention and SQLite paths
- webhook or Slack alert destinations
Environment variables override TOML using double-underscore nesting.
Examples:
export OBERWATCH_SERVER__PORT=8080
export OBERWATCH_GATE__ENABLED=true
export OBERWATCH_TRACE__STORAGE=sqliteIf you expose Oberwatch on the public internet, put it behind a reverse proxy such as Caddy or Nginx and terminate TLS there.
Warning: Never expose Oberwatch without TLS in production. API keys pass through the proxy in request headers.
See production.md for the production deployment guide placeholder.
Oberwatch publishes images across two registries with different intent.
| Channel | Registry | Purpose |
|---|---|---|
latest, 0.1, 0.1.0 |
Docker Hub + GHCR | Stable tagged releases |
beta |
GHCR | Preview build from main |
staging |
GHCR | Integration/staging build |
sha-<commit> |
GHCR | Immutable branch build for debugging and verification |
Recommended usage:
- Production:
oberwatch/oberwatch:0.1.0oroberwatch/oberwatch:latest - Preview testing:
ghcr.io/oberwatch/oberwatch:beta - Staging environments:
ghcr.io/oberwatch/oberwatch:staging
Oberwatch ships as a Cobra-based CLI.
Primary commands:
oberwatch serveoberwatch gateoberwatch traceoberwatch test runoberwatch validateoberwatch initoberwatch version
Core paths:
- cmd/oberwatch - CLI entrypoint
- internal/api - management API and auth
- internal/proxy - provider proxy path
- internal/budget - budget tracking and enforcement
- internal/pricing - pricing engine and usage extraction
- internal/storage - SQLite persistence
- dashboard/svelte - Svelte dashboard source
Project docs:
See CONTRIBUTING.md for local setup, checks, commit conventions, and workflow details.
The short version:
make devThen before sending work upstream, run the same checks CI expects.
Oberwatch is licensed under the GNU Affero General Public License v3.0.
Copyright (C) 2026 Bouali Consulting Inc.