# description
A portable, service-neutral format for a person's TV & movie watch history, ratings, reviews and lists. Human docs: https://seenr.app/wlog

# properties.format.description
Format discriminator and version, 'wlog/MAJOR.MINOR'. Consumers MUST check this before parsing. This is the v1 schema: it validates wlog/1.x only. A wlog/2.x file is a breaking change validated by the /v2/ schema.

# properties.$schema.description
URL of the schema this file conforms to.

# properties.generator.description
The app that produced this file. Informational only.

# properties.profile.description
Minimal, non-identifying owner context. Never carries email or legal name.

# properties.items.description
The library: one entry per show or movie.

# properties.extensions.description
Document-level vendor-namespaced data, keyed by service (e.g. 'seenr'). For things that don't belong to a single item, such as favourite-character votes that may target a show, season or episode. Consumers MUST ignore keys they don't understand.

# $defs.timestamp.description
An ISO 8601 date ('2020-03-01') or date-time ('2020-03-01T20:00:00Z' or '...+00:00'); null when the date is unknown. UTC is RECOMMENDED. JSON Schema treats 'format' as an annotation only, so this is validated by pattern; a date-only value is accepted so imports from sources that carry no time (Letterboxd, IMDb) are not rejected.

# $defs.ids.description
External catalog ids. At least one MUST be present so a consumer has something to resolve against; any single namespace (including a provider not listed below) satisfies this. Internal ids MUST NOT be used. The keys below are the recognised producer vocabulary: a producer SHOULD include a broadly-resolvable id (tmdb or imdb) alongside any niche one, and a consumer resolves the namespaces it knows and ignores the rest.

# $defs.rating.description
A score together with the scale it was given on, so a 5-star and a /10 rating coexist losslessly. Normalise as value / scale.

# $defs.rating.$comment
value <= scale is an intended invariant that JSON Schema 2020-12 cannot express across sibling properties; the schema enforces only value >= 0 and scale > 0.

# $defs.review.properties.contains_spoilers.description
Whether the review should be veiled as a spoiler: declared by the author, or flagged by enough readers to pass the exporter's threshold.

# $defs.review.properties.spoiler_reports.description
Count of distinct community 'this is a spoiler' reports on the review. A consumer veils the text once this reaches its own threshold (Seenr: 1). An author-declared spoiler sets contains_spoilers with no count.

# $defs.review.properties.lang.description
BCP-47 language the review is written in.

# $defs.season_rating.description
A rating (and optional review) for a whole season. Trakt, Simkl and others rate seasons natively.

# $defs.episode_rating.description
A rating (and optional review) for a single episode.

# $defs.watch.description
One entry in the watch log. For episodes, 'season' and 'episode' locate it (numbered as in §6.4); for movies they are absent. 'watched_at' MAY be null, meaning 'watched, date unknown'. An entry SHOULD carry at least a locator or a 'watched_at' key: a fully empty entry has no meaning. 'plays' collapses repeats: total views of this episode/movie = the sum of 'plays' across its entries.

# $defs.item.description
A tracked show or movie and everything the owner did with it.

# $defs.item.properties.status.description
The owner's tracking status for the whole work.

# $defs.item.properties.favorite.description
Spelled 'favorite' (US). Readers SHOULD also accept 'favourite'.

# $defs.item.properties.collected.description
The owner owns a copy (Trakt 'collected', media-server library). A separate axis from watched.

# $defs.item.properties.tags.description
Free-form labels (Letterboxd tags, MyAnimeList tags…).

# $defs.item.properties.extensions.description
Vendor-namespaced extra data, keyed by service (e.g. 'seenr'). Consumers MUST ignore keys they do not understand, and MUST NOT rely on anything here for core interop.