Running OpenTodo on a Raspberry Pi
The whole household's task list on a device the size of a deck of cards, for a few watts. What to buy, how to start it, and how to keep the data safe.
Last reviewed
A Raspberry Pi is the cheapest server most people will ever run, and OpenTodo is small enough to be happy on it.
What you need
- A Raspberry Pi with a 64-bit system (Raspberry Pi OS 64-bit on a Pi 4 or 5, 1 GB of memory or more). OpenTodo publishes its image for
arm64, so it runs there without any special build. Resource usage - Docker installed on it, following Docker’s own instructions for Raspberry Pi OS.
- A way for your phones to reach it from outside the house, if you want that: a domain and a reverse proxy with HTTPS, or a private network such as Tailscale between your devices. Installing the app and push notifications need an
https://address. Behind a reverse proxy
Start it
- Create a folder for the data and give it to the user the container runs as:
mkdir -p ./data && sudo chown 65532:65532 ./data. Bind mounts - Start the container with that folder mounted at
/data, port 8080 published, andOPENTODO_BASE_URLset to the address your phones will use. Plain docker run - Open the address. The first visitor creates the owner account, and sign-up closes. Docker Compose
- Put a reverse proxy such as Caddy in front for HTTPS, and set
OPENTODO_BASE_URLto the publichttps://address so cookies are secure and passkeys are offered. Behind a reverse proxy
Keep the data safe
SD cards fail. Treat the Pi as the thing that runs OpenTodo, not the thing that keeps your data.
- Turn on scheduled backups to somewhere else: a USB disk mounted into the container, a NAS over WebDAV, or S3-compatible storage. The folder-on-the-server option is on the same card and protects only against mistakes. Destinations
- Restore is one command with the container stopped; try it once on a second card so you know it works. Restore
- Everyone can also download their own data as one file at any time. Download everything
Good to know
- Memory: OpenTodo idles at about 20 MB. A large JSON import peaks higher during its preview; on a 1 GB Pi keep the default import file limit. Memory
- Updates are a pull and a restart, like anywhere else. Updating
- The container’s health check works without curl or a shell, so Docker’s own status is reliable. Health
- If the Pi is only reachable at home, the apps on your phones keep working outside: they hold a full copy and sync when you are back. Offline and sync