Why HedgeDoc Reigns as the King of Self-Hosted Note-Taking Apps

This is going to be a bold, highly opinionated take on how note-taking apps should be. For the non-technical folks, discussing text editors and note-taking apps with IT people is like walking straight into a heated geopolitical debate at the family Thanksgiving table—it’s passionate, intense, and probably never-ending. Gobble Gobble.

I have tested a lot of note taking apps:

There are probably even more apps I have used in the past, but these are the ones that left a lasting impression on me. First off, let me just say—I love taking notes in Markdown. Any app that doesn’t support Markdown is pretty much useless to me. I’m so much faster at writing styled notes this way, without the hassle of clicking around or memorizing weird shortcut commands.

For me, HedgeDoc hit the sweet spot. It’s got just the right features and just the right amount of organization. I’m not looking for an app to micromanage my entire life—I just want to take some damn notes!

Live editing has also become a game-changer for me. I often have multiple screens open, sometimes even on different networks, and being instantly up-to-date while copy-pasting seamlessly between them is invaluable. Before HedgeDoc, I was using Obsidian synced via Nextcloud, but that was neither instant nor reliable on many networks.

And let’s talk about security. With HedgeDoc, it’s a breeze. Their authorization system is refreshingly simple, and backing up your notes is as easy as clicking a button. You get a ZIP file with all your Markdown documents, which you could technically use with other editors—but why would you? HedgeDoc feels like it was made for you, and honestly, you’ll feel the love right back.

I run HedgeDoc inside a container on my server, and it’s rock-solid. It just works. No excessive resource use, no drama—just a tool that quietly does its job.

Now, let’s dive in! I’m going to show you how to host HedgeDoc yourself. Let’s get started!

Prerequisites

Here’s what you’ll need to get started:

  • A Linux distribution: Any modern Linux distro that supports Docker will work, but for today, we’ll go with Alpine.
  • A server with a public IP address: While not strictly mandatory, this is highly recommended if you want to access your note-taking app from anywhere.
  • A reverse proxy: Something like Caddy or Nginx to handle HTTPS and make your setup accessible and secure.

Got all that? Great—let’s get started!

Setup

Here’s a handy script to install Docker on a fresh Alpine setup:

init.sh
#!/bin/sh

# Exit on any error
set -e

echo "Updating repositories and installing prerequisites..."
cat <<EOF > /etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF

apk update
apk add --no-cache curl openrc docker docker-compose

echo "Configuring Docker to start at boot..."
rc-update add docker boot
service docker start

echo "Verifying Docker installation..."
docker --version
if [ $? -ne 0 ]; then
    echo "Docker installation failed!"
    exit 1
fi

echo "Verifying Docker Compose installation..."
docker-compose --version
if [ $? -ne 0 ]; then
    echo "Docker Compose installation failed!"
    exit 1
fi

echo "Docker and Docker Compose installed successfully!"

To make the script executable and run it, follow these steps:

Bash
chmod +x init.sh
./init.sh

If everything runs without errors, Docker should now be installed and ready to go. 🎉

To install HedgeDoc, we’ll follow the steps from their official documentation. It’s straightforward and easy

I prefer to keep all my environment variables and secrets neatly stored in .env files, separate from the actual Compose file.

.env
POSTGRES_USER=hedgedoctor
POSTGRES_PASSWORD=super_secure_password
POSTGRES_DB=hedgedoc

CMD_DB_URL=postgres://hedgedoctor:super_secure_password@database:5432/hedgedoc
CMD_ALLOW_FREEURL=true
CMD_DOMAIN=docs.yourdomain.de
CMD_PROTOCOL_USESSL=true
CMD_ALLOW_ANONYMOUS=false
CMD_ALLOW_EMAIL_REGISTER=true # <- remove after you registered

To keep things secure, it’s a good idea to set CMD_ALLOW_ANONYMOUS to false, so anonymous users can’t edit your documents. For added security, you can create your own account and then disable CMD_ALLOW_EMAIL_REGISTER to prevent outsiders from signing up, effectively locking down HedgeDoc.

One great benefit of using the env_file directive in your Docker Compose setup is that it keeps your Compose files clean and tidy:

docker-compose.yml
services:
  database:
    image: postgres:13.4-alpine
    env_file:
      - .env
    volumes:
      - database:/var/lib/postgresql/data
    restart: always

  app:
    image: quay.io/hedgedoc/hedgedoc:latest
    env_file:
      - .env
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3000:3000"
    restart: always
    depends_on:
      - database

volumes:
  database:
  uploads:

After running docker compose up -d, you should be all set! This setup assumes you already have a reverse proxy configured and pointing to the public domain where you’re hosting your HedgeDoc. If you need help setting that up, I’ve written a guide on it in another blog post.

Keep in mind, with the settings in the .env file above, HedgeDoc won’t work unless it’s served via HTTPS through the reverse proxy using the domain you specified.

Once everything’s in place, you should see the HedgeDoc login screen and be able to “Register” your account:

Don’t forget to head back to your .env file and comment out that specific line once you’re done:

.env
...
# CMD_ALLOW_EMAIL_REGISTER=true # <- remove after you registered

This ensures that no one else can create accounts on your HedgeDoc instance.

Personally, I always set my notes to “Private” (you can do this in the top right). That way, even if I decide to let others use the instance later, I don’t have to worry about any old notes where I might have called them a stinky doodoo face (as one does):

You can still share your documents with others, but you’ll need to change the setting to “Locked.” Anything more restrictive will prevent people from viewing your notes.

Imagine sending your crush a beautifully crafted, markdown-styled love letter, only for them to get blocked because of your overly strict settings. Yeah… couldn’t be me.

Conclusion

I conclude —our notes are ready, no need for more WordPress blog posts. Now it’s time to hit the gym because it’s chest day, and let’s be honest, chest day is the best day! 💪

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *