Virginia ABC · unofficial CLI

Find the bottle.
Skip the website.

Search the Virginia ABC catalog and check live store inventory from your terminal — including allocated and online-only bottles the price list never shows. One command, real stock, ranked by distance.

$ vabc inventory check 953714 --near 22182
Planteray O.F.T.D · 953714 · near 22182
StoreCityQtyMiles
#219 Vienna 21 0.0
#231 Vienna 26 1.2
#76 Falls Church 33 2.8
#346 Falls Church 14 2.9
#267 McLean out 3.3
Install

One line and you're hunting.

A single static binary, no runtime deps, no login. Pick your poison.

$ curl -fsSL https://vabc-cli.vercel.app/install.sh | sh
$ brew install rnwolfe/tap/vabc
$ go install github.com/rnwolfe/vabc/cmd/vabc@latest
Prebuilt, checksummed binaries for macOS / Linux / Windows releases ↗

The curl script verifies the SHA-256 before installing. Then run vabc doctor.

The point

Two ways to find a bottle.

The website makes you click. vabc answers in one line — and returns the product code, so the next call just works.

✕ abc.virginia.gov
  • Load the JS-heavy storefront
  • Type into search, wait for results
  • Click the product page
  • Open the "check my store" widget
  • Pick a store from a dropdown
  • Repeat for every nearby store…
✓ vabc
$ vabc inventory check 953714 --near 22182 store #219 Vienna   qty 21   0.0 mi store #231 Vienna   qty 26   1.2 mi store #76  Falls Church   qty 33   2.8 mi store #267 McLean   qty out   3.3 mi
Not just for humans

Built for agents, too.

Every command is engineered for autonomous callers: structured, bounded, self-describing, and safe by default.

Structured output

JSON on stdout, notes on stderr. Field projection and bounded results.

vabc --json product search rum \
  --select productCode,name

Stable exit codes

Distinct, documented codes — not a bare 1. 5 not found, 7 rate-limited…

{ "error": …, "code": "NOT_FOUND",
  "remediation": … }

Self-describing

The full usage contract ships inside the binary — no repo, no network.

vabc agent
vabc schema --json

Read-only by default

No mutating commands. A default-deny gate guards any future write.

vabc inventory check … # safe

Prompt-injection fenced

Untrusted target text is wrapped so an agent won't execute it.

⟦UNTRUSTED⟧ … ⟦/UNTRUSTED⟧

Polite by design

Persistent cross-process throttle. No login, no secrets, no scraping evasion.

go get github.com/rnwolfe/vabc
Ready in one line

Start hunting.

$ go install github.com/rnwolfe/vabc/cmd/vabc@latest