Syncwave
WebSocket sync · sub-100ms drift

Watch YouTube together, perfectly in sync.

Spin up a room in one click, share a link, and every play, pause and seek lands on the same frame for everyone. Roles and permissions keep the remote in the right hands.

MO
DR
LW
+9
No sign-up · 14,208 rooms hosted this week
syncwave.app/r/QK4-92T
youtube iframe embed
42ms
IN ROOM · 4
MO
DR
LW
AD
FEATURES

Built for rooms that don't drift

Every client holds an open socket. Late joiners are fast-forwarded to the host's exact timestamp on connect.

Frame-accurate sync

Drift correction runs every 2s and nudges playback rate instead of hard-seeking.

Roles & permissions

Host, moderator, participant. The UI hides or disables what a role can't do.

One-link rooms

No account, no install. A 7-character code or a link is the whole invite.

Any screen

Desktop, tablet and phone layouts share one component system.

HOW IT WORKS

Three steps, under a minute

1

Create the room

Pick a display name and a room name. You become the host automatically.

form · 2 fields
2

Share the link

Copy the invite link or read out the code. Guests land straight in the room.

invite link · QK4-92T
3

Press play once

Your controls broadcast to everyone. Promote a friend to share the remote.

player · synced

Your watch party is one click away

Rooms stay open as long as someone's inside. Nothing to download.

Create a room

You'll be the host. You can hand over the remote at any time.

MO
Shown in the top bar to everyone in the room.
Room is live — share the invite
{{ inviteLink }}
Room code {{ roomCode }}

Already have a code? Join a room instead

Join a room

Enter the 6-character code your host shared with you.

LW
{{ c.ch }}
{{ joinErrorMessage }}
Codes are case-insensitive
RECENT
FN
Friday Night Cinema
QK4-92T · 4 online
DJ
Deep House Journey
7XB-40M · ended
{{ room }} LIVE
{{ roomCode }} · {{ peopleCount }} watching
VIEWING AS
{{ roleHint }}
youtube iframe embed · 1280×720
Synced with host
Playback is controlled by the host. Ask to be promoted to take the remote.
{{ timeNow }}
12:48
thumbnail

{{ currentVideoTitle }}

{{ currentVideoChannel }} ·{{ currentVideoDurationFormatted }} · {{ hostInitials }} queued by {{ hostName }}
{{ p.initials }}
{{ p.name }} (you)
{{ p.badge }} {{ p.statusLabel }}
HOST CONTROLS
socket open · 42ms · region fra1
{{ msg.text }}
{{ msg.initials }}
{{ msg.username }} HOST {{ msg.time }}
{{ msg.text }}
SYSTEM STATES

Loading, empty, error & feedback

Every socket state has a designed surface. Nothing falls back to a blank screen.

connecting to room…

Nothing queued yet

Paste a YouTube link to start the party. Everyone will jump in automatically.

You're the only one here

Share the invite link and your room fills up in seconds.

Connection lost

The socket dropped and playback is paused locally. We'll re-sync you to the host's timestamp on reconnect.

ws_close 1006 · attempt 3 of 8 · retry in 4s
!

Video unavailable in your region

The host was asked to pick a different video. You'll stay in the room.

Drift detected · 1.8s behind
Field validation
not-a-youtube-link.com
Enter a valid youtube.com or youtu.be URL.
Invite link copied
syncwave.app/r/QK4-92T
DR
Dev Rao is now a moderator
Can control playback
!
Reconnecting…
Attempt 3 of 8
i
Amara joined the room
Fast-forwarded to 4:21

Fire one live

Toasts stack bottom-right, auto-dismiss after 3.2s, and pause on hover.

RESPONSIVE

Tablet & mobile behaviour

Breakpoints at 1180px and 760px. The sidebar becomes a bottom sheet, controls collapse to essentials, the seek bar keeps full width.

Tablet834 × 1112
Friday Night Cinema LIVE +
player
4:21
PEOPLE · 5
  • Sidebar collapses into a people strip with overflow count
  • Video info and queue stack under the player
  • Control bar keeps play, seek and time only
Mobile390 × 844
21:075G ▪ 82%
Friday Night Cinema LIVE
player
4:21
People · 5Chat
MO
Maya OseiHOST
DR
Dev RaoMOD
LW
Liang WuGUEST
Invite
Leave
  • People and chat live in a draggable bottom sheet
  • Player pins to top; tap toggles overlay controls
  • All hit targets ≥ 44px, safe-area padded
FOUNDATIONS

Design system & flows

Tokens, hierarchy and flows behind every screen above.

COLOR

{{ s.name }}
{{ s.hex }}
{{ s.use }}

TYPE · INTER

Display60/800/-2.4
Section title36/700/-1.2
Card heading17/650/-.3
Body copy at 14/1.6 for dense UI14/400
OVERLINE / LABEL11/700/.8
JetBrains Mono · codes, ids, latencymono

RADII & SPACING

8
12
16 ★
full
{{ sp.label }}

ICONS · 1.5px STROKE, 16PX GRID

ROLE BADGES & PERMISSIONS

ROLEPLAYBACKCHANGE VIDEOMANAGE PEOPLE
HOST FullYesYes
MODERATOR FullYesNo
PARTICIPANT Disabled (visible)HiddenNo

COMPONENT HIERARCHY

App ├─ LandingPage │ ├─ NavBar · Hero · FeatureGrid │ └─ HowItWorks · CTABand · Footer ├─ CreateRoomPage │ ├─ TextField ×2 · SegmentedControl │ └─ InvitePanel (link + code + copy) ├─ JoinRoomPage │ ├─ TextField · CodeInput ×6 │ └─ InlineError · RecentRooms └─ RoomPage ├─ TopBar (name, live, invite, copy, leave) ├─ PlayerPane │ ├─ YouTubeEmbed · SyncBadge │ ├─ ControlBar (play, seek, vol, change) │ └─ VideoInfoCard · QueueList ├─ Sidebar │ ├─ Tabs (People / Chat) │ ├─ ParticipantRow │ │ ├─ Avatar + PresenceDot │ │ ├─ RoleBadge │ │ └─ HostMenu (popover) │ └─ ChatPanel · SocketStatus └─ Overlays ├─ ToastStack · Skeletons └─ EmptyState · ErrorState

USER FLOW

Landing Create Invite link Room · host
Link / code Join Skeleton Room · participant

INTERACTION FLOW · SOCKET

host → wsPAUSE {t: 261.4} — optimistic local pause, button scales to 1.06
ws → allSTATE broadcast — clients seek if |drift| > 0.4s, else rate-nudge
ws → allPRESENCE join/leave — row animates in, toast fires bottom-right
ws → oneROLE_CHANGE — badge cross-fades, controls enable in the same frame
close1006 — controls disable, banner appears, backoff 1s→8s

BUTTONS & MICRO-INTERACTIONS

Hover: −2px lift + shade shift, 180ms ease. Press: scale .98. Focus: 2px primary ring.
{{ t.icon }}
{{ t.title }}
{{ t.sub }}