bb — Bitbucket Cloud CLI
Open pull requests, read every comment, and write replies — without leaving the shell or opening a browser tab.
One binary, no runtime to install. Your API token lives in your OS keyring and is never printed,
never written to disk, and never sent anywhere except api.bitbucket.org over TLS. bb update is
the one command that talks to another host — it queries the GitHub Releases API without sending any
credentials.
$ bb pr list
┌────┬──────────────────────────┬─────────────────┬───┬────────┬────────┬────────────┬──────────┐
│ ID ┆ TITLE ┆ SOURCE ┆ → ┆ TARGET ┆ AUTHOR ┆ REVIEWERS ┆ APPROVED │
╞════╪══════════════════════════╪═════════════════╪═══╪════════╪════════╪════════════╪══════════╡
│ 42 ┆ Cache session lookups ┆ feat/cache ┆ → ┆ main ┆ dev ┆ Ada, Linus ┆ Ada │
│ 41 ┆ Fix token refresh window ┆ fix/token-clock ┆ → ┆ main ┆ dev ┆ Linus ┆ │
└────┴──────────────────────────┴─────────────────┴───┴────────┴────────┴────────────┴──────────┘
Install
Homebrew, the prebuilt archives, and cargo binstall all install a compiled binary and need no
Rust toolchain at all; only building from source requires one, with a 1.88 floor.
Homebrew (macOS and Linux):
Prebuilt binary — download the archive for your platform from the
latest release, verify it against
the accompanying .sha256 file, and put bb on your PATH. Supported targets: aarch64-apple-darwin,
x86_64-apple-darwin, x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu.
Install script — detects your platform, verifies the checksum, installs to ~/.local/bin:
|
cargo-binstall — fetches the same prebuilt binary, no compiler needed:
From source — needs Rust 1.88 or newer:
That installs bb into ~/.cargo/bin. If the command isn't found afterwards, put that directory on
your PATH:
&&
Authenticate
Atlassian removed Bitbucket Cloud app passwords on 2026-07-28. bb uses an Atlassian API token,
sent as HTTP Basic auth with your account email as the username.
- Create a token at https://id.atlassian.com/manage-profile/security/api-tokens, selecting the scopes below.
- Run
bb auth loginand paste it — the input is masked and never echoed.
Token scopes
Grant the least you need. For the pull request workflow — listing, reading and commenting — four scopes are enough:
| Scope | Needed for |
|---|---|
read:user:bitbucket |
mandatory. bb auth login verifies the token against /user, so login fails without it |
read:pullrequest:bitbucket |
pr list, pr view, pr diff, pr files, pr commits |
write:pullrequest:bitbucket |
pr create, pr comment, pr request-changes |
read:repository:bitbucket |
branch list, and the default-reviewer lookup pr create does |
One gotcha worth knowing: write:pullrequest:bitbucket does not imply
read:repository:bitbucket, so pr create needs both.
CI and headless machines
There is no keyring on a CI runner, and on Linux the keyring backend is secret-service, which is absent on servers. Set the credentials in the environment instead — they are checked before the keyring, so this also works as a local override:
Check it works
&&
Usage
bb --help lists every command, and bb <command> --help documents its flags. The shape is
bb <noun> <verb>:
bb update compares your version against the latest GitHub release. If Homebrew or cargo installed
bb, it prints the right upgrade command for that package manager instead of overwriting a file they
manage. For a standalone binary it verifies the download's checksum and replaces itself atomically.
One thing worth knowing that --help won't tell you:
Everything speaks JSON. Add --json to any command and pipe it to jq rather than parsing the
tables, whose layout is not a contract. Scripts and agents should default to it.
|
Shell completions make the rest discoverable:
Use it from Claude Code
Copy this whole block into your project's CLAUDE.md so your agent drives PR review through bb
instead of asking you to open a browser.
This project uses Bitbucket, not GitHub. Use the `bb` CLI for all pull request work — never `gh`,
and never ask the user to open the web UI. Run `bb --help` to discover commands.
- ----
Each entry under `.inline[]` has `file`, `line`, `author`, `body`, `resolved`, and `id`. Use that
`id` to reply in the right thread.
Reference
| Flag / variable | Purpose |
|---|---|
--json |
machine-readable output, on every command |
-R, --repo |
act on workspace/repo instead of the current git remote |
BB_REPO |
default repository |
BB_EMAIL, BB_TOKEN |
credentials for CI and other non-interactive use |
BB_API_BASE |
override the API base URL (testing) |
BB_UPDATE_API_BASE |
override the release-lookup API base URL for bb update (testing) |
NO_COLOR |
disable colour and spinners |
| Exit code | Meaning |
|---|---|
| 0 | success |
| 1 | general error |
| 2 | not authenticated |
| 3 | not found |
Platform support
macOS (arm64, x86_64) and Linux (x86_64, aarch64), both covered by CI. Windows is not supported.
Contributing
Issues and pull requests are welcome. Before opening a PR, run cargo fmt --all --check,
cargo clippy --all-targets -- -D warnings, and cargo test — CI enforces all three.
rust-toolchain.toml pins the exact toolchain used for those checks (currently 1.97), which rustup
auto-installs on first use but which a contributor building offline needs to already have.
Security reports: please use GitHub's private vulnerability reporting rather than a public issue.
License
MIT — see LICENSE. This project is an independent Rust rewrite of the MIT-licensed PHP
bb-cli; see NOTICE for attribution.