ByteSync is an open-source file synchronization software with end-to-end encryption and smart delta transfers, supporting up to 5 remote locations per session.
This is a C#/.NET 8 solution with a client-server architecture:
ByteSync.Client/- Cross-platform desktop app (Avalonia UI, ReactiveUI/MVVM)ByteSync.Functions/- Azure Functions serverless backend (HTTP APIs, SignalR hub)ByteSync.Common/- Shared business logic and domain modelsByteSync.ServerCommon/- Server-side services and data repositories
- Frontend: Avalonia UI, ReactiveUI
- Backend: Azure Functions, SignalR, MediatR (CQRS)
- Storage: Azure Cosmos DB, Redis
- Sync: FastRsync for binary diffs
This repository uses a branch-based development workflow. Please follow the conventions below when working in this project, especially when creating branches, writing PR titles, and generating commits or documentation. Agents must not create branches until they have received clear instructions to do so from a human or an explicitly invoked skill.
Use the following prefixes:
feature/<name>for new featuresfix/<name>for bug fixesrefactor/<name>for refactoringsdocs/<name>for refactoringstest/<name>for tests
Avoid slashes other than the prefix.
Format:
[<type>] <Short summary>
Allowed types: feature, fix, refactor, docs, test
Examples:
[feature] Add user registration[bugfix] Fix memory leak in sync module
- PR descriptions must be written in English.
- Include a summary of the changes, main modifications, and implementation approach when relevant.
- Never propose changes directly on
master. - Always create a branch using the proper prefix.
- PR titles must follow the documented format.
- All comments must be written in English.
- Do not add comments or Javadoc/XML-style documentation in C# code.
- Comments are only allowed when strictly necessary to explain complex or non-obvious logic.
- Prefer clear and self-explanatory code over adding comments.
- Assertions: use FluentAssertions (
.Should()). Do not useNUnit.Framework.Legacy/ClassicAssert. - Usings: remove
using NUnit.Framework.Legacy;from tests. - Structure: follow Arrange–Act–Assert. Use clear, English names and messages.
- Target per new unit test class: ≥ 85% coverage.
- PR Quality (Sonar): each PR must maintain a minimum coverage of 80%.
- Always run build and test as two separate commands to avoid blocking issues.
- If you need to clean the solution, use
dotnet clean --verbosity quietbefore building.