taskchampion-sync-server

taskchampion-sync-server

Docker app from UnraidUser-3609265787's Repository

Overview

TaskChampion Sync Server is the official sync backend for Taskwarrior 3.x. It allows tasks to be synchronised across multiple devices. Task data is encrypted client-side — the server never sees plaintext. IMPORTANT: you must set Client ID(s) before the container will start. The upstream taskchampion-sync-server provides no HTTP authentication by design; access control is via UUID allowlisting only. For internet-facing deployments, place this behind a reverse proxy with HTTP Basic Auth (e.g. Nginx Proxy Manager).

TaskChampion Sync-Server

TaskChampion is the task database Taskwarrior uses to store and sync tasks. This repository implements a sync server against which Taskwarrior and other applications embedding TaskChampion can sync.

Status

This project provides both pre-built images for common use-cases and Rust libraries that can be used to build more sophisticated applications. See the documentation for more on how to use this project.

Repository Guide

The repository is comprised of four crates:

  • taskchampion-sync-server-core implements the core of the protocol
  • taskchampion-sync-server-storage-sqlite implements an SQLite backend for the core
  • taskchampion-sync-server-storage-postgres implements a Postgres backend for the core
  • taskchampion-sync-server implements a simple HTTP server for the protocol

Building From Source

Installing Rust

TaskChampion Sync-Server build has been tested with current Rust stable release version. You can install Rust from your distribution package or use rustup.

rustup default stable

The minimum supported Rust version (MSRV) is given in Cargo.toml. Note that package repositories typically do not have sufficiently new versions of Rust.

If you prefer, you can use the stable version only for installing TaskChampion Sync-Server (you must clone the repository first).

rustup override set stable

Building TaskChampion Sync-Server

To build TaskChampion Sync-Server binary simply execute the following commands.

git clone https://github.com/GothenburgBitFactory/taskchampion-sync-server.git
cd taskchampion-sync-server
cargo build --release

After build the binary is located in target/release/taskchampion-sync-server.

Building the Postgres Backend

The storage backend is controlled by Cargo features postres and sqlite. By default, only the sqlite feature is enabled. To enable building the Postgres backend, add --features postgres. The Postgres binary is located in target/release/taskchampion-sync-server-postgres.

Building the Docker Images

To build the images, execute the following commands.

SQLite:

docker build \
  -t taskchampion-sync-server \
  -f Dockerfile-sqlite .

Postgres:

source .env
docker build \
  -t taskchampion-sync-server-postgres \
  -f Dockerfile-postgres .

Now to run it, simply exec.

docker run -t -d \
  --name=taskchampion \
  -p 8080:8080 \
  taskchampion-sync-server

This starts TaskChampion Sync-Server and publishes port 8080 to the host. Please note that this is a basic run, all data will be destroyed after stop and delete container. You may also set DATA_DIR, CLIENT_ID, or LISTEN with -e, e.g.,

docker run -t -d \
  --name=taskchampion \
  -e LISTEN=0.0.0.0:9000 \
  -p 9000:9000 \
  taskchampion-sync-server

Install taskchampion-sync-server on Unraid in a few clicks.

Find taskchampion-sync-server in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for taskchampion-sync-server Review the template variables and paths Click Install

Requirements

Clients must use Taskwarrior 3.0 or any app implementing the TaskChampion sync protocol. Before starting the container, generate a UUID for each device with `uuidgen` and add them all to the Client ID(s) field. Each Taskwarrior client also needs a shared encryption secret (never sent to the server).

Related apps

Details

Repository
ghcr.io/furan917/taskchampion-sync-server:latest
Last Updated2026-07-17
First Seen2026-05-16

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false
Extra Params
--restart=unless-stopped

Template configuration

WebUI PortPorttcp

Host port mapped to the container's internal port 8080. Default is 8007 to avoid conflicts with common Unraid services.

Target
8080
Default
8007
Value
8007
DataPathrw

Persistent storage for the SQLite task database.

Target
/var/lib/taskchampion-sync-server
Default
/mnt/user/appdata/taskchampion-sync-server
Value
/mnt/user/appdata/taskchampion-sync-server
PUIDVariable

UID the server process runs as. Defaults to Unraid's nobody user (99). Change to match your user ID on other systems (run `id` to find it).

Default
99
Value
99
PGIDVariable

GID the server process runs as. Defaults to Unraid's users group (100). Change to match your group ID on other systems (run `id` to find it).

Default
100
Value
100
Client ID(s)Variable

Required. UUID(s) allowed to sync. Comma-separated for multiple devices (e.g. uuid1,uuid2). Generate a UUID with `uuidgen` on Linux/Mac or use an online generator. The container will not start without this.

Target
CLIENT_ID
No Create ClientsVariable

Set to true to prevent new clients from registering after initial setup. Only useful after all your devices have synced at least once — enabling this before first sync will block even allowed clients.

Target
NO_CREATE_CLIENTS
Default
false
Value
false
Listen AddressVariable

Address and port the server binds to inside the container. Only change this if you also adjust the container port above.

Target
LISTEN
Default
0.0.0.0:8080
Value
0.0.0.0:8080