AI containers shouldn't stay loaded when no one's talking to them. Vigil watches for silence and stops them — freeing VRAM automatically.
Model containers — Ollama, Kokoro TTS, Whisper, ComfyUI — consume gigabytes of VRAM the entire time they're running, even when completely idle. On a single consumer GPU, running two models simultaneously is often impossible.
The standard answer is to manually docker stop containers when you're done.
Nobody actually does this. Vigil does it for you.
Built for local AI workloads where VRAM is precious and containers stay resident forever by default.
All requests pass through untouched — streaming, SSE, chunked responses, large bodies. Point OpenWebUI or any API client at Vigil instead of the container. Zero client-side changes.
After configurable idle time, Vigil stops the container — releasing its VRAM back to the system. The next request wakes it back up. Run as many models as your disk holds, not just your VRAM.
Request arrives while the container is stopped? Vigil starts it, waits for the health check, then forwards. The client just sees a slower first response — nothing breaks.
Monitor live request traffic, adjust idle timeouts, stop or restart containers — all from a web UI. No SSH, no docker ps, no remembering which model is on which port.
Some models crash under concurrent load. Set a per-proxy max concurrency cap — excess requests queue instead of piling in and causing OOM errors.
Proxy configs are persisted to a mounted volume. Set up once, leave it running. Upgrade Vigil, reboot the host — your proxy configuration comes back intact.
Point your client at Vigil instead of the model container. That's the only change.
Client sends a request to Vigil on the configured subpath
If the container is stopped, Vigil starts it and waits for the health check to pass
Request is proxied to the backend; the full response streams back to the client
Idle timer resets on each request. When it expires, the container is stopped or restarted
Requires Docker and access to /var/run/docker.sock. Use host.docker.internal or a LAN IP in backend URLs.
# pull and run docker run -d \ -p 8474:8474 \ --add-host=host.docker.internal:host-gateway \ -v /var/run/docker.sock:/var/run/docker.sock \ -v vigil-data:/data \ ghcr.io/refolded/vigil:latest
services:
vigil:
image: ghcr.io/refolded/vigil:latest
ports:
- "8474:8474"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- vigil-data:/data
environment:
STARTUP_TIMEOUT: "120"
restart: unless-stopped
volumes:
vigil-data:
Open http://localhost:8474 — add your first proxy from the web UI.
| Variable | Default | Description |
|---|---|---|
STARTUP_TIMEOUT |
120 |
Seconds to wait for a container to become ready after start |
DATA_FILE |
/data/proxies.json |
Path where proxy configs are persisted |
Open source. MIT licensed. Self-hosted in minutes.