Track rare bourbon and spirits availability across multiple states' ABC stores with real-time inventory monitoring, smart caching, and interactive map visualization.
v2.0.0 - Now tracking 48,850+ items across Virginia ABC and North Carolina with intelligent caching and listing type filters!
- πΊοΈ Interactive Google Maps visualization - See spirits inventory on a color-coded map with geocoded locations
- π Multi-state support - Virginia ABC (390 stores) + North Carolina Wake County (15 stores)
- π§ Smart caching - Intelligent request optimization reduces API calls by 80% on scheduled runs
- π·οΈ Listing type filters - Filter NC products by Limited, Allocation, Listed, Barrel, Christmas
- π Comprehensive tracking - 48,850+ items including rare allocations (Pappy, Blanton's, Buffalo Trace, etc.)
- β‘ Optimized performance - Conservative rate limiting prevents 429 errors
- π Secure - API keys stored in gitignored config files
- π³ Containerized - Docker image with multi-arch support (amd64/arm64)
- π§ Modular architecture - Easy to add new states/counties
Interactive map showing spirits locations and quantities. Perfect for local use or simple deployments.
Quick Start:
# Copy config template and add your Google Maps API key
cp config.example.js config.js
# Edit config.js and add your API key
# Build the tracker
go build -o tracker ./cmd/tracker
# Run tracker to generate inventory data (Virginia ABC only)
./tracker
# Run with Wake County NC included
./tracker -va -wake
# Start local web server
python3 -m http.server 8000
# Open http://localhost:8000 in your browserSee MAP_USAGE.md for detailed setup instructions.
Screenshots:
Interactive Google Maps view showing spirits inventory across Virginia ABC stores
Product filter dropdown with multi-select capability
Store marker showing product details and quantities
Full ELK stack deployment for historical data, time-series analysis, and alerting. Ideal for production Kubernetes environments.
The app outputs inventory data in JSON format which is picked up by Filebeat and shipped to an Elasticsearch cluster. End-to-end Kubernetes manifests are included in the k8s/ directory.
See Architecture section below for details.
Inspired by https://github.com/misfitlabs/pappytracker
python3 dict2json.py |jq > products.json
Tested on python3.
go run generateStoreList.go
# Virginia ABC only (default)
./tracker
# Virginia ABC + Wake County NC
./tracker -va -wake
# Wake County NC only
./tracker -va=false -wake
# Custom output file
./tracker -output my-inventory.json
# Custom product list (for VA ABC)
./tracker -products my-products.json
# Custom store list (for VA ABC)
./tracker -stores my-stores- Stores: 390 across Virginia
- Method: REST API at
abc.virginia.gov - Product IDs: Numeric codes (e.g.,
018006for Buffalo Trace) - Products Tracked: ~48 curated rare/allocated spirits
- Coordinates: Yes (latitude/longitude for each store)
- Stores: 15 across Wake County
- Method: HTML parsing via web scraping at
wakeabc.com - Product Search: NC Codes from state warehouse (e.g.,
18006for Buffalo Trace) - Products Tracked: All 3,167 products from NC ABC warehouse catalog
- Listing Types: Limited, Allocation, Listed, Barrel, Christmas
- Coordinates: Yes (geocoded latitude/longitude for all 15 stores)
- Smart Caching:
- "Listed" products: Update every 24 hours
- Limited/Allocation/Barrel/Christmas: Update hourly
- Result: 80% reduction in API requests on scheduled runs
- Total Items: 48,850+ tracked across both states
- Fresh Deployment: ~36 minutes (full scan of all products)
- Scheduled Runs: ~3-5 minutes (with smart caching)
- Rate Limiting: Conservative (3 concurrent, 1 second delay) to prevent 429 errors
See ARCHITECTURE.md for details on adding new states/counties.
# Pull the latest version
docker pull ghcr.io/jeffspahr/bourbontracker:latest
# Run and save inventory.json to current directory
docker run --rm -v $(pwd):/root ghcr.io/jeffspahr/bourbontracker
# Or specify a version
docker pull ghcr.io/jeffspahr/bourbontracker:1.0.1
docker run --rm -v $(pwd):/root ghcr.io/jeffspahr/bourbontracker:1.0.1Note: The -v $(pwd):/root flag mounts the current directory so inventory.json is written to your host machine for use with the Google Maps visualization.