dolly-cli 0.1.1

Like apt, but for GitHub repositories — clone, build, install and update tools from source.
Documentation

Dolly

Like apt, but for GitHub. Named after the sheep.

Most developer tools you actually use live on GitHub, not in your distro's package manager — or if they do, the distro version is two years stale. Dolly is a CLI that clones, builds, and installs tools straight from GitHub source, then keeps them up to date.

The name comes from Dolly the Finn-Dorset, the world's first cloned mammal (Scotland, 1996).

Quick start

# From crates.io (recommended)
cargo install dolly-cli

# From source:
cargo install --git https://github.com/michal-pielka/dolly

Write a recipe at ~/.dolly/recipes/<repo>.toml:

[package]
owner = "junegunn"
repo = "fzf"
description = "A command-line fuzzy finder"

[build]
steps = ["go build ."]
output = "fzf"

Then:

dolly install junegunn/fzf

Dolly clones the repo into ~/.dolly/repos/fzf/, runs go build ., and copies the resulting fzf binary to ~/.local/bin/fzf. Re-runs are idempotent.

Commands

Command What it does
dolly install <owner/repo> Clone, build, install
dolly update [<repo>] [--dry-run] Pull, rebuild, replace; or check upstream
dolly remove <repo> [--keep-repo] Delete the binary (and optionally the clone)
dolly list List installed packages
dolly info <repo> Show recipe, install path, current commit
dolly clone <owner/repo> Just clone — no build, no install

Recipe format

Required: [package].owner, [package].repo, [build].steps, [build].output. Optional: [package].description.

[package]
owner = "BurntSushi"
repo = "ripgrep"

[build]
steps = ["cargo build --release"]
output = "target/release/rg"

steps runs each command via sh -c from the cloned repo's root, with full shell features (&&, pipes, env vars). output is the path to the built binary, relative to the repo root; its basename becomes the installed binary's filename. Unknown fields and malformed TOML fail loudly with a line number.

For multi-step builds, just list each command as its own entry — they're run sequentially, and the first failure aborts:

[package]
owner = "htop-dev"
repo = "htop"
description = "Interactive process viewer"

[build]
steps = [
  "./autogen.sh",
  "./configure",
  "make",
]
output = "htop"

Layout

~/.dolly/
  repos/<repo>/         # cloned source trees
  recipes/<repo>.toml   # user-authored recipes
~/.local/bin/<binary>   # installed binaries (or $XDG_BIN_HOME)

The filesystem is the source of truth — there's no separate state file to drift out of sync.

TODO

Plans for future versions:

  • Crash-safe updates — atomic binary swap with .bak, so a failed mid-update never leaves a broken tool on PATH.
  • Better recipe-not-found UX — copy-pasteable starter template instead of a bare error.
  • Auto-detection — recognise Cargo / Go / Make / CMake repos and generate a starter recipe automatically.
  • Community registry — pull recipes from a shared GitHub repo so common tools work without hand-writing TOML.
  • --quiet build mode — capture build output, replay only on failure.
  • Shell completions via clap_complete.
  • dolly doctor — check for stale clones, missing binaries, broken recipes.
  • Rollback — restore a .bak binary from an earlier version.

License

MIT.