Skip to content
RetroPrice Build showcase

Film Price Guide · physical media market intelligence

What we built

A full-stack data product for collectors: automated sold-listing ingestion, community signal, wave scoring, and a public web app — grounded in real comps, not asking prices.

Production snapshot · March 2026 · standalone portfolio (main app offline)

901,713
Price records
3,753
Titles with comps
3,770
Catalog titles
38,075
Wave analyses

Product surfaces

Each item below is a shipped feature in the RetroPrice codebase: PHP pages, APIs, cron jobs, and Python analyzers wired to PostgreSQL. This page describes them — no live app links.

Price guide

Sold-price medians and format breakdowns per title, SEO-friendly title/format landing pages, and confidence cues from listing volume.

  • PostgreSQL aggregates
  • Format-aware comps

Search & title pages

Fast lookup across the TMDB-backed catalog with enriched metadata (posters, years, cast) and deep links into comp history.

  • TMDB / OMDb
  • Redis caching

Thrift check

In-store “is this a deal?” flow: compare shelf price to recent sold medians across formats and conditions.

  • Mobile-first UX
  • Median comps

Goodwill deals

Automated poller surfaces underpriced listings from Goodwill’s online shop against internal comp thresholds.

  • Deal scoring
  • Cron poller

Amazon new releases

Curated feed of hot physical media pre-orders and drops, cross-referenced with collector interest signals.

  • Release tracking
  • Format filters

Collector guides

Long-form SEO guides (grading, hunting, format primers) generated from structured templates and JSON metadata.

  • Content pipeline
  • Schema.org

Wave analysis dashboard

0–100 heat scores blending eBay scarcity, Reddit velocity, and seasonality — with human-readable buy/sell/hold states.

  • Python analyzer
  • sklearn blend

Public collections

Community shelves and watchlists: share what you own, track wants, and discover titles trending in the collector graph.

  • Accounts & CSRF
  • Social discovery

Public read APIs

Versioned JSON endpoints for prices, heating-up titles, myth-bust stats, and integrator API keys with rate limits.

  • API keys
  • v1 REST

Architecture

PHP handles the web app and API integrations; Python runs ML and heavy analysis. PostgreSQL stores JSONB listing payloads; Redis caches hot reads. A cron-driven pipeline runs twice daily.

┌─────────────────────────────────────────────────────────┐
│                    Daily pipeline (cron)                   │
│  eBay crawl ──→ Reddit scan ──→ AI insights ──→ Wave     │
│  (PHP)          (PHP)           (Python)        analyzer │
│                       ▼                           ▼     │
│              ┌─────────────────┐        ┌──────────────┐│
│              │   PostgreSQL    │        │ ML predict   ││
│              └────────┬────────┘        └──────────────┘│
│                       ▼                                 │
│              ┌─────────────────┐                        │
│              │  PHP web app    │                        │
│              └─────────────────┘                        │
└─────────────────────────────────────────────────────────┘
PHP 8.x Python 3.12 PostgreSQL Redis scikit-learn Alpine.js OAuth 2.0 PWA Railway / Vercel

Data collected

Every estimate traces back to sold-listing and auction data plus optional community signal.

Marketplaces & APIs

  • eBay Browse API — sold listings, format, condition, grading metadata
  • Heritage Auctions — high-end memorabilia and graded tape results
  • TMDB — catalog metadata for ~3,700+ titles
  • Reddit — 16 collector subreddits for mention velocity and price language
  • Goodwill / Amazon — deal surfaces and hot new releases

Format coverage (snapshot)

FormatListingsTitlesAvg sold
DVD376,5393,251$12.14
Blu-ray293,1762,177$18.21
4K UHD154,007852$32.37
LaserDisc73,453747$42.05
VHS4,538939$22.03

Surprise valuations the data surfaced

TitleFormatAvg sold
Akira (1988)VHS$1,543.99
The Ballad of Buster ScruggsBlu-ray$1,293.44
The Matrix (1999)LaserDisc$1,098.44
The Iron Giant (1999)LaserDisc$446.10

Collection began August 2025 with twice-daily eBay batches (~100 catalog titles per run across formats).

Daily pipeline (5 steps)

  1. TMDB batch crawler (PHP) — eBay across all physical formats; JSONB rows in price_history.
  2. Reddit trending analyzer (PHP) — subreddit scans with catalog title matching.
  3. AI price analysis (Python) — weighted pricing; optional Ollama market notes.
  4. Wave analyzer (Python) — scarcity (40%) + Reddit (40%) + seasonality (20%) → 0–100 score.
  5. ML predictions (Python) — weekly sklearn retrain on 7-day price change; blended with rules.

Skills & disciplines

Backend & APIs

eBay OAuth, Reddit, TMDB, rate limits, webhooks, public read APIs.

Data engineering

Cron ETL in PHP/Python, JSONB modeling, sitemaps at scale.

ML & analytics

Feature engineering, scikit-learn pipelines, confidence blending.

Frontend & UX

Design system, Alpine.js, PWA, SEO title/format pages.

Security & ops

CSRF, sessions, deployment automation, backups and monitoring.

Domain expertise

Physical media formats, grading, comps, collector guides.

Wave score → action

The wave system maps numeric scores to collector-friendly states used across dashboards and alerts.

ScoreStatusTypical read
75+PeakConsider selling before cool-off
60–74Heating upHold / watch momentum
40–60StableSideways market
25–40CoolingWait for better entry
<25BottomDefault state for most titles — hunt inflection

Full case study

A standalone long-form narrative lives in this folder as case-study.md (metrics, pipeline phases, ML results, and lessons). Additional repo docs: docs/how-we-built-film-price-guide.md, docs/wave-analysis-system.md.