Reference

Configuration

Every option in ~/.pilothouse/config.yaml — web listener, presence thresholds, hold limit, fail-closed, notifications, retention and the update check — with defaults.

Pilothouse works without a config file; every option has a default. To change something, create ~/.pilothouse/config.yaml (or $PILOTHOUSE_HOME/config.yaml). Durations use Go syntax: 45s, 9m, 720h.

web:
  addr: 127.0.0.1:7517          # loopback only
  public_url: ""                # set by `pilothouse remote tailscale`

presence:
  idle_threshold: 60s           # idle longer than this = away (min 5s)
  notify_after: 45s             # at the desk: desktop notification after this long

approvals:
  hold_limit: 9m                # how long to hold a request for your devices (min 10s)
  always_hold: false            # send every permission request to devices, even at the desk
  fail_closed: false            # deny PreToolUse when the daemon is unreachable

notify:
  desktop: true
  ntfy:
    server: https://ntfy.sh
    topic: ""                   # empty = ntfy off
    token: ""
  webhooks: []                  # Slack/Discord-compatible incoming webhook URLs

retention: 720h                 # closed requests and hook events (30 days)
machine: ""                     # name shown in the inbox and on your phone (default: hostname)
update_check: true              # anonymous daily update check

Options

Key Default Description
web.addr 127.0.0.1:7517 Listener for the web app and device API. Keep it on loopback; use Tailscale Serve for remote access.
web.public_url — HTTPS address of the web app, e.g. https://mac.tailnet.ts.net. Used for pairing links, push and ntfy buttons.
presence.idle_threshold 60s How long without input before you count as away.
presence.notify_after 45s At the desk, send a desktop notification if a dialog has waited this long.
approvals.hold_limit 9m Maximum time a request is held for your devices before the agent’s own dialog takes over. Always clamped below the agent’s hook timeout.
approvals.always_hold false Route every permission request to devices regardless of presence.
approvals.fail_closed false If the daemon is unreachable, deny PreToolUse instead of having no opinion.
notify.desktop true Desktop notifications.
notify.ntfy.server https://ntfy.sh ntfy server.
notify.ntfy.topic — ntfy topic. Empty disables ntfy.
notify.ntfy.token — ntfy access token.
notify.webhooks [] Incoming webhook URLs (Slack, Discord).
retention 720h How long closed requests, hook events and state evidence are kept.
machine hostname Display name for this machine in the inbox, web app and notifications. Also settable with PILOTHOUSE_MACHINE.
update_check true Anonymous daily update check.

Environment variables

Variable Effect
PILOTHOUSE_HOME Data directory (default ~/.pilothouse)
PILOTHOUSE_NO_UPDATE_CHECK=1 Disable the update check

Inside wrapped agents Pilothouse sets PILOTHOUSE=1 and PILOTHOUSE_SESSION_ID.

Found a mistake? Open an issue.