Documentation

Installation

Sift ships as a single self-contained binary with no runtime dependencies. Choose the path that fits your platform.

Requirements

  • Runtime: any supported operating system below. The prebuilt binaries need nothing else installed.
  • To build from source: Go 1.26 or newer.
  • Signature compression (--mode signatures) is included in the prebuilt release binaries. Building from source enables it when cgo is available.

macOS and Linux (curl)

curl -fsSL https://bethropolis.github.io/sift/install.sh | sh

The installer places sift in ~/.local/bin. Set SIFT_INSTALL_DIR to choose a different destination:

SIFT_INSTALL_DIR="$HOME/bin" curl -fsSL https://bethropolis.github.io/sift/install.sh | sh

If ~/.local/bin is not already on your PATH, add it to your shell profile:

export PATH="$HOME/.local/bin:$PATH"

Homebrew

brew install bethropolis/tap/sift

Windows (Scoop)

scoop bucket add bethropolis https://github.com/bethropolis/scoop-bucket
scoop install sift

FreeBSD and other release archives

Download a prebuilt archive for your operating system and architecture from the latest GitHub release. Archives are produced for Linux, Windows, macOS, and FreeBSD on amd64, arm64, 386, and armv7 where supported by Go.

Build from source

Clone the repository and run the local installer, which builds the checkout you are in and installs to ~/.local/bin (override with SIFT_INSTALL_DIR):

git clone https://github.com/bethropolis/sift.git
cd sift
./scripts/install.sh

Or build manually:

go build -o "$HOME/.local/bin/sift" ./cmd/sift

During development the justfile provides just build (writes bin/sift), just test, just vet, and just fmt.

Verify the installation

sift version
# e.g.  sift version 1.0.4

Confirm it can render by scanning a small project to standard output:

sift dump . --output -

Shell completions

sift can generate completion scripts for Bash, Zsh, Fish, and PowerShell:

sift completion bash   # or: zsh, fish, powershell

Both installers write Bash, Zsh, and Fish completions into your user-local directories automatically when those shells are present (failures are non-fatal warnings). Zsh additionally needs the site-functions directory on your fpath; the installer prints the exact line to add. To load completions without reinstalling, source the output directly:

source <(sift completion bash)

Desktop launcher (Linux and macOS)

sift desktop install adds Sift to your app launcher, opening sift serve --app (run it with the installed binary, not a go run cache path — the entry embeds the binary that ran the install):

sift desktop install    # install the launcher
sift desktop status     # show what is installed
sift desktop uninstall  # remove it again

Linux writes ~/.local/share/applications/sift.desktop plus an icon and refreshes the desktop database. macOS builds ~/Applications/Sift.app (the icon needs sips, which ships with macOS; without it the bundle installs iconless, and first launch may show a Gatekeeper prompt for the unsigned bundle). Everything is user-local and marked, so uninstall only removes files sift created — a foreign file at one of these paths is left alone with an explanation.

Distro packages may ship the same entry system-wide: packaging/sift.desktop launches sift serve --app and travels in the release tarballs (including sift-context-bin from v1.4.0 on).

Upgrading

Re-run the same install command you used originally — the installer overwrites the existing binary — or download the newest release archive. State and preferences written during use live under your application configuration directory and are preserved across upgrades.

Uninstalling

Remove the installed binary, and optionally the config/state directory:

./scripts/uninstall.sh            # from a checkout; binary + generated completions
./scripts/uninstall.sh --purge    # ...and the config/state directory
brew uninstall bethropolis/tap/sift   # Homebrew
scoop uninstall sift                  # Scoop

uninstall.sh honors SIFT_INSTALL_DIR, removes the desktop launcher first (via the binary itself), and only ever deletes files sift created. Without a checkout, the manual equivalent is rm -f ~/.local/bin/sift plus the completion files; the config/state directory is ~/.config/sift.