A small dashboard that tracks PSA-graded prices for five iconic Charizard cards, scraped hourly 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 - Puppeteer for scraping
node-cronfor the hourly 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, and then scrapes every hour on the hour.
scraper.jsopens each card's pricecharting.com page in headless Chrome and reads the PSA 9 / 9.5 / 10 prices off the page.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 |
Puppeteer scrape 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.