Skip to main content

badgevet

CI crates.io clispec compliant

Find retired and broken status badges in Markdown that link checkers miss.

A retired shields.io badge returns HTTP 200 with a valid SVG whose title reads retired badge, so ordinary link checkers (lychee, markdown-link-check) mark it OK. badgevet fetches each badge and reads the rendered SVG title instead, so it can tell a dead badge from a healthy one.

Install

cargo install badgevet
# or a prebuilt binary, no recompile:
cargo binstall badgevet

Usage

badgevet                    # scan README.md in the current directory
badgevet docs/ README.md    # scan files and directories (dirs recurse for *.md)
badgevet ~/Projects/mine    # one command scans every README under all your local repos
badgevet --only-broken .    # report only permanently broken badges
badgevet | jq .             # JSON when piped

Check every repo you own

Point badgevet at an owner and it checks the canonical published README of each of their repositories - no cloning needed. It reads the same README GitHub shows the world, so it catches badge rot even in repos you rarely touch.

badgevet --github rvben              # all your public, non-fork, non-archived repos
badgevet --github rvben --only-broken

Set GITHUB_TOKEN (or GH_TOKEN) to lift GitHub's unauthenticated rate limit; required for --include-private. Widen the default scope with --include-forks, --include-archived, --include-private.

Example:

STATE        PROVIDER               LOCATION                   BADGE
broken       shields.io             README.md:3                Version
             -> https://vsmarketplacebadges.dev/version/rvben.rumdl.svg

3 checked · 2 ok · 1 broken · 0 unconfirmed

How it classifies

Each badge lands in one of three states:

State Meaning Fails CI?
ok The badge renders a real value. no
broken A deterministic dead state (retired, deprecated). yes (exit 1)
unconfirmed Could not be verified: an ambiguous invalid / inaccessible / empty title, or a transient network failure. Retried with backoff first. no (unless --strict)

The distinction is the point. shields.io renders invalid both for a genuinely bad badge and when its upstream API is merely rate-limiting, so unconfirmed never fails your build by default. Only an explicit, permanent dead state does.

When a known-dead pattern has a modern replacement (e.g. shields.io's retired Visual Studio Marketplace routes), badgevet prints the suggested URL.

Fixing

scan never touches your files. The separate fix command applies those suggestions in place:

badgevet fix              # rewrite broken badges in README.md
badgevet fix docs/        # ...or across a directory of Markdown

It swaps only the badge image URL (leaving the surrounding link untouched), changes only broken badges that have a known replacement, and is idempotent. Broken badges with no known replacement are left alone and reported as unfixable (exit 1). fix is local-only; it does not work with --github. Since scan is read-only and fix mutates, they are separate commands with honest mutating markers in the schema.

Options

Flag Default Description
--github <owner> - Scan an owner's GitHub repos instead of local paths.
--include-forks off With --github: include forks.
--include-archived off With --github: include archived repos.
--include-private off With --github: include private repos (needs a token).
--only-broken off Report only permanently broken badges.
--strict off Also exit 1 on unconfirmed badges.
--retries <n> 2 Re-fetch an ambiguous badge before giving up.
--timeout <secs> 10 Per-request HTTP timeout.
-o, --output <fmt> auto auto (text on a TTY, JSON when piped), json, text.

Exit codes

code meaning
0 no broken badges
1 at least one badge is permanently broken (or, with --strict, unconfirmed)
2 a path could not be read, or the HTTP client failed to build
3 usage error

Exit 1 is an outcome, not an error: stdout still carries the full report and no error envelope is written. This makes badgevet a natural CI or pre-commit gate.

For agents (clispec)

badgevet follows The CLI Spec: structured output on stdout, structured error envelopes on the last line of stderr, and a schema subcommand whose output validates against clispec.dev/schema/v0.3.json (checked by the test suite).

badgevet schema

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

badgevet-0.1.1.tar.gz (54.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

badgevet-0.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

badgevet-0.1.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

badgevet-0.1.1-py3-none-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

badgevet-0.1.1-py3-none-macosx_10_12_x86_64.whl (1.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file badgevet-0.1.1.tar.gz.

File metadata

  • Download URL: badgevet-0.1.1.tar.gz
  • Upload date:
  • Size: 54.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for badgevet-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7b63b4270521f6c5ba5e46efe0b6d86bd7f8dbca9d72a07fab1f86729b270b08
MD5 17cc938e9727bf6b04420c8b3f561afe
BLAKE2b-256 a60855be3aab488f48c43c197709a49effe19070034448f3a026acab840bd99c

See more details on using hashes here.

File details

Details for the file badgevet-0.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: badgevet-0.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: Python 3, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for badgevet-0.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c42959cab57ab995a64d81b19ebdf026a82cf834ab22c29206fb9fa42cde2d1a
MD5 806da20e73a87634e61ced9bb3419cd0
BLAKE2b-256 ece3b2bff3c055f1453f709eb9a8321f8ca6e040b839a59585e4246281a2b7b2

See more details on using hashes here.

File details

Details for the file badgevet-0.1.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: badgevet-0.1.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: Python 3, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for badgevet-0.1.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ecfef905035831a1b2f2049a75eea0f8c4ea2288e53badf8c6d92f99fded7d25
MD5 0547c9935b721476d37b9e7983130343
BLAKE2b-256 59194e298b0390e47707ac247e16abccd5ec45f33bdd60b7f953523b04fb035e

See more details on using hashes here.

File details

Details for the file badgevet-0.1.1-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: badgevet-0.1.1-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for badgevet-0.1.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6b90c35d5286f14519ec0d37fab0369b000ec4a52fe48681563e28119df83a9f
MD5 cc9c7a35e5c6f71fabefbafa2bea3fe8
BLAKE2b-256 5e309a73168914df4867b2f5ade9199521769859d1c3c89e128f38f326162f60

See more details on using hashes here.

File details

Details for the file badgevet-0.1.1-py3-none-macosx_10_12_x86_64.whl.

File metadata

  • Download URL: badgevet-0.1.1-py3-none-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: Python 3, macOS 10.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for badgevet-0.1.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c664d4b3e6d5d57172d20e8cd89b54d4ea079faf6d05046caf0fef551f40e9ae
MD5 98c5ab663d50a9429d12f58703825ac8
BLAKE2b-256 7d88247ee536d09799f0cea4a27193b7120aee7203cc04cc9dd8b1833274738b

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.1 This release

5 files

0.1.0

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page