PriceGhost

PriceGhost

Self-hosted alerts when a price drops or an item restocks

PriceGhost is a self-hosted web app that checks the price on a product page at a set interval and alerts you when it drops, when it hits a target, or when the item is back in stock. You paste a product URL; a Node.js backend fetches the page, stores each reading in PostgreSQL and charts the history. Alerts go to Telegram, Discord, Pushover, ntfy or Gotify, and several accounts can share one instance.

Each tracked product is a single URL: PriceGhost does not look for the same item at other stores. To find pages from a search query, OpenSERP queries Google, Bing or DuckDuckGo and returns the results as JSON. changedetection.io also tracks price and stock, as one option of a general page-monitoring tool.

The comparison of open source web scraping tools places PriceGhost among crawling frameworks and page-monitoring tools.

Extractors that disagree show you every candidate price

  • Four extractors vote on the price: the page's schema.org JSON-LD, a retailer-specific scraper, generic CSS selectors and, if enabled, an AI model each propose a price. When they agree, that price is kept. When they don't, a dialog lists every candidate with its source and a confidence score, and you pick one. The winning method is reused on later checks.
  • Any AI provider, local included: Claude, GPT, Gemini or a model served by Ollama, used as a fallback when extraction fails, to verify each price, or to settle disagreements between extractors. The README recommends Claude Haiku 4.5, or Qwen3 for a local model.
  • JavaScript-rendered pages: the backend image ships Chromium, driven by Puppeteer with the stealth plugin. Best Buy, Walmart, Target and Costco always go through it; other sites do when the static HTML yields no price.
  • Spaced-out checks: anywhere from 5 minutes to 24 hours per product, one hour by default, with up to 5 minutes of random jitter and a 2 to 5 second pause between products to reduce blocking.

Dormant since February, with a hard-coded fallback JWT secret

The dedicated scrapers mostly target US retailers. The Amazon one covers ten domains, amazon.co.uk, .de and .fr among them, and the eBay one covers six. Walmart, Best Buy, Target, Costco, Newegg and Home Depot are only recognized on their US .com domain. Magento 2 stores share one scraper; every other site goes through JSON-LD, generic selectors and AI. Adding a retailer means editing backend/src/services/scraper.ts, and a request for a plugin system (issue #48) has no reply from the maintainer. If you need to write your own scrapers, Crawlee handles collection over HTTP or in a browser, with no UI or alerts.

Eight currencies, dollars by default. The price parser knows US, Canadian and Australian dollars, euros, pounds, yen, rupees and Swiss francs. Any other symbol is stored as dollars: an issue from March 2026 (#24) shows R$2.720,00 read as $2.72.

The bundled Compose file needs work before it faces the internet. docker-compose.yml publishes PostgreSQL on port 5432 with the password postgres, and when JWT_SECRET is unset it signs sessions with a value hard-coded in the file. A September 2026 issue (#50) shows that value is enough to forge a token for an existing user. Images are built for linux/amd64 only and carry no version number: latest, main or a commit hash.

The README pitches itself against Keepa, CamelCamelCamel and Honey. Those services guess the price, it says, while PriceGhost lets you choose when its extractors disagree.

MIT on paper, no license file. The README ends with "MIT", but the repository has no LICENSE file and GitHub detects no license.

Two weeks of commits, nothing since February 3. The repository was created on January 20, 2026; v1.0.0 shipped on the 23rd, 1.0.6 on the 26th, and the last commit landed on February 3. One developer wrote all 122 commits, and the README says the whole app was built with Claude Code. The maintainer last replied in the issues on February 10, and 25 issues and 6 pull requests are currently open. No outside contribution has ever been merged, and the repository publishes nothing under GitHub Releases.