diff --git a/README.md b/README.md index 8af1ba0..481f970 100644 --- a/README.md +++ b/README.md @@ -396,6 +396,8 @@ python -m ingestion.run_streaming_availability --country GR This costs at most two requests with the default configuration. The client and event model still support `removed`, `updated`, and `expiring`, but those types and the Leaving Soon section are deferred beyond the first public release. +WatchPulse cards and search results link explicitly to TMDB for richer title +details instead of duplicating a full internal details page. Full pagination is opt-in and remains protected by the request ceiling: diff --git a/docs/decisions.md b/docs/decisions.md index b3b1f92..516feb6 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -353,6 +353,28 @@ labels this as a new season without claiming a season number absent upstream. Browser requests never trigger enrichment, and each retained response type is skipped independently on subsequent runs. +## ADR-021: Use TMDB as the title-details destination + +Status: Accepted (2026-09-01) + +WatchPulse owns the decision experience: region/provider availability, shared +filters, discovery sections, and concise comparison metadata. For the first +public release it does not reproduce a complete internal title-details page. +Poster links and catalog-search results instead identify TMDB explicitly and +open the canonical TMDB movie or TV page in a new tab. + +This keeps the product focused, gives users a clear destination for richer +cast, crew, production, and related-title information, and sends appropriate +traffic back to the free metadata service supporting WatchPulse. Cards may +retain a short overview, year, genres, rating, and runtime/series totals when +available because those fields directly support the discovery decision. + +Provider actions remain separate and continue to require verified HTTPS watch +links under ADR-019. TMDB attribution remains visible in the site footer, and +outbound labels must not imply that WatchPulse is endorsed or certified by +TMDB. An internal details route may be reconsidered only if it creates distinct +WatchPulse value rather than duplicating TMDB. + ## Open decisions These remain unresolved and should receive new ADRs when decided: diff --git a/docs/roadmap.md b/docs/roadmap.md index 2b788ce..a6313a6 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -156,7 +156,7 @@ the [v0.4 release notes](releases/v0.4.md). Goal: deliver the complete deterministic user experience locally. -Current status: **in progress (2026-08-23)**. React, TypeScript, and Vite are +Current status: **release candidate (2026-09-01)**. React, TypeScript, and Vite are selected in ADR-018. The first increment establishes the responsive application shell, typed local API client, catalog readiness state, explicit development CORS policy, frontend tests, and CI build validation. The second increment adds @@ -185,14 +185,18 @@ desktop filter sidebar, denser rails, and a responsive stacked mobile layout. Verified provider deep links are retained from historical lifecycle payloads and exposed as optional safe card actions; TMDB-only rows remain unlinked rather than receiving guessed destinations. +Title cards and catalog search now identify TMDB as the canonical destination +for richer title details. WatchPulse intentionally retains only the concise +metadata needed to make a discovery decision. Leaving Soon remains deferred +until reliable expiration ingestion is enabled rather than inferred. Scope: - choose and document the frontend framework; - region selector and region-aware provider selection; - type, genre, runtime, release-year, and rating filters; -- responsive rails/cards for all five sections; -- title details; +- responsive rails/cards for Top 10, New Releases, Recently Added, and Upcoming; +- explicit outbound TMDB title-details navigation; - browser-local guest preferences; - loading, empty, stale-data, and error states. @@ -203,6 +207,11 @@ Exit criteria: - filter changes only query the WatchPulse backend; - mobile and desktop layouts are credible for a portfolio demonstration. +Release exception: Leaving Soon was part of the original five-section target, +but is intentionally excluded from v0.5 because expiration ingestion is not +enabled. The existing backend endpoint remains evidence-only and returns no +guessed departures. + ## v0.6 — Automation and deployment Goal: make WatchPulse reproducible, observable, and publicly accessible. diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 6ec8804..8b9f515 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -32,6 +32,7 @@ test("shows catalog readiness returned by the local API", async () => { "href", "https://www.justwatch.com", ); + expect(screen.queryByText(/title details arrive next/i)).not.toBeInTheDocument(); }); test("shows an honest error when the catalog is unavailable", async () => { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 5bc0e87..5f850c0 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -92,7 +92,6 @@ export default function App() { {scope && scope.providers.length === 0 && (

Select at least one streaming service to start discovering titles.

)} -

Leaving Soon and title details arrive next.