A small dashboard that tracks PSA-graded prices for five iconic Charizard cards, refreshed every six hours and rendered as interactive Chart.js timelines.
Five cards × three PSA grades (9 / 9.5 / 10):
- Japanese Expansion Pack 1996
- Base Set
- Base Set 2
- Shadowless
- 1st Edition
Each card has its own dock card with current prices and a sparkline; clicking opens a detail panel with a stacked line chart and time-range selector (1W / 1M / 3M / 6M / 1Y / MAX).
- Node.js + Express
- EJS for server-rendered HTML
- SQLite (
sqlite3) for storage - Bright Data Web Unlocker for reliable PriceCharting access
node-cronfor the six-hour schedule- Chart.js on the client
No build step, no framework, no bundler.
npm install
node server.js
# → http://localhost:5000The server initializes prices.db if it doesn't exist, kicks off one scrape on startup when data is stale, and then scrapes every six hours.
Copy .env.example to .env and provide the Bright Data API key. New free-tier accounts automatically provision the mcp_unlocker Web Unlocker zone used by the example. The .env file is ignored by Git.
scraper.jsretrieves each PriceCharting page through Bright Data Web Unlocker and reads the PSA 9 / 9.5 / 10 prices from the returned HTML.server.jsschedules the scrape and writes results toprices.dbviadb.js.- The
/route fetches each card's price history (filtered by?range=1w|1m|3m|6m|1y|max) and rendersviews/index.ejs, which builds the dock + detail chart on the client.
| File | What it does |
|---|---|
server.js |
Express app, cron schedule, route handlers |
scraper.js |
Bright Data fetch and PriceCharting parsing logic, card list |
db.js |
sqlite3 helpers (initDB, insertPrice, getPriceHistory) |
views/index.ejs |
Single-page UI |
public/css/style.css |
Dark theme + glassmorphism |
public/images/ |
Card thumbnails + background |
The price database is not committed — scraped pricing data from pricecharting.com belongs to them. Run the app for an hour or two and you'll have your own.