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
/operatorroute 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
localhostor 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 stopstays 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 notesuv run ruff check: cleanuv run pytest: all passcd dashboard-react && npm run build: clean