Portfolio demo · Chrome extension · Vue 3 + Gemini

The same product, other stores’ prices — matched by AI, not by keywords.

Open a product on Rozetka, Foxtrot or Allo and PriceMatch shows what the same item costs elsewhere — with a confidence score and a one-line reason, streamed in as each store answers.

Get a demo code How it works
PriceMatch panel on a Rozetka product page: Foxtrot and Allo prices with a 100% match badge and a reason in Ukrainian
An iPhone 15 on Rozetka. Foxtrot’s own search ranked the exact model 11th behind used stock and screen protectors — PriceMatch still found it.

How it works

Read the product

The extension reads the product’s name, model code and price from the page you opened — structured data first, page markup as a fallback.

Search the other stores

From your own browser, like you would by hand. Results are re-ranked with cheap lexical rules so the right candidate is in the window: used stock and accessories sink, exact storage/colour rise.

Let the model decide

Gemini gets the source product and up to eight candidates per store and answers a strict question: same SKU or not? Colour, storage, refurbished and bundles all count. It streams one store at a time.

Why this isn’t a widget

The AI key never leaves the server

The extension only holds an access code. Model calls go through a serverless proxy; the provider key lives in its environment, nowhere else.

Cost is capped three ways

Per-code quota, a global daily cap and a per-IP rate limit in front of every call — plus a hard monthly spend limit at the provider as the last line.

Stores are plug-ins

Each store is one adapter file with a fixture test. When a store changes its markup, one test fails and one file changes. Adding a store is adding a file.

No vendor lock-in

The model provider is a single setting on the server. Swap Gemini for another vendor without touching the extension.

Honest when unsure

“No exact match” with a reason beats a wrong price. The model is told never to guess, and the extension never renders its output as HTML.

Two languages, one build

English and Ukrainian UI from the browser’s locale, through the extension platform’s own i18n — no runtime downloads.

Under the hood

Chrome Manifest V3 · Vue 3 in a Shadow DOM panel · WXT build · background worker does all fetching · Vercel serverless proxy (Node) · Gemini via the OpenAI-compatible API with a strict JSON schema · Upstash Redis for counters · Server-Sent Events for streaming.

The same three layers — store adapters, AI matching, gated proxy — are what a competitor price-monitoring system for a retailer is built from. This demo is the consumer-facing shape of it.