Self-hosting

Your instance, your data, your rules

Todo is built to run on your own infrastructure. A single PostgreSQL database (with pgvector), a stateless API, and a container-native deployment.

Get started in three commands

1

Copy the environment template

cp .env.example .env
2

Generate a local TLS certificate

./scripts/gen-certs.sh
3

Bring up the full stack

docker compose up --build

Three containers come up: the database, the API (REST + MCP) and the web (nginx). The app is available at https://todo.mindlog.localhost.

A clean monorepo architecture

Three TypeScript packages, a sharp separation of concerns.

@mindlog/core

The shared domain: Zod schemas, services, repositories, embeddings, RAG and authentication.

@mindlog/server

Express 5 REST API + MCP server + OpenAPI. Migrations run on startup.

@mindlog/web

React 19 + Vite SPA, a pure REST client, served by nginx. No business logic.

Built for data ownership

Solid auth

Argon2-hashed passwords, short-lived JWTs + rotating refresh tokens, optional Google OAuth.

REST API + OpenAPI

A documented canonical interface, Swagger UI served at /docs.

JSON export

Download all of your data whenever you want. No lock-in.

On your server

Docker deployment, in-container TLS, GitHub Actions CI/CD to your host.

Host Todo in minutes

Docker Compose, PostgreSQL + pgvector, automatic migrations. Everything you need is in the repo.