Homelab and AI Deal Scanner

Personal project

A home server defined entirely in one Git repository, and a scanner that finds second-hand clothes on Vinted with two DeepSeek models. Built with Claude Code and Claude Opus 5.5; the part I designed is the context the models decide on.

At a glance

The homelab

ServerDebian · Docker Compose

  • Deal scannerPlaywright · DeepSeek
  • MonitoringPrometheus · Grafana
  • DocumentsPaperless-ngx · OCR
  • Home automationHome Assistant
  • MediaMedia server
  • CV generatorReads this site
  • ContainersDockge

NASRAID 1 · Btrfs · daily snapshots

Storage
RAID 1 NAS over NFS
Backups
Nightly, plus immutable snapshots
Health
Checked every 5 min
Alerts
Private Telegram bot
Access
No open ports, VPN only
Config
All in Git, no secrets

The deal scanner

Saved searches by garment, brand, size and price. Once a day it reads the listings, checks the photos and sends a ranked shortlist.

rules in code drop doubtful listingsCollect listingsHeadless ChromiumFilter in PythonPrice, size, medianDeepSeek eyeFlash reads photosDeepSeek judgePro ranks finalistsDeliverWeb page, Telegramrules in codeCollect listingsHeadless ChromiumFilter in PythonPrice, size, medianDeepSeek eyeFlash reads photosDeepSeek judgePro ranks finalistsDeliverWeb page, Telegram
The eye returns, per listing
{
  "garment": "t-shirt",
  "photo": "real",
  "graphic": "large illustration",
  "defects": [],
  "condition": "like new",
  "confidence": "high"
}
The judge ranks by
  1. No visible defects
  2. Discount on the new price
  3. Discount on the Vinted median
  4. Seller rating

Context design

The quality of the picks came from choosing what each model sees, and in which form.

  • The photos
    • Thumbnails, five listings per call
  • The listing
    • Title, brand, size
    • Declared condition
  • The checklist
    • Garment type, defects, graphic
    • Real or catalogue photo
DeepSeek eye writes a report per listing
  • The item
    • Title, brand, size, condition
    • Eye report on the photos
  • The price
    • Total with shipping
    • Gap to the Vinted median
  • The seller
    • Rating and review count
    • Their own description
  • The buyer
    • Body measurements
    • Notes on taste and fit
DeepSeek judge ranks and comments
Photos never reach the judge: the eye turns them into a structured report first. Listing text is passed as untrusted data, and certain rules are applied before.

Decisions

Eye and judge
Flash sees photos cheaply, Pro reasons better but is text only.
Rules in code
Brand limits and visible wear are enforced by the script, not the prompt.
Measured, then chosen
Same 172 listings run through Claude and DeepSeek: 8 of 10 picks matched.
Spend cap
Token-based cost tracking, a monthly limit, cheapest offers as fallback.

Who did what

Claude Code Claude Opus 5.5

  • Code and configuration
  • Server operations
  • Scripts, timers, dashboards

Me

  • The context each model receives
  • What reaches it, and in which form
  • The eye and judge design
  • Ranking criteria
  • Review of every result