WhiteBoardDoodle: Collaborative Whiteboard

WhiteBoardDoodle: Collaborative Whiteboard

A lightweight desktop whiteboard for real‑time collaboration on trusted local networks. Built with Python, PyQt6, and WebSockets, it syncs drawings across multiple clients with smooth zoom/pan, undo/redo, and PNG export. Just start the server, open clients, and draw together.

A desktop app for real-time collaborative drawing on local networks, built with Python.

This project was created to explore real-time networking and GUI development with PyQt6. It’s a simple whiteboard where multiple users can draw together over WebSockets.

About

The app allows users to draw shapes and freehand lines in real-time across multiple clients connected to a central server. It’s designed for quick collaboration on ideas, like brainstorming sessions.

Learning Experience

Working on this project taught me several key skills:

  • Real-time Networking: Implementing WebSocket communication for instant synchronization between clients.
  • GUI Development: Building a responsive interface with PyQt6, including canvas rendering, event handling, and undo/redo functionality.
  • Asynchronous Programming: Using asyncio for the server to handle multiple connections efficiently.
  • Project Structure: Organizing code into modular components (client/server, MVC pattern) for maintainability.
  • Tooling: Setting up modern Python development with uv, Ruff for linting, and pytest for testing.

It was a great way to combine desktop app development with networking concepts.

Features

  • Real-time drawing with freehand, lines, rectangles, and ellipses
  • Zoom and pan canvas
  • Color and width selection
  • Undo/redo functionality
  • Export to PNG
  • Multi-user collaboration via WebSocket
  • Cross-platform (Windows, macOS, Linux)

Quick Start

  1. Install dependencies: uv sync
  2. Start server: uv run python -m src.collaborative_whiteboard.server.main
  3. Start clients: uv run python -m src.collaborative_whiteboard.client.main (multiple instances)

Draw in one client and see changes sync in others.

Installation

Requires Python 3.13+.

Using uv (recommended):

uv sync

Using pip:

pip install PyQt6 websockets

Usage

  • Server runs on ws://localhost:8765 by default.
  • For LAN collaboration, update SERVER_HOST in client config to the server’s IP.
  • Tools: Select from toolbar, draw by clicking and dragging.

Configuration

  • Server settings: src/collaborative_whiteboard/server/config.py
  • Client settings: src/collaborative_whiteboard/client/config.py

Architecture

  • Server: Asyncio WebSocket server that broadcasts drawing messages.
  • Client: PyQt6 GUI with MVC pattern, canvas rendering, and network handling.

See docs/ARCHITECTURE.md for details.

Development

  • Run tests: uv run pytest
  • Format code: uv run ruff format src/
  • Lint: uv run ruff check src/