Koder Take — Cinéfilo Social Network

  • Area: Suite
  • Sector: Social
  • Path: suite/take
  • Kind: B2C SaaS — audiovisual diary, ratings, lists, recommendations, social graph

Role in the stack

Koder Take is the Suite product slot for the audiovisual social network vertical — the Letterboxd / Trakt / TVTime equivalent inside the Koder Stack. It covers films, series (episode-level), documentaries, anime, stand-up, reality — anything narrative on a screen. Its job in the stack is the personal layer: where the user logs what they watched, rates it, builds lists, follows accounts, and answers "what should I watch tonight?".

Take is positioned at the intersection of three audiences:

Mode Audience Status
Diary + ratings Casual viewers who want to remember what they watched v1 — flagship
Cinéfilo social Power users who follow critics, curate lists, write reviews v1 — flagship
Recommendation hub Anyone tired of "what should I watch tonight?" v1 — flagship

It is deliberately separate from Koder Cine (which is a B2B engine for cinema operations). Take and Cine integrate via well-defined seams (Cine ticket purchase → Take diary entry) but ship, brand, and reach independently. This follows the engine-product pattern documented in engine-product-pattern.md.

Status

Design (Phase 0) — landing live. Architecture ratified in take-RFC-001. Module scaffold (README.md, koder.toml) created on 2026-04-27 with 15 tickets opened in backlog/pending/. On 2026-04-28: product icon (TAKE-2) and landing page (TAKE-3) shipped — landing deployed at take.koder.dev on s.forge via koder-jet, with OG image, darklight theme, and the score-breakdown / "similar-to" / dual-audio-trailer features highlighted in the hero mockup. Implementation of the platform and capturediscover layers begins after lock-koder-play archives.

Primary couplings

Module Relationship
foundation/id Identity — Take is a tenant in Koder ID; one Person ↔ one Take account
foundation/billing Premium tier subscription (R$19,90/mo target)
foundation/reporter Error reporting via KoderErrorReporter
data/kdb Catalog (take.titles), ratings, diary, watch-status, lists, social graph
data/mq Event bus for cross-product seams (PlayTuneCine → Take)
data/search Title / person / list search backend
data/blob User-uploaded list covers, profile avatars
ai/recsys All recommendation logic — Take is a thin client over recsys
ai/runtime Embedding computation (used by recsys for "similar to")
core/apis Shared error codes, request/response shapes
suite/play End-of-video event seam (≥90% → watched; <15% → soft-negative)
suite/tune Same end-of-video event seam from Smart TV
suite/cine Ticket-purchase event → diary entry pre-creation
engines/sdk/koder_kit Flutter widget kit (sign-in, theme, safe-area, back, error reporter)
engines/sdk/koder_web_kit Landing page widgets (theme toggle, etc.)

External (non-Koder) integrations:

Source Purpose Method
TMDb Title metadata, cast/crew, posters, trailers Official API
Trakt Aggregate watched/rating signal for cold-start Official API
JustWatch "Where to watch" links per region Partial API
Letterboxd Personal viewing history import Per-user CSV upload (no API)

IMDb and Rotten Tomatoes are not scraped (ToS). Their values are surfaced indirectly via TMDb's external_ids / vote_average proxy where available.

Architecture

products/horizontal/take/
├── platform/     ← Go SaaS — catalog, ratings, diary, lists, social graph
├── app/
│   ├── mobile/   ← Flutter — iOS + Android (primary surface)
│   └── desktop/  ← Flutter — Linux + Windows + macOS (companion)
└── site/         ← landing page at take.koder.dev

The backend is a thin orchestrator over kdb (storage), recsys (intelligence), and external catalogs (metadata). Most "complexity" of a recommender lives in ai/recsys; Take's value-add is the interface (multi-aspect "similar to" anchoring, score breakdown UX, filter DSL) and the social graph that feeds collaborative-filtering signals.

Differentiators

What Take does that Letterboxd / Trakt / TVTime don't:

  1. Multi-aspect "similar to" — pick anchor titles AND specify what kind of similarity (action, tone, pacing, theme, archetype) with weighted sliders, plus negative anchors ("like Bourne but no torture"). Implemented as weighted projection over the recsys embedding space.
  2. Score breakdown, never single number — RT / IMDb / Letterboxd / Take shown side-by-side, always. Cinéfilos want divergence; this is a brand-defining choice.
  3. Native cross-product wiring — Play/Tune auto-mark watched at ≥90%; Cine ticket purchase pre-fills a diary entry; same Koder ID is the social account.
  4. Trailer in suggestions — every recommended title surfaces its official trailer with both audio tracks (original/subtitled and dubbed) side-by-side.

Interfaces

Public API surface (planned per RFC § Service boundaries):

Subsystem Endpoints
Catalog GET /titles/{id}, GET /search?q=, GET /search/persons?q=
Ratings POST /ratings, PATCH /ratings/{id}, DELETE /ratings/{id}, GET /users/{id}/ratings
Watch status POST /watch-status, GET /users/{id}/watch-status?title_id=
Diary POST /diary, GET /users/{id}/diary, PATCH /diary/{id}, DELETE /diary/{id}
Discover POST /discover/feed, POST /discover/similar, POST /discover/filter, GET /discover/presets
Lists POST /lists, GET /lists/{id}, POST /lists/{id}/items
Social POST /follow, GET /users/{id}/feed, GET /users/{id}/profile
Webhooks POST /webhooks/end-of-video (Play, Tune via mTLS)

Phase plan

Phase Scope Locks
0 RFC + scaffold + initial backlog (15 tickets) lock-koder-take (this)
1 TMDb sync, title page, score breakdown UI TBD
2 Capture (rating, diary, watch-status, end-of-video) After lock-koder-play
3 Discover (feed, similar-to, filter DSL) After Phase 2
4 Social (follow graph, lists, reviews, Cine seam) After Phase 3
5 Premium tier + billing + ads + Letterboxd CSV import After Phase 4

Refs