A real-time collaboration tool for shared notes with user accounts, private notes, and an invitation system.
From user accounts and real-time collaboration to full access control.
Registration and login with persistent JSON storage. Automatic re-login via localStorage.
Notes are private by default, visible only to the creator. Full control over your own data.
Invite other users by username. Real-time notification when an invitation is received.
Changes to title and content are instantly transmitted to all collaborators via SignalR WebSockets.
Only the owner can delete notes, invite or remove collaborators. All operations enforce access checks.
Clear separation between “My Notes” and “Shared with Me” for the best overview.
Strict layer separation following the Dependency Rule — outer layers know inner layers, never the reverse.
The architecture follows Clean Architecture principles. Each layer has a clearly defined responsibility and communicates only with the layer directly below it through interfaces.
Cutting-edge .NET technologies for a robust and scalable architecture.
Web framework with Controllers, Middleware, and DI
Real-time communication via WebSockets with Groups and User-Targeting
CQRS Command/Query dispatching with Pipeline Behaviors
Declarative input validation as a MediatR Pipeline Behavior
Note storage (easily swappable for SQL/SQLite)
Lightweight frontend with zero framework overhead
Strict separation of read and write operations for maximum maintainability.
RegisterCommand → Register a new userLoginCommand → Authenticate userCreateNoteCommand → Create note (+ OwnerId)UpdateNoteContentCommand → Update contentUpdateNoteTitleCommand → Update titleDeleteNoteCommand → Delete note (owner only)AddCollaboratorCommand → Invite collaboratorRemoveCollaboratorCommand → Remove collaboratorGetMyNotesQuery → Fetch own notesGetSharedNotesQuery → Fetch shared notesGetNoteByIdQuery → Single note (+ access check)SearchUsersQuery → Search usersEvery command automatically passes through ValidationBehavior<T>, which executes FluentValidation rules before the handler is reached.
Complete RESTful API with authentication via the X-User-Id header.
| Method | Route | Description |
|---|---|---|
| Authentication | ||
| POST | /api/auth/register | Register a new user |
| POST | /api/auth/login | Login |
| GET | /api/auth/search?q= | Search users |
| Notes | ||
| GET | /api/notes/my | Fetch own notes |
| GET | /api/notes/shared | Fetch shared notes |
| GET | /api/notes/{id} | Fetch single note |
| POST | /api/notes | Create a new note |
| PUT | /api/notes/{id}/content | Update content |
| PUT | /api/notes/{id}/title | Update title |
| DELETE | /api/notes/{id} | Delete note (owner only) |
| Collaboration | ||
| POST | /api/notes/{id}/collaborators | Invite collaborator |
| DELETE | /api/notes/{id}/collaborators/{userId} | Remove collaborator |
WebSocket-based real-time communication with Groups and User-Targeting.
A new note was created
Note was updated
Note was deleted
User joined a note
User left a note
Real-time text changes
Real-time title changes
Invitation to a note
Access to note revoked