Product

Built for two people and one film

Partmov is not a streaming catalogue and not a video call with a player bolted on. It is a room that two people enter to watch one thing at the same time, and it optimises for that single case.

Concept

What the product actually promises

The promise is narrow and testable: both viewers see the same frame within a few tens of milliseconds, playback starts together, and when one connection stumbles the recovery is handled by the platform rather than by two people typing “wait, where are you?”

Everything else is subordinate. There is no feed, no recommendation engine, no public rooms, no follower graph. A room holds one title, two people, and a shared clock. That constraint is what makes the sync problem tractable and the privacy story honest.

Design test used throughout: if a feature does not make the two people more synchronised, more private, or more comfortable, it does not ship.

User flow

From empty account to shared film

Eight steps, none of which require the guest to create an account or install anything.

Host signs in with a link

Email address in, magic link out, signed session cookie back. No password, no social login, no profile to fill in. The account exists to own media and rooms, nothing more.

Host adds a film

A resumable upload streams the original file into private object storage. The client shows probe results within seconds — container, duration, video and audio streams, embedded subtitle tracks — and the transcode job is queued immediately.

The pipeline prepares the title

FFmpeg produces three renditions and an HLS master playlist, extracts subtitles into WebVTT, grabs a poster frame, and builds a sprite sheet for scrub previews. The title becomes playable when the lowest rung finishes, and quality rungs light up as they land.

Host creates a room and invites one person

A room is bound to exactly one title and one invite link. The link carries a random 22-character token, an expiry, a use limit of one, and optionally a passphrase. Nothing about the room is discoverable.

Guest joins and both arm playback

The guest opens the link, picks a display name, and lands in the room. Each client fetches signed manifest URLs, buffers the first segments, and reports readiness. The room shows a calm 'ready when you are' state rather than autoplaying into a stall.

Start together

The host presses play. The server schedules a start timestamp roughly 400 ms in the future and broadcasts it. Both players seek to the same position and unpause on that shared instant.

Watch, drift, correct, recover

Every second each client reports its position and buffer health. The server answers with the authoritative position. Small gaps close through rate nudges; a rebuffer on one side triggers an optional courtesy pause for both, which is the default for two-person rooms.

Leave and come back

Closing the tab does not destroy the room. Position, subtitle choice, and audio track persist. Reopening the link resumes from the stored position with the same roles.

Roles

Who can do what

Two roles keep the permission model small enough to reason about, and the control model explicit enough that nobody fights over the remote.

Host
Owns the room and the asset. Can play, pause, seek, change subtitle and audio tracks, adjust rate, hand over the remote, revoke the invite, and end the room.
Guest
Can always pause for both and change their own volume and quality. Seeking and track changes are gated unless the host enables shared control.
Shared control
A single room-level toggle. When on, both participants hold the same command rights and the server resolves conflicts by monotonic sequence number, last write wins.
Remote handover
The host can pass control to the guest without leaving; the room records the change in its audit trail and the status line updates for both.
Interface

Five surfaces, one job each

The room stays quiet on purpose. Loom-like dark surfaces, solid blue accents, and transitions measured in fractions of a second.

Ayla is holding the remoteBoth connected · in sync within 40 ms

“We have all the time in the world.”

Pause for both00:48:12 / 02:07:33Subtitles: English
SurfaceBehaviour
StageThe player fills the viewport with no chrome over the picture. Controls fade after three idle seconds and return on pointer move, tap, or key press.
Status lineOne row, always truthful: who holds the remote, whether both people are connected, and the current sync delta in milliseconds.
Control stripPause for both, timeline with buffered range, subtitle and audio menus, quality override, volume. Nothing else.
Companion railCollapsed by default. Holds chat and six reactions. Opening it shrinks the stage rather than covering it.
InterstitialsJoin, ready, rebuffer, and reconnect states are full-width whispers under the player, never modal dialogs that block the film.
  • Palette — background #1F1F21, secondary #18191A, text #CECFD2, accent #1868DB, healthy-sync #4BCE97, attention #FBC828. Flat fills only — no gradients.
  • Motion — 160–240 ms fades for controls, 420 ms for sheets and reveals, no bounce, no parallax. Every animation respects prefers-reduced-motion.
  • Typography — one soft product sans for titles and interface text, sized to Loom Lens body and heading steps so the product reads clear rather than decorative.
  • Mobile — the same room in portrait: stage on top, status line beneath, control strip as a bottom sheet, rail as a full-height drawer. Landscape goes edge to edge.
Non-goals

What Partmov deliberately is not

  • Not a public catalogue. There is no browse page, no search across other people's libraries, and no shared index.
  • Not a social network. Chat exists because pausing to type a full message is worse than a two-word reaction; it is not a feed.
  • Not a rooms-for-twenty product. Group watch changes the sync trade-offs and the moderation surface, so it stays out of scope.
  • Not a piracy tool. Uploads are private to the uploader, links are single-use, and takedown tooling exists from day one.
  • Not DRM-first. Access control, expiring URLs, and audit logs cover self-owned files; DRM only enters if a licensor contractually demands it.