A stupidly simple, self-hosted todo list.
50
A stupidly simple todo list.
Website: todom.lightmorphic.com
Todom is a small, dependency-free todo list. Every task has a due date, active tasks are sorted soonest-first, and completing a task records the completion date.
See CHANGELOG.md for version history.
Todom stores tasks server-side in a single JSON file
(tasks.json), written by a small Node/Express backend. There is
no database and no accounts, just one file. Because storage lives
on the server rather than in the browser, every device that opens
the same URL sees the same task list.
Requires Node.js 20+.
curl -LO https://todom.buildmorphic.com/code/latest.tar.gz
tar -xzf latest.tar.gz
cd todom-v*
npm install
node server.js
Open http://localhost:3000. Tasks are written to tasks.json,
whose location defaults to /data/tasks.json but can be overridden
with the DATA_FILE environment variable, e.g.
DATA_FILE=./tasks.json node server.js.
Note: service workers require HTTPS (localhost is exempt for testing), so offline support and "Add to Home Screen" will only work once this is served over TLS on a real domain.
Pull from Docker Hub
docker pull lightmorphic/todom:latest
sudo mkdir -p /opt/todom
docker run -p 4070:3000 -v /opt/todom:/data lightmorphic/todom:latest
Or build locally
docker build -t todom .
sudo mkdir -p /opt/todom
docker run -p 4070:3000 -v /opt/todom:/data todom
Docker Compose
services:
todom:
image: lightmorphic/todom:latest
container_name: todom
restart: unless-stopped
ports:
- "4070:3000"
volumes:
- /opt/todom:/data
sudo mkdir -p /opt/todom
docker compose up -d
Note: since v1.7.0 the container runs as a non-root user (UID 1000) rather than root. After creating
/opt/todom(or if you're upgrading an existing install), run:sudo chown -R 1000:1000 /opt/todomso the container can write to the mounted data folder. Without this, the container will fail to create or update
tasks.json.
Open http://localhost:4070. Tasks are stored server-side in a JSON
file inside /opt/todom, so every device that opens this URL sees
the same task list.
The image is built on the maintainer's own computer and published to
lightmorphic/todom on Docker Hub
with each release.
todom/
├── public/ # Static frontend served by the app
│ ├── index.html
│ ├── manifest.json
│ ├── service-worker.js
│ ├── todom-logo-small.png
│ └── todom-logo-large.png
├── server.js # Node/Express backend, reads/writes tasks.json
├── package.json
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── .gitignore
└── .github/workflows/docker-publish.yml
Keep it dumb, keep it simple - if you're writing complex code to solve a simple problem here, you're probably doing it wrong.
Todom is free software, licensed under GPL version 3 or any later version. See the LICENSE file for the full text.
This software is provided "as is", without warranty of any kind, express or implied - see the LICENSE file for the exact legal terms. You use it entirely at your own risk.
Comments are stripped from the published code to keep it lean.
Content type
Image
Digest
sha256:ab5abce6f…
Size
54.8 MB
Last updated
about 7 hours ago
docker pull lightmorphic/todom