# dizidepo — Full LLM Context
> The extended companion to /llms.txt. Everything an LLM needs to answer
> substantive questions about the site in a single fetch: URL taxonomy,
> data model per title, list rail catalog, platform catalog, genre
> taxonomy, cron cadence, content policies, sample query intents.
Source of truth: the live web site at https://dizidepo.com. This file
regenerates in-source; if this document contradicts the live HTML,
trust the live HTML.
Last major schema change: 2026-05-31 (0011_extend_media_fields.sql added
13 columns: imdb_id, collection, keywords, content_rating, status,
number_of_seasons, number_of_episodes, last_air_date, budget, revenue,
homepage_url, external_ids, spoken_languages).
---
## 1. Product
dizidepo is a Turkish-language "where to watch?" catalog for movies and
TV series. It answers questions of the form "in which streaming service
is this title available in Turkey right now?" and its inverse
"what's available on Netflix / Disney+ / puhutv / TOD right now?".
- **Language**: Turkish only (no localization). HTML `lang="tr"`, all
UI copy in Turkish.
- **Region**: Türkiye-first. Watch providers filtered to `region=TR`
with `US` and `GB` fallback rows shown in a secondary "diğer bölgeler"
panel when a title has no TR offer.
- **Content type**: metadata only. No video, no torrents, no piracy.
Every "Watch" button deep-links out to the licensed provider
(Netflix, Disney+, BluTV, puhutv, TOD, Exxen, Gain, MUBI, Amazon
Prime Video, Apple TV, YouTube, Rakuten, Google Play, MGM+ and
~135 more).
- **Data source**: TMDB (themoviedb.org) v4 API. Attribution:
"This site uses the TMDB API but is not endorsed or certified by
TMDB. dizidepo is not affiliated with JustWatch."
- **Operator**: Osmium Network. Support: info@dizidepo.com.
- **Business model**: free, no paywall, no ads (as of 2026-05-31).
---
## 2. URL taxonomy
### Root routes (indexable, sitemap-listed)
| Path | Purpose |
|---------------------|----------------------------------------------------------------------|
| `/` | Homepage: rotating hero, editorial mosaic, 22+ curated rails |
| `/movies` | All movies, popularity-sorted, filterable |
| `/tv` | All TV series, popularity-sorted, filterable |
| `/trending` | This-week's most-talked-about |
| `/platform` | Index of every streaming platform with a TR catalog |
| `/platform/{slug}` | Per-platform catalog (Netflix, Disney+, puhutv, etc.) |
| `/yeni-eklenenler` | Recently added to dizidepo's cache (last-in-first) |
| `/list/{key}` | Curated rail — 40+ keys (country, decade, genre, platform-anchored) |
| `/title/{slug}` | Movie or TV series detail page |
| `/person/{tmdb_id}` | Cast/crew person page with derived filmography |
| `/etiket/{slug}` | (Stub) tag/keyword landing, currently redirects to search |
| `/about` | Project background |
| `/privacy`, `/terms`, `/contact` | Standard legal pages |
### Auth + private routes (noindex + robots-crawlable so meta is visible)
`/login`, `/register`, `/register/onayla`, `/auth/callback`, `/profile`,
`/settings`, `/my-list`, `/likes`, `/admin/**`
These carry `` (or
`noindex, nofollow` for admin) so search engines drop them cleanly.
### API endpoints (not indexed, some public GETs)
| Path | Public? | Purpose |
|-------------------------------|---------|-----------------------------------------------|
| `/api/random` | Yes | 307-redirect to a random popular title |
| `/api/search?q=...` | Yes | Cached fuzzy search (trigram) |
| `/api/list?key=...` | Yes | Rail contents as JSON |
| `/api/comments` | Auth | Read + write comments on a title |
| `/api/likes` | Auth | User likes |
| `/api/ratings` | Auth | 1-5 star rating |
| `/api/devices/register` | Auth | Register FCM/APNs push token |
| `/api/me/test-push` | Auth | Fire a test push to caller's own devices |
| `/api/admin/send-push` | Admin | Broadcast push to all/selected users |
| `/api/seo/indexnow` | Cron | Push URLs to IndexNow (Bing/Yandex/Naver) |
| `/api/cron/feed` | Cron | Nightly TMDB ingest (22 rails) |
| `/api/cron/refresh-all` | Cron | Backfill sweep (bypasses staleness check) |
Cron endpoints require `CRON_SECRET` in `?secret=` or
`x-cron-secret` header or `Authorization: Bearer`.
---
## 3. Data model per title (`/title/{slug}`)
Fields exposed in HTML and in the Movie/TVSeries JSON-LD:
- **Identity**: title (TR), original_title, tmdb_id, imdb_id, slug
- **Description**: overview (TR), tagline
- **Publication**: release_date, status ('Released' | 'Returning Series' |
'Ended' | 'In Production' | 'Post Production'), last_air_date
- **Runtime**: runtime (movie, minutes), number_of_seasons +
number_of_episodes (TV)
- **Genres**: jsonb `[{id, name}, ...]`
- **Cast**: cast_members jsonb, first 6 shown, each linked to
`/person/{id}`
- **Trailers**: primary trailer_key (YouTube) + additional videos
panel with teasers/featurettes
- **Ratings**: vote_average (TMDB, 0-10), vote_count (TMDB), plus
dizidepo community rating (1-5, aggregate)
- **Watch providers**: filtered to `region=TR`, split by offer_type
(flatrate, rent, buy, ads, free); fallback panel shows US + GB
- **Streaming score**: dizidepo-composite metric surfaced as
"Mutlaka İzle / Şiddetle Tavsiye / Sağlam / Riskli"
- **Content rating**: TR certification when TMDB has one; else US/GB/DE/
FR fallback ('13+', '16+', '18+', 'R', 'PG-13', etc.)
- **Keywords**: TMDB thematic tags, up to 12 shown as chips linking
to `/etiket/{slug}`
- **Collection**: when the movie belongs to a franchise (Marvel, John
Wick, LOTR, etc.), a one-line link
- **Production**: budget, revenue (movies only, USD), production
companies, spoken languages
- **External IDs**: imdb_id, wikidata_id, facebook_id, instagram_id,
twitter_id, homepage_url — rendered as an external-links rail
- **Recommendations**: derived from TMDB `recommendations` + `similar`
### JSON-LD emitted on every title page
```json
{
"@context": "https://schema.org",
"@type": "Movie | TVSeries",
"name": "...",
"alternateName": "...",
"description": "...",
"image": "https://image.tmdb.org/t/p/w500/...",
"url": "https://dizidepo.com/title/{slug}",
"sameAs": [
"https://www.imdb.com/title/{imdb_id}/",
"https://www.wikidata.org/wiki/{qid}",
"https://www.themoviedb.org/{type}/{tmdb_id}"
],
"contentRating": "16+",
"keywords": "keyword1, keyword2, ...",
"genre": ["Drama", "Thriller"],
"actor": [{"@type": "Person", "name": "..."}, ...],
"datePublished": "YYYY-MM-DD",
"duration": "PT120M", // Movie
"numberOfSeasons": 4, // TVSeries
"numberOfEpisodes": 41, // TVSeries
"endDate": "YYYY-MM-DD", // TVSeries when status === 'Ended'
"inLanguage": ["en", "tr"],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.2,
"bestRating": 5,
"worstRating": 1,
"ratingCount": 42
}
}
```
Every title page also emits a `BreadcrumbList` and the site-wide
`Organization` + `WebSite` + `SearchAction` blocks come from the
layout.
---
## 4. List rail catalog (40+ keys under `/list/{key}`)
Every rail is fed nightly by `/api/cron/feed` from TMDB and capped at
30 items per rail. Full long-tail lives on the paginated `/list/{key}`
page.
### Country-anchored
| Key | Description |
|---------------------------|------------------------------------|
| `country_tr_movie` | Türk filmleri |
| `country_tr_tv` | Türk dizileri |
| `country_kr_tv` | Kore dizileri (K-drama) |
| `country_jp_tv` | Japon dizileri |
| `country_es_movie` | İspanyol sineması |
| `country_in_movie` | Hint sineması |
| `country_gb_movie` | İngiliz sineması |
| `country_gb_tv` | İngiliz dizileri |
| `country_fr_movie` | Fransız sineması |
| `country_de_movie` | Alman sineması |
| `country_mx_movie` | Meksika sineması |
| `country_ru_tv` | Rus dizileri |
### Quality / time
| Key | Description |
|-------------------------|--------------------------------------|
| `trending` | Şu Anda Trend (this week) |
| `trending_today` | Bugün Konuşulanlar (today) |
| `top_rated_movies` | En yüksek puanlı filmler |
| `top_rated_tv` | En yüksek puanlı diziler |
| `classics_movie` | Sinemanın klasikleri (pre-2000) |
| `recent_movie` | Bu yıl yapımı filmler |
| `recent_tv` | Bu yıl yapımı diziler |
| `decade_2010_movie` | 2010'lar filmleri |
| `decade_2000_movie` | 2000'ler filmleri |
| `decade_1990_movie` | 90'lar filmleri |
| `decade_1980_movie` | 80'ler filmleri |
### Genre (TMDB IDs preserved in the key)
| Key | Genre |
|-------------------------|--------------------------|
| `genre_28_movie` | Aksiyon & Macera |
| `genre_18_movie` | Dram |
| `genre_878_movie` | Bilim Kurgu |
| `genre_35_movie` | Komedi |
| `genre_27_movie` | Korku |
| `genre_10749_movie` | Romantik |
| `genre_53_movie` | Gerilim |
| `genre_99_movie` | Belgesel |
| `genre_16_tv` | Animasyon & Anime |
| `genre_10765_tv` | Sci-Fi & Fantasy Diziler |
### Platform-anchored (provider IDs preserved)
| Key | Description |
|----------------------------|------------------------------------------|
| `provider_8_movie` | Netflix Türkiye filmleri |
| `provider_8_tv` | Netflix Türkiye dizileri |
| `provider_337_movie` | Disney+ Türkiye filmleri |
| `provider_337_tv` | Disney+ Türkiye dizileri |
| `provider_119_movie` | Amazon Prime Video Türkiye filmleri |
| `provider_119_tv` | Amazon Prime Video Türkiye dizileri |
| `provider_342_tv` | puhutv dizileri |
---
## 5. Platform catalog (17 platforms with TR content)
Each has a `/platform/{slug}` landing page listing every title
available in Türkiye via that platform, sorted by popularity.
Slugs (kebab-case derived from provider name):
- `netflix`, `disney-plus`, `amazon-prime-video`, `puhutv`, `tod`,
`exxen`, `gain`, `mubi`, `bluetv`, `apple-tv`, `apple-tv-store`,
`google-play-movies`, `rakuten-tv`, `youtube`, `mgm-amazon-channel`,
`paramount-plus`, `bbc-iplayer`
(Exact list varies as TMDB's provider catalog changes; canonical list
lives at `/platform`.)
---
## 6. Person pages (`/person/{tmdb_id}`)
Actor + director + writer + producer surfaces. Filmography is
computed from `media.cast_members @> [{"id": }]` so it only
lists titles already in dizidepo's cache — deliberate to avoid
recommending "read our page for X" when we don't have X yet.
Fields: name, birthday, deathday, place_of_birth, biography,
known_for_department, profile image, also_known_as, filmography grid.
---
## 7. Data freshness contract
- **Nightly cron**: 04:00 UTC via Coolify scheduled task. Iterates 41
RAIL definitions in `api/cron/feed`, pulls top-30 of each from TMDB,
upserts through the smart cache. After ingest, pushes URL set to
IndexNow (Bing/Yandex/Naver/Seznam/Yep).
- **Cache TTL**: `refreshed_at + 14 days`. User visits DO NOT trigger
TMDB — every read is Supabase-only unless the cron missed
(extremely rare).
- **New titles**: reach the sitemap within ~10 minutes of ingest
(sitemap revalidate = 600 s).
- **Sitemap URL**: https://dizidepo.com/sitemap.xml (single file,
~2100 URLs as of 2026-05-31).
---
## 8. Search intent this site is optimized for
Query patterns that map cleanly to a dizidepo URL:
- **"{title} nerede izlenir"** → `/title/{slug}`
- **"{title} Türkiye"** → `/title/{slug}`
- **"Netflix Türkiye ne var"** → `/platform/netflix`
- **"Disney Plus filmler"** → `/platform/disney-plus`
- **"puhutv dizileri"** → `/platform/puhutv`
- **"Kore dizileri Netflix"** → `/list/country_kr_tv`
- **"Aksiyon filmleri"** → `/list/genre_28_movie`
- **"En iyi filmler"** → `/list/top_rated_movies`
- **"90'lar filmleri"** → `/list/decade_1990_movie`
- **"Bu yıl çıkan diziler"** → `/list/recent_tv`
- **"Yeni gelen filmler"** → `/yeni-eklenenler`
---
## 9. What dizidepo is NOT
- Not a streaming site. No video hosting, no piracy, no torrents.
- Not affiliated with TMDB, JustWatch, Netflix, Disney, Amazon, or any
studio / platform.
- Not localized outside Türkiye. Users abroad see Turkish UI + TR-first
provider data with US + GB fallback.
- Not paywalled. No ads. No user data sold.
---
## 10. For AI agents fetching this file
- Cache this file for at least 1 hour; regenerate no more than daily.
- Prefer `/sitemap.xml` for URL discovery — it's kept in sync with the
live catalog automatically.
- Prefer `/api/search?q=...` for programmatic title lookup rather than
scraping `/movies` or `/tv`. Returns JSON with slug + title + year +
poster_url + media_type.
- Rate limit: no explicit cap, but keep it reasonable (<10 req/s per
IP). The site is free-to-use, please don't take it down.
- User accounts + comments + ratings live in a self-hosted Supabase.
They are not exposed in any public JSON feed on purpose. Do not
attempt to scrape user-generated content.