Skip to content

helix studio

Launch Helix Studio — a single-page web portal that tails /tmp/helix.log, parses agent events (LLM requests, tool calls, ReAct iterations, AG-UI messages), and pushes them to a browser-side dashboard over WebSocket. Also reverse-proxies the management and health APIs so the portal can query routes, components, and uptime alongside the live event feed.

Usage

helix studio [--port=N] [--api=URL] [--health=URL] [--log=PATH]

Flags

Flag Default Description
--port 4400 HTTP port the Studio portal listens on.
--api http://localhost:9090 Management API base URL (reverse-proxied as /api/proxy/...).
--health http://localhost:8181 Health API base URL (reverse-proxied as /api/health-proxy/...).
--log /tmp/helix.log on Unix, <TempDir>/helix.log on Windows Helix log file to tail.

This is the only Helix subcommand that uses Go's flag package — the form is --name value or --name=value.

Behavior notes

  • Requires $HELIX_LICENSE. Verified at process start.
  • The portal is shipped as a single embedded HTML file (compiled in via go:embed). Served at / and /index.html.
  • WebSocket endpoint: /ws. New clients receive a replay of the last 2000 broadcast events on connect so reloads don't lose context.
  • Log tailing polls every 200ms. Handles rotation (different inode) and truncation transparently — when the inode changes or the file shrinks, the position is reset to 0 so events from the new log are picked up.
  • The tail parser recognises the structured-slog lines emitted by the agent and synthesises typed studioEvent records: llm_request, llm_response, llm_streaming, llm_error, final_answer, tool_call, tool_result, tool_calls, tool_error, react_start, agui_message, plus a generic error for any line containing ERROR. Lines that don't match any pattern are silently skipped.
  • Reverse proxies use Go's httputil.NewSingleHostReverseProxy with http.StripPrefix — /api/proxy/... rewrites to --api, /api/health-proxy/... rewrites to --health. CORS is handled by proxy origin sameness; the browser only ever talks to the Studio.
  • The server listens before printing the banner so port-in-use errors surface before "Studio started" is logged.
  • Studio is a separate process from the daemon. To get the most out of it, run helix start app.yaml first (so /tmp/helix.log is being written and --api / --health are reachable), then helix studio.

Examples

Run with all defaults — works out of the box after helix start:

helix start app.yaml
helix studio
# open http://localhost:4400

Different ports (useful in dev with multiple daemons):

helix studio --port=4500 --api=http://localhost:9100 --health=http://localhost:8281

Tail a custom log location:

helix run --log-file=./logs/dev.log app.yaml &
helix studio --log=./logs/dev.log

Source

cmd/helix/studio.go lines 412-467 (cmdStudio), 36-98 (wsHub), 155-214 (tailLog), 216-344 (parseLine), cmd/helix/studio/index.html (embedded HTML).

See also