A fast, self-hosted web interface for local and remote language models.
226
A fast, self-hosted web interface for local and remote language models. Functional parity with Open WebUI, built for latency and a small footprint.
Local backends are the primary case, not a fallback. No API key is required, loading a model is reported as its own state rather than as a timeout, and a host that is switched off degrades to an offline badge instead of an error.
docker run -d \
--name velox-ui \
-p 8080:8080 \
-v velox-data:/data \
lordraw/velox-ui:latest
Open http://localhost:8080 and create the first account — it becomes the
administrator. If Ollama is already running on the host, velox-ui finds it by
itself.
velox import openwebui reconstructs the branching
message tree, tags and folders from an Open WebUI chat export.These are CI gates, not marketing numbers — a regression fails the build.
| Target | Budget | Measured |
|---|---|---|
| Time-to-first-token overhead vs. calling the backend directly | < 15 ms p95 | ~10 ms |
| Container image | < 250 MB | ~189 MB |
| Idle memory | < 150 MB | ~131 MB |
| Open a 5 000-message conversation | < 150 ms | ~9 ms |
| Frontend bundle | < 200 KB gzip | ~47 KB |
No GPU, no Node.js and no PyTorch in the runtime image.
Everything has a working default; none of this is required.
| Variable | Default | Notes |
|---|---|---|
VELOX_DATA_DIR | /data | Database, uploads, generated secret key. Mount it. |
VELOX_PORT / VELOX_HOST | 8080 / 0.0.0.0 | |
VELOX_SECRET_KEY | (generated) | Encrypts stored credentials. Generated into /data on first run — set it explicitly to survive a rebuilt volume. |
VELOX_DB_URL | (SQLite in /data) | postgresql+asyncpg://user:pass@host:5432/velox for PostgreSQL. |
VELOX_AUTH_ENABLED | true | false runs as a single local account with no login screen. |
VELOX_LOG_FORMAT | json | console when a person is watching a terminal. |
VELOX_PROVIDER_OLLAMA_HOSTS | (autodiscovered) | e.g. http://192.168.1.10:11434. |
VELOX_PROVIDER_<PRESET>_API_KEY | — | e.g. VELOX_PROVIDER_ANTHROPIC_API_KEY. |
Backends, plugins and MCP servers can also be added from the interface, where credentials are stored encrypted.
services:
velox-ui:
image: lordraw/velox-ui:latest
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- velox-data:/data
environment:
VELOX_PROVIDER_OLLAMA_HOSTS: http://ollama:11434
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-models:/root/.ollama
volumes:
velox-data:
ollama-models:
python:3.12-slim. Runs as a non-root velox user (uid 1000).8080; VOLUME /data.HEALTHCHECK probes /ready (database reachable and migrations current), not
/health (process alive) — so an instance mid-migration is not sent traffic.velox CLI: serve by default, also config check,
migrate up, bench, import openwebui, import mcp-config.Note on stdio MCP servers: the runtime image deliberately ships no Node.js, so
MCP servers launched with npx cannot run inside this container. Run such a server
in lordraw/velox-ui-mcp-gateway
instead — it republishes a stdio server as Streamable HTTP, which velox-ui then adds
as an ordinary http_sse server.
Everything that must survive a container recreation is in the /data volume: the
SQLite database, uploaded and generated files, and secret.key if you did not set
VELOX_SECRET_KEY. Back it up as a unit — losing the key means re-entering every
stored credential. SQLite runs in WAL mode, so use
sqlite3 velox.db ".backup backup.db" rather than copying the file from under a
running process.
docs/configuration.mddocs/deployment.mdApache-2.0.
Content type
Image
Digest
sha256:0f1fe97e7…
Size
62.4 MB
Last updated
about 16 hours ago
docker pull lordraw/velox-ui