{
"version": "3",
"templates": [
{
"type": 1,
"title": "OpenTodo",
"name": "opentodo",
"description": "Open-source, local-first task manager. Works offline and syncs every device from one small container. Source: https://github.com/OpenTodoApp/OpenTodo",
"categories": [
"Productivity"
],
"platform": "linux",
"logo": "https://raw.githubusercontent.com/OpenTodoApp/OpenTodo/main/web/public/pwa-512.png",
"image": "ghcr.io/opentodoapp/opentodo:stable",
"restart_policy": "unless-stopped",
"ports": [
"8080:8080/tcp"
],
"volumes": [
{
"container": "/data"
}
],
"env": [
{
"name": "OPENTODO_SETUP_TOKEN",
"label": "Setup token (optional, 16+ characters)",
"description": "When set, creating the first (owner) account asks for this token, so a server others can reach cannot be claimed by a stranger. Generate one with: openssl rand -hex 16",
"default": ""
},
{
"name": "OPENTODO_BASE_URL",
"label": "Public https address (optional)",
"description": "The https address people open behind a reverse proxy, for example https://todo.example.com. Leave empty when you open OpenTodo by the server's address over plain http: an https value there breaks sign-in.",
"default": ""
},
{
"name": "OPENTODO_ALLOW_SIGNUP",
"label": "Open sign-up",
"description": "true lets anyone who can reach the server create an account. Otherwise the owner invites people.",
"select": [
{
"text": "Closed: the owner invites people",
"value": "false",
"default": true
},
{
"text": "Open to anyone who can reach the server",
"value": "true"
}
]
},
{
"name": "OPENTODO_TRUSTED_PROXIES",
"label": "Trusted proxies (optional)",
"description": "Reverse proxies whose X-Forwarded-For is trusted for the visitor's address: IP addresses or ranges such as 192.0.2.0/24 separated by commas, or cloudflare. Set it only when every request comes through them.",
"default": ""
}
],
"note": "Open http://<your-host>:8080 right after deploying: the first visitor creates the owner account (paste the setup token there if you set one), and sign-up is closed after that. Everything OpenTodo stores is in the /data volume, so back that volume up. On plain http, tasks, sync and sharing work; installing the app, offline use, push notifications and passkeys need https: put a reverse proxy with a certificate in front and set the public https address. Updates: re-pull the stable image (Recreate with Re-pull image). Docs: open-todo.app/docs/self-hosting/portainer"
}
]
}