Monitors the Secret Lair store and Chaos Vault for new product drops. Sends notifications to a Discord channel via webhook when new items appear.
- Main store (
/us/) — Featured drops and homepage products - Chaos Vault (
/us/chaosvault) — Detects when the vault opens/closes and alerts immediately - Shop All (
/us/shopall) — Catches products that may not be on the homepage (optional, enabled by default)
- Detects new product additions by tracking product IDs
- Special "CHAOS VAULT IS OPEN" alert when the vault transitions from closed to active
- Detects pre-release site downtime and fires a single "Releasing Soon" alert (instead of spamming for every failed poll), then polls faster so the new drop is announced quickly when the site returns
- Rich Discord embeds with product name, price, and direct link
- Persists state across restarts (won't re-notify on reboot)
- First run silently catalogues existing products (no spam on initial deploy)
- Rate-limit aware for Discord API
In your Discord server: Server Settings > Integrations > Webhooks > New Webhook
Pick the channel you want alerts in, copy the webhook URL.
cp .env.example .envEdit .env and set your webhook URL:
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234567890/aBcDeFgHiJkLmNoPqRsT
docker compose up -dCheck logs:
docker compose logs -fAll config is via environment variables (set in .env):
| Variable | Default | Description |
|---|---|---|
DISCORD_WEBHOOK_URL |
(required) | Discord webhook URL |
POLL_INTERVAL_SECONDS |
180 |
Seconds between checks when the site is up |
MAINTENANCE_POLL_INTERVAL_SECONDS |
60 |
Poll interval used while the site is down, outside the top-of-hour window |
MAINTENANCE_BURST_INTERVAL_SECONDS |
15 |
Fast poll interval while in maintenance mode and near :00 (drops historically go live on the hour) |
MAINTENANCE_BURST_JITTER_SECONDS |
2 |
±jitter added to the burst interval to avoid looking like a cron job |
MAINTENANCE_BURST_WINDOW_BEFORE |
2 |
Minutes before :00 to start burst-polling |
MAINTENANCE_BURST_WINDOW_AFTER |
2 |
Minutes after :00 to keep burst-polling |
MAINTENANCE_REQUEST_TIMEOUT_SECONDS |
10 |
HTTP timeout while in maintenance mode (so a hung request can't eat a burst interval) |
MAINTENANCE_ALERT_AFTER_MINUTES |
15 |
Site must be continuously down this long before the "Releasing Soon" alert fires (filters routine maintenance windows) |
MONITOR_SHOP_ALL |
true |
Also monitor /us/shopall |
NOTIFY_ON_START |
false |
Notify for existing products on first run |
LOG_LEVEL |
INFO |
Log verbosity |
- On startup, fetches all monitored pages and parses product links from the HTML
- Product IDs (the numeric ID in
/us/product/1249999) are the unique key - First run stores all current products silently (no notification flood)
- Subsequent checks compare against known state — new IDs trigger Discord alerts
- The Chaos Vault page is checked for whether it has any product listings. When products appear, a special high-visibility alert fires.
- State is written to
state.jsonafter every cycle
No notifications on first run — This is by design. Set NOTIFY_ON_START=true if you want alerts for existing products.
Products not detected — The scraper looks for /us/product/{id} links in the HTML. If Wizards changes their URL structure or moves to fully client-rendered content, the regex patterns may need updating. Check logs at LOG_LEVEL=DEBUG.
Rate limited — The monitor handles Discord 429 responses automatically. If the site itself rate-limits you, increase POLL_INTERVAL_SECONDS.
State reset — Delete the data/ directory to start fresh. The next run will re-catalogue everything.