Project

Xcal

Realtime Excalidraw

A real-time collaborative whiteboard built with the HTML Canvas API, RoughJS, and WebSockets.

Xcal is a browser-based whiteboard that enables multiple users to draw and collaborate on the same canvas in real time. Inspired by Excalidraw, it features hand-drawn rendering, low-latency synchronization, and a custom canvas engine built from scratch.


Features

  • ✏️ Freehand drawing with smooth stroke interpolation
  • ⬜ Rectangle, Circle, Line, Arrow, and Text tools
  • 🎨 Hand-drawn rendering powered by RoughJS
  • 🔄 Real-time collaboration using WebSockets
  • 👥 Room-based collaborative editing
  • ⚡ Optimized rendering pipeline for smooth interactions
  • 🖱️ Shape selection, movement, and transformations

Tech Stack

Layer Technology
Frontend React
Rendering HTML Canvas API
Drawing Engine RoughJS
Backend Node.js + Express
Realtime WebSockets
Language TypeScript

Architecture

            User A             User B
               │                  │  
               └──────────┬───────┴

                    WebSocket Server

                 Room-based Event Broadcast

        ┌─────────────────┴─────────────────┐
        ▼                                   ▼
 Canvas State Sync                  Drawing Events
        │                                   │
        └──────────────┬────────────────────┘

              Canvas Rendering Engine

Drawing Engine

The canvas engine is implemented directly on top of the HTML Canvas API.

Supported primitives:

  • Rectangle
  • Circle
  • Line
  • Arrow
  • Freehand Pencil

Each shape is represented as structured data, allowing the canvas to be fully reconstructed on every redraw while supporting selection, movement, and editing.


Rendering Pipeline

To maintain smooth interactions, the rendering system:

  • Redraws only when necessary
  • Minimizes expensive canvas operations
  • Batches user interactions
  • Efficiently replays canvas state

This allows the application to maintain approximately 45 FPS during collaborative drawing sessions.