How to Install HedgeDoc (Real-Time Collaborative Markdown Notes, Slides and Meeting Minutes)

HedgeDoc: everyone typing in the same Markdown note at once, with cursors, diagrams, maths and a slide mode. Share by link, host it yourself.

Collabora (121) brings Word to the browser. For the lighter case — meeting minutes typed by three people at once, a shared planning doc, a quick page to paste a plan into and send someone — HedgeDoc is a Markdown editor where everyone sees everyone's cursor live. Links can be view-only or editable, notes render diagrams, maths and code, and any note becomes a slide deck with one menu click. It's a staple of hackspaces and conferences, and it's two containers at home.

Quick reference

TaskWhat
Folder~/docker/hedgedoc/compose.yaml
Webhttp://server-ip:3011
NeedsCMD_DOMAIN set to the address you'll use, PostgreSQL
Sharethe note's URL; Permissions menu → Freely / Editable / Locked / Private
SlidesMenu → Slide mode, sections split by ---
Sign-upsCMD_ALLOW_EMAIL_REGISTER: "false" after you've registered

1. The compose file

mkdir -p ~/docker/hedgedoc/uploads && cd ~/docker/hedgedoc
sudo chown 1000:1000 uploads
nano compose.yaml

services:
hedgedoc:
image: quay.io/hedgedoc/hedgedoc:latest
container_name: hedgedoc
ports:
- "127.0.0.1:3011:3000"
environment:
CMD_DB_URL: postgres://hedgedoc:${DB_PASSWORD}@hedgedoc-db:5432/hedgedoc
CMD_DOMAIN: notes.example.com
CMD_PROTOCOL_USESSL: "true"
CMD_URL_ADDPORT: "false"
CMD_ALLOW_ANONYMOUS: "false"
CMD_ALLOW_ANONYMOUS_EDITS: "true"
CMD_ALLOW_EMAIL_REGISTER: "true"
CMD_DEFAULT_PERMISSION: private
CMD_SESSION_SECRET: ${SESSION_SECRET}
volumes:
- ./uploads:/hedgedoc/public/uploads
depends_on: [hedgedoc-db]
restart: unless-stopped

hedgedoc-db:
image: postgres:16-alpine
container_name: hedgedoc-db
environment:
POSTGRES_USER: hedgedoc
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: hedgedoc
volumes:
- ./db:/var/lib/postgresql/data
restart: unless-stopped

CMD_ALLOW_ANONYMOUS: "false" means only logged-in users create notes; ANONYMOUS_EDITS: "true" lets people you send an editable link type without an account — the useful combination.

docker compose up -d

2. Proxy and first user

notes.example.com → 127.0.0.1:3011 with the WebSocket lines (28), HTTPS; CMD_DOMAIN must match. Open it, Sign in → Register with an email and password. Then set CMD_ALLOW_EMAIL_REGISTER: "false" and up -d; add the household's accounts beforehand, or temporarily reopen it.

3. Write together

New note. Left pane Markdown, right pane preview (or Both / Edit / View). Send the URL to someone; with Permissions → Editable they can type as a guest and you both see each other's cursor and name. # headings make a table of contents; - [ ] task lists are clickable in the preview.

What renders: tables, footnotes, images (paste or drag — stored in ./uploads), code with highlighting, Mermaid and PlantUML diagrams, KaTeX maths, embedded YouTube/Vimeo/PDF, sequence diagrams, emoji. A meeting's minutes with an action list and a diagram, typed by three people, is the sweet spot.

4. Slides

Write sections separated by --- lines, then Menu → Slide mode: a reveal.js deck in the browser, with speaker notes from Note: lines, and a printable PDF via the browser's print. A talk for the user group or a quick explainer for the family, from the same note.

5. Permissions and history

Each note: Freely (anyone with the link can edit), Editable (logged-in users edit, others view), Limited, Locked (only you edit), Private (only you see). Default is private per the config. Revision history keeps versions; Export to Markdown, HTML or PDF. Your notes list is at /history.

6. Back up

./db (dump it, 65) and ./uploads. Both in the nightly backup. CMD_SESSION_SECRET constant, or everyone is logged out on restart.

Troubleshooting

Live collaboration doesn't update. WebSockets blocked at the proxy.

Images upload but don't display. CMD_DOMAIN/USESSL wrong, so image URLs are built with the wrong address.

"Unable to join note". Permission is Private and the viewer isn't the owner; change it to Editable or Freely for the link.

Can't register. Registration closed — intended; reopen briefly to add someone.

Wrapping up

Two containers behind the proxy, one registered user, sign-ups closed. A link is a shared document where everyone types at once, with diagrams and maths and a slide mode — meeting minutes and plans stop living in a chat thread, and Google Docs isn't needed for the quick stuff.

Call us