A lightweight Next.js dashboard that monitors Apple's Certified Refurbished Mac store across multiple countries. Track new arrivals, removed products, and price changes without relying on any external APIs or API keys.
- Multi-country support — Monitor refurbished stores in Poland (default), United States, United Kingdom, Germany, France, Spain, Italy, Canada, and Australia.
- Change detection — Automatically detects and highlights:
- New products (green badge)
- Removed products (red section)
- Price changes (amber badge with previous price)
- Smart filtering — Filter by Model, Screen size, Chip, Memory, Storage, and Color using clickable tags.
- No API keys — Scrapes data directly from Apple's public storefront. No registration or API keys required.
- Docker support — Run locally with a single
docker runcommand. - GitHub Container Registry — Pre-built images published automatically on release tags.
- Bunny.net Magic Containers — Automatic rolling deployments to Bunny.net's serverless container platform on every release.
docker run -d \
-p 3000:3000 \
-v refurb-data:/app/data \
--name refurb-watcher \
ghcr.io/YOUR_USERNAME/apple-refurb-watcher:latestThen open http://localhost:3000.
Replace
YOUR_USERNAMEwith your GitHub username or build the image locally (see below).
# Install dependencies
npm install
# Run the dev server
npm run dev
# Open http://localhost:3000To fetch data, click the Refresh button in the UI.
docker build -t apple-refurb-watcher .
docker run -d -p 3000:3000 -v refurb-data:/app/data apple-refurb-watcherThis repository includes a GitHub Action that automatically deploys to Bunny.net Magic Containers after a successful release build.
- Create an application on Bunny.net Magic Containers.
- Configure the container image to pull from
ghcr.io/YOUR_USERNAME/apple-refurb-watcher. - Add the following to your GitHub repository (Settings → Secrets and variables → Actions):
| Type | Name | Value |
|---|---|---|
| Variable | BUNNYNET_APP_ID |
Your Bunny.net Magic Containers App ID |
| Secret | BUNNYNET_API_KEY |
Your Bunny account API key |
When you publish a release (or push a v* tag), the workflow:
- Builds and publishes the Docker image to GHCR
- Automatically triggers a rolling update on Bunny.net Magic Containers
No manual deployment steps are required after the initial setup.
- The app fetches Apple's refurbished Mac category page for the selected country.
- It extracts structured product data from the page's embedded JSON (with a Cheerio-based HTML fallback).
- Products are compared against the locally stored state to detect changes.
- Changes and the current catalog are saved to
data/state-<country>.json. - The dashboard displays the current catalog with change highlights and interactive filters.
- Next.js 16.2 (App Router, Turbopack)
- React 19.2
- TypeScript 6.0
- Tailwind CSS v4
- Cheerio (HTML fallback parsing)
| Country | Code | Currency |
|---|---|---|
| Poland | pl |
PLN |
| United States | us |
USD |
| United Kingdom | uk |
GBP |
| Germany | de |
EUR |
| France | fr |
EUR |
| Spain | es |
EUR |
| Italy | it |
EUR |
| Canada | ca |
CAD |
| Australia | au |
AUD |
Push a semver tag to trigger the GitHub Action that builds and publishes the Docker image to GHCR:
git tag v1.0.0
git push origin v1.0.0Or create a release via the GitHub UI.
The app stores state locally in JSON files inside the data/ directory (or /app/data in Docker). No external database is required.
This project is an unofficial tool and is not affiliated with, endorsed by, or sponsored by Apple Inc. It simply scrapes publicly available information from Apple's certified refurbished store pages. Use at your own risk and please respect Apple's Terms of Service.
MIT