docs/observability/dashboard.md
The Daft Dashboard is a web UI for inspecting Daft query execution. Daft scripts push query metadata, plans, and execution stats to the dashboard server, which you can browse to investigate query behavior in real time.
The dashboard ships pre-built with the daft Python package — pip install daft is all you need, no separate install step or extra dependencies.
!!! note The dashboard is under active development. Some operational ergonomics (persistence, compatibility, authentication) are still evolving — feedback is welcome on the Daft Slack or GitHub.
The dashboard has two pieces:
DAFT_DASHBOARD_URL environment variable is set.The relationship is push-based: your Daft script (and any Ray actors running on its behalf) sends events to the dashboard. The dashboard does not need to know where your script or cluster is — it only needs to be reachable over HTTP from anywhere that runs Daft code.
Running the dashboard alongside a local Daft script is the quickest way to try it out.
In one terminal, start the dashboard server:
daft dashboard start
By default this listens on 0.0.0.0:3238. You can override the address and port:
daft dashboard start -a 127.0.0.1 -p 3238
Useful flags:
-a, --addr <ADDR>: address to bind to (default 0.0.0.0).-p, --port <PORT>: port to bind to (default 3238).-v, --verbose: log HTTP requests and responses.-d, --daemon: run in the background (Unix only). Logs go to $DAFT_DASHBOARD_LOG_DIR/daft_dashboard.log (defaults to your system's temp directory). Stop the daemon with daft dashboard stop.In another terminal, point your Daft script at the dashboard via the DAFT_DASHBOARD_URL environment variable:
DAFT_DASHBOARD_URL=http://localhost:3238 python script.py
Then open http://localhost:3238 in a browser to view query activity.
When running Daft on a Ray cluster (whether self-managed or on a platform like Kubernetes), three things need to be true for the dashboard to work:
DAFT_DASHBOARD_URL.ray attach --port-forward).The dashboard is a standalone HTTP server, so it can be deployed in several places. Pick one based on your topology:
ray attach --port-forward 3238). Note that the dashboard will compete for resources on the head.The dashboard does not need to be told where the Ray cluster is. It is a passive recipient — Daft queries push events to it.
DAFT_DASHBOARD_URLSet DAFT_DASHBOARD_URL on the Python driver process. Daft propagates it to the Ray actors that run query work, so you do not need to set it separately on the workers.
The URL must be routable from every process that runs Daft code — both the driver and the Ray head/workers. In particular:
http://localhost:3238 only works if the dashboard, driver, and Ray actors are all on the same host. On Ray, actors will resolve localhost to their own node, not the driver's, so this almost never works in a cluster.http://daft-dashboard.my-namespace.svc:3238), the runner pod's hostname, or the head node's IP.Example for a Kubernetes deployment where the dashboard runs as a sidecar in the runner pod:
# In the runner pod, alongside the Python script:
daft dashboard start -p 3238 --daemon
# Run the script with DAFT_DASHBOARD_URL pointing at a hostname
# the Ray head and workers can resolve.
export DAFT_DASHBOARD_URL=http://runner-01.my-namespace.svc:3238
python script.py
To make the UI accessible to humans (not just Daft processes), expose the dashboard port through whatever mechanism your platform uses — a Kubernetes Service plus Ingress, an SSH tunnel, ray attach --port-forward, or a cloud load balancer.
0.0.0.0 is convenient but means the dashboard accepts connections from any interface. Restrict access at the network layer (security groups, NetworkPolicies, firewall rules).