b460f17029ddbcf490c3b0c7573f842f36410d2f
Massenger
Massenger is a working Telegram-like messenger MVP built in this folder with one shared client codebase for Windows and Android.
Stack
src/Massenger.Server: ASP.NET Core 10 Web API + SignalR + SQLite.src/Massenger.Shared: shared DTO/contracts used by server and client.src/Massenger.Client: .NET MAUI client targetingnet10.0-windows10.0.19041.0andnet10.0-android.
Implemented
- user registration and login
- JWT access tokens with rotating refresh tokens
- secure client-side session persistence
- seeded demo accounts and sample chats
- user search
- direct chats
- group chats
- channels with owner-only publishing
- message history persisted in SQLite
- file attachments with metadata persisted in SQLite
- voice notes as audio-classified attachments
- message edit/delete with realtime updates
- authenticated attachment download
- real-time message delivery with SignalR
- Android push registration API and FCM-based push delivery pipeline
- configurable server URL in the client
- publishable Windows
exe - publishable Android
apk
Not Implemented
This is not full Telegram parity. The following are not implemented in this MVP:
- calls and video
- microphone recording UI for voice notes
- inline audio playback controls
- stickers and inline media previews
- end-to-end encryption
- moderation, advanced channel admin roles, multi-device sync edge cases
- Windows cloud push notifications
Demo Accounts
alice / demo123bob / demo123carol / demo123
These are created automatically on first server start in src/Massenger.Server/Data/massenger.db.
Run
- Start the backend:
./scripts/run-server.ps1
- Run the Windows client from Visual Studio or CLI:
dotnet build .\src\Massenger.Client\Massenger.Client.csproj -f net10.0-windows10.0.19041.0
.\src\Massenger.Client\bin\Debug\net10.0-windows10.0.19041.0\win-x64\Massenger.Client.exe
- Run the Android client from Visual Studio or install the generated APK:
dotnet build .\src\Massenger.Client\Massenger.Client.csproj -f net10.0-android
The default server URL is:
- Windows:
http://localhost:5099 - Android emulator:
http://10.0.2.2:5099
On a physical Android device, set the server URL manually in the app to the PC LAN IP, for example http://192.168.1.10:5099.
Publish
Windows EXE:
./scripts/publish-windows.ps1
Android APK:
./scripts/publish-android-apk.ps1
Smoke test against the running backend:
./scripts/smoke-test.ps1
Published Artifacts
- Windows EXE:
src/Massenger.Client/bin/Release/net10.0-windows10.0.19041.0/win-x64/publish/Massenger.Client.exe - Android APK:
src/Massenger.Client/bin/Release/net10.0-android/publish/com.seven.massenger.apk - Signed Android APK:
src/Massenger.Client/bin/Release/net10.0-android/publish/com.seven.massenger-Signed.apk
Solutions
- XML solution:
Massenger.slnx - classic Visual Studio solution:
MassengerClassic.sln
Auth Notes
- Access tokens are short-lived JWTs.
- Refresh tokens are rotated on refresh and stored as hashed server-side sessions.
- Logout revokes the active session immediately, and the revoked access token stops working because the server validates the session id (
sid) on authenticated requests. - The JWT signing key in
src/Massenger.Server/appsettings.jsonis a development default. Replace it with a strong secret via configuration before any real deployment.
Attachment Notes
- Attachments are stored on the server under
src/Massenger.Server/Data/Attachments. - Metadata stored for each attachment: original file name, content type, file size, upload time, and owning message.
- Audio files are classified as
voice notesby MIME type / file extension and use the same secure attachment pipeline. - Attachment content is downloaded through an authenticated API route, not via a public static files directory.
Channel And Message Lifecycle Notes
- Channels are broadcast rooms: the creator is the owner, selected users join as subscribers, and only owners can publish.
- Message edit/delete is synchronized through SignalR
MessageUpdatedevents. - Delete is implemented as a soft-delete on the message row with attachment cleanup on the server.
Push Setup Notes
- Android push in this repo is implemented through Firebase Cloud Messaging HTTP v1 on the server and
FirebaseMessagingServiceon the Android client. - Server-side device registrations are stored in SQLite in the
PushDevicestable and managed throughapi/push/devices. - To enable real Android delivery, set
Push:FirebaseProjectIdand eitherPush:ServiceAccountJsonPathorPush:ServiceAccountJsoninsrc/Massenger.Server/appsettings.jsonor environment-specific configuration. - Before building the Android APK, fill
src/Massenger.Client/Resources/Raw/firebase.android.jsonwith the Android Firebase values:applicationId,projectId,apiKey,senderId. - If the Firebase configuration is left empty, the app still builds and the server still accepts device registrations, but actual FCM delivery is skipped.
- The current Windows desktop target remains unpackaged (
WindowsPackageType=None), so this pass does not implement Windows cloud push.
Description
Languages
C#
95.2%
PowerShell
4.8%