Introduction
You just spun up a Proxmox host and you're looking for something useful to run on it besides another Pi-hole clone. Here's a good one: a self-hosted whiteboard.
Excalidraw is the hand-drawn-style diagramming tool a lot of developers already use at excalidraw.com without thinking twice about it. What most people don't realize is that the whole thing is open source, and you can run your own private copy in about ten minutes using an LXC container on Proxmox VE. No account, no rate limits, no "your session expired" nonsense — just a whiteboard that's actually yours.
This guide walks through the install from a completely blank Proxmox host. If you've never created an LXC container before, that's fine — I'll explain what's happening at each step, not just what to type.
What You Will Learn
- What Excalidraw actually is and why it's worth self-hosting
- How LXC containers differ from full virtual machines, in plain terms
- How to install Excalidraw using the community-scripts helper script
- How to find your container's IP address and open the web interface
- What to do when the container won't start or the page won't load
- A few settings worth changing before you start using it daily
What Is This Feature?
Excalidraw is a browser-based drawing tool built for diagrams, wireframes, flowcharts, and quick sketches. It has that loose, hand-drawn look on purpose — it's meant for thinking out loud, not for pixel-perfect design work. You draw shapes, connect them with arrows, drop in text, and the whole thing lives on an infinite canvas you can pan and zoom around.
The self-hosted version is the same app you'd get at excalidraw.com, just running on your own server instead of Excalidraw's. It ships as a Docker image, and the community has wrapped that into a script that builds an LXC container for it automatically on Proxmox.
Quick definition, since it comes up constantly in this guide: an LXC container is a lightweight, Linux-based virtual environment that shares the host's kernel instead of emulating its own hardware like a full VM does. That makes it start faster and use a lot less RAM and disk than a comparable VM — which is exactly why a small app like Excalidraw is a good fit for one.
Why Would You Use It?
A few real reasons people do this, beyond "because I can":
- Privacy. If you're sketching out network diagrams, business plans, or anything with client names on it, you probably don't want that sitting on someone else's server indefinitely.
- No sign-in wall. The public site works fine without an account, but a self-hosted copy means you're never one browser update away from losing local-only data.
- It's basically free to run. Excalidraw is light. It won't fight your Plex server or your Nextcloud instance for resources.
- It fits the homelab habit. If you're already running Pi-hole, Uptime Kuma, and a dozen other small tools in LXC containers, one more takes almost no extra effort.
Is it essential? No. Honestly, if you only draw a diagram twice a year, just use the public site. But if you're documenting your homelab, planning out a network, or collaborating with a friend on a project layout, having your own instance removes a lot of small annoyances.
Prerequisites
Before you start, make sure you've got:
- A working Proxmox VE host — this guide was written against Proxmox VE 8.x and 9.x, and the script works on both.
- Root shell access to the Proxmox host, either through the web console's Shell button or SSH.
- At least 10 GB of free space on the storage you plan to use for the container.
- A network connection for the Proxmox host, since the install script pulls files from GitHub during setup.
- A little patience the first time — nothing here is hard, but if you've never touched a Linux shell before, take it slow and read the prompts.
You don't need to know Docker to follow this. The helper script handles the container creation and the Docker install inside it for you.
Step-by-Step Tutorial
Step 1: Open the Proxmox shell
Log in to the Proxmox web interface, click your node's name in the left sidebar, then click >_ Shell near the top. This drops you into a root terminal on the Proxmox host itself — not inside any VM or container.
Step 2: Run the Excalidraw install script
Paste this into the shell and press Enter:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/excalidraw.sh)"
This pulls a script maintained by the Proxmox VE Community Scripts project and runs it. It's the same project behind most of the one-line LXC installers you'll see recommended in homelab forums — it automates the boring parts of creating a container, installing dependencies, and deploying the app inside it.
Give it a minute to download. You'll see a text menu appear.
Step 3: Choose Default Settings or Advanced
The script asks whether you want Default Settings or Advanced. For a first install, pick Default. It creates the container with these specs:
| Setting | Default Value |
|---|---|
| OS | Debian 13 |
| CPU cores | 2 |
| RAM | 3072 MB |
| Disk | 10 GB |
| Networking | DHCP on your default bridge (usually vmbr0) |
If you're tight on disk space or want a static IP set up right away, choose Advanced instead — it walks you through each of these one at a time. For most homelabs, Default is fine and you can always bump the RAM later with pct set if the app feels sluggish, though in practice it rarely does.
Step 4: Let it build
The script now creates the LXC container, installs Docker inside it, pulls the Excalidraw image, and starts the container. This takes somewhere around three to six minutes depending on your internet connection — most of that time is Docker downloading the image layers.
You'll see a stream of output scroll by. That's normal. When it's done, the script prints something like:
Excalidraw should be reachable by going to the following URL.
http://192.168.1.147:3000
Write that IP address down, or just leave the terminal open — you'll need it in the next step.
Step 5: Open Excalidraw in your browser
Go to http://<container-ip>:3000 from any device on the same network. You should land straight on the drawing canvas — no login screen, no setup wizard. That's it. You're drawing on your own server now.
Step 6: Find the container later (if you close the terminal)
If you lose track of the IP address, go to the Proxmox web UI, find the container under your node (it'll be named something like excalidraw), select it, and open the >_ Console tab. Log in as root with the password you set (or the one the script generated — check the install output if you didn't set one), and run:
ip a
Look for the address next to inet under the container's network interface (usually eth0). That's your IP.
Commands Explained
| Command | What It Does |
|---|---|
bash -c "$(curl -fsSL URL)" | Downloads a script from the given URL and runs it immediately in your current shell. The -f flag makes curl fail silently on server errors instead of printing an HTML error page, -s keeps it quiet, and -L follows redirects. |
ip a | Lists the network interfaces on the current machine and their assigned IP addresses. Short for "ip address show." |
pct list | Run this on the Proxmox host (not inside the container) to see every LXC container, its ID, and its current status. |
pct enter <CTID> | Drops you straight into a root shell inside a specific container, identified by its container ID number. Faster than using the web console if you're already at the host's terminal. |
docker ps | Run inside the container to list running Docker containers. Useful for confirming Excalidraw's container is actually up. |
Common Errors
"Connection refused" when opening the IP in your browser. Usually means the container is still finishing its Docker pull, or you copied the IP down wrong. Give it another minute, then double-check with pct list on the host.
The script hangs at "Installing Docker." This is almost always a DNS or internet problem on the container itself, not the script. Enter the container and try ping deb.debian.org to confirm it has outbound access.
Script fails with a permission or storage error partway through. Check that the storage you picked during Advanced setup actually has free space. Community-scripts installs default to whatever storage is marked as available for container templates in your Proxmox storage config.
Page loads but the canvas is blank white with no toolbar. This is typically a browser caching issue after a reinstall, not a real Excalidraw problem. Hard refresh with Ctrl+Shift+R (Cmd+Shift+R on a Mac).
Troubleshooting
If the container built successfully but the app itself won't load, start inside the container rather than guessing from the Proxmox host. Get in with pct enter <CTID> using the container ID shown in the Proxmox UI, then run:
docker ps
You should see an Excalidraw container listed with a status of "Up." If it's missing entirely, check what happened with:
docker ps -a
That shows stopped containers too, along with an exit code. An exit code that isn't 0 usually points to a port conflict or a resource limit — the container ran out of RAM trying to start, for instance. If you picked a very small RAM allocation during Advanced setup, bump it up with pct set <CTID> -memory 2048 from the Proxmox host, then reboot the container.
If Docker itself won't start inside the container, check that the container isn't unprivileged in a way that blocks nested containerization — the community script sets this up correctly by default, so this mostly comes up if someone manually recreated the container later with different settings.
Best Practices
A few things worth doing once the install is working, not just leaving it as-is:
- Set a static IP. DHCP is fine to get started, but if your router reassigns addresses, you'll lose track of where Excalidraw lives. Set a static lease in your router, or a static IP inside the container's network config.
- Put it behind a reverse proxy. If you're already running something like Nginx Proxy Manager, giving Excalidraw a real hostname like
draw.home.labbeats remembering an IP and port. - Take a snapshot before you tinker. Container snapshots on Proxmox are fast and cheap. Take one before you mess with the Docker config, so you can roll back instantly if something breaks.
- Don't expose it to the internet directly. There's no built-in authentication on the base install. If you want remote access, put it behind Tailscale, WireGuard, or a reverse proxy with its own auth layer — not a raw port forward.
- Keep it updated occasionally. The community script includes an update option if you re-run it against an existing container — it'll detect the install and offer to update rather than create a duplicate.
Frequently Asked Questions
Does self-hosted Excalidraw support real-time collaboration like the public site?
Yes, the collaboration feature works the same way, but it depends on your Docker Compose setup including the collaboration backend service. The default community-scripts install includes it.
Will my drawings be saved automatically?
Excalidraw saves your work to the browser's local storage by default, plus the server if you're signed into a collaboration session. It's not a full cloud-sync system — export your important diagrams as .excalidraw or PNG files if you want a permanent copy.
Can I run this on a Raspberry Pi instead of a full Proxmox server?
The Docker image itself will run on ARM hardware, but this specific guide is written for Proxmox VE on x86. You'd need a different install path on a Pi.
How much RAM does it actually need day to day?
In practice, well under the 3072 MB default once it's idle. That default gives headroom for the Docker daemon plus a handful of simultaneous users — you can trim it down later if you're watching resources closely.
Is this the same thing as installing Excalidraw with plain Docker on any Linux box?
Functionally yes — the community script just automates creating the LXC container and running the same Docker setup inside it, so you don't have to do it by hand.
Conclusion
Ten minutes, one script, and you've got a private whiteboard running on hardware you actually control. It's a small project compared to setting up a full media server or a cluster, but it's the kind of thing that quietly becomes part of your daily workflow once it's there — sketching out a VLAN layout, mapping a backup strategy, or just thinking through a project before you commit to it.
If you're new to LXC containers, this is also a decent one to practice on. Low stakes, fast to rebuild, and you'll walk away more comfortable with pct commands and the Proxmox console than you were an hour ago.