Roadmap

An eight-week MVP with a testable promise

The MVP is the smallest system that can honestly claim two people watched the same film in sync, privately. Everything that does not serve that claim waits.

Scope

In and out for v1

AreaDetailStatus
AccountsMagic-link sign-in, session cookie, account deletionIn
UploadResumable tus upload, checksum verification, ffprobe validationIn
TranscodeThree-rung HLS ladder, fMP4, 2 s segments, aligned keyframesIn
SubtitlesExtraction and upload, normalised to WebVTT, room-shared selectionIn
Visual metadataPoster frame, sprite sheet with VTT index, chapter markersIn
RoomsOne asset, one host, one guest, unlisted, resumableIn
InvitesHashed token, expiry, single use, optional passphrase, revocationIn
SyncCanonical clock, start-together, pause for both, host seek, rate nudge correctionIn
RecoveryReconnect with full resync, courtesy pause, 90 s grace, re-arm on large driftIn
CompanionCollapsible chat and six reactions, ephemeralIn
AdminAsset takedown, room kill, invite revocation, audit log viewIn
ObservabilityPrometheus, Grafana, Loki, eight core metrics, two paging alertsIn
DeploymentDocker Compose on one VPS, Caddy TLS, pgBackRest, mc mirrorIn
Group rooms (3+)Different sync and moderation trade-offsOut
Native mobile appsThe web room must be excellent firstOut
DRMOnly if a licensor contractually requires itOut
Voice or video chatChanges the product from co-watching to a callOut
Public catalogue and discoveryContradicts private by constructionOut
Recommendations or watch historyRequires the behavioural data the design refuses to collectOut
Build order

Eight weeks, two engineers

Sequenced so the riskiest part — synchronisation — is exercised with real media by week six rather than discovered in week eight.

WhenPhaseWork
Weeks 1–2FoundationsCompose stack up: PostgreSQL, MinIO, Caddy. Schema migrations. Magic-link auth. Upload with checksum verification and ffprobe gating.
Weeks 3–4PipelineWorker with the PostgreSQL queue, FFmpeg ladder, subtitle extraction, poster and sprites, atomic publish, asset status streaming to the client.
Weeks 5–6Room and syncSync service with canonical clock, ping/pong offset estimation, heartbeat loop, start-together handshake, drift controller in the client, reconnect path.
Week 7ExperienceRoom UI, status line, control strip, subtitle and audio menus, collapsible companion rail, mobile layouts, reduced-motion support.
Week 8HardeningRate limits, admin routes, dashboards and alerts, backup plus a timed restore drill, load test with simulated poor networks.
Definition of done

Acceptance criteria, all measurable

Every item below is a test that either passes or fails. None of them are opinions about polish.

  • Two devices on different networks start within 150 ms of each other, measured from player timestamps and repeated 20 times.
  • Drift p95 stays under 120 ms across a 2-hour film with one device on throttled mobile network conditions.
  • A forced 5-second stall on one device recovers to locked state without a hard seek.
  • Killing the sync container mid-film costs under 3 seconds and no position loss.
  • A revoked invite closes the guest's socket and fails the next segment request within 2 seconds.
  • Deleting an asset leaves zero objects under both prefixes, verified by a list call, and writes an audit row.
  • A restore drill from backups reaches a working room join in under 4 hours, timed and recorded.

The first two criteria are the product. If start alignment and drift cannot be held on real networks, no amount of interface work makes Partmov worth using.

After launch

Enhancements in the order they earn their keep

EnhancementWhat it involves
Shared control by defaultPromote the shared-control toggle to a first-class mode with intent-based conflict resolution, once real usage shows how often couples fight over the remote.
Continue watching across roomsPer-asset resume positions per user, so a film picks up wherever it was left even in a new room.
Native appsReact Native or a thin Kotlin/Swift shell over the same REST and WebSocket contracts. Sync logic ports directly because the protocol is server-authoritative.
Redis scale-outCross-node WebSocket fan-out and shared rate-limit counters, plus consistent-hash room sharding.
Optional edge cachingA second cache node near the viewers, or a commodity CDN in front of the signed media path. Zero code change by design.
Licensed catalogueAdmin-managed titles with licence references, territory rules, and a curated shelf that never becomes public discovery.
AV1 and HEVC rungsRoughly 30 percent bitrate savings at the cost of encode time; gate behind browser capability detection.
Low-latency ambienceOptional whisper audio channel over WebRTC, strictly separate from media delivery so it can never destabilise sync.
KeycloakOnly if teams or organisations become users and SSO is genuinely required.
Watch-together schedulingInvitations with a start time, a calendar file, and a gentle reminder — the one growth feature that fits the product's tone.
Closing

Why this design holds together

Partmov works because it refuses generality. One title per room, two people per room, one authoritative clock, one delivery protocol. That narrowness is what lets a two-person team hold sync accuracy to tens of milliseconds on commodity hardware, and it is what keeps the privacy story simple enough to be true: there is no catalogue to browse, no history to mine, and no third party in the request path.

Every component named in this blueprint — PostgreSQL, MinIO, FFmpeg, Caddy, Prometheus, Grafana, Loki, Docker — is free software that runs on a single machine you control, and each one can be replaced without redesigning the system around it. That is the point of the architecture as much as the sync protocol is the point of the product.