Doory Art

Open-source design editor in your browser. A self-hosted Canva alternative.

  • ghcr.io/hsinghhira/doory-art:latest
  • port 6143
  • Productivity
Doory Art screenshot 1: EditorDoory Art screenshot 2: TemplatesDoory Art screenshot 3: AnimationDoory Art screenshot 4: LayersDoory Art screenshot 5: Share and export

Design editor

/
http://localhost:6143/

Admin

/admin/
http://localhost:6143/admin/

Doory is a design editor that runs in the browser. Make posters, social posts, stories, slides, invitations, resumes, thumbnails and business cards, then export them as PNG, JPG, SVG, PDF, MP4 or GIF. This is Doory in a single container, with one port and one data folder. PostgreSQL is inside, and the secret key and database passwords are made for you on first start. The optional AI server and Redis are left out.

Features

  • Start from a template or a blank page, with several pages per design
  • Text effects, curved text, an open-licensed font catalogue and your own fonts
  • About 27,500 icons, emoji and illustrations, shapes, QR codes
  • Photo crop, masks, filters and background removal in the browser
  • Animations, page transitions, music loops, sound effects and video clips
  • Share links, comments, version history and live co-editing
  • Brand kits with your colours, fonts and logos
  • Server-side PDF export with headless Chromium inside

How to use

  1. Open Doory Art from your dashboard.
  2. Sign in with the admin email and password, or create an account.
  3. Pick a size or a template and start designing.
  4. Use Share to make a link, or download your design.
  5. Open /admin/ as the admin to manage users, templates and settings.

Before you install

Set ADMIN_EMAIL to your own email. Leave ADMIN_PASSWORD blank to get a random one; it is shown in the app log on the first start (look for "admin password is") and saved in /data/state/secrets.env. Change localhost in PUBLIC_URL to your box's IP, for example http://192.168.1.10:6143, so share links work from other devices. More settings, like email (SMTP), Google or SSO sign-in, stock photo keys and the MCP server, are in the Variables tab; add them in the app settings. The first start takes about ten minutes while it sets up the database and downloads icons, fonts and templates.

