diff --git a/blueprints/opentodo/docker-compose.yml b/blueprints/opentodo/docker-compose.yml
new file mode 100644
index 000000000..9ae1efd10
--- /dev/null
+++ b/blueprints/opentodo/docker-compose.yml
@@ -0,0 +1,22 @@
+services:
+ opentodo:
+ image: ghcr.io/pixari/opentodo:0.13.0
+ restart: unless-stopped
+ expose:
+ - 8080
+ environment:
+ - OPENTODO_BASE_URL=${OPENTODO_BASE_URL:-}
+ - OPENTODO_SETUP_TOKEN=${OPENTODO_SETUP_TOKEN:-}
+ - OPENTODO_ALLOW_SIGNUP=${OPENTODO_ALLOW_SIGNUP:-false}
+ - OPENTODO_TRUSTED_PROXIES=${OPENTODO_TRUSTED_PROXIES:-}
+ volumes:
+ - opentodo-data:/data
+ healthcheck:
+ test: ["CMD", "/opentodo", "healthcheck"]
+ interval: 30s
+ timeout: 5s
+ retries: 3
+ start_period: 10s
+
+volumes:
+ opentodo-data:
diff --git a/blueprints/opentodo/meta.json b/blueprints/opentodo/meta.json
new file mode 100644
index 000000000..a47b288d5
--- /dev/null
+++ b/blueprints/opentodo/meta.json
@@ -0,0 +1,18 @@
+{
+ "id": "opentodo",
+ "name": "OpenTodo",
+ "version": "0.13.0",
+ "description": "Open-source, local-first task manager. Works offline and syncs every device from one small container.",
+ "logo": "opentodo.svg",
+ "links": {
+ "github": "https://github.com/pixari/opentodo",
+ "website": "https://open-todo.app",
+ "docs": "https://open-todo.app/docs/self-hosting/dokploy/"
+ },
+ "tags": [
+ "productivity",
+ "tasks",
+ "todo",
+ "self-hosted"
+ ]
+}
diff --git a/blueprints/opentodo/opentodo.svg b/blueprints/opentodo/opentodo.svg
new file mode 100644
index 000000000..1df0f6e6d
--- /dev/null
+++ b/blueprints/opentodo/opentodo.svg
@@ -0,0 +1 @@
+
diff --git a/blueprints/opentodo/template.toml b/blueprints/opentodo/template.toml
new file mode 100644
index 000000000..330adb2cb
--- /dev/null
+++ b/blueprints/opentodo/template.toml
@@ -0,0 +1,20 @@
+[variables]
+main_domain = "${domain}"
+setup_token = "${password:32}"
+
+[config]
+mounts = []
+
+[[config.domains]]
+serviceName = "opentodo"
+port = 8080
+host = "${main_domain}"
+
+[config.env]
+# Empty while the domain is plain http (an https value there breaks sign-in).
+# Once the domain has HTTPS, set https:// and redeploy.
+OPENTODO_BASE_URL = ""
+# Asked for when you create the owner account on the first visit.
+OPENTODO_SETUP_TOKEN = "${setup_token}"
+OPENTODO_ALLOW_SIGNUP = "false"
+OPENTODO_TRUSTED_PROXIES = ""