Self-hosting & cloud

PriceGhost - Self-Hosted Price Tracking for Online Products

PriceGhost is "a selfhosted price tracking application that monitors product prices from any website" — add a product URL, get notified when the price drops, hits your target, or the item is back in stock.

PriceGhost - Self-Hosted Price Tracking for Online Products

PriceGhost is “a self-hosted price tracking application that monitors product prices from any website” — add a product URL, get notified when the price drops, hits your target, or the item is back in stock.

Most price trackers guess a price off a page and hope. PriceGhost does something better, and it is the reason this project is worth a look.

The voting design, which is genuinely good

When you add a product, PriceGhost runs four independent extraction methods in parallel and has each of them vote:

Method How it works
JSON-LD Reads schema.org structured data embedded by the retailer
Site-specific Custom scrapers tuned for major retailers
Generic CSS Selectors that find price patterns
AI analysis Claude, GPT or Ollama reads the page context

If the methods agree, the price is accepted. If they disagree, you get a modal showing every candidate with a confidence score and an explanation of where each came from, and you pick.

This is the correct answer to a problem every scraper has and most pretend not to. A product page contains several numbers that look like prices: the item, a crossed-out RRP, a subscription price, a bundle, a “customers also bought” tile. An extractor that silently picks one is right most of the time and wrong in a way you will not notice for weeks — which, for a tool whose entire purpose is alerting you to a change, is the worst possible failure mode.

Surfacing the ambiguity at setup time, once per product, and asking a human to resolve it is a small amount of friction in exchange for trustworthy alerts afterwards. It is a design decision that shows someone used their own tool.

The licence situation needs care

Here is what we found, stated precisely because the distinction matters.

The README has a ## License section, and it says MIT.

The repository contains no LICENSE file — we listed every tracked file and there is none. Neither backend/package.json nor frontend/package.json declares a license field; both are empty on that key.

So the author’s intent is clear and stated, but the formal artefacts are missing. For personal use this is almost certainly fine — a written statement of MIT in the project’s own README is a real grant. For anything else it is a problem: many corporate review processes require a licence file, automated scanners will report the repository as unlicensed, and “the README said MIT” is weaker ground than a licence text you can point at.

If you want to use PriceGhost at work, the practical move is to open an issue asking for a LICENSE file. It is a two-minute fix for the author and it converts an intention into a grant.

What it puts on your server

The compose file is three services — postgres, backend, frontend — with a postgres_data volume. Version 1.0.6, most recent commit February 2026.

The dependency worth knowing about is in the backend: Puppeteer, with puppeteer-extra and the stealth plugin. That means PriceGhost drives a real headless Chrome to load pages.

Two consequences:

It is not a lightweight container. A bundled Chromium is hundreds of megabytes and loading a page costs real memory and CPU. On a small VPS, checking many products on a tight schedule will be the heaviest thing running. Size accordingly and spread the schedule out.

Browser automation is fragile in specific ways. Chrome crashes, pages hang, memory leaks across long runs. The project is clearly aware — the most recent commit is literally “Fix Puppeteer crash handler error in Docker” — but expect to restart things occasionally and to monitor whether checks are actually running rather than assuming silence means stable prices.

The part that is on you

This is a scraper, and that carries obligations the software cannot discharge for you.

Retailers’ terms of service frequently restrict automated access, and the stealth plugin exists to make headless Chrome resemble an ordinary browser. Whatever your view of that, the sensible and defensible operating posture is the same: check infrequently, one request at a time, for a small number of products you personally intend to buy. The README includes a “Rate Limiting & Best Practices” section, and following it is the point.

A price tracker polling a dozen products twice a day is indistinguishable from a person browsing. One hammering hundreds of URLs every fifteen minutes is a different thing, will get blocked, and deserves to be.

Wiring up the alerts

The notification is the product, so make sure it reaches you. A generic HTTP push target like ntfy is the simplest sink — a POST to a URL and your phone buzzes — and it has the advantage of being maintained independently of the tracker.

Run the stack somewhere that handles restarts and certificates for you rather than hand-managing compose; Coolify is the obvious fit, and it keeps the Postgres volume in a place you can back up.

Who should run it

Someone tracking a modest list of specific items who would rather not hand their shopping intentions to a commercial tracker. The voting design makes it more trustworthy than the category norm, and self-hosting means the list of things you want is not a marketing asset.

The finding: the four-method price vote with a human tiebreak is the feature worth adopting — it fixes the silent-wrong-price failure that makes most trackers untrustworthy. Before you rely on it, note that the MIT licence exists only as a line in the README with no LICENSE file to back it, and that a bundled headless Chrome makes this the heaviest small app on your server.

Learn more at: https://github.com/clucraft/PriceGhost

Share

XLinkedIn