macOS · single binary · no dependencies

Catch releases straight from GitHub.

ketch installs command-line tools and macOS apps directly from GitHub releases. No taps, no formulae, no build step — it downloads what the project already ships, verifies it, and puts it on your PATH.

curl -fsSL https://raw.githubusercontent.com/listepo/ketch/main/install.sh | bash

What it does differently

Any repo that ships releases

No formula to write and no maintainer to wait for. Point ketch at owner/repo and it infers the rest — the asset matching your architecture, the binaries inside, what to call them.

Verified, not just downloaded

Published SHA-256 checksums are checked against what actually landed on disk. require_checksums refuses anything that publishes none, and ketch's own updates never accept trust-on-first-use.

Apps as well as binaries

A release that ships an .app bundle gets placed in /Applications, quarantine cleared when the signature checks out — and removed cleanly when you uninstall it.

Everything in one tree

Versioned payloads in ~/.ketch/store, links in ~/.ketch/bin, one state.json. Nothing is written anywhere else. Uninstalling leaves nothing behind.

Sources beyond GitHub

GitLab, Gitea, an internal artifact server: a plugin is one executable that answers in JSON. No recompile, no ketch release. The protocol is one page.

A registry you can read

One folder per package, one ketch.toml inside. No index to keep in step, no lockstep releases — send a pull request.

The whole surface

ketch install <pkg>...     # install; --pre for prereleases, @version to pin one
ketch list                 # what is installed
ketch outdated             # what has a newer release
ketch upgrade              # bring everything unpinned up to date
ketch info <pkg>           # details, including --assets and why each scored
ketch search <query>       # the registry and GitHub
ketch changelog <pkg>      # what changed: the shipped file, or the release notes
ketch history [<pkg>]      # every version you have had, newest first
ketch stats                # how many installs, and how long they take
ketch update               # refresh the package registry
ketch pin / unpin <pkg>    # hold a version, or let go
ketch uninstall <pkg>...   # remove it
ketch lock / sync          # pin every tool to a release, and reproduce it
ketch path install         # put ~/.ketch/bin on PATH in bash, zsh and fish
ketch doctor --fix         # check the environment, and repair what it can
ketch self update          # upgrade ketch itself
ketch self uninstall       # remove ketch, its packages, its PATH block, its cask

Names resolve through four tiers — your own manifests, the fetched registry, the registry compiled into the binary, then inference from owner/repo. The last one is what makes an uncurated repository installable with no manifest at all. Writing a manifest →

Get started

curl -fsSL https://raw.githubusercontent.com/listepo/ketch/main/install.sh | bash

Then add ~/.ketch/bin to your PATH. ketch doctor will tell you if it is not.