Open source · AGPL-3.0 · Self-hosted

Your tasks.
Your server.

An open-source, local-first task manager you host yourself. Everything you expect from a polished task app, without the subscription, the tracking or the lock‑in.

Go ahead, it works. Press q to add a task, j/k to move, c to complete.

todo.your-server.com Synced

Today

+ q
    0MB static binary
    0SQLite file holds everything
    0trackers inside the app
    0usable offline

    Why OpenTodo

    The comfort of a commercial app.
    The freedom of software you run.

    Local-first, for real

    Every device keeps a full copy of your tasks. The app opens instantly, works on a plane, and syncs the moment it sees your server again.

    Keyboard-first

    Capture, triage and finish without touching the mouse, or switch on Vim mode. Try the keys below.

    Your data, one folder

    A single SQLite file in one volume. Scheduled backups to a folder, S3 or WebDAV; JSON export any time.

    Tiny footprint

    One distroless container, no database server, no Redis. Happy on a Raspberry Pi or the cheapest VPS.

    Private by design

    The app talks only to your server. No telemetry, no crash reporters, no third-party fonts. The server calls out only to what you configure.

    Plan the day, not just the list

    Estimates on every task, Day and Week calendars with time blocks, reminders with web push, and recurring rules you can read.

    Share with your people

    Invite your household or team to your server. Share projects as viewer, editor or admin; assign tasks, comment, @mention, follow the activity.

    Locked down when you need it

    Two-factor codes, passkeys, single sign-on, an audit log, and optional end-to-end encryption so the server only sees ciphertext.

    An API that's a first-class citizen

    REST endpoints and API tokens write through the same op log as the app. Create a task with curl and watch it land on your phone within a second or two. CalDAV, webhooks, a CLI and a read-only MCP endpoint build on the same data.

    # add a task from a script
    curl -X POST $OPENTODO/api/v1/tasks \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"title":"Renew passport","priority":1}'

    Built in the open, with specs

    Every feature started as an OpenSpec change. Behaviour is written down before it is built, so you can read exactly how it works.

    Sync that just converges

    Edit anywhere. Offline.
    Never pick a version again.

    Every change is a tiny operation on one field, stamped with a hybrid logical clock. Devices queue them while offline and exchange them when they reconnect. The same rule runs everywhere, so every device lands on the same state. Play with it:

    Toggle Wi-Fi on a device, change something, then reconnect.

    💻 Laptop Synced
      Your server 0 ops
      📱 Phone Synced

        Tip: click a task title to rename it, click the circle to complete it.

        What you get today

        Everything a task app needs.
        Nothing that phones home.

        Real screenshots of the app, seeded with demo data. Pick a chapter, then a feature.

        Today view: an Overdue group above today's tasks with times, estimates, labels and projects
        Today view on a phone in dark mode
        Task detail panel on a phone

        At home on a phone

        The same app, the same offline copy of your data. The detail panel slides over the list; the sidebar tucks behind a menu. Share pages into it from the share sheet or the browser extension. No app store, no account on anyone else's server.

        • Owner account on first visit, sign-up closed afterwards
        • Live sync between devices, offline edits upload on reconnect
        • Command-line client and REST API with tokens
        • JSON / CSV import, JSON export any time

        The honest comparison

        Rent your to‑do list,
        or own it.

        Typical subscription appOpenTodo
        PriceMonthly, foreverFree. A €4 VPS runs it
        Where your data livesTheir serversYour server, one SQLite file
        Works offlineDepends on the planFully, on every device
        TrackingAnalytics in the appNone. Zero requests elsewhere
        If the company disappearsSo do your tasksNothing happens
        Source codeClosedAGPL-3.0, on GitHub

        Self-host in 2 minutes

        One container.
        Zero required config.

        Point Coolify at the repository, or run one command. Open the URL, create the owner account, done. Updates are a redeploy; migrations run on start.

        • Automatic HTTPS with Coolify
        • Health check built into the binary
        • Sign-up closed after the owner account
        • Back up one volume, restore anywhere
        # In Coolify: + New Resource → Public Repository
        Repository  https://github.com/pixari/opentodo
        Branch      main
        Build pack  Dockerfile
        Port        8080
        Storage     volume → /data
        # Add your domain, press Deploy. That's it.

        Stop renting your to‑do list.

        Deploy OpenTodo tonight. Your tasks will still be yours in ten years.