selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

Drawpile logo

Self-host Drawpile

2.3.1

Real-time collaborative drawing app and session server

ReleaseOpen SourceGPL-3.0
docker run -it --rm -p 27750:27750 drawpile/drawpile-srv:2.2
Updated11 hours ago
LanguageC
Setup difficultyModerate
MobileNative app
Stars
1 347
Port
27750 (TCP port drawpile-srv listens on for client connections)
Docker
drawpile/drawpile-srv
The Host Session page of the start dialog, with content rating and hosting optionsHosting an already opened canvas from the Session menuThe tablet driver options in the Edit menu

What is Drawpile?

Should you self-host Drawpile?

Drawpile scores 59/100 on selfhost.directory (how scoring works) and ranks #3 of 7 in Design. It has 1 347 GitHub stars.

It shipped 4 stable releases in the past year. The latest, continuous, came out on 26 October 2026. New versions land roughly every 5 days.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is GPL-3.0-licensed and written mostly in C.

Its closest alternative on selfhost.directory is OpenDesign (83/100, 104 574 stars). It scores higher overall, so compare the two before you pick. See Drawpile vs OpenDesign side by side.

Features

  • Animation timeline with onion skins
  • Brush editor with 200+ built-in brushes
  • File-backed and persistent sessions
  • Layers and layer groups with blend modes
  • Offline drawing mode
  • OpenRaster and PSD file interchange
  • Password-protected private sessions
  • Pressure-sensitive tablet support
  • Real-time collaborative canvas
  • Roles, permissions and moderation
  • Session Recording
  • Stroke stabilizer
  • Timelapse export
  • Web admin API for the server
  • Web browser client

Drawpile README

How to install Drawpile

Install Drawpile with Docker

Environment variables
DRAWPILESRV_WEB_ADMIN_AUTH
$ docker run -it --rm -p 27750:27750 drawpile/drawpile-srv:2.2

A more realistic example:

$ docker run -dt --name "drawpile-server" \
    -p 27750:27750 -p 127.0.0.1:27780:27780 \
    -v dpsessions:/home/drawpile \
    --restart always \
    drawpile/drawpile-srv:2.2 \
    --sessions /home/drawpile/sessions \
    --database /home/drawpile/config.db \
    --web-admin-port 27780 \
    --web-admin-access all

Dedicated server only; pulls the drawpile/drawpile-srv image from Docker Hub.

How to configure Drawpile

  • allowGuestHoststrueAllow anyone to host sessions, or restrict to HOST-flagged accounts

    Allow anyone to host sessions, or restrict to HOST-flagged accounts

    values: true or false

  • allowGueststrueAllow users without an account to connect

    Allow users without an account to connect

    values: true or false

  • allowGuestWebtrueAllow anyone to join via the web browser client

    Allow anyone to join via the web browser client

    values: true or false

  • --announce-portPort advertised in session listings when it differs from the listen port

    Port advertised in session listings when it differs from the listen port

    values: port number

  • announceWhitelistfalseRestrict session listings to explicitly allowed listing servers

    Restrict session listings to explicitly allowed listing servers

    values: true or false

  • autoResetThreshold15mbDefault threshold for automatic session resets

    Default threshold for automatic session resets

    values: size

  • clientTimeout60Disconnect clients after this long without a message

    Disconnect clients after this long without a message

    values: duration

  • --configPath to the INI-style configuration file

    Path to the INI-style configuration file

    values: file path, mutually exclusive with --database

  • --crypt-keyKey used to encrypt exported session bans

    Key used to encrypt exported session bans

    values: generated with drawpile-srv --generate-crypt-key

  • customAvatarstrueAllow users to provide their own avatars

    Allow users to provide their own avatars

    values: true or false

  • --databasePath to the SQLite configuration database

    Path to the SQLite configuration database

    values: file path, mutually exclusive with --config

  • DRAWPILESRV_WEB_ADMIN_AUTHUsername and password pair for HTTP Basic auth on the web admin API

    Username and password pair for HTTP Basic auth on the web admin API

    values: <user:password>

  • --extauthURL of the external authentication endpoint

    URL of the external authentication endpoint

    values: URL, e.g. drawpile.net's ext-auth API

  • extauthkeyValidation key of the external authentication server

    Validation key of the external authentication server

    values: string key

  • forceNsfmfalseForce every session to be tagged Not Suitable for Minors

    Force every session to be tagged Not Suitable for Minors

    values: true or false

  • idleTimeLimit0How long a session may stay up without activity

    How long a session may stay up without activity

    values: duration, 0 disables the timeout

  • --listen0.0.0.0IP address the server accepts TCP connections from

    IP address the server accepts TCP connections from

    values: any address

  • --local-hostIntended hostname of the server, used for session announcements

    Intended hostname of the server, used for session announcements

    values: domain name

  • persistencefalseAllow sessions to persist after the last user leaves

    Allow sessions to persist after the last user leaves

    values: true or false

  • --port27750TCP listen port for client connections

    TCP listen port for client connections

    values: any port number

  • --recordPath pattern for recording every session

    Path pattern for recording every session

    values: path with %d, %h, %i, %a placeholders

  • --report-urlURL hit when someone uses the client's report function

    URL hit when someone uses the client's report function

    values: URL

  • serverTitleServer title shown in the login dialog

    Server title shown in the login dialog

    values: string

  • sessionCountLimit25Maximum number of simultaneously hosted sessions

    Maximum number of simultaneously hosted sessions

    values: integer

  • --sessionsDirectory for file-backed session storage

    Directory for file-backed session storage

    values: existing directory path

  • sessionSizeLimit99mbMaximum size of a session history

    Maximum size of a session history

    values: size

  • sessionUserLimit254Maximum users allowed in a single session

    Maximum users allowed in a single session

    values: integer

  • --ssl-certPath to the TLS certificate file (fullchain.pem) for TCP connections

    Path to the TLS certificate file (fullchain.pem) for TCP connections

    values: file path

  • --ssl-keyPath to the TLS private key file

    Path to the TLS private key file

    values: file path

  • --ssl-key-algorithmguessEncryption algorithm of the TLS key

    Encryption algorithm of the TLS key

    values: guess, rsa, ec, dsa, dh

  • --templatesDirectory containing session templates

    Directory containing session templates

    values: directory path

  • --web-admin-access127.0.0.1IP address or subnet allowed to reach the web admin API

    IP address or subnet allowed to reach the web admin API

    values: localhost only, a subnet, or all

  • --web-admin-port0Listen port for the web admin HTTP API

    Listen port for the web admin HTTP API

    values: 0 disables it; 27780 is the typical port

  • --websocket-listen0.0.0.0Address to accept WebSocket connections from

    Address to accept WebSocket connections from

    values: any address, e.g. 127.0.0.1 behind a local reverse proxy

  • --websocket-port0Listen port for WebSocket connections used by the browser client

    Listen port for WebSocket connections used by the browser client

    values: 0 disables it; 27751 is the typical port

  • welcomeMessageMessage posted to chat when a user joins or hosts a session

    Message posted to chat when a user joins or hosts a session

    values: string

Drawpile releases & version history

FAQ

Why does Drawpile not recognize pen pressure?

The current brush may simply have no pressure dynamics enabled, so try another one. On Windows it is often a driver mismatch: pick a different option under Edit → Tablet Driver and test them.

More in Design

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…