Troubleshooting

Start with silo doctor. It checks your environment and flags issues.

macOS: "running SIP-protected binary"

macOS strips DYLD_INSERT_LIBRARIES from binaries in /usr/bin, /bin, etc. Silo tries to find a non-SIP alternative from your PATH automatically, but warns when it can't.

Fix: install a shell via Homebrew.

brew install bash
# or
brew install zsh

Silo will automatically pick the Homebrew version over the system one.

"password required" on every run

Silo needs sudo for two things: adding loopback IP aliases and writing to /etc/hosts. On first run, it installs passwordless sudo rules in /etc/sudoers.d/silo.

If this didn't happen, or the rules are stale:

# Remove and re-trigger setup
sudo rm /etc/sudoers.d/silo
silo doctor

"not a git repository"

Silo derives the session IP from the git directory. It won't work outside a git repo. If you need to run in a non-git directory, use --ip to set an address manually:

silo run --ip 127.0.5.1 -- npm run dev

Port still in use after stopping a server

The IP alias and /etc/hosts entry persist after the process exits. This is intentional. It avoids setup overhead on the next run. To clean up:

# Remove aliases with no listening ports
silo prune

# Remove everything
silo prune --all

IP collision between worktrees

The FNV-1a hash has ~16.5 million possible addresses in 127.0.0.0/8. Collisions are rare but possible. If two worktrees get the same IP, override one:

silo run --ip 127.0.99.1 -- npm run dev

silo run will also warn about IP collisions in /etc/hosts at startup.

Statically linked binaries

The preload backend (DYLD_INSERT_LIBRARIES / LD_PRELOAD) only works with dynamically linked binaries. Static Go binaries with CGO_ENABLED=0 won't be intercepted.

Fix (Linux): use the eBPF backend, which intercepts at the kernel level:

sudo silo setup-ebpf
silo ./my-static-binary

On macOS, there is no eBPF alternative. Use CGO_ENABLED=1 or bind to $SILO_IP directly in your code.

"already inside a silo session"

Silo warns when SILO_IP is already set in the environment. Nesting silo sessions is not supported. The inner session would override the outer one.

Linux: eBPF setup

The eBPF backend requires cgroup v2 and kernel 5.8+. Check with:

silo doctor --json | jq '.checks[] | select(.name | startswith("ebpf"))'

If eBPF is available but not set up:

sudo silo setup-ebpf

After setup, silo will use eBPF automatically. No LD_PRELOAD needed, works with static binaries.