Skip to main content

Release Notes 1.1.0

Release date: 2026-05-03

Highlights​

  • Autostart and crash recovery. Skulk can now run as a supervised service on macOS (LaunchAgent) and Linux (systemd user unit). It starts at login/boot and restarts itself automatically if it crashes. One-shot installers handle the setup; no root required on either platform.
  • Tailscale connectivity. A new connectivity layer lets cluster nodes span multiple physical networks over Tailscale (or a self-hosted Headscale server). Each node detects its own Tailscale status at startup; the dashboard's Node tab shows Tailscale IP and DNS name; and a new API endpoint exposes connectivity status to monitoring tools.
  • Operator panel. A dedicated /operator route in the dashboard gives remote operators a mobile-first view of cluster health (memory, GPU, and temperature at a glance) with a tap-twice-to-confirm node restart button that doesn't require SSH.
  • Remote dashboard fixes. The chat view and copy affordances now work over plain HTTP (not just localhost or HTTPS), which matters when accessing Skulk over Tailscale.

Autostart and Crash Recovery​

deployment/install/install-launchd.sh (macOS) and deployment/install/install-systemd.sh (Linux) are one-shot scripts that register Skulk as a user-level service. Both supervisors:

  • Start Skulk at login (macOS) or boot (Linux, via loginctl enable-linger)
  • Restart on crash with backoff; stop after 5 crashes within 5 minutes to avoid a hot restart loop
  • Leave a clean exit (exit 0) alone: deliberate skulk stop stays stopped

A pre-startup port preflight exits with EX_TEMPFAIL (75) when the API port is still held by a previous instance. The supervisor's backoff handles the brief race on restart; operators get a clear log line rather than a confusing mid-run bind error.

See the Run Skulk as a service guide for installation steps and day-to-day operations.

Tailscale Connectivity​

Add a connectivity section to skulk.yaml to enable multi-network clusters:

connectivity:
tailscale:
enabled: true
bootstrap_peers:
- /ip4/100.101.102.103/tcp/52416 # other node

At startup, Skulk runs tailscale status --json and logs its Tailscale IP, hostname, and tailnet name. The Node tab in the Observability panel surfaces the same information. GET /v1/connectivity/tailscale exposes it to scripts and monitoring tools.

See the Tailscale guide for full setup instructions, ACL guidance, and Headscale notes.

Operator Panel​

Open /operator in the dashboard (or tap "Operator" in the nav) for a layout optimized for phone-sized screens over Tailscale:

  • Cluster summary bar: total nodes, memory in use, average GPU utilization, and average temperature across the cluster
  • Per-node cards: role badge (master / worker), memory bar, GPU bar, temperature, and model placements
  • Tap-twice restart: tap "Restart" on a node card; a "Confirm?" prompt appears; tap again within 3 seconds to fire POST /admin/restart. Accidental taps do nothing.

Upgrade Guidance​

No breaking changes relative to 1.0.3. The new connectivity.tailscale config section is optional; omitting it leaves behaviour identical to 1.0.3.

If you run Skulk as a manual uv run skulk process today, the service installer is additive: run it once and the existing process becomes supervised going forward.

Validation Snapshot​

  • uv run basedpyright: 0 errors, 0 warnings, 0 notes
  • uv run ruff check: clean
  • uv run pytest: all pass
  • cd dashboard-react && npm run build: clean