A self-hosted price tracking application that monitors product prices from any website.
Get notified when prices drop, hit your target price, or items come back in stock.
This entire application was developed collaboratively with Claude (Anthropic's AI assistant) using Claude Code. Every feature, from database migrations to responsive UI components, was crafted through iterative conversation and careful code generation.
This is not "AI slop." This is a fully functional, production-ready application with: - Proper error handling throughout - Clean, maintainable TypeScript codebase - Real security practices (JWT auth, bcrypt hashing, input validation) - Thoughtful UX with toast notifications, loading states, and responsive design - Comprehensive API with consistent patterns
Built with Claude Opus 4.5.
While PriceGhost includes multiple scraping strategies (JSON-LD, meta tags, CSS selectors, pattern matching, and headless browser), we highly recommend enabling AI-powered features for the best results.
Modern e-commerce sites use increasingly complex layouts, dynamic pricing, and anti-scraping measures. AI can understand page context and reliably extract prices even from difficult sites.
When standard scraping fails to find a price, AI extraction kicks in as a fallback.
Verifies every scraped price to ensure accuracy. This catches issues like accidentally scraping a "savings" amount ($189.99 off) instead of the actual product price ($675.59).
To enable: 1. Get an API key from Anthropic (Claude), OpenAI, or install Ollama locally (free) 2. Go to Settings > AI Extraction 3. Enable AI Extraction (fallback) and/or AI Verification (recommended) 4. Select your provider and enter your API key (or Ollama URL)
The cost is minimal (fractions of a cent per API call with Claude Haiku/GPT-4o-mini). Ollama is completely free but requires local compute.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Backend | Node.js, Express, TypeScript |
| Database | PostgreSQL |
| Scraping | Cheerio, Puppeteer (with stealth plugin) |
| AI Extraction | Anthropic Claude, OpenAI GPT, Ollama (optional but recommended) |
| Charts | Recharts |
| Auth | JWT + bcrypt |
| Scheduling | node-cron |
# Clone the repository
git clone https://github.com/clucraft/PriceGhost.git
cd PriceGhost
# Start all services
docker-compose up -d
# Access at http://localhost:8089
Create a .env file or set these in your environment:
# Database
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=priceghost
# Backend
JWT_SECRET=your_jwt_secret_here
DATABASE_URL=postgresql://postgres:password@db:5432/priceghost
# Frontend (optional)
VITE_API_URL=/api
cd backend
npm install
npm run db:init # Initialize database schema
npm run dev
cd frontend
npm install
npm run dev
priceghost-yourname)https://ntfy.sh/your-topic-nameFor dramatically improved compatibility with difficult sites:
ollama pull llama3.2The AI automatically activates when standard scraping fails to extract a price, providing a reliable fallback.
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register |
Create account |
| POST | /api/auth/login |
Login, returns JWT |
| GET | /api/auth/registration-status |
Check if registration is enabled |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/products |
List all tracked products |
| POST | /api/products |
Add product by URL |
| GET | /api/products/:id |
Get product details + stats |
| PUT | /api/products/:id |
Update settings/notifications |
| DELETE | /api/products/:id |
Stop tracking product |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/products/:id/prices |
Get price history |
| POST | /api/products/:id/refresh |
Force immediate price check |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/settings/notifications |
Get notification config |
| PUT | /api/settings/notifications |
Update notification settings |
| POST | /api/settings/notifications/test/telegram |
Send test Telegram notification |
| POST | /api/settings/notifications/test/discord |
Send test Discord notification |
| POST | /api/settings/notifications/test/pushover |
Send test Pushover notification |
| POST | /api/settings/notifications/test/ntfy |
Send test ntfy notification |
| GET | /api/settings/ai |
Get AI extraction settings |
| PUT | /api/settings/ai |
Update AI settings |
| POST | /api/settings/ai/test |
Test AI extraction on a URL |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/profile |
Get user profile |
| PUT | /api/profile |
Update profile |
| PUT | /api/profile/password |
Change password |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/admin/users |
List all users |
| POST | /api/admin/users |
Create user |
| DELETE | /api/admin/users/:id |
Delete user |
| PUT | /api/admin/users/:id/admin |
Toggle admin status |
| GET | /api/admin/settings |
Get system settings |
| PUT | /api/admin/settings |
Update system settings |
PriceGhost/
├── backend/
│ └── src/
│ ├── config/ # Database connection
│ ├── middleware/ # JWT authentication
│ ├── models/ # Database queries
│ ├── routes/ # API endpoints
│ ├── services/ # Scraper, AI extractor, scheduler, notifications
│ └── utils/ # Price parsing utilities
├── frontend/
│ └── src/
│ ├── api/ # Axios client
│ ├── components/ # Reusable components
│ ├── context/ # Auth & Toast contexts
│ ├── hooks/ # Custom hooks
│ └── pages/ # Page components
└── docker-compose.yml
To avoid getting blocked by retailers:
MIT
$ claude mcp add PriceGhost \
-- python -m otcore.mcp_server <graph>