Take

Koder Take — Cinéfilo Social Network

  • *rea:*Suite
  • *ector:*Social
  • *ath:*suite/take
  • *ind:*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 (episodelevel), documentaries, anime, standup, reality — anything narrative on a screen. Its job in the stack is the *ersonal 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
*iary + ratings* Casual viewers who want to remember what they watched v1 — flagship
*inéfilo social* Power users who follow critics, curate lists, write reviews v1 — flagship
*ecommendation hub* Anyone tired of "what should I watch tonight?" v1 — flagship

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

Status

*esign (Phase 0) — landing live.*Architecture ratified in take-RFC-001. Module scaffold (README.md, koder.toml) created on 20260427 with 15 tickets opened in backlog/pending/. On 20260428: product icon (TAKE2) and landing page (TAKE3) shipped — landing deployed at take.koder.dev on s.forge via koderjet, with OG image, dark/light theme, and the scorebreakdown / "similarto" / dualaudiotrailer features highlighted in the hero mockup. Implementation of the platform and capture/discover layers begins after `lockkoder-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 Endofvideo event seam (≥90% → watched; <15% → soft-negative)
suite/tune Same endofvideo event seam from Smart TV
suite/cine Ticketpurchase event → diary entry precreation
engines/sdk/koder_kit Flutter widget kit (signin, theme, safearea, 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 *ot*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 valueadd is the interface (multiaspect "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. *ulti-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. *core breakdown, never single number*— RT / IMDb / Letterboxd / Take shown sidebyside, always. Cinéfilos want divergence; this is a brand-defining choice.
  3. *ative crossproduct wiring*— Play/Tune automark watched at ≥90%; Cine ticket purchase pre-fills a diary entry; same Koder ID is the social account.
  4. *railer in suggestions*— every recommended title surfaces its official trailer with both audio tracks (original/subtitled and dubbed) sidebyside.

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, watchstatus, endof-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

Source: ../home/koder/dev/koder/meta/docs/stack/modules/take.md