bird is a Rust CLI for the X (Twitter) API, built on xurl for authentication and transport. It adds a local entity store, watchlist monitoring, usage tracking, thread reconstruction, and structured error output for agents.
xurl already provides authentication, curated commands, and raw API access. bird extends xurl with capabilities it doesn't have:
- Entity store — Local SQLite cache with per-endpoint TTL. Reduces API calls, enables offline access, and supports
--refresh,--no-cache, and--cache-onlymodes. - Thread reconstruction — Rebuilds full conversation threads from a single tweet ID.
- Watchlist — Monitor a list of users for recent activity without manual searches.
- Usage tracking — Local API usage history with cost estimation;
--syncto refresh from the X API. - Structured errors — Machine-readable JSON errors on stderr for agent and CI integration.
- Self-diagnostics —
bird doctorreports xurl status, auth state, command availability, and store health in one place.
bird delegates all authentication and HTTP transport to xurl at runtime.
brew tap brettdavies/tap
brew install bird# From source (requires Rust toolchain)
cargo install bird
# Pre-built binary (fast, no compiler needed)
cargo binstall birdDownload the latest binary for your platform from Releases. Extract
and place bird on your PATH.
git clone https://github.com/brettdavies/bird
cd bird
cargo build --release
# Binary: target/release/birdbird requires xurl-rs (or the Go xurl) for X API authentication:
# Recommended: xurl-rs (Rust)
brew tap brettdavies/tap
brew install xurl-rs
# Alternative: xurl (Go original)
brew tap xdevplatform/tap
brew install xurlbird checks for xr (xurl-rs) first, then xurl (Go). Override with BIRD_XURL_PATH.
Verify your setup: bird doctor
bird login # Opens browser, sign in, done
bird me --pretty # Current user profile
bird bookmarks # List bookmarks (paginated)
bird search "rust lang" --sort likes --min-likes 100
bird tweet "Hello from bird"No config or app creation needed.
| Command | Description |
|---|---|
bird me |
Current user (GET /2/users/me) |
bird bookmarks |
List bookmarks (paginated, max 100 per page) |
bird profile <user> |
Look up a user by username |
bird search <query> |
Search recent tweets; --sort likes, --min-likes N, --pages N |
bird thread <tweet_id> |
Reconstruct a conversation thread |
| Command | Description |
|---|---|
bird tweet <text> |
Post a tweet |
bird reply <id> <text> |
Reply to a tweet |
bird like <id> |
Like a tweet |
bird unlike <id> |
Unlike a tweet |
bird repost <id> |
Repost (retweet) a tweet |
bird unrepost <id> |
Undo a repost |
bird follow <user> |
Follow a user |
bird unfollow <user> |
Unfollow a user |
bird dm <user> <text> |
Send a direct message |
bird block <user> |
Block a user |
bird unblock <user> |
Unblock a user |
bird mute <user> |
Mute a user |
bird unmute <user> |
Unmute a user |
| Command | Description |
|---|---|
bird watchlist check |
Check recent activity for watched users |
bird watchlist add <user> |
Add a user to the watchlist |
bird watchlist remove <user> |
Remove a user from the watchlist |
bird watchlist list |
Show the current watchlist |
bird usage |
View local API usage and cost estimates |
bird usage --sync |
Refresh usage data from the X API |
| Command | Description |
|---|---|
bird get <path> |
GET request; supports path templates with -p id=123 |
bird post <path> |
POST request; optional --body '{"text":"..."}' |
bird put <path> |
PUT request |
bird delete <path> |
DELETE request |
| Command | Description |
|---|---|
bird login |
Sign in via browser (delegates to xurl) |
bird doctor |
Diagnostics: xurl status, auth, commands, store health |
bird doctor <cmd> |
Scoped diagnostics for a single command |
bird cache stats |
Entity store status |
bird cache clear |
Delete all cached entities |
bird completions <shell> |
Generate shell completions (bash, zsh, fish, powershell, elvish) |
bird maintains a local SQLite entity store that caches API responses with per-endpoint TTL. This reduces redundant API calls and provides offline access to previously fetched data.
bird search "rust" --refresh # Bypass store, fetch fresh, update store
bird search "rust" --no-cache # Skip store entirely (no read, no write)
bird search "rust" --cache-only # Serve from store only, no API requests
bird cache stats --pretty # View store status
bird cache clear # Wipe the storeAll commands emit JSON to stdout by default. Use --pretty for human-readable output.
bird me --pretty # Formatted, colored output
bird me --plain # No color, no hyperlinks (script-friendly)
bird me --no-color # Disable ANSI colors only (or set NO_COLOR)
bird me --output json # Force JSON error output on stderr
bird me -q # Suppress informational stderr messagesColors and hyperlinks are disabled automatically when stdout is not a TTY or TERM=dumb.
Authentication is handled entirely by xurl. For headless/CI environments where a browser is not available, configure auth tokens through xurl's environment variables — see xurl documentation.
bird reads one environment variable: X_API_USERNAME (or --username) to select which stored account xurl should use.
Use --output json (or BIRD_OUTPUT=json) for machine-readable errors on stderr. When stderr is not a TTY, JSON is
the default.
{"error":"message","kind":"config","code":78}
{"error":"message","kind":"auth","code":77}
{"error":"message","kind":"command","command":"me","code":1}
{"error":"message","kind":"command","command":"get","status":429,"code":1}| Field | Type | Description |
|---|---|---|
error |
string | Error message |
kind |
string | config, auth, or command |
code |
number | Exit code (78, 77, or 1) |
command |
string | Command name (only for kind: "command") |
status |
number | HTTP status (only for API errors) |
bird's own config is minimal — just username and watchlist:
- Config file (optional):
~/.config/bird/config.toml - Entity store:
~/.config/bird/bird.db(SQLite)
Username priority: --username flag > config file > X_API_USERNAME env var.
Authentication and token storage are handled entirely by xurl. To use your own X Developer app, configure it through xurl — see xurl documentation.
Generate and install completions for your shell:
# Bash
bird completions bash > ~/.local/share/bash-completion/completions/bird
# Zsh
bird completions zsh > ~/.zfunc/_bird
# Fish
bird completions fish > ~/.config/fish/completions/bird.fishHomebrew users get completions installed automatically.
| Doc | Purpose |
|---|---|
| docs/CLI_DESIGN.md | Auth requirements, doctor, and error design |
| docs/DEVELOPER.md | Build from source, architecture, project layout |
| RELEASING.md | Release process and distribution channels |
| CHANGELOG.md | Version history (generated by git-cliff) |
Licensed under either of Apache License, Version 2.0 or MIT license at your option.