{"id":49521867,"url":"https://github.com/rennerdo30/watch-together","last_synced_at":"2026-05-02T00:02:51.403Z","repository":{"id":331643616,"uuid":"1127604777","full_name":"rennerdo30/watch-together","owner":"rennerdo30","description":"Real-time video synchronization platform for watching YouTube, Twitch, and over 1800 sites together, using Next.js, FastAPI, and yt-dlp for universal video s...","archived":false,"fork":false,"pushed_at":"2026-02-23T06:36:56.000Z","size":371,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-23T14:39:46.272Z","etag":null,"topics":["browser-extension","chrome-extension","cloudflare","dash","docker","fastapi","hls","nextjs","python","react","tailwindcss","typescript","video-streaming","web-development","zero-trust-authentication"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rennerdo30.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-04T08:19:53.000Z","updated_at":"2026-02-23T06:36:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rennerdo30/watch-together","commit_stats":null,"previous_names":["rennerdo30/watch-together"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rennerdo30/watch-together","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rennerdo30%2Fwatch-together","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rennerdo30%2Fwatch-together/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rennerdo30%2Fwatch-together/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rennerdo30%2Fwatch-together/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rennerdo30","download_url":"https://codeload.github.com/rennerdo30/watch-together/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rennerdo30%2Fwatch-together/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32517232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-extension","chrome-extension","cloudflare","dash","docker","fastapi","hls","nextjs","python","react","tailwindcss","typescript","video-streaming","web-development","zero-trust-authentication"],"created_at":"2026-05-02T00:02:48.119Z","updated_at":"2026-05-02T00:02:51.398Z","avatar_url":"https://github.com/rennerdo30.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Watch Together\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Docker](https://img.shields.io/badge/Docker-Ready-blue?logo=docker)](docker-compose.yml)\n[![Next.js](https://img.shields.io/badge/Next.js-16-black?logo=next.js)](https://nextjs.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.115-009688?logo=fastapi)](https://fastapi.tiangolo.com/)\n[![CI](https://github.com/rennerdo30/watch-together/actions/workflows/ci.yml/badge.svg)](https://github.com/rennerdo30/watch-together/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/rennerdo30/watch-together/actions/workflows/codeql.yml/badge.svg)](https://github.com/rennerdo30/watch-together/actions/workflows/codeql.yml)\n\nA real-time video synchronization platform for watching YouTube, Twitch, and 1800+ other sites together. Built with Next.js 16, FastAPI, and yt-dlp.\n\n## Features\n\n- **Universal Video Support**: Uses `yt-dlp` to resolve streams from YouTube, Twitch, Vimeo, Dailymotion, and 1800+ other sites\n- **Real-time Synchronization**: Sub-second accurate sync via WebSockets with intelligent drift correction\n- **DASH/HLS Streaming**: Separate video/audio streams with quality selection up to 4K\n- **Room System**: Create custom rooms with persistent queue and playback state\n- **Cookie Authentication**: Bypass age-restrictions and regional blocks with your own cookies\n- **Browser Extension**: Automatic cookie sync from your browser (Chrome/Firefox)\n- **Audio Normalization**: \"Night mode\" audio with configurable gain boost\n- **Modern UI**: Dark theme with TailwindCSS, drag-and-drop queue management\n- **Cloudflare Integration**: Zero Trust authentication and tunnel support\n\n## Quick Start\n\n### Prerequisites\n- Docker \u0026 Docker Compose\n- (Optional) Cloudflare account for Zero Trust access\n\n### Deploy with Docker\n\n```bash\n# Clone the repository\ngit clone https://github.com/rennerdo30/watch-together.git\ncd watch-together\n\n# Copy environment template\ncp .env.example .env\n\n# Start all services\ndocker compose up -d --build\n```\n\nThe application will be available at `http://localhost:80` (via nginx proxy).\n\n### Local Development\n\n```bash\n# Backend (Python 3.11+)\ncd backend\npython -m venv venv\nsource venv/bin/activate  # or `venv\\Scripts\\activate` on Windows\npip install -r requirements.txt\nuvicorn main:app --reload --port 8000\n\n# Frontend (Node.js 20+) - in a new terminal\ncd frontend\nnpm install --legacy-peer-deps\nnpm run dev\n```\n\n- Frontend: http://localhost:3000\n- Backend API: http://localhost:8000\n- API Docs: http://localhost:8000/docs\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     User Browser                             │\n└─────────────────────────┬───────────────────────────────────┘\n                          │ HTTPS\n┌─────────────────────────▼───────────────────────────────────┐\n│              Cloudflare Tunnel (Optional)                    │\n└─────────────────────────┬───────────────────────────────────┘\n                          │ HTTP\n┌─────────────────────────▼───────────────────────────────────┐\n│                    Nginx Reverse Proxy                       │\n│  ┌─────────────┐    ┌─────────────┐    ┌─────────────────┐  │\n│  │  /api/*     │    │   /ws/*     │    │      /*         │  │\n│  │  /api/proxy │    │  WebSocket  │    │   Static/SSR    │  │\n│  └──────┬──────┘    └──────┬──────┘    └────────┬────────┘  │\n└─────────┼──────────────────┼───────────────────┼────────────┘\n          │                  │                   │\n┌─────────▼──────────────────▼───────┐  ┌───────▼─────────────┐\n│         FastAPI Backend            │  │   Next.js Frontend  │\n│  • yt-dlp video resolution         │  │   • React 19        │\n│  • WebSocket room sync             │  │   • TailwindCSS 4   │\n│  • HLS/DASH proxy                  │  │   • hls.js player   │\n│  • Cookie management               │  │   • Custom hooks    │\n└────────────────────────────────────┘  └─────────────────────┘\n```\n\n## Cookie Authentication\n\nTo watch age-restricted or region-locked content:\n\n### Option 1: Browser Extension (Recommended)\n1. Install the Watch Together extension from `/extension` folder\n2. Log in to YouTube/Twitch in your browser\n3. The extension automatically syncs cookies to the server\n\n### Option 2: Manual Upload\n1. Export cookies using [Get cookies.txt LOCALLY](https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc)\n2. Open Settings (gear icon) in any room\n3. Paste Netscape-formatted cookies and save\n\n\u003e **Note:** Cookies are stored server-side and linked to your identity. Guest users cannot save cookies.\n\n## Project Structure\n\n```\nwatch-together/\n├── backend/                 # FastAPI Python backend\n│   ├── main.py             # API endpoints, proxy, app init\n│   ├── connection_manager.py # WebSocket room management\n│   └── services/           # Resolver, cache, database\n├── frontend/               # Next.js React frontend\n│   ├── app/               # App router pages\n│   ├── components/        # React components\n│   │   ├── custom-player.tsx  # Video player\n│   │   └── player/hooks/      # Player hooks\n│   └── lib/               # Utilities, API client\n├── extension/             # Browser extension for cookie sync\n├── nginx/                 # Nginx configuration\n├── docker-compose.yml     # Container orchestration\n├── CONTRIBUTING.md        # Contribution guidelines\n├── DEPLOYMENT.md          # Deployment guide\n├── SECURITY.md            # Security policy\n└── SUPPORT.md             # Support policy\n```\n\n## Documentation\n\n- [DEPLOYMENT.md](DEPLOYMENT.md) - Detailed deployment guide\n- [CONTRIBUTING.md](CONTRIBUTING.md) - Development guidelines\n- [SPECIFICATION.md](SPECIFICATION.md) - Technical specification\n- [CHANGELOG.md](CHANGELOG.md) - Version history\n- [ISSUES.md](ISSUES.md) - Known issues and roadmap\n- [SECURITY.md](SECURITY.md) - Responsible vulnerability disclosure\n- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) - Community standards\n- [SUPPORT.md](SUPPORT.md) - Support channels and expectations\n\n## Tech Stack\n\n| Component | Technology |\n|-----------|------------|\n| Frontend | Next.js 16, React 19, TypeScript, TailwindCSS 4 |\n| Backend | FastAPI, Python 3.11+, yt-dlp, aiosqlite |\n| Player | hls.js, custom DASH sync hooks |\n| Real-time | WebSockets |\n| Proxy | Nginx |\n| Container | Docker Compose |\n| Auth | Cloudflare Zero Trust (optional) |\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Contributing\n\nContributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frennerdo30%2Fwatch-together","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frennerdo30%2Fwatch-together","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frennerdo30%2Fwatch-together/lists"}