🚀 NexusFlow
About • Demo • Features • Architecture • Tech Stack • Getting Started • Diagrams • Project Structure • Issues & Feedback
NexusFlow is a production-grade project management tool inspired by Trello and Jira, built from the ground up as a full-stack portfolio project. It features real-time collaboration via SignalR WebSockets, a rich Kanban board with drag-and-drop, multiple view modes, and a deep AI layer powered by the OpenRouter API.
Try it out: https://nexusflow123.vercel.app
⚠️ The live demo runs on free-tier infrastructure (Vercel + Render + Supabase). The backend may be slow to respond on the first request (cold start ~30s) and could occasionally be unavailable. Performance will improve after the first request wakes the server up.
NexusFlow includes a deep AI layer powered by the OpenRouter API — a unified gateway to models like stepfun/step-3.5-flash with automatic fallback to google/gemini-2.0-flash. Users configure their own API key in their profile, validated live before it is ever saved.
NexusFlow is structured as three loosely coupled layers communicating over HTTP REST and WebSockets.
The React 19 frontend (Vite + TypeScript) communicates with the ASP.NET Core Web API (.NET 9) over two channels: - HTTP/REST with JWT Bearer tokens for standard CRUD operations - SignalR WebSockets for real-time push events (task moves, presence updates, notifications)
The API is organized into a thin controller → scoped service → EF Core pipeline. Business logic lives entirely in injectable service classes (IBoardService, ITaskService, etc.), keeping controllers as simple request routers. A singleton PresenceTracker service maintains an in-memory map of which users are online on which boards, without any database polling.
The PostgreSQL database (provisioned via Supabase — local Docker for development, cloud for production) is fully managed by EF Core code-first migrations, making the schema reproducible on any machine.
AI requests are made directly from the frontend using the user's own OpenRouter API key, so AI credentials never transit the backend server.
flowchart TB
subgraph Browser["Browser"]
FE["React 19 Frontend\n(Vite + TypeScript)"]
end
subgraph API["ASP.NET Core Web API (.NET 9)"]
CTRL["Controllers\n(Auth, Boards, Tasks, Workspaces...)"]
SVC["Service Layer\n(IBoardService, ITaskService...)"]
HUB["BoardHub\n(SignalR)"]
PT["PresenceTracker\n(Singleton DI)"]
EF["EF Core DbContext"]
end
subgraph DB["PostgreSQL (Supabase)"]
TABLES["Tables: Users, Boards, Columns,\nTaskCards, Labels, Automations..."]
end
AI["OpenRouter API\n(AI Gateway)"]
FE -- "HTTP/REST (JWT Bearer)" --> CTRL
FE <-- "WebSocket (SignalR)" --> HUB
HUB --> PT
CTRL --> SVC
SVC --> EF
EF --> TABLES
FE -- "AI requests\n(user's own key)" --> AI
| Decision | Rationale |
|---|---|
| Optimistic UI | All mutations update the UI instantly and roll back automatically if the server returns an error, providing seamless UX with no perceived latency. |
| SignalR presence tracking | A singleton PresenceTracker maps ConnectionIds to UserIds and BoardIds, enabling live online indicators without polling. |
| Service layer pattern | Business logic lives in scoped services injected via ASP.NET Core DI, keeping controllers thin and testable. |
| Code-First migrations | The entire database schema is defined in C# and managed via EF Core migrations, making it fully reproducible from any machine. |
| Drag-and-drop conflict guard | When a user is mid-drag, incoming SignalR TaskMoved events are silently queued via an isDraggingRef guard and applied after the drag ends, preventing ghost-card artifacts. |
| Per-user AI key validation | The OpenRouter API key is validated by making a real test call before being persisted, ensuring no broken keys are ever stored. |
| Layer | Technology |
|---|---|
| Backend | C# / .NET 9, ASP.NET Core Web API |
| ORM | Entity Framework Core 9 (Code-First) |
| Database | PostgreSQL (via Supabase — local Docker or cloud) |
| Auth | JWT Bearer tokens + BCrypt password hashing |
| Real-Time | ASP.NET Core SignalR (WebSockets) |
| Frontend | React 19, TypeScript 5, Vite |
| UI Library | Mantine 7 (dark/light theme) |
| Drag & Drop | @hello-pangea/dnd |
| Rich Text | TipTap editor |
| Icons | Tabler Icons |
| HTTP Client | Axios |
| AI | OpenRouter API (user-supplied key) |
Full setup guide: See SETUP.md for detailed instructions.
| Tool | Version |
|---|---|
| .NET SDK | 9.0+ |
| Node.js | 18+ |
| Docker Desktop | Latest |
This spins up a full local Supabase (PostgreSQL) environment automatically.
First-time setup (run once after cloning):
.\init-dev.ps1
Daily development (after first-time setup):
.\start-dev.ps1
The script automatically starts Supabase, applies migrations, and launches both the backend (localhost:5145) and frontend (localhost:5173).
If you prefer not to use Docker, point the app to a cloud Supabase project.
1. Create a Supabase project at supabase.com and copy your connection string.
2. Configure the backend (backend/appsettings.json):
{
"ConnectionStrings": {
"DefaultConnection": "YOUR_SUPABASE_CONNECTION_STRING"
},
"JwtSettings": {
"SecretKey": "your-strong-random-secret-key-min-32-chars",
"Issuer": "NexusFlow",
"Audience": "NexusFlowUsers"
}
}
3. Apply migrations:
cd backend
dotnet ef database update
4. Run the backend:
cd backend
dotnet run
# → API running at http://localhost:5145
5. Run the frontend:
cd frontend
npm install
npm run dev
# → App running at http://localhost:5173
These diagrams use Mermaid.js which is natively rendered by GitHub — no plugins needed.
```mermaid erDiagram Users { int id PK string username string email string passwordHash string fullName string avatarUrl string openRouterApiKey string themePreference bool displayOfflineAlways datetime createdAt } Workspaces { int id PK string name int ownerId FK } WorkspaceMembers { int workspaceId FK int userId
$ claude mcp add NexusFlow \
-- python -m otcore.mcp_server <graph>