Local-first task system

Your tasks, local-first.
Terminal to phone.

A sync server and native iOS app built for TaskWarrior. Use it standalone or connect to your own server. Your data stays yours, your CLI doesn't change, and your tasks work everywhere.

Your terminal
~ task
$ task sync
Syncing with sync server at https://sync.cmdock.dev

$ task +DUE list

ID  Age Project          Due        Description
--- --- ---------------- ---------- -------------------------
 7  3d  work.api-rewrite 2026-03-31 Fix auth middleware timeout
12  1d  PERSONAL.Family  2026-03-31 School pickup 3:15
14  1w  PERSONAL.Health  2026-03-31 Dentist 2pm
23  2d  oss.cmdock       2026-03-31 Update Docker recipe
 9  5d  PERSONAL.Home    2026-04-03 Call electrician back
31  1d  work.api-rewrite Tomorrow   Review PR #47

6 tasks
$ _
Your phone
cmdock iOS app showing the same tasks — urgency sorted with URGENT and SOON badges

The sync that TW3 has been missing

inthe.am is gone. FreeCinc is gone. WingTask has been working on TW3 support. cmdock is a sync server that speaks the TaskChampion protocol natively — task sync just works. Your .taskrc stays yours.

Read the full ecosystem survey →

Sync server

Self-host with Docker in 5 minutes. Built-in auth, device management, admin CLI, webhooks for automation. All features, no gating.

  • AGPL-3.0
  • Self-host
  • Webhooks

iOS app

Urgency-sorted widgets. Focus mode filtering. Siri Shortcuts and Spotlight search. Offline queue that replays on reconnect. Works standalone or connected. Native SwiftUI.

  • Widgets
  • Siri + Spotlight
  • Offline-first

Android in development. Same server, same sync.

Server AGPL-3.0
iOS Beta
Android In development
Hosted Coming soon
Webhooks Shipped

Sync that just works

Add a task at your desk, see it on your phone. Complete it on the train, it's done in the CLI. No manual sync, no conflicts.

Shows what matters now

Widgets sorted by urgency. Focus mode filters work vs personal automatically. Your shopping list surfaces at the supermarket.

Works offline

No signal? No problem. Changes queue on your device and replay when you reconnect. Reliable on the train, in a dead zone, on a plane.

Your CLI stays untouched

task sync, task add, task next — all the same. The server syncs behind the scenes. No wrapper binary, no plugins to install.

You own your data

Self-host on your own hardware. Server is AGPL-3.0 — full source, all features, no gating. Your tasks never touch infrastructure you don't control.

Automation-ready

Webhooks fire on task changes — wire them to Slack, Home Assistant, or your own scripts. Admin CLI for backups, user management, and diagnostics.

Native iOS, not a web wrapper

Urgency-sorted task lists. Swipe to complete. Context-aware filtering by Focus mode. Offline queue that replays on reconnect.

cmdock widget on iPhone home screen showing due tasks Home screen widget
cmdock iOS app — add task with project, priority, due date presets Quick add with presets
cmdock iOS app — swipe to complete a task Swipe to complete

Server to sync in 5 minutes

deploy
# Pull image and start (~45 MB, HTTPS cert provisions on first request)
$ mkdir cmdock && cd cmdock
$ cat > compose.yaml <<'YAML'
services:
  server:
    image: ghcr.io/cmdock/server:v0.2.0
    restart: unless-stopped
    volumes:
      - server-data:/app/data
    expose: ["8080"]
    environment:
      CMDOCK_MASTER_KEY: ${CMDOCK_MASTER_KEY}
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports: ["80:80", "443:443"]
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy-data:/data
    depends_on: [server]
volumes:
  server-data:
  caddy-data:
YAML
$ cat > Caddyfile <<'CADDY'
sync.yourdomain.com {
  reverse_proxy server:8080
}
CADDY
$ export CMDOCK_MASTER_KEY=$(openssl rand -hex 32)
$ docker compose up -d
✓ Server running. HTTPS cert will provision on first request (~30s).

# Create your account
$ docker compose exec server cmdock-server admin user create --username alice
User created:
  ID:       15f6fc60-28b6-4741-bb7a-f715d0c914de
  API token: 943202f6e1...d0489a  (save this for the iOS app)

# Provision a device
$ docker compose exec server cmdock-server admin device create 15f6fc60-... --name laptop
Device registered:
  Client ID:          c0c173fd-706d-4c9b-aed2-ca6dde18347c
  Encryption Secret:  89b5db8c4955...a177a375

# Add to ~/.taskrc
$ task config sync.server.url https://sync.yourdomain.com
$ task config sync.server.client_id c0c173fd-706d-4c9b-aed2-ca6dde18347c
$ task config sync.encryption_secret 89b5db8c4955...a177a375
$ task sync
Syncing with sync server at https://sync.yourdomain.com
✓ Sync successful.

Don't want to run a server?

A managed hosted service is coming. Same sync, zero ops — we handle the infrastructure, TLS, backups, and uptime. Self-hosting remains free with all features. The managed service is for people who'd rather not think about servers.

Not available yet. Self-hosted is what ships today.

TestFlight beta is open

The iOS app is available now for external testers. Self-host the server and join the beta — all features, no gating.