Synchronized viewing, theater, live streaming, video, long-distance relationship
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Go to file
zijiren233 564f8bba08
fix(ci): stabilize Rust and Docker builds
1 month ago
.cargo
…
.config
…
.github fix(ci): stabilize Rust and Docker builds 1 month ago
.sqlx feat: add playback history management (#431) 1 month ago
docs release: prepare v1.0.3 (#430) 1 month ago
helm/synctv release: prepare v1.0.3 (#430) 1 month ago
migrations feat: add personal user blocking (#429) 1 month ago
scripts release: prepare v1.0.3 (#430) 1 month ago
synctv fix(web): harden playback capabilities and SPA routing 1 month ago
synctv-adapter feat(web): add client-aware playback routing 1 month ago
synctv-api fix(web): harden playback capabilities and SPA routing 1 month ago
synctv-api-common refactor(web): isolate reproducible UI builds 1 month ago
synctv-api-grpc feat(web): add client-aware playback routing 1 month ago
synctv-api-http refactor(web): isolate reproducible UI builds 1 month ago
synctv-cluster refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-common refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-core refactor(web): isolate reproducible UI builds 1 month ago
synctv-livestream refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-management feat: add personal user blocking (#429) 1 month ago
synctv-media-providers refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-proto fix(web): harden playback capabilities and SPA routing 1 month ago
synctv-proto-build feat(web): add client-aware playback routing 1 month ago
synctv-proto-main refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-proto-playback-provider feat(playlist): add browse access controls (#423) 1 month ago
synctv-proto-providers refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-proxy refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-realtime refactor: remove low-value thin wrappers (#426) 1 month ago
synctv-web-ui fix(web): harden reproducible asset inputs 1 month ago
synctv-xiu refactor: remove low-value thin wrappers (#426) 1 month ago
.dockerignore refactor(web): isolate reproducible UI builds 1 month ago
.env.postgres.example
…
.env.redis.example
…
.env.synctv.example fix(webrtc): use public STUN by default (#427) 1 month ago
.gitattributes
…
.gitignore refactor(web): isolate reproducible UI builds 1 month ago
CONTRIBUTING.md
…
Cargo.lock refactor(web): isolate reproducible UI builds 1 month ago
Cargo.toml refactor(web): isolate reproducible UI builds 1 month ago
Dockerfile fix(ci): stabilize Rust and Docker builds 1 month ago
LICENSE
…
Makefile fix(ci): stabilize Rust and Docker builds 1 month ago
README.md refactor(web): isolate reproducible UI builds 1 month ago
README.zh-CN.md chore(dev): remove background server targets (#407) 2 months ago
SECURITY.md
…
deny.toml
…
docker-compose.dev.yml fix(bilibili): restore subtitles and dynamic live danmaku (#415) 1 month ago
docker-compose.yml fix(webrtc): use public STUN by default (#427) 1 month ago
rust-toolchain.toml fix(ci): stabilize Rust and Docker builds 1 month ago
synctv.example.yaml fix(webrtc): use public STUN by default (#427) 1 month ago

README.md

SyncTV

SyncTV

简体中文 · Website

Rust Tokio Axum gRPC PostgreSQL Redis Docker Helm Kubernetes OpenAPI Astro Starlight License

SyncTV is a Rust implementation of a real-time synchronized video watching platform with media provider integration, livestreaming, HTTP/gRPC APIs, and Kubernetes-ready horizontal scaling.

SyncTV synchronized room playback

Highlights

  • Synchronized room playback with real-time state updates.
  • Media providers for Bilibili, Twitch, YouTube, Douyin, TikTok, Huya, Douyu, AcFun, CCTV, Alist, Cloudreve, Emby/Jellyfin, FNOS, QNAP, Synology, Nextcloud, Seafile, TrueNAS, direct URLs, and livestream sources.
  • RTMP push/pull, HLS, and HTTP-FLV livestream support.
  • RTSP external pull with TCP/UDP transport and live HLS/HTTP-FLV remuxing.
  • HTTP REST, public gRPC, WebSocket, management gRPC, metrics, RTMP, and STUN runtime surfaces.
  • PostgreSQL-backed durable storage with optional Redis shared state, cache, rate limiting, and cluster coordination.
  • Docker Compose and Helm deployment templates.
  • Built-in management CLI and optional OpenAPI/Swagger UI.
  • Astro Starlight documentation site with English and Simplified Chinese content.

Discussion and Contributors

Join the SyncTV Telegram discussion to talk with users and contributors about deployment, operations, media providers, client development, and the product roadmap.

SyncTV contributors

Quick Start

Development environment from a full repository checkout:

# Starts PostgreSQL and Redis, then runs SyncTV locally with development settings.
make dev-serve

# Starts optional media/auth/storage dependencies too.
make dev-stack

# Runs real CLI/curl provider smoke tests through the Makefile dev startup path.
make dev-smoke

Production Compose uses generated PostgreSQL, Redis, and application secrets:

# Requires Docker Compose and openssl.
make compose-init

# Edit SYNCTV_BOOTSTRAP_ROOT_PASSWORD in .env.synctv before starting.
make compose-up

Validate configuration:

cargo +nightly run -p synctv --bin synctv -- config validate

Optional migration preflight. The server also runs embedded SQLx migrations automatically during startup:

cargo +nightly run -p synctv --bin synctv -- db migrate

Start locally:

cargo +nightly run -p synctv --bin synctv -- serve

Embedded Web client

The optional web-ui feature embeds a Flutter Web distribution in the HTTP server. The browser client always uses the page origin, so one deployed Web UI belongs to one SyncTV server. Build the configured Web distribution and server:

make web-ui-build
make web-release-build

synctv-web-ui/README.md documents prebuilt, local-project, and immutable Git sources together with cache and offline controls. The server provides SPA fallback, content types, ETags, Brotli/gzip variants, cache policy, and CSP. OAuth uses the normal SPA entry point, while provider verification uses its dedicated static page. API and media routes remain outside the application-shell cache.

Keep the app and server protobuf snapshots aligned. Browser playback sends a versioned PlaybackClientProfile; Providers use it with the configured proxy policy to select direct or proxy routes before returning playback output.

Documentation

Read the complete documentation at docs.syncs.tv.

Download the native client from the client downloads guide or SyncTV App releases. Store builds are distributed through the supported app stores.

License

MIT. See LICENSE.