owl ships as a multi-arch container image (ghcr.io/neverbot/owl:latest). The fastest way to see it is to clone the repository and bring the bundled compose stack up — it pulls the published image, mounts the example config, and exposes the UI on port 9090.

From a clone

git clone https://github.com/neverbot/owl.git
cd owl
docker compose up

Then browse to http://localhost:9090/. The bundled Owl Health dashboard is the first thing you see; it plots the binary's own goroutines, heap, GC pauses, storage size and alerter counters. Owl scrapes its own /metrics endpoint on startup, so panels populate within one scrape interval.

Owl Health dashboard

docker compose up --build rebuilds the image from your local checkout — useful when hacking on the Go code. docker compose down -v removes the named data volume for a clean slate.

Minimal compose

services:
  owl:
    image: ghcr.io/neverbot/owl:latest
    ports: ["9090:9090"]
    volumes:
      - ./config.yml:/etc/owl/config.yml:ro
      - ./dashboards:/etc/owl/dashboards:ro
      - owl-data:/data
    command: ["--config", "/etc/owl/config.yml"]
volumes:
  owl-data:

Minimal config

The same shape parses cleanly through owl's loader. Drop your own scrape targets under targets: and any dashboards under dashboards.dir.

listen: "0.0.0.0:9090"

storage:
  path: "/data/owl.db"
  retention:
    time: 30d
    size: 500MB
    interval: 30m

scrape:
  default_interval: 30s
  default_timeout: 10s

targets:
  - name: owl-self
    url: "http://127.0.0.1:9090/metrics"
    labels:
      job: owl

dashboards:
  dir: "/etc/owl/dashboards"

The owl-self target is what makes the Owl Health dashboard light up without further configuration. Drop or override it if you want an external Prometheus to scrape the same endpoint instead.

What to do next

  • Tune the YAML — every field is listed in Configuration, including the env vars that override file values for operational secrets.
  • Add your own dashboard JSON to dashboards/. See Dashboards for the panel shape and supported units.
  • Wire a webhook for Alerting. Owl posts JSON on every state transition; the rest is up to your receiver.
  • If you run on a Linux VPS, opt into the host collector and the Docker integration.

Validate any config without starting the server:

owl --config /etc/owl/config.yml --check-config