Vigil

AI containers shouldn't stay loaded when no one's talking to them. Vigil watches for silence and stops them — freeing VRAM automatically.

http://localhost:8474
Vigil web interface — container list and active proxies

Your GPU is tied up.
The container isn't even doing anything.

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.

Everything you need.
Nothing you don't.

Built for local AI workloads where VRAM is precious and containers stay resident forever by default.

Invisible to your clients

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.

Frees VRAM when idle

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.

Wakes on demand

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.

No terminal required

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.

Protects memory-hungry models

Some models crash under concurrent load. Set a per-proxy max concurrency cap — excess requests queue instead of piling in and causing OOM errors.

Survives restarts

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.

Simple by design

Point your client at Vigil instead of the model container. That's the only change.

01

Request arrives

Client sends a request to Vigil on the configured subpath

02

Wake if needed

If the container is stopped, Vigil starts it and waits for the health check to pass

03

Forward

Request is proxied to the backend; the full response streams back to the client

04

Count down

Idle timer resets on each request. When it expires, the container is stopped or restarted

Up in one command

Requires Docker and access to /var/run/docker.sock. Use host.docker.internal or a LAN IP in backend URLs.

docker run
# 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
docker-compose.yml
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

Your VRAM is waiting.

Open source. MIT licensed. Self-hosted in minutes.

Star on GitHub View releases