Check whether crate names are truly available on crates.io.
Unlike simple "does this crate exist?" checkers, cargo-avail uses the
actual crates.io validation logic to catch names that would be rejected at
publish time:
- Syntactic validation (character rules, length limits, leading digits)
- Reserved names (Rust internals like
std,core,alloc; Windows device names likenul,con,aux,com0-com9,lpt0-lpt9) - Canonical collision detection (hyphens and underscores are equivalent:
foo-barandfoo_barare the same crate) - crates.io API lookup with canonical matching
cargo install cargo-avail# Check one or more names
cargo avail my-crate another-name
# Pipe names from stdin
printf "my-crate\nanother-name\n" | cargo avail
# Only show available names
cargo avail -a name1 name2 name3
# Quiet mode: exit code only
cargo avail -q my-crate
# JSON output for scripting
cargo avail --json my-crate another-name | jq '.status'
# Print version
cargo avail --versionTab-separated: name\tstatus
my-crate available
serde taken
std reserved
foo+bar invalid: invalid character `+` in crate name: `foo+bar`, characters must be ASCII alphanumeric, `-`, or `_`
With --json, one JSON object per line (NDJSON):
{"name":"my-crate","status":"available"}
{"name":"serde","status":"taken"}
{"name":"std","status":"reserved"}
{"name":"foo+bar","status":"invalid","error":"invalid character `+` in crate name: `foo+bar`, characters must be ASCII alphanumeric, `-`, or `_`"}| Code | Meaning |
|---|---|
| 0 | All names are available |
| 1 | One or more names are unavailable (taken, reserved, or invalid) |
| 2 | Usage error (no names provided, stdin read failure) |
| 3 | Partial failure: some names could not be checked (network error) |
cargo-avail also exposes a library crate for programmatic use:
use cargo_avail::check::{Client, check_name, Availability};
let client = Client::new();
match check_name(&client, "my-cool-crate") {
Ok(Availability::Available) => println!("go grab it!"),
Ok(status) => println!("{status}"),
Err(e) => eprintln!("error: {e}"),
}- Cannot detect recently deleted crates (requires database access).
- A name passing all checks could still fail at publish time due to server-side race conditions or policy changes.
MIT