Skip to content

Getting started

Shepherd is interactive mission control for fleets of Claude Code agents — it runs sessions, drains backlogs into pull requests, and keeps a human in the loop where it matters.

Terminal window
curl -fsSL https://raw.githubusercontent.com/erwins-enkel/shepherd/main/deploy/install.sh | bash

The installer provisions prerequisites, clones the repo to ~/Work/shepherd, builds the UI, and on Linux installs and enables the systemd user service. It is idempotent — safe to re-run: it never clobbers an existing ~/.shepherd/ state dir and never force-resets a dirty checkout.

This is third-party curl|bash: the script runs unconfined as your user before any sandbox exists, and it invokes upstream installers it does not control — bun.sh, fnm (Node), herdr.dev, and the claude CLI — plus your distro’s package manager for git, unzip, and the C/C++ build toolchain + python3 (needed for the node-pty native build). In keeping with Shepherd’s radical-transparency posture the script echoes each third-party command before running it. Read it first: deploy/install.sh.

OSModeNotes
Linux (systemd + unprivileged userns)FullThe only fully supported target — sandbox membrane, egress allowlist, auto-drain, Tailscale-serve previews, and the systemd user unit.
macOSCore-only / degradedInstalls prereqs, clones, builds the UI, prints a loud degraded banner. No sandbox, egress allowlist, auto-drain, previews, or systemd unit — run bun run start manually.
WindowsNot supportedThe installer refuses and routes you to WSL2.
VariableDefaultPurpose
SHEPHERD_DIR~/Work/shepherdWhere the repo is cloned / found
SHEPHERD_REFmainGit ref to clone or check out
SHEPHERD_SRC(none)Install from a local tarball or directory instead of cloning
SHEPHERD_NO_SERVICE(none)Skip the systemd unit step (set automatically on macOS)

The installer never runs commands that need a human secret. After it completes, sign in:

Terminal window
claude # sign in with your Max/Pro subscription
# (or configure API-key auth in Settings → Session)
gh auth login # GitHub integration (PR list, merge, redeploy)
# remote access via Tailscale
tailscale serve --bg 7330
# then add the tailnet hostname to SHEPHERD_ALLOWED_HOSTS
# (in ~/.shepherd/env or deploy/shepherd.service)

Settings → DIAGNOSE surfaces any remaining gaps with one-click fixes.

To run Shepherd from a checkout instead of the installer:

Terminal window
# 1. install deps (root + ui)
bun install
cd ui && bun install && cd ..
# 2. build the SPA (the core serves it statically from ui/build)
cd ui && bun run build && cd ..
# 3. run the core
bun run start
# → shepherd core on http://localhost:7330

Open http://localhost:7330. To expose it (e.g. via Tailscale), set SHEPHERD_ALLOWED_HOSTS to include the public hostname — see Configuration.

  • Bun — backend runtime + package manager
  • herdr on PATH — manages the interactive claude panes (owns the PTYs)
  • The claude CLI, logged in with your Max/Pro subscription
  • Node.js — for the PTY helper subprocess