Installation
| Method | Platforms | Upgrades |
|---|---|---|
| Homebrew | macOS, Linux; arm64 and x64 | brew upgrade chernabog |
| Release binary | macOS, Linux; arm64 and x64 | by hand |
| From source | anywhere Bun builds | by hand |
Homebrew
Section titled “Homebrew”brew install dataquail/tap/chernabogThe formula installs the release binary for your platform and pulls in gh. Each release updates it. Then set up the machine.
After an upgrade, move the daemon onto the new version:
brew upgrade chernabogchernabog stop && chernabog startThe daemon’s service, and the hooks Chernabog writes for agents, name the binary by its $(brew --prefix)/opt/chernabog path rather than its versioned Cellar path, which brew upgrade deletes. They keep working across upgrades.
Release binary
Section titled “Release binary”Each release attaches one self-contained binary per platform — darwin-arm64, darwin-x64, linux-x64, linux-arm64 — and a sha256 file.
target=darwin-arm64tag=$(gh api repos/dataquail/chernabog/releases --jq '[.[].tag_name | select(startswith("v"))][0]')gh release download "$tag" --repo dataquail/chernabog \ --pattern "chernabog-$tag-$target.tar.gz" --pattern "chernabog-$tag-sha256.txt"grep -- "-$target.tar.gz" "chernabog-$tag-sha256.txt" | shasum -a 256 -c -tar -xzf "chernabog-$tag-$target.tar.gz"mv chernabog ~/.local/bin/- Tags. The binary’s start with
v, the SDK’s withsdk-v. GitHub’s “latest release” is sometimes the SDK’s, so the second line picks the newestvtag. - Gatekeeper. macOS binaries are signed ad hoc, not notarized. Download with
ghorcurl; a browser download is blocked.
To upgrade, chernabog stop, install the new binary the same way, then chernabog start. mv replaces the file rather than writing over it, which macOS requires of a signed binary that is running; cp over it gets the process killed.
From source
Section titled “From source”git clone https://github.com/dataquail/chernabog && cd chernabogbun installbun run build # dist/chernabogmv dist/chernabog ~/.local/bin/Every method needs git, gh logged in with the repo scope, and your agent’s own CLI. See Requirements.
Set up the machine
Section titled “Set up the machine”chernabog installinstall runs chernabog setup, then registers the daemon as a launchd agent or systemd user unit and starts it. setup writes ~/.config/chernabog/config.yaml, asking only what it has to, and is safe to run again to add a login or an account.
- GitHub personas. The logins
gh auth statuslists, asked withoutGH_TOKEN. With one, it’s added without asking, alongside any already in machine config; with several, you pick which ones Chernabog acts as. It won’t drop a login an enrolled repo still runs as. With none, runs act asGH_TOKENorgh’s active account. - AI accounts. It finds
~/.claude*and~/.codex*directories that machine config doesn’t have yet and asks which to add, then asks for any others, such as~/.claude-personalbehind apclaudealias, and which agent each is for when the name doesn’t say. It stores the account’s config directory, home-relative, and its agent, never the alias, and names the account after the directory:~/.claude-personalbecomesclaude-personal. Withoutaccounts:, machine config has one implicit account,work, on~/.claude; the first timesetupwritesaccounts:it keepsworkthere too.
| Flag | Answers |
|---|---|
--persona <a,b> |
the GitHub logins to act as; each must be logged in to gh |
--account <dir[:agent],…> |
the account directories to add, such as ~/.codex-work:codex; the agent is inferred from a name like .codex-work |
Both commands take both flags. Piped and without them, setup still takes a single gh login, leaves the personas as they are when there are several, and adds an account only when machine config has no accounts: yet and it finds exactly one.
Then set up a repo.