Install
The published birdclaw package is a Node CLI plus a local web app. Source development and Birdclaw's production deployment use one checksum-pinned Bun 1.4 canary, while the npm/Homebrew artifact retains its public Node 26 contract.
#Requirements
- Homebrew/npm runtime: Node.js
>=26.5.1 <27 - Source toolchain: the exact Bun
1.4.0-canary.1+f972c287frecorded intoolchains/bun-canary.conf - Source bootstrap:
curl,unzip, and either macOS arm64 or Linux x64 - macOS is recommended for archive autodiscovery (Spotlight
mdfind); Linux works for everything else - SQLite uses the shared
node:sqliteAPI under Node and Bun — no separate SQLite install is needed
Bun 1.4 is the Rust port of Bun, but it still embeds JavaScriptCore, SQLite, and other C/C++ components. The selected build is a canary rather than a stable release. Birdclaw verifies the archive checksum, extracted binary checksum, full source revision, and bun --revision before using it.
Bun's public canary download is rolling, so Birdclaw does not use it. The bootstrap downloads the revision-specific artifact from Bun's Buildkite build 90456 and fails closed on any checksum or revision mismatch. You can also pass a verified cached archive explicitly:
BIRDCLAW_BUN_ARCHIVE=~/Downloads/bun-darwin-aarch64.zip \
./scripts/install-bun-canary.sh
Optional but encouraged:
xurl— recommended official-API live reads/writes (likes, bookmarks, blocks, mutes, posting)- an existing private
birdinstallation — optional browser-cookie-backed compatibility fallback OPENAI_API_KEY— inbox scoring and low-signal filtering
birdclaw still works in pure local/archive mode without any of the optional tools.
#Homebrew (macOS, Linux)
brew install steipete/tap/birdclaw
birdclaw --version
The Homebrew formula lives in steipete/homebrew-tap and installs the npm artifact with its Node runtime contract.
#npm
npm install -g birdclaw
birdclaw --version
The package is published as birdclaw on npm. Its #!/usr/bin/env node launcher and engines.node range remain tested in CI.
#From source
git clone https://github.com/steipete/birdclaw.git
cd birdclaw
./scripts/bun-canary.sh install --frozen-lockfile
./scripts/bun-canary.sh run --bun build
./scripts/bun-canary.sh bin/birdclaw.mjs --version
./scripts/bun-canary.sh installs the exact verified binary under the ignored project-local .toolchains/ directory, prepends only that binary to PATH, disables Bun's implicit .env loading, and sets DO_NOT_TRACK=1 unless you override it.
The source build produces the same compiled bin/ plus dist/cli, dist/client, and dist/server artifact shape used by the npm package. Runtime TypeScript loaders are not shipped.
#Node compatibility from source
Node remains a named public contract rather than a fallback hidden inside the default scripts:
fnm use
./scripts/bun-canary.sh run test:node
./scripts/bun-canary.sh run coverage:node
./scripts/bun-canary.sh run build:node
Bun owns dependency installation through bun.lock; Node executes the same sources and compiled package in the compatibility lane.
#Verify the install
birdclaw --version
birdclaw auth status --json
birdclaw db stats --json
auth status runs Birdclaw's coarse xurl status probe. Verify xurl with xurl whoami. Existing private bird users can verify bird with bird whoami. See Sign in for the complete setup and transport-selection model.
#Optional: xurl
# macOS
brew install --cask xdevplatform/tap/xurl
# macOS or Linux
npm install -g @xdevplatform/xurl
xurl auth oauth2 --app my-app
xurl whoami
Alternatively, use xurl's no-sudo install script. Register my-app through the xurl authentication guide, keeping the client secret out of shared shell history and process listings. The redirect URI configured in the X developer portal must match xurl's configured URI. Birdclaw shells out to xurl and does not own ~/.xurl.
#Existing bird installations
Birdclaw preserves compatibility with existing private bird installations, but bird is not a public setup path for new users. If bird is already installed, verify it with bird whoami.
This compatibility path matters most for DMs, mentions, timeline reads, and moderation flows where X rejects OAuth2 writes.
If you only run birdclaw via launchd (jobs install-bookmarks-launchd), bird may need its AUTH_TOKEN/CT0 exported via an env file because launchd does not see your interactive browser session. See Jobs.
#Optional: OpenAI
export OPENAI_API_KEY="sk-..."
Add it to ~/.profile or your shell rc to persist. The inbox uses OpenAI for low-signal scoring; without the key, inbox --score is a no-op and the heuristic ranker still works.
#Updating
- Homebrew:
brew upgrade birdclaw. - npm:
npm i -g birdclaw@latest. - Source:
git pull && ./scripts/bun-canary.sh install --frozen-lockfile && ./scripts/bun-canary.sh run --bun build.
If the pinned Buildkite artifact is unavailable, use the previously verified archive through BIRDCLAW_BUN_ARCHIVE. Updating to a different Bun canary is a repository change with new artifact URLs, checksums, and a full compatibility/performance rerun, not an automatic upgrade.
The local SQLite store is forward-compatible across point releases. Long-running schema migrations run on startup; birdclaw db stats --json reports the current schema version.
#Uninstall
# Homebrew
brew uninstall birdclaw
# npm
npm rm -g birdclaw
# Optional source toolchain cache
rm -rf .toolchains/bun
# Optional: also remove local data
rm -rf ~/.birdclaw
The local data root defaults to ~/.birdclaw (override via BIRDCLAW_HOME). Removing it deletes your imported archive, media cache, and live cache. Backup shards are stored separately if you set up backup sync.