esc
Type to search the docs
Back to catalog

hedgedoc

Tested

Collaborative markdown editor

hedgedoc screenshot

Run locally

Tested and verified to launch successfully.

Terminal
$ npx launchfile up hedgedoc

Requires Docker Desktop. No source code needed — pulls pre-built images and starts hedgedoc with all dependencies.

Image: quay.io/hedgedoc/hedgedoc:1.10.8
Launchfile View on GitHub
# yaml-language-server: $schema=https://launchfile.dev/schema/v1
version: launch/v1
name: hedgedoc
description: "Collaborative markdown editor"
repository: https://github.com/hedgedoc/hedgedoc

components:
  default:
    image: quay.io/hedgedoc/hedgedoc:1.10.8
    provides:
      - protocol: http
        port: 3000
        exposed: true
    requires:
      - type: postgres
        version: ">=9.6"
        set_env:
          CMD_DB_URL: $url
    env:
      # HedgeDoc builds absolute URLs for assets, scripts, CSP, and the
      # collaboration websocket from its configured domain. It must match the
      # address the browser actually used, or every asset 404s / is CSP-blocked
      # and the editor websocket fails. $app.authority is host[:port] of the
      # deployment's public URL; with CMD_URL_ADDPORT=false HedgeDoc uses it
      # verbatim. CMD_PROTOCOL_USESSL tracks the deployment scheme via $app.tls.
      CMD_DOMAIN:
        default: $app.authority
        description: "Public host[:port] HedgeDoc is served from"
      CMD_PROTOCOL_USESSL:
        default: $app.tls
        description: "Whether the public URL is HTTPS"
      CMD_URL_ADDPORT:
        default: "false"
        description: "Don't append the internal port — the authority already carries the public one"
      CMD_ALLOW_ANONYMOUS:
        default: "true"
        description: "Allow anonymous note creation/editing"
    storage:
      uploads:
        path: /hedgedoc/public/uploads
        persistent: true
    health:
      # The hedgedoc image ships neither wget nor curl, so the default HTTP
      # probe (wget/curl against health.path) can never run and the container
      # would never go healthy. It does ship node, so probe /_health with a
      # tiny node one-liner instead — exit 0 only on HTTP 200.
      command: 'node -e ''require("http").get("http://localhost:3000/_health",r=>process.exit(r.statusCode===200?0:1)).on("error",()=>process.exit(1))'''
      # First boot runs all DB migrations before the server listens; keep a
      # generous start period so early probes don't burn the retry budget.
      start_period: 90s

Test Results

Last Tested

2026-06-18

Health Check

Passing

Startup Time

11s

Total Disk

290 MB

Required Services

postgres

Learn More

Spec references for features used in this Launchfile.

Related Apps

© 2026 High Bridge Enterprises AB