Skip to content

Mishin870/FriendSync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FriendSync

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

Motivation

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

Preview

files downloading downloaded

lobby chat

Architecture

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

Features

Implemented

  • 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)

Planned

  • Synchronized video playback across all lobby members
  • Chat reactions
  • File upload from the client application

Security Model

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

Getting Started

Prerequisites

  • .NET 8 SDK
  • MySQL server

Server setup

  1. Configure appsettings.json:

    {
      "FriendSync": {
        "ConnectionString": "Server=...;Database=friendsync;User=...;Password=...",
        "FilesPath": "/path/to/video/files",
        "FullIdentity": false
      }
    }
  2. Run the server — EF Core migrations are applied automatically on startup:

    dotnet run --project Server
  3. Create user accounts directly in the database (no registration endpoint)

Client setup

  1. Build and run the WPF client:

    dotnet run --project Client
  2. Log in with credentials on the login screen. The client connects to the configured server address

Project Structure

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)

About

[WIP] A client-server application for watching videos together with a friend, with preloading to solve the problem of slow internet

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages