Skip to content

AstraDraw/astradraw

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

AstraDraw

A fully self-hosted, feature-rich fork of Excalidraw with real-time collaboration, user workspaces, video recordings, presentation mode, and more.

License: MIT

Warning

๐Ÿšง Alpha Release

This is a hobby project in active development. I created AstraDraw because I wanted to share some of my Obsidian whiteboards with my team โ€” while keeping the files local in my vault. Inspired by the excellent Obsidian Excalidraw Plugin by @zsviczian.

A few things to keep in mind:

  • ๐Ÿค– Most code is AI-assisted (written with Cursor)
  • ๐Ÿ‘ค Solo developer โ€” no team behind this, just me working in spare time
  • โš ๏ธ Expect bugs and breaking changes as the project evolves

That said, it works for my use case and I'm actively improving it. If you find this useful, contributions are very welcome! ๐Ÿ™Œ


๐Ÿ”ฎ Planned: Obsidian Vault Sync

The end goal is to selectively sync .excalidraw files from your Obsidian vault to a self-hosted AstraDraw instance (via Syncthing, mounted volumes, or similar). The synced boards appear in your private workspace, where you can share specific boards with different teams using AstraDraw's role-based access control. All changes sync back to your Obsidian vault โ€” your vault remains the source of truth, AstraDraw becomes the collaboration layer.

Not yet implemented โ€” focusing on core features first.

About

AstraDraw extends the open-source Excalidraw whiteboard with enterprise-ready features while remaining fully self-hostable. It's designed for teams and organizations that need:

  • User authentication via OIDC (Authentik, Keycloak, Dex) or local accounts
  • Workspaces with teams, collections, and role-based access (Admin/Member/Viewer)
  • Real-time collaboration with presence indicators and cursor tracking
  • Threaded comments with @mentions and real-time sync
  • In-app notifications for mentions and comment replies
  • Video walkthroughs (Talktrack) with camera picture-in-picture
  • Presentation mode using frames as slides with laser pointer
  • Custom pen presets (highlighter, fountain, marker, etc.)
  • Quick search (Cmd+K) to find scenes across workspaces
  • GIF/Sticker search via GIPHY integration

Features

Core Features (from Excalidraw)

  • ๐ŸŽจ Infinite canvas with hand-drawn style
  • ๐Ÿ”’ End-to-end encryption for all scene data
  • ๐Ÿค Real-time collaboration via WebSocket
  • ๐Ÿ“ฑ Responsive design for desktop and mobile
  • ๐ŸŒ™ Dark mode support

AstraDraw Extensions

Feature Description Documentation
Workspaces Personal & shared workspaces with scene organization docs/features/WORKSPACE.md
Roles & Teams Role-based access (Admin/Member/Viewer), team management docs/guides/ROLES_TEAMS_COLLECTIONS.md
Collaboration Real-time collaboration with presence & cursor tracking docs/features/COLLABORATION.md
Comments Threaded canvas comments with @mentions docs/features/COMMENTS.md
Notifications In-app notifications for mentions and replies docs/features/NOTIFICATIONS.md
Talktrack Record canvas walkthroughs with camera PIP docs/features/TALKTRACK.md
Presentation Use frames as slides with laser pointer docs/features/PRESENTATION_MODE.md
Custom Pens Highlighter, fountain, marker presets docs/features/PENS_IMPLEMENTATION.md
Quick Search Cmd+K to search scenes across workspaces docs/features/QUICK_SEARCH.md

Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         Traefik Proxy (HTTPS)                       โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ /            โ”‚  โ”‚ /socket.io/  โ”‚  โ”‚ /api/v2/                 โ”‚   โ”‚
โ”‚  โ”‚ Frontend     โ”‚  โ”‚ Room Server  โ”‚  โ”‚ Backend API              โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                  โ”‚                      โ”‚
         โ–ผ                  โ–ผ                      โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ React + Vite    โ”‚ โ”‚ Socket.io       โ”‚ โ”‚ NestJS + Prisma             โ”‚
