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