A private self-hosted platform for watching videos together with friends, designed specifically for users on slow internet connections. Instead of streaming, users download video files from a shared server in advance and then watch them in sync via real-time SignalR lobbies
Warning: Project under development. File synchronization has been implemented, there is a lobby with chat, but a synchronized video player has not been implemented
At the moment, this is a concept project
Most "watch together" services rely on high internet speed to stream video in real time. FriendSync takes a different approach: files are hosted on a self-hosted server, clients download them at their own pace (even at 10 KB/s), and later join a lobby to watch together without buffering or lags
![]() |
![]() |
![]() |
The solution is split into three projects:
FriendSync/
├── Core/ # Shared library — entities, SignalR hub interfaces
├── Server/ # ASP.NET Core backend (REST API + SignalR hub)
└── Client/ # WPF desktop application
Core defines the domain entities (User, File, Lobby) and the typed SignalR hub contracts (ILobbiesHub, ILobbiesClient), shared between server and client for compile-time safety.
Server runs an ASP.NET Core web application that:
- Exposes a REST API for file management and lobby control
- Hosts a SignalR hub (
/lobbies/hub) for real-time events - Uses ASP.NET Core Identity with Bearer token authentication
- Stores data in MySQL via Entity Framework Core and Dapper
- Auto-applies EF Core migrations on startup
Client is a WPF desktop application that:
- Connects to the server using credentials (Bearer token auth)
- Browses and downloads files from the server
- Creates and joins real-time lobbies
- Renders a Material Design UI with customizable themes
| Layer | Technologies |
|---|---|
| Backend | .NET 8, ASP.NET Core, SignalR, Entity Framework Core, Dapper |
| Database | MySQL |
| Auth | ASP.NET Core Identity (Bearer tokens, no self-registration) |
| API Docs | Swagger / OpenAPI |
| Frontend | WPF (.NET 8), MaterialDesignThemes |
| Real-time | SignalR + TypedSignalR.Client (type-safe contracts) |
| Serialization | Newtonsoft.Json |
- File browser — navigate a server-side directory tree, browse folders
- File download — download files with HTTP range support (resumable downloads, low-bandwidth friendly)
- Lobby system — create and join lobbies; real-time user join/leave events via SignalR
- Live chat — send and receive messages in a lobby in real time
- Theme customization — switch primary/secondary colors and toggle dark mode (persisted per client)
- Secure auth — login-only flow via ASP.NET Core Identity; accounts are provisioned directly in the database (no public registration endpoint)
- Synchronized video playback across all lobby members
- Chat reactions
- File upload from the client application
User registration is intentionally disabled. Accounts are created manually in the database by the server administrator. This keeps the platform private and eliminates unauthorized access by design, suitable for a small trusted group of users
- .NET 8 SDK
- MySQL server
-
Configure
appsettings.json:{ "FriendSync": { "ConnectionString": "Server=...;Database=friendsync;User=...;Password=...", "FilesPath": "/path/to/video/files", "FullIdentity": false } } -
Run the server — EF Core migrations are applied automatically on startup:
dotnet run --project Server
-
Create user accounts directly in the database (no registration endpoint)
-
Build and run the WPF client:
dotnet run --project Client
-
Log in with credentials on the login screen. The client connects to the configured server address
Server/
├── Api/ # REST controllers (Files, Lobbies, Users)
├── Core/ # Application entry point (Program.cs, Config)
├── Data/ # EF Core DbContext, ApplicationUser
├── Hubs/ # SignalR LobbiesHub
├── Lobbies/ # In-memory lobby state (LobbiesManager, ServerLobby)
└── Migrations/ # EF Core database migrations
Client/
├── Controllers/ # Client-side API wrappers
├── View/
│ ├── Windows/ # LoginWindow, MainWindow, LobbyWindow
│ ├── Controls/ # Chat, ChatMessage, Breadcrumbs
│ └── Templates/# File and Lobby list item templates
└── Utils/ # Command utilities, helpers
Core/
├── Entities/ # User, File, Lobby
└── Hubs/ # ILobbiesHub, ILobbiesClient (typed contracts)