Doory is released under the Attribution Assurance License by Siam, creator and maintainer of Doory (https://github.com/shaongitbd/doory). The licence text is in the image at /usr/share/doc/doory/LICENSE.

The settings in the first table are already in the app settings. To use any other one, open the app settings, add the variable with your value, save, and the app restarts with it. A setting you leave out uses its default.

In the app settings

VariableDefault valueDescription
TZ$TZYour time zone. It is filled in from your ZimaOS time zone. Leave it unless you need another.
PUBLIC_URLhttp://localhost:6143The address people use to open Doory, with no slash at the end. Change localhost to your ZimaOS IP, for example http://192.168.1.10:6143, or use your own https:// domain. Share links and emails use it.
ADMIN_EMAIL—The email for the first admin account. Put your own email here. Left blank, it is [email protected]. Only used while there is no admin yet.
ADMIN_PASSWORD—The password for the first admin account. Leave it blank and the app makes a random one on first start. It is shown in the app log and saved in the data folder. Or type your own. Only used while there is no admin yet; change it later in Doory.

Server

VariableDefault valueDescription
DJANGO_ALLOWED_HOSTS*The host names Doory answers to, separated by commas, for example design.example.com,192.168.1.10. Leave it out to answer on any address.
SECURE_SSL_REDIRECTfalseSet to true to send every visitor to https. Leave it out and it turns on by itself when PUBLIC_URL starts with https://.
SECURE_COOKIESfalseSet to true so sign-in cookies only travel over https. Leave it out and it turns on by itself when PUBLIC_URL starts with https://.
NUM_PROXIES1How many reverse proxies sit in front of the API. Add one for each proxy in front of the app's own one (for example 2 behind Nginx Proxy Manager).
WEB_CONCURRENCY3How many API worker processes run. Lower it to save memory on a small box.
LOG_LEVELINFOHow much the server writes to the log: DEBUG, INFO, WARNING or ERROR.
DJANGO_SECRET_KEY_FALLBACKS—Old secret keys that are still accepted, separated by commas. Only needed if you replace the secret key in /data/state/secrets.env.

Limits

VariableDefault valueDescription
USER_STORAGE_QUOTA_BYTES2147483648How much each person may upload, in bytes. The default is 2 GB.
MAX_DESIGNS_PER_USER5000The most designs one person can have.
MAX_API_TOKENS_PER_USER20The most personal access tokens one person can make.

First-run content

VariableDefault valueDescription
DOORY_SYNC_ELEMENTStrueInstalls about 27,500 icons, emoji and illustrations (about 130 MB). Set to false to skip it. After the first time it takes about a second.
DOORY_SYNC_ELEMENTS_ARGS—Extra options for the element download, for example --pack lucide phosphor-regular to install only some packs.
DOORY_ELEMENTS_BRAND_LOGOSfalseSet to true to add brand logos (Facebook, YouTube and others) on the next start. Logos belong to their owners; follow their brand rules.
DOORY_SYNC_FONTStrueDownloads the open-licensed font catalogue once, on the first start. Set to false to skip it.
DOORY_SYNC_FONTS_ARGS—Which font families to download. Blank means the 100 most popular. For example --popular 253 or --all.
DOORY_SEED_TEMPLATEStrueAdds the ten starter templates. Templates you already have are never changed. Set to false to skip it.
DOORY_SYNC_MODELStrueInstalls the small background-removal model (4.6 MB). Set to false to skip it.
DOORY_SYNC_MODELS_ARGS—Extra options for the model download, for example --model u2net for the bigger, better model (176 MB).
DOORY_SYNC_AUDIOtrueInstalls the music loops and sound effects that come with Doory (about 7 MB). Set to false to skip it.
DOORY_SYNC_AUDIO_ARGS—Extra options for the audio install, for example --pack some-pack.

Email (SMTP)

VariableDefault valueDescription
EMAIL_URLconsolemail://Your mail server, for example smtp+tls://user:[email protected]:587. Leave it out and emails (password resets) are only written to the app log.
DEFAULT_FROM_EMAILDoory <no-reply@localhost>The sender of Doory's emails, for example "Doory <[email protected]>".

Sign in with Google

VariableDefault valueDescription
GOOGLE_CLIENT_ID—Your Google OAuth web client ID. Set it to show the Sign in with Google button.

Sign in with SSO (OIDC)

VariableDefault valueDescription
OIDC_ISSUER—The issuer URL of your sign-in provider, for example https://auth.example.com/application/o/doory/ for authentik.
OIDC_CLIENT_ID—The client ID from your sign-in provider.
OIDC_CLIENT_SECRET—The client secret from your sign-in provider.
OIDC_BUTTON_LABELSign in with SSOThe text on the sign-in button.
OIDC_SCOPESopenid email profileThe scopes Doory asks for.
OIDC_TRUST_EMAILfalseSet to true so a first SSO sign-in joins an existing account with the same email. Only do this if your provider checks emails.

Stock photos, videos and sounds

VariableDefault valueDescription
UNSPLASH_ACCESS_KEY—Your Unsplash access key. Set it to search Unsplash photos in the editor.
PEXELS_API_KEY—Your Pexels API key, for Pexels photos (and videos, unless PEXELS_VIDEO_API_KEY is set).
PIXABAY_API_KEY—Your Pixabay API key, for Pixabay images (and videos, unless PIXABAY_VIDEO_API_KEY is set).
PEXELS_VIDEO_API_KEY—A separate Pexels key for video search, so it does not use up the photo quota.
PIXABAY_VIDEO_API_KEY—A separate Pixabay key for video search.
FREESOUND_API_KEY—Your Freesound API key. Set it to show the Freesound tab in the Audio tool. Freesound's terms cover non-commercial use.
FREESOUND_LICENSEScc0Which Freesound licences are allowed. Use cc0,by to also allow CC BY sounds (the editor then shows the credits).
STOCK_PROVIDERSunsplash,pexels,pixabayWhich photo providers are on, in tab order. Only ones with a key show up.

Export

VariableDefault valueDescription
SERVER_PDF_ENABLEDtrueServer-side PDF export with the Chromium inside. Set to false to turn it off.
SERVER_IMAGE_EXPORT_ENABLEDfalseSet to true to make PNG, JPG, WebP and AVIF files on the server. It runs the editor's engine in the export browser.
SERVER_VIDEO_EXPORT_ENABLEDfalseSet to true to make MP4, WebM and GIF files on the server. Needs SERVER_IMAGE_EXPORT_ENABLED=true too.
EXPORT_FILENAME_STYLEsimpleHow downloaded files are named: simple (summer-sale-02.png) or structured (title, platform, size and page in the name).
IMAGE_OPTIMIZERSbuiltinWhich image optimizers people can pick, separated by commas: builtin, tinypng, kraken or custom. Blank turns them off.
TINYPNG_API_KEY—Your TinyPNG key, to offer the TinyPNG optimizer. Images are sent to TinyPNG.

Video

VariableDefault valueDescription
VIDEO_ENABLEDtrueVideo clips (uploads and stock videos), using the ffmpeg inside. Set to false to turn them off.
MAX_VIDEO_UPLOAD_BYTES209715200The largest video clip someone can upload, in bytes. The default is 200 MB, which is also the most the app's web server lets through.

AI assistants (MCP)

VariableDefault valueDescription
MCP_ENABLEDfalseSet to true to start the MCP server at /mcp, so AI assistants like Claude or Cursor can work on your designs. People make tokens in Settings.
MCP_CALLS_PER_MINUTE120How many MCP calls each person can make per minute. 0 means no limit.

AI background removal

VariableDefault valueDescription
BACKGROUND_REMOVAL_ENABLEDtrueBackground removal in the editor. Set to false to hide it.
AI_PROVIDER_1_URL—The address of your own background-removal server, for better results than the in-browser one. AI_PROVIDER_1_STYLE, _AUTH_HEADER and _AUTH_VALUE (and AI_PROVIDER_2_ and up) work the same way; see Doory's AI providers guide.
AI_USER_PROVIDERSoffWho may add their own AI servers: off, staff or everyone.
docker-compose.yml
name: doory-art

services:
  doory-art:
    image: ghcr.io/hsinghhira/doory-art:latest
    container_name: doory-art
    restart: unless-stopped
    stop_grace_period: 90s
    privileged: true
    environment:
      - TZ=$TZ
      - PUBLIC_URL=http://localhost:6143
      - ADMIN_EMAIL=
      - ADMIN_PASSWORD=
    ports:
      - target: 8080
        published: "6143"
        protocol: tcp
    volumes:
      - type: bind
        source: /DATA/AppData/$AppID/data
        target: /data
        bind:
          create_host_path: true
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:8080/api/v1/health/"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 600s
    deploy:
      resources:
        limits:
          cpus: "2.00"
          memory: 3072M
        reservations:
          cpus: "0.00"
          memory: 768M
    labels:
      icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/icon.png
    x-casaos:
      id: com.icestore.doory-art
      envs:
        - container: TZ
          description:
            en_US: >-
              Your time zone. It is filled in from your ZimaOS time zone.
              Leave it unless you need another.
        - container: PUBLIC_URL
          description:
            en_US: >-
              The address people use to open Doory, with no slash at the end.
              Change localhost to your ZimaOS IP, for example
              http://192.168.1.10:6143, or use your own https:// domain. Share
              links and emails use it.
        - container: ADMIN_EMAIL
          description:
            en_US: >-
              The email for the first admin account. Put your own email here.
              Left blank, it is [email protected]. Only used while there is no
              admin yet.
        - container: ADMIN_PASSWORD
          description:
            en_US: >-
              The password for the first admin account. Leave it blank and the
              app makes a random one on first start. It is shown in the app log
              and saved in the data folder. Or type your own. Only used while
              there is no admin yet; change it later in Doory.
      ports:
        - container: "8080"
          description:
            en_US: Doory editor, API, live editing and admin, published on host as 6143
      volumes:
        - container: /data
          description:
            en_US: >-
              The database, uploaded images and videos, fonts, elements,
              exports, secret keys and settings.

x-casaos:
  id: com.icestore.doory-art
  architectures:
    - amd64
    - arm64
  main: doory-art
  author: HSinghHira
  category: Productivity
  developer: shaongitbd
  icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/icon.png
  thumbnail: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/screenshot-1.webp
  screenshot_link:
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/screenshot-1.webp
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/screenshot-2.webp
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/doory-art/screenshot-3.webp
  title:
    en_US: Doory Art
  tagline:
    en_US: Open-source design editor in your browser. A self-hosted Canva alternative.
  description:
    en_US: >-
      Doory is a design editor that runs in the browser. Make posters, social
      posts, stories, slides, invitations, resumes, thumbnails and business
      cards, then export them as PNG, JPG, SVG, PDF, MP4 or GIF. This is Doory
      in a single container, with one port and one data folder. PostgreSQL is
      inside, and the secret key and database passwords are made for you on
      first start. The optional AI server and Redis are left out.


      **Features**


      - Start from a template or a blank page, with several pages per design

      - Text effects, curved text, an open-licensed font catalogue and your
        own fonts

      - About 27,500 icons, emoji and illustrations, shapes, QR codes

      - Photo crop, masks, filters and background removal in the browser

      - Animations, page transitions, music loops, sound effects and video
        clips

      - Share links, comments, version history and live co-editing

      - Brand kits with your colours, fonts and logos

      - Server-side PDF export with headless Chromium inside


      **How to use?**


      1. Open Doory Art from the Zima OS dashboard.


      2. Sign in with the admin email and password, or create an account.


      3. Pick a size or a template and start designing.


      4. Use Share to make a link, or download your design.


      5. Open /admin/ as the admin to manage users, templates and settings.
  tips:
    before_install:
      en_US: >-
        1. Open the app configuration before you install.


        2. Find ADMIN_EMAIL. Set it to your own email.


        3. Leave ADMIN_PASSWORD blank to get a random one. Or type your own.


        4. Find PUBLIC_URL. Change localhost to your ZimaOS IP, for example
           http://192.168.1.10:6143.


        5. More settings, like email (SMTP), Google sign-in and stock photo
           keys, are listed on the Doory Art page at
           https://icestore.hsinghhira.me/app/doory-art/ (Variables tab). You
           can add them now or later in the app settings.


        6. Start the installation.


        7. Wait about ten minutes. The first start sets up the database and
           downloads icons, fonts and templates.


        8. If you left ADMIN_PASSWORD blank, open the app log. Find the line
           that says "admin password is".


        9. Open http://your-zimaos-ip:6143 and sign in with your admin email.


        10. The admin pages are at http://your-zimaos-ip:6143/admin/.
  index: /
  port_map: "6143"
  scheme: http
  is_uncontrolled: false
  version: "0.2.0"
  update_at: "2026-10-25"
  release_notes:
    en_US: |-
      - Single-container Doory with one port (6143) and one data folder
      - Secret key and database passwords are made on first start, so each install gets its own
      - The first admin account is made for you from ADMIN_EMAIL and ADMIN_PASSWORD
      - ghcr.io/shaongitbd/doory-backend 0.2.0 (api, realtime and mcp), with ffmpeg added for video clips
      - ghcr.io/shaongitbd/doory-frontend 0.2.0 (the web app, served by the built-in nginx)
      - PostgreSQL 16 inside
      - Icons, fonts, starter templates, audio and the background-removal model are installed on first start
      - The MCP server for AI assistants is off until you add MCP_ENABLED=true
      - Left out: Redis (only for more than one realtime worker) and the optional AI server
  repo: "https://github.com/shaongitbd/doory"
  support: "https://github.com/shaongitbd/doory/issues"
  docs: "https://github.com/shaongitbd/doory/tree/main/docs/self-hosting"