A self-hosted price tracking application that monitors product prices from any website.
TypeScript
1,123
122 commits
updated Feb 3, 2026
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.
Unlike other price trackers that silently pick a price and hope it's right, PriceGhost uses a multi-strategy extraction system with a unique Price Voting Modal that puts you in control.
When you add a product, PriceGhost runs four independent extraction methods in parallel:
| Method | How It Works | Reliability |
|---|---|---|
| JSON-LD | Reads schema.org structured data embedded by the retailer | Highest |
| Site-Specific | Custom-tuned scrapers for major retailers (Amazon, Best Buy, Walmart, etc.) | High |
| Generic CSS | Intelligent CSS selectors that find price patterns | Medium |
| AI Analysis | Claude/GPT/Ollama analyzes the page context | High |
Each method "votes" on what it thinks the price is. If they agree, you're good to go. If they disagree, you see all the candidates and make the final call.
Multiple prices found? No problem. You decide which one is correct.
The modal shows you:
This means:
This feature doesn't exist in Keepa, CamelCamelCamel, Honey, or any other price tracker we've seen. They guess. You choose.
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:
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).
When multiple extraction methods disagree, AI can analyze all candidates and recommend the correct one - which you can then confirm or override in the Price Selection Modal.
To enable:
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.
PriceGhost has site-specific scrapers optimized for:
| Retailer | Browser Rendering | Notes |
|---|---|---|
| Amazon (.com, .co.uk, .de, etc.) | No | Full support including deal prices |
| Best Buy | Yes | Filters out financing/payment plans |
| Walmart | Yes | Reads NEXT_DATA for prices |
| Target | Yes | Full support |
| Costco | Yes | Full support |
| eBay | No | Auction and Buy It Now prices |
| Newegg | No | Handles combo deals correctly |
| Home Depot | No | Full support |
| AliExpress | No | Full support |
| Magento 2 stores | No | Any store using Magento 2 |
Any other site works via generic extraction + AI fallback.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Backend | Node.js, Express, TypeScript |
| Database | PostgreSQL |
| Scraping | Cheerio, Puppeteer (with stealth plugin) |
| AI Extraction | Anthropic Claude (Haiku 4.5 recommended), OpenAI GPT, Ollama Qwen3 (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)For dramatically improved compatibility with difficult sites:
Based on testing, these models work best with PriceGhost:
| Provider | Model | Notes |
|---|---|---|
| Anthropic | Claude Haiku 4.5 | ⭐ Best overall - fast, accurate, cheap (~$0.001/check) |
| Ollama | Qwen3 (any size) | ⭐ Best free option - run ollama pull qwen3 |
| OpenAI | GPT-4.1 Nano | Good alternative to Haiku |
Note for Ollama users: Qwen3 works well for price extraction and verification. Other models (llama3, mistral, deepseek) may struggle with structured JSON output or have thinking mode issues.
The 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 |
| POST | /api/settings/notifications/test/gotify | Send test Gotify notification |
| POST | /api/settings/notifications/test-gotify | Test Gotify connection before saving |
| 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 (including PriceSelectionModal)
│ ├── context/ # Auth & Toast contexts
│ ├── hooks/ # Custom hooks
│ └── pages/ # Page components
└── docker-compose.yml
To avoid getting blocked by retailers:
MIT
101 followers · starred Feb 2026
43 followers · starred Sep 2026
18 followers · starred Mar 2026
35 followers · starred Jul 2026
A self-hosted price tracking application that monitors product prices from any website.
TypeScript
1,123
122 commits
updated Feb 3, 2026
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.
Unlike other price trackers that silently pick a price and hope it's right, PriceGhost uses a multi-strategy extraction system with a unique Price Voting Modal that puts you in control.
When you add a product, PriceGhost runs four independent extraction methods in parallel:
| Method | How It Works | Reliability |
|---|---|---|
| JSON-LD | Reads schema.org structured data embedded by the retailer | Highest |
| Site-Specific | Custom-tuned scrapers for major retailers (Amazon, Best Buy, Walmart, etc.) | High |
| Generic CSS | Intelligent CSS selectors that find price patterns | Medium |
| AI Analysis | Claude/GPT/Ollama analyzes the page context | High |
Each method "votes" on what it thinks the price is. If they agree, you're good to go. If they disagree, you see all the candidates and make the final call.
Multiple prices found? No problem. You decide which one is correct.
The modal shows you:
This means:
This feature doesn't exist in Keepa, CamelCamelCamel, Honey, or any other price tracker we've seen. They guess. You choose.
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:
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).
When multiple extraction methods disagree, AI can analyze all candidates and recommend the correct one - which you can then confirm or override in the Price Selection Modal.
To enable:
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.
PriceGhost has site-specific scrapers optimized for:
| Retailer | Browser Rendering | Notes |
|---|---|---|
| Amazon (.com, .co.uk, .de, etc.) | No | Full support including deal prices |
| Best Buy | Yes | Filters out financing/payment plans |
| Walmart | Yes | Reads NEXT_DATA for prices |
| Target | Yes | Full support |
| Costco | Yes | Full support |
| eBay | No | Auction and Buy It Now prices |
| Newegg | No | Handles combo deals correctly |
| Home Depot | No | Full support |
| AliExpress | No | Full support |
| Magento 2 stores | No | Any store using Magento 2 |
Any other site works via generic extraction + AI fallback.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Backend | Node.js, Express, TypeScript |
| Database | PostgreSQL |
| Scraping | Cheerio, Puppeteer (with stealth plugin) |
| AI Extraction | Anthropic Claude (Haiku 4.5 recommended), OpenAI GPT, Ollama Qwen3 (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)For dramatically improved compatibility with difficult sites:
Based on testing, these models work best with PriceGhost:
| Provider | Model | Notes |
|---|---|---|
| Anthropic | Claude Haiku 4.5 | ⭐ Best overall - fast, accurate, cheap (~$0.001/check) |
| Ollama | Qwen3 (any size) | ⭐ Best free option - run ollama pull qwen3 |
| OpenAI | GPT-4.1 Nano | Good alternative to Haiku |
Note for Ollama users: Qwen3 works well for price extraction and verification. Other models (llama3, mistral, deepseek) may struggle with structured JSON output or have thinking mode issues.
The 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 |
| POST | /api/settings/notifications/test/gotify | Send test Gotify notification |
| POST | /api/settings/notifications/test-gotify | Test Gotify connection before saving |
| 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 (including PriceSelectionModal)
│ ├── context/ # Auth & Toast contexts
│ ├── hooks/ # Custom hooks
│ └── pages/ # Page components
└── docker-compose.yml
To avoid getting blocked by retailers:
MIT
101 followers · starred Feb 2026
43 followers · starred Sep 2026
18 followers · starred Mar 2026
35 followers · starred Jul 2026