Show GN: 낯선 사람과 익명으로 유튜브 같이보기 — 한 명이 떠나면 방이 사라지는 1:1 동시 시청
(momentbrand.site)알고리즘 추천이 아니라 "누군가 직접 골라서 띄운 영상"을 만나는 컨셉으로 만들었습니다. 예전 돛단배 컨셉
익명 유저가 유튜브 링크 + 한 줄 편지를 '돛단배'로 띄우면, 다른 익명 유저가 그걸 클릭해서 1:1 시청방이 열립니다. 두 사람의 유튜브 플레이어가 같은 장면으로 동기화되고, 익명 채팅을 하면서 같이 봅니다. 둘 중 한 명이 떠나는 순간 방과 채팅이 전부 사라집니다.
처음엔 영상이 끝나면 3분 카운트다운 후 방이 폭파되는 컨셉이었는데, 막상 써보니 잘 맞는 상대를 만나면 "한 편 더"가 자연스러워서 — 영상이 끝나도 방은 유지되고 방장이 영상을 교체하며 이어 보는 쪽으로 바꿨습니다.
만들면서 재밌었던/삽질했던 부분:
- 동기화: 서버가 기준 시각을 잡고(RTT 보정), drift 0.5초 이내는 무시, 2초 안쪽은 재생속도 0.95~1.05x로 사용자 모르게 따라잡고, 그 이상은 seekTo로 강제 보정합니다. 광고 재생 중엔 보정을 멈춥니다.
- 진짜 삽질은 라이브 스트림이었습니다. 라이브는 seekTo가 DVR 윈도우 안에서만 동작하는데 두 시청자의 DVR 윈도우가 서로 달라서, "방장이 라이브 엣지에 있다"는 의도를 상대방 윈도우 기준으로 번역해야 했습니다. loading→play→loading 무한 에코 루프까지 — 커밋 로그를 보니 라이브 싱크 픽스만 7개네요.
- 매칭 race: 같은 돛단배에 동시에 여러 명이 올라타는 걸 Redis Lua 스크립트 원자 락으로 막았습니다 (5명 동시 join 테스트에서 1명만 승리 확인).
- 임베드 차단 영상(오류 153)은 IFrame API가 onError를 안 쏴줘서 화면만 검게 남는데, 8초 재생 watchdog으로 감지해 "재생 불가" 안내를 띄우게 했습니다.
- 익명 1:1이라 안전장치를 많이 깔았습니다: 채팅 전체 서버 sanitize, 외부 연락처 자동 마스킹, AI 모더레이션 + 신고 누적 차단, 위기 키워드 감지 시 상담전화 안내.
스택: Next.js 15 / Fastify 5 / Socket.io / Redis 7 / Postgres 16, 모바일은 Expo(RN)
가입 없이 바로 체험할 수 있습니다. 이번 주에 iOS 앱도 App Store에 올라갔어요: https://apps.apple.com/kr/app/float/id6777661839
피드백 환영합니다.