LAN-first enterprise communication & collaboration platform for software houses. Combines direct messaging, project workspaces, company announcements, file sharing, a GitHub-style repository simulation and an activity audit trail into one internal system — styled after WhatsApp Desktop. Built to run entirely on a Local Area Network with no internet dependency.
| Layer | Technology |
|---|---|
| Runtime | .NET 10, Blazor Server (Interactive Server) |
| Realtime | SignalR (ChatHub, PresenceHub) + in-process notifier + circuit presence |
| Data | Entity Framework Core 10 + SQLite (zero-setup, file-based) |
| Identity | ASP.NET Core Identity, role-based authorization |
| UI | Bootstrap 5, Tailwind CSS, Bootstrap Icons — all vendored locally for offline use |
No Docker / no server required. The database is a single SQLite file (
src/NexaLAN.Web/nexalan.db) created automatically on first run. PostgreSQL/Supabase is still supported — see Switching to PostgreSQL below.
src/
├─ NexaLAN.Domain # entities + enums + ApplicationUser (no infra deps)
├─ NexaLAN.Infrastructure # EF Core DbContext, migrations, repository, services, seeder
└─ NexaLAN.Web # Blazor Server UI, SignalR hubs, Identity, realtime
- Repository pattern (
IRepository<T>) + a focused service layer (chat, directory, projects, announcements, repository-sim, files, activity, admin). - Services use
IDbContextFactory<ApplicationDbContext>— a short-lived context per operation, the recommended pattern for Blazor Server (many components share a circuit). - Real-time UI updates fan out through an in-process
RealtimeNotifier; every laptop receives them over its own Blazor SignalR circuit. First-classChatHub/PresenceHubendpoints are also mapped at/hubs/chatand/hubs/presence.
# from the repo root
dotnet run --project src/NexaLAN.WebThen open the URL printed in the console (e.g. http://localhost:5062).
On first launch the app creates the SQLite DB, applies migrations and seeds
roles, 12 demo employees, 3 projects, repositories, commits and announcements.
| Name | Role | |
|---|---|---|
ceo@nexalan.local |
Ayesha Khan | CEO (+ Admin) |
coo@nexalan.local |
Bilal Ahmed | COO |
pm@nexalan.local |
Sana Malik | Project Manager |
hr@nexalan.local |
Hina Raza | HR |
haseeb@nexalan.local |
Haseeb Jalil | Senior Software Engineer |
usman@nexalan.local |
Usman Tariq | Senior Software Engineer |
zara@nexalan.local |
Zara Sheikh | Junior Software Engineer |
design@nexalan.local |
Mariam Nawaz | Designer |
qa@nexalan.local |
Fahad Iqbal | QA Engineer |
devops@nexalan.local |
Kamran Shah | DevOps Engineer |
intern@nexalan.local |
Noor Fatima | Intern |
- Find the host machine's LAN IP (e.g.
192.168.1.20). - Start the app bound to all interfaces:
(the bundled
dotnet run --project src/NexaLAN.Web --urls http://0.0.0.0:5080
lanlaunch profile does this and runs in Production mode.) - On every other laptop on the same WiFi/router/hotspot, browse to
http://192.168.1.20:5080and sign in as a different employee. - Chat, presence (online / last seen), typing indicators, announcements, commits and activity all update live across machines — no internet needed.
The app runs over plain HTTP (no HTTPS redirect) so any laptop can reach the host by IP without certificate friction. Allow port
5080through the host firewall.
- Direct messaging — realtime, read receipts (✓✓), delivery status, typing indicators, emoji, file attachments.
- Employee directory — search & filter by role/department, online status, last seen.
- Project workspaces — members + project roles, group chat, shared files, repositories.
- Announcement center — priorities, pinning, read-tracking; publishing restricted to CEO/COO/HR/PM/Admin.
- Repositories — AirDrop-style file sharing over the LAN — each "push"
uploads a real file to the host over WiFi and records it on a push/pull
timeline (commit hash, version, author). Any project member can pull
(download the actual bytes) — entirely offline, no internet or Git required.
Files stream with their original name via an authenticated
/files/{id}endpoint. - Activity log — login, messages, uploads, project/commit/announcement events.
- Admin dashboard — stats, user & role management, projects, live activity (CEO/COO/Admin only).
The data layer is provider-agnostic. To use PostgreSQL instead of SQLite:
dotnet add src/NexaLAN.Infrastructure package Npgsql.EntityFrameworkCore.PostgreSQL- In
NexaLAN.Infrastructure/DependencyInjection.csswapoptions.UseSqlite(...)→options.UseNpgsql(...). - Set
ConnectionStrings:DefaultConnectioninappsettings.jsonto your Postgres/Supabase string. - Regenerate migrations:
dotnet ef migrations add InitialPg -p src/NexaLAN.Infrastructure -s src/NexaLAN.Web -o Data/Migrations
The full UI was click-tested end-to-end with a real headless browser driving three concurrent users (Playwright + system Chrome). All 25 checks pass with zero console errors, including: login/logout, realtime DM both directions, typing indicators, online presence, directory search, project + member + repo creation, real file push and pull over the LAN (bytes verified), announcements, admin role changes, and navigation across every page.
Stop the app and delete the SQLite database; it will be recreated and reseeded on next run:
rm src/NexaLAN.Web/nexalan.db*