โ”‚ Excalidraw Fork โ”‚ โ”‚ Collaboration   โ”‚ โ”‚ - Auth (OIDC/Local)         โ”‚
โ”‚                 โ”‚ โ”‚                 โ”‚ โ”‚ - Workspace API             โ”‚
โ”‚                 โ”‚ โ”‚                 โ”‚ โ”‚ - Storage (S3/MinIO)        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                   โ”‚
                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                           โ–ผ                                           โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚    PostgreSQL       โ”‚               โ”‚    MinIO/S3         โ”‚
                  โ”‚  (Users, Scenes,    โ”‚               โ”‚  (Scene data,       โ”‚
                  โ”‚   Metadata)         โ”‚               โ”‚   Files, Rooms)     โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Repository Structure

AstraDraw consists of multiple repositories:

Repository Description
astradraw Main orchestration (this repo) - deployment, docs
astradraw-app React frontend (Excalidraw fork)
astradraw-api NestJS backend API
astradraw-room WebSocket collaboration server
astradraw/
โ”œโ”€โ”€ frontend/           # React app (clone astradraw-app here)
โ”œโ”€โ”€ backend/            # NestJS API (clone astradraw-api here)
โ”œโ”€โ”€ room-service/       # WebSocket server (clone astradraw-room here)
โ”œโ”€โ”€ docs/               # Documentation
โ”œโ”€โ”€ deploy/             # Docker Compose, configs
โ””โ”€โ”€ Justfile            # Development commands

Quick Start

Development

# 1. Clone all repositories
git clone https://github.com/AstraDraw/astradraw.git
cd astradraw
git clone https://github.com/AstraDraw/astradraw-app.git frontend
git clone https://github.com/AstraDraw/astradraw-api.git backend
git clone https://github.com/AstraDraw/astradraw-room.git room-service

# 2. Setup (first time only)
just setup

# 3. Start development with hot-reload
just dev

# 4. Access at https://draw.local

Docker Deployment

# 1. Clone this repository
git clone https://github.com/AstraDraw/astradraw.git
cd astradraw/deploy

# 2. Copy environment template
cp env.example .env

# 3. Create secrets
mkdir -p secrets
openssl rand -base64 32 > secrets/jwt_secret
openssl rand -base64 32 > secrets/postgres_password
echo "minioadmin" > secrets/minio_access_key
openssl rand -base64 32 > secrets/minio_secret_key

# 4. Generate self-signed certs for local testing
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/server.key -out certs/server.crt \
  -subj "/CN=draw.local"

# 5. Start all services
docker compose up -d

# 6. Access at https://draw.local (add to /etc/hosts if needed)

Configuration

Environment Variables

Copy deploy/env.example to deploy/.env and configure:

Variable Description
APP_DOMAIN Your domain (e.g., draw.example.com)
APP_PROTOCOL http or https
POSTGRES_* PostgreSQL credentials
OIDC_* OIDC provider settings (optional)
GIPHY_API_KEY For Stickers & GIFs sidebar

Authentication Options

  1. Local Auth (default): Email/password with admin account
  2. OIDC/SSO: Authentik, Keycloak, Dex, or any OIDC provider
  3. Hybrid: Both local and SSO enabled

See docs/deployment/SSO_OIDC_SETUP.md for detailed auth setup.

Docker Secrets

All sensitive variables support the _FILE suffix pattern for Docker secrets:

environment:
  - JWT_SECRET_FILE=/run/secrets/jwt_secret

See docs/deployment/DOCKER_SECRETS.md for details.

Documentation

Document Description
docs/README.md Full documentation index
CONTRIBUTING.md Development setup guide
docs/architecture/ARCHITECTURE.md Technical architecture
docs/deployment/ Deployment guides

Tech Stack

Frontend: React 18, TypeScript, Vite, Jotai, SCSS

Backend: NestJS, Prisma, PostgreSQL, MinIO/S3, JWT

Infrastructure: Docker Compose, Traefik, Let's Encrypt

Contributing

We welcome contributions! Please see CONTRIBUTING.md for development setup.

Note: All issues should be filed in this repository, not in the sub-repos.

Credits

AstraDraw is built on the shoulders of giants:

License

MIT License - see LICENSE for details.

This project includes code from:

  • Excalidraw ยฉ 2020 Excalidraw (MIT License)
  • excalidraw-storage-backend ยฉ 2022 Kilian Decaderincourt (MIT License)

About

๐Ÿ–ผ๏ธ Self-hosted Excalidraw with workspaces, collaboration, video recordings & more

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published