My own product: a UAE price tracker with a browser extension, price history, and drop, target, and restock alerts. 1.6M+ products and 12M+ price points tracked.
Updated .
Role
Founder & Sole Engineer
Year
2025
Type
Product Development
Stack and skills
Python, FastAPI, PostgreSQL, Next.js, Browser Extensions, Web Scraping, LLM Integration
DeserTracker is my own product. It watches prices in UAE online stores and tells you when one drops, hits your target, or comes back in stock. I built all of it alone: the backend, the website, the browser extension, and the servers it runs on. By September 2026 it had 1.6M+ products in its catalog and 12M+ recorded price points.
A DeserTracker product page with the price, the low and high, and the price history
This is a real product page. The fan is "52% off" today, but the history shows the trick: the price jumps to near 499 AED every few weeks, then drops back to about 240 AED. The "sale" price is the normal price.
Role: Founder and sole engineer.
Stack: Python, FastAPI, SQLModel, PostgreSQL, Alembic; Next.js, TypeScript, Tailwind; a Manifest V3 extension for Chrome and Firefox; Azure OpenAI through LiteLLM; AWS SES, Firebase push, Telegram.
Sales in the UAE are loud and prices move every day. Is a "40% off" a real deal or last week's price with a new label? You can only tell with price history, and the big stores don't show it. The only way to get it is to check every product yourself, many times a day, across Amazon.ae, Noon, Carrefour, IKEA, iHerb, and dozens more.
Stores also don't want to be checked. A price tracker lives or dies on getting a clean page back.
Paste a link, get alerts. Drop alerts fire on a real change, at least 1 AED and 1%. Target alerts fire when the price gets within 1% of your number. Restock alerts fire once per real out-of-stock period of 24 hours or more, not on every flicker.
Price history on the store page. The extension draws the history chart right on the product page and shows coupons at checkout.
Deals. A live list of the biggest drops across stores, and a public Telegram channel for deals.
The DeserTracker extension showing price history on an Amazon.ae product page
A queue in PostgreSQL. Each product has a next_check_at. Workers claim due rows with SELECT ... FOR UPDATE SKIP LOCKED, so many workers pull from one table without two of them taking the same product. No Celery, no Redis. The next check gets random jitter, so checks don't bunch up into bursts a store notices.
Fetchers per store. Each store gets the fetcher it tolerates: curl_cffi, tls_client, rnet, or a headless browser. Amazon.ae prices now come from Amazon's official API.
Parsing in layers. JSON-LD first, then store-specific rules, then Open Graph, then a generic fallback. An LLM reads the page only when all of those fail.
Fast first save. A new product is saved at once. Images, history, and category classification fill in on a second pass, so adding a link feels instant.
Small, cheap hosting. One server runs Caddy, the API, the website, and Postgres in Docker Compose, behind Cloudflare. The firewall only lets Cloudflare reach it. I moved it off AWS to this setup with an rsync cutover that took 25 minutes.
DeserTracker live price drops page with store and category filters
Captchas were a TLS fingerprint problem, not an IP problem. In March 2026 Amazon.ae started returning a captcha on 64 to 85% of requests. I could browse the same store from the same IP with no captcha at all, so the block was keyed on the HTTP client's TLS fingerprint. Switching the client to a Safari fingerprint took the captcha rate from 75% to 0% within the first hour.
The throttle made it worse. The adaptive throttle then swung from its slowest tier to its fastest every two hours. The slow tier saw few captchas, jumped straight to full speed, flooded the store, and crashed back. That kept the captcha rate at 72.5% over a day. I made it climb one tier at a time and only on 100+ samples, and stopped writing each captcha to the alerts table, since the scrape log already held it. That removed about 57K rows a day.
LLM cost. Classifying bulk imports that no one tracked cost about $71 a day. Skipping them saved all of it.
Alert noise. Stock flickers sent too many restock emails. Across 60 days of data, the 24-hour rule would have cut 23,125 restock emails to about 2,500 at most.
The DeserTracker extension showing price history on a Noon product page