Created by: Ammara Dawood
A real-time collaborative workspace that bridges ideation and execution. Teams brainstorm on a shared infinite canvas; the platform automatically extracts intent from canvas content and populates a live task board.
- Infinite Canvas: Collaborative whiteboard with sticky notes, text blocks, shapes, and freehand drawing
- Real-Time Collaboration: Multiple users can edit simultaneously with live cursor presence
- AI Intent Classification: Automatic extraction of action items, decisions, questions, and references
- Task Board: Auto-populated from canvas action items with no data duplication
- Node-Level RBAC: Per-node access control (Lead, Contributor, Viewer roles)
- Append-Only Event Log: Immutable audit trail of all canvas mutations
- CRDT Conflict Resolution: Proper merge logic for simultaneous edits (no "last write wins")
- WebSocket Management: Efficient delta broadcasting with graceful reconnection and event replay
- AI Summary Export: One-click export of structured brief (decisions, tasks, questions)
- Presence Indicators: Real-time user presence with colored cursors
- Vite + React + TypeScript: Modern, fast development experience
- Konva + React-Konva: Canvas rendering engine
- Socket.io-client: Real-time WebSocket communication
- Zustand: Lightweight state management
- TailwindCSS: Utility-first styling
- Node.js + Express: RESTful API server
- Socket.io: WebSocket server for real-time sync
- Mongoose: MongoDB ODM
- Rule-Based NLP: Custom intent classification engine (no paid APIs)
- MongoDB Atlas: Cloud-hosted database (free tier)
- Render: Cloud platform for hosting (free tier)
ligma/
├── client/ # Frontend (Vite + React)
│ ├── src/
│ │ ├── components/
│ │ │ ├── Canvas/
│ │ │ │ └── InfiniteCanvas.tsx
│ │ │ ├── TaskBoard/
│ │ │ │ └── TaskBoard.tsx
│ │ │ ├── EventLog/
│ │ │ │ └── EventLogPanel.tsx
│ │ │ └── Header/
│ │ │ └── Header.tsx
│ │ ├── store/
│ │ │ ├── canvasStore.ts
│ │ │ ├── taskStore.ts
│ │ │ ├── userStore.ts
│ │ │ └── eventStore.ts
│ │ ├── hooks/
│ │ │ └── useWebSocket.ts
│ │ ├── types/
│ │ │ └── index.ts
│ │ ├── App.tsx
│ │ └── main.tsx
│ └── public/
│ └── taskorbit_logo_1777394787859.png
│
├── server/ # Backend (Node.js + Express)
│ ├── src/
│ │ ├── websocket/
│ │ │ └── connectionManager.ts
│ │ ├── models/
│ │ │ ├── CanvasNode.ts
│ │ │ └── EventLog.ts
│ │ ├── middleware/
│ │ │ └── rbac.ts
│ │ ├── ai/
│ │ │ └── intentClassifier.ts
│ │ ├── types/
│ │ │ └── index.ts
│ │ └── index.ts
│ └── .env
│
├── shared/ # Shared types
│ └── types/
│ └── index.ts
│
├── render.yaml # Render deployment config
└── package.json # Root workspace config
- Node.js 18+ installed
- MongoDB Atlas account (free tier)
- npm or yarn package manager
-
Clone the repository
cd /Users/ammarah/Desktop/app -
Install dependencies
npm run install:all
-
Configure environment variables
Edit
server/.env:PORT=4000 MONGODB_URI=your_mongodb_atlas_connection_string NODE_ENV=development CLIENT_URL=http://localhost:3000
Edit
client/.env:VITE_SERVER_URL=http://localhost:4000
-
Start development servers
npm run dev
This starts:
- Backend server on
http://localhost:4000 - Frontend dev server on
http://localhost:3000
- Backend server on
-
Open in browser
open http://localhost:3000
- Enter your name
- Select your role (Lead, Contributor, or Viewer)
- Click "Join Workspace"
- Sticky Note: Click canvas to create a sticky note
- Text Block: Click canvas to create a text block
- Pan: Hold space + drag
- Zoom: Mouse wheel
- Open multiple browser tabs to simulate multiple users
- Each user gets a unique colored cursor
- All changes sync in real-time via WebSocket
- Action items automatically appear in the Task Board
- Click a task to navigate to its canvas node
- Tasks show author, priority, and deadline (if extracted)
- Leads: Can edit, delete, and lock any node
- Contributors: Can edit unlocked nodes
- Viewers: Read-only access
- Toggle Event Log panel to view all canvas mutations
- Events are immutable and append-only
- Each event shows type, user, timestamp, and version
- Click "Export Summary" in the header
- Generates structured brief with:
- Decisions made
- Action items
- Open questions
- References
- Using Yjs for automatic conflict resolution
- Proper merge logic for simultaneous edits
- No "last write wins" - converges to consistent state
- Per-node ACL enforcement
- Server-side validation on all mutations
- Client-side UI affordances for permissions
- Rule-based NLP engine (no paid APIs)
- Classifies: action items, decisions, questions, references
- Extracts metadata: assignee, deadline, priority
- Immutable event storage in MongoDB
- Schema-level prevention of updates/deletes
- Versioned events for efficient replay
- Delta broadcasting (not full state)
- Event versioning for reconnection recovery
- Graceful reconnection with missed event replay
- Render deployment configuration included
- Free tier compatible
- Health check endpoint included
-
Conflict Resolution
- Open 2 tabs
- Edit same node simultaneously
- Verify both edits merge correctly
-
RBAC Enforcement
- Create a node as Lead
- Lock the node
- Try to edit as Contributor (should fail)
- Send raw WebSocket message to edit locked node (server should reject)
-
Reconnection
- Kill server
- Make changes offline
- Restart server
- Verify client reconnects and replays missed events
-
Intent Classification
- Write "Need to fix login bug by Friday" → Should classify as action item
- Write "We decided to use React" → Should classify as decision
- Write "How should we handle auth?" → Should classify as question
-
Event Log Immutability
- Check MongoDB - events collection should only have inserts
- No updates or deletes allowed
- Push code to GitHub
- Go to Render Dashboard
- Create new Web Service
- Connect your repository
- Configure:
- Build Command:
cd server && npm install && npm run build - Start Command:
cd server && npm start - Environment Variables:
MONGODB_URI: Your MongoDB Atlas connection stringNODE_ENV: productionPORT: 10000
- Build Command:
- Create new Static Site on Render
- Configure:
- Build Command:
cd client && npm install && npm run build - Publish Directory:
client/dist - Environment Variables:
VITE_SERVER_URL: Your backend URL
- Build Command:
GET /api/health- Health checkGET /api/canvas/:canvasId/export- Export canvas summary
Client → Server:
join_canvas- Join a canvas roomnode_create- Create a new nodenode_update- Update an existing nodenode_lock- Lock/unlock a nodecursor_move- Broadcast cursor positionrequest_replay- Request missed events after reconnection
Server → Client:
canvas_state- Initial canvas statenode_created- New node creatednode_updated- Node updatednode_locked- Node lock status changedcursor_update- Another user's cursor movedpresence_update- User presence changedreplay_events- Missed events for reconnectionerror- Error message
{
_id: ObjectId,
id: string (unique),
canvasId: string,
type: 'sticky' | 'text' | 'shape' | 'drawing',
position: { x: number, y: number },
content: string,
author: string,
acl: {
locked: boolean,
allowedRoles: string[]
},
intent: 'action_item' | 'decision' | 'question' | 'reference',
intentData: {
assignee: string,
deadline: string,
priority: 'high' | 'medium' | 'low'
},
createdAt: Date,
updatedAt: Date
}{
_id: ObjectId,
id: string (unique),
canvasId: string,
version: number,
eventType: 'node_create' | 'node_update' | 'node_delete' | 'node_lock',
nodeId: string,
delta: object,
userId: string,
timestamp: Date
}- All mutations validated server-side against node ACL
- WebSocket authentication via session
- Input sanitization on canvas content
- MongoDB injection prevention via Mongoose
- Append-only event log enforced at schema level
- Delta broadcasting (only send changes, not full state)
- Event versioning for efficient reconnection
- Debounced intent classification (1s delay)
- Cursor position throttling (50ms interval)
- Indexed MongoDB queries for fast event replay
- Check MongoDB connection string in
server/.env - Ensure port 4000 is not in use
- Verify
VITE_SERVER_URLinclient/.env - Check browser console for WebSocket errors
- Whitelist your IP in MongoDB Atlas
- Verify connection string format
MIT License - Created by Ammara Dawood
Creator: Ammara Dawood
Project: LIGMA - Virtual Collaboration Workspace
Hackathon: Web Development Hackathon
For issues or questions, please refer to the documentation or contact the development team.