Skip to main content
The Adrian backend is a single Go server that combines the WebSocket ingestion endpoint, the dashboard REST API, and the in-process classifier engine. It runs alongside a Next.js dashboard and a Llama.cpp container serving a local Gemma 4 model under Docker Compose. The full open-source release lives at github.com/secureagentics/Adrian. This page covers the configuration surface and the externally-visible endpoints; for step-by-step bring-up and operational walkthroughs, see the repository README.

Bring-up

Requires Docker + Docker Compose v2 and an NVIDIA GPU with the NVIDIA Container Toolkit. Around 10 GB free disk for the bundled classifier model.

Configuration

Backend config is read from environment variables loaded via the .env file the bootstrap writes. Override values directly in .env, or use the setup set-model subcommand to update model-related settings.

Endpoints

The Go server exposes three externally-visible surfaces on the backend port (default 8080).

WebSocket ingestion

This is the endpoint the Adrian SDK connects to. Authentication is via Authorization: Bearer <api_key> on the upgrade. Frames are protobuf-encoded ClientFrame (login / paired_batch / mcp_inventory) and ServerFrame (login_ack / verdict).

Health probes

Compose’s healthcheck for the backend service polls /readyz, so docker compose --profile llm ps reporting (healthy) is the canonical “stack is fully up” signal.

Dashboard API

REST endpoints under /api/ for the Next.js dashboard - authentication, agents, policies, events, verdicts, reviews, webhooks. These are internal to the bundled dashboard at v1 and are not part of a stable public API; see the repo source for current routes.

Architecture

The classifier is the bundled Llama.cpp container running Gemma 4 (E2B or E4B by default). The model is downloaded by the bootstrap step; swap variants via setup set-model --gguf <name>.

Operational tasks

Reset the admin password

Generates a new random password, updates the SQLite admin row, and prints the plaintext to stdout. The password is shown once and never persisted to disk; if you lose it, run reset-password again. Pass --password <plaintext> for a non-interactive flow.

Switch the local GGUF

Updates ADRIAN_LLM_MODEL_PATH in .env and the llm service picks up the new model on next restart. The GGUF must already be present under ./models/.