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.