Open-source collaborative whiteboard for teams.
Loomy gives you an infinite canvas, real-time collaboration, and multi-tenant workspaces — draw, brainstorm, and plan together on shared boards. Built on Excalidraw for a familiar, fast drawing experience, and on FastAPI + Redis pub/sub for live sync that scales.
You can run Loomy in two ways:
- Self-hosted — Run the API and UI on your own infrastructure. You need PostgreSQL 17 and Redis 7 (see the API and UI setup below for environment variables).
- From source — Clone the repo and run the API and UI for local development or your own deployment.
| Method | Notes |
|---|---|
| Docker | A docker-compose.yml is included for PostgreSQL and Redis. Dockerfiles for API and UI can be built from the api/app/ and apps/frontend/ directories. |
| From source | See Local development below. |
Workspace owners can manage members, invitations, and workspace settings from the workspace settings area after signing up.
- Infinite canvas — Draw shapes, sticky notes, arrows, and connectors on a pan-and-zoom canvas powered by Excalidraw.
- Workspaces & boards — Organize work in multi-tenant workspaces, create any number of boards per workspace, star favorites, and jump back to recently viewed boards.
- Real-time collaboration — Board changes and cursors stream to every connected client via WebSockets and Redis pub/sub — ready for horizontal scaling.
- Membership & invitations — Invite teammates to a workspace, manage pending invitations, and remove members. Owner-only actions are enforced server-side.
- Authentication — Email/password accounts with bcrypt hashing, plus GitHub and Google OAuth 2 with CSRF-protected state tokens.
- Themes — Light, dark, and a soft pastel theme, with system preference detection.
- Internationalization — Localized UI for English, Azerbaijani, and Russian out of the box.
- Rate limiting — Redis-backed request limits protect the API from abuse.
- Interactive API docs — Swagger UI at
/docsand ReDoc at/redoc, with a full MkDocs site indocs/api/.
- Python 3.12+ and uv
- Node.js 22+ and npm
- Docker (for PostgreSQL 17 and Redis 7)
-
Start dependencies — from the repo root:
docker compose up -d
PostgreSQL runs on
localhost:15432, Redis onlocalhost:6379. -
API — from
api/app/, copy.env.exampleto.env, setSECRET_KEY,DATABASE_URL,REDIS_URL,FRONTEND_URL(and optional OAuth credentials), run migrations, then start the server:cd api/app cp .env.example .env uv sync --all-extras uv run alembic upgrade head uv run python -m app.mainAPI: http://localhost:8000 — Swagger UI: http://localhost:8000/docs
-
UI — from
apps/frontend/, install dependencies and start Vite. Point the UI at your local API withVITE_API_URL(defaults tohttp://localhost:8000):cd apps/frontend cp .env.example .env # optional npm install npm run dev
-
First run — sign up (or sign in with GitHub / Google), create a workspace, and open your first board.
For contribution workflow and code style, see CONTRIBUTING.
- API — See
api/app/README.mdfor setup, environment variables, and running the server. Full MkDocs reference lives indocs/api/. - UI — See
apps/frontend/README.mdfor front-end setup and scripts. - Architecture for contributors — See
CLAUDE.mdand the rules in.cursor/rules/for module layout, layering, and UI conventions.
Contributions are welcome. Please open an issue for bugs or feature ideas, and read CONTRIBUTING for pull-request workflow, coding standards, and our Conventional Commits policy.
This project adopts the Contributor Covenant. Security vulnerabilities should be reported privately per SECURITY.md.
This project is licensed under the GNU General Public License v3.0. You are free to use, modify, and distribute Loomy under the terms of the GPL, provided that derivative works are released under the same license and that you preserve the copyright and license notices. See LICENSE for the full text.