Ports the main-branch experiment surfacing (status chip descriptions,
variant-aware Top Picks banner, /health mode detection). Lite runs no
A/B experiment by design, so the chip is hidden instead of implying a
measurement that does not exist.
chore(seed): bake full TMDB art β 3528/3883 movies with postersβ
build_seed.py gains --tmdb-key to sweep art for every movie missing a
cached entry. HF Spaces' filesystem is ephemeral: live-fetched posters
were wiped on each restart, which is why titles like Seven Chances kept
losing images. Seed v3 (3.9 MB gz) ships with 91% coverage; the rest are
films genuinely absent from TMDB.
fix(frontend): sidebar feed scrolls fully; stats refresh after eventsβ
The Live Feed section clipped instead of scrolling (overflow-hidden on a
flex child without min-h-0) and capped at 8 items β now it flexes to the
remaining sidebar height and scrolls through the last 30 server events.
useStats now exposes refresh(); App triggers it immediately after each
event and alongside recs refetch so latency/cache/event counters update
in real time rather than waiting for the 10 s poll.
Page load updated recs twice (initial WS payload + HTTP fetch); events
updated them twice more (instant WS push + 3 s refetch). The socket no
longer sends an initial payload, and fetchRecs skips when a WS push
arrived within the last 2.5 s.
fix(seed): integer rating keys β popularity was all zerosβ
Ratings were counted under string keys ('2') but looked up by int (2),
so pop() returned 0.0 for every movie and browse fell back to movie_id
order β surfacing obscure, artless titles first. Rebuilt seed: 3706
movies now carry real Bayesian popularity and the top pages are popular,
poster-backed titles.
chore(seed): embed ALS item factors + item-sim mapsβ
Seed v2 carries 3706x50 float32 factors and 3706 similarity maps so the
lite re-ranker and /movies/{id} similar-titles work without Spark.
Rebuilt via scripts/build_seed.py (3.3 MB gz).
/simulate now recomputes the user's top-10 in-process with the same
scoring math as the Spark job (time-decayed preference vector over ALS
item factors, event-type weights, genre bonus, diversity penalty) and
pushes refreshed recs over WebSocket instantly. Just-engaged titles are
excluded from results.
Optional TMDB_API_KEY (Space secret) fetches missing posters/backdrops/
overviews live and persists them to SQLite.
feat: CineMatch Lite β single-container HF Space demo (FastAPI + SQLite)β
Same HTTP contract as the full stack on main, served from one SQLite file:
/recommend with 3-layer fallback, /simulate promoting the ALS baseline,
catalogue browse/search, genres, stats, events feed, Prometheus metrics,
WebSocket keep-alive and the static React build.
No Kafka, Spark, Redis or Postgres β everything HF Spaces free tier
supports reliably. Seed restore gives a ~0.1 s cold start; retraining
from scratch via python -m app.bootstrap_lite needs PySpark + JVM.