Full-stack developer · Birmingham, UKOpen to opportunities · 2026
Selected work

04 / Case study

Vinted Monitor

A local tool for finding promising second-hand listings quickly.

I built a real-time Vinted research tool that watches saved searches, values new listings and sends the strongest candidates to a clear local dashboard.

View repository
Year
2026
Role
Product design · TypeScript and Python engineering
Built with
TypeScript · Node.js · Python
Vinted Monitor dashboard showing scored listings, resale estimates and profit signals

The problem

What needed to work better.

Good second-hand listings can disappear quickly, but checking the same searches by hand creates noise. A low price is not enough on its own: the model, condition, likely resale value, fees and demand all affect whether an item is worth reviewing.

What I built

The monitor watches chosen searches, ignores the first scan, scores only new listings and presents the useful evidence in one place. It supports local, Telegram, Hermes and Windows notifications without automating purchases.

Main areas

What I worked on.

  1. 01Multiple saved-search monitors
  2. 02Seeded scans and deduplication
  3. 03Photo-based product and condition checks
  4. 04Resale comparison routing
  5. 05Profit, ROI and confidence gates
  6. 06Local live dashboard and alerts

My role

Designing the product and the scoring system end to end.

I built the TypeScript monitoring application, the Python fetcher service, the scoring pipeline, local dashboard, notification routes, Docker setup and test suite.

I also researched how to compare listings fairly. The system separates an interesting discount from a properly checked candidate, so the dashboard can explain why an item was surfaced or rejected.

Key decisions

Making the result useful, not simply fast.

The first scan is seeded and produces no alerts. Later scans deduplicate listing IDs, build an internal price index and only spend more work on items that pass basic eligibility and value checks.

Resale estimates can come from matched eBay sold listings, optional provider APIs, the monitor’s own observed cohort or a lower-confidence Gemini estimate. The first reliable result is used, and wide or irrelevant comparison sets are rejected.

Margin calculations include buyer cost, inbound postage, selling fees and outbound postage. A candidate must then clear profit, ROI, resale, confidence and condition thresholds.

Product intelligence

Combining images, demand and real costs.

When enabled, Gemini analyses listing photos to suggest the model, colourway, condition and authenticity risk. Ambiguous items can go through a second confirmation pass, with daily limits and caching to control usage.

A local cohort records when listings appear and later disappear. Rechecks distinguish sold items from removals, building sell-through and time-to-sale signals that feed the sellability score.

What I learned

A useful alert needs evidence behind it.

This project taught me to separate collection, enrichment, valuation and decision rules so each part can fail without hiding the rest of the result. The code uses bounded caches, provider fallbacks and isolated notification failures.

I added 101 automated tests across price buckets, margin maths, comparison matching, eligibility, scoring hardening, cohort metrics, vision requests and notifications. I also prepared a clean public release without credentials, personal searches or runtime data.

Tools used

TypeScriptNode.jsPythoncurl_cffiGeminiServer-Sent EventsDockerVitest

Continue

Next projectcellbot