{"id":20027572,"url":"https://github.com/gothenburgbitfactory/taskchampion-sync-server","last_synced_at":"2025-04-12T22:30:58.525Z","repository":{"id":234602956,"uuid":"783481734","full_name":"GothenburgBitFactory/taskchampion-sync-server","owner":"GothenburgBitFactory","description":"The sync server for Taskchampion","archived":false,"fork":false,"pushed_at":"2025-03-15T00:13:27.000Z","size":282,"stargazers_count":96,"open_issues_count":4,"forks_count":15,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-04-04T04:36:42.734Z","etag":null,"topics":["taskchampion","taskwarrior"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GothenburgBitFactory.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-08T01:23:20.000Z","updated_at":"2025-04-02T05:32:58.000Z","dependencies_parsed_at":"2024-04-20T01:40:57.134Z","dependency_job_id":"1c7fffe7-5324-4675-b327-e2b8d06ac7a1","html_url":"https://github.com/GothenburgBitFactory/taskchampion-sync-server","commit_stats":{"total_commits":56,"total_committers":6,"mean_commits":9.333333333333334,"dds":0.5714285714285714,"last_synced_commit":"f3445d558e7f581c251cbc3e11e71deceb2f05a6"},"previous_names":["gothenburgbitfactory/taskchampion-sync-server"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GothenburgBitFactory%2Ftaskchampion-sync-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GothenburgBitFactory%2Ftaskchampion-sync-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GothenburgBitFactory%2Ftaskchampion-sync-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GothenburgBitFactory%2Ftaskchampion-sync-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GothenburgBitFactory","download_url":"https://codeload.github.com/GothenburgBitFactory/taskchampion-sync-server/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248639733,"owners_count":21137897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["taskchampion","taskwarrior"],"created_at":"2024-11-13T09:10:51.069Z","updated_at":"2025-04-12T22:30:58.491Z","avatar_url":"https://github.com/GothenburgBitFactory.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"TaskChampion Sync-Server\n------------------------\n\nTaskChampion is the task database [Taskwarrior][tw] uses to store and sync\ntasks. This repository implements a sync server against which Taskwarrior\nand other applications embedding TaskChampion can sync.\n\n[tw]: https://github.com/GothenburgBitFactory/taskwarrior\n\n## Status\n\nThis repository was spun off from Taskwarrior itself after the 3.0.0\nrelease. It is still under development and currently best described as\na reference implementation of the Taskchampion sync protocol.\n\nIt is comprised of three crates:\n\n - `taskchampion-sync-server-core` implements the core of the protocol\n - `taskchmpaion-sync-server-sqlite` implements an SQLite backend for the core\n - `taskchampion-sync-server` implements a simple HTTP server for the protocol\n\n## Running the Server\n\nThe server is a simple binary that serves HTTP requests on a TCP port. The\nserver does not implement TLS; for public deployments, the recommendation is to\nuse a reverse proxy such as Nginx, haproxy, or Apache httpd.\n\n### Using Docker-Compose\n\nEvery release of the server generates a Docker image in\n`ghcr.io/gothenburgbitfactory/taskchampion-sync-server`. The tags include\n`latest` for the latest release, and both minor and patch versions, e.g., `0.5`\nand `0.5.1`.\n\nThe\n[`docker-compose.yml`](https://raw.githubusercontent.com/GothenburgBitFactory/taskchampion-sync-server/refs/tags/v0.6.1/docker-compose.yml)\nfile in this repository is sufficient to run taskchampion-sync-server,\nincluding setting up TLS certificates using Lets Encrypt, thanks to\n[Caddy](https://caddyserver.com/).\n\nYou will need a server with ports 80 and 443 open to the Internet and with a\nfixed, publicly-resolvable hostname. These ports must be available both to your\nTaskwarrior clients and to the Lets Encrypt servers.\n\nOn that server, download `docker-compose.yml` from the link above (it is pinned\nto the latest release) into the current directory. Then run\n\n```sh\nTASKCHAMPION_SYNC_SERVER_HOSTNAME=taskwarrior.example.com \\\nTASKCHAMPION_SYNC_SERVER_CLIENT_ID=your-client-id \\\ndocker compose up\n```\n\nThe `TASKCHAMPION_SYNC_SERVER_CLIENT_ID` limits the server to the given client\nID; omit it to allow all client IDs.\n\nIt can take a few minutes to obtain the certificate; the caddy container will\nlog a message \"certificate obtained successfully\" when this is complete, or\nerror messages if the process fails. Once this process is complete, configure\nyour `.taskrc`'s to point to the server:\n\n```\nsync.server.url=https://taskwarrior.example.com\nsync.server.client_id=your-client-id\nsync.encryption_secret=your-encryption-secret\n```\n\nThe docker-compose images store data in a docker volume named\n`taskchampion-sync-server_data`. This volume contains all of the task data, as\nwell as the TLS certificate information. It will persist over restarts, in a\ntypical Docker installation. The docker containers will start automatically on\nsystem startup. See the docker-compose documentation for more information.\n\n### Running the Binary\n\nThe server is configured with command-line options. See\n`taskchampion-sync-server --help` for full details.\n\nThe `--listen` option specifies the interface and port the server listens on.\nIt must contain an IP-Address or a DNS name and a port number. This option is\nmandatory, but can be repeated to specify multiple interfaces or ports. This\nvalue can be specified in environment variable `LISTEN`, as a comma-separated\nlist of values.\n\nThe `--data-dir` option specifies where the server should store its data. This\nvalue can be specified in the environment variable `DATA_DIR`.\n\nBy default, the server allows all client IDs. To limit the accepted client IDs,\nspecify them in the environment variable `CLIENT_ID`, as a comma-separated list\nof UUIDs. Client IDs can be specified with `--allow-client-id`, but this should\nnot be used on shared systems, as command line arguments are visible to all\nusers on the system.\n\nThe server only logs errors by default. To add additional logging output, set\nenvironment variable `RUST_LOG` to `info` to get a log message for every\nrequest, or to `debug` to get more verbose debugging output.\n\n## Building\n\n### Building From Source\n\n#### Installing Rust\n\nTaskChampion Sync-Server build has been tested with current Rust stable\nrelease version. You can install Rust from your distribution package or use\n[`rustup`][rustup].\n```sh\nrustup default stable\n```\n\nThe minimum supported Rust version (MSRV) is given in\n[`Cargo.toml`](./Cargo.toml). Note that package repositories typically do not\nhave sufficiently new versions of Rust.\n\nIf you prefer, you can use the stable version only for installing TaskChampion\nSync-Server (you must clone the repository first).\n```sh\nrustup override set stable\n```\n\n[rustup]: https://rustup.rs/\n\n#### Installing TaskChampion Sync-Server\n\nTo build TaskChampion Sync-Server binary simply execute the following\ncommands.\n```sh\ngit clone https://github.com/GothenburgBitFactory/taskchampion-sync-server.git\ncd taskchampion-sync-server\ncargo build --release\n```\n\nAfter build the binary is located in\n`target/release/taskchampion-sync-server`.\n\n### Building the Container\n\nTo build the container execute the following commands.\n```sh\nsource .env\ndocker build \\\n  --build-arg RUST_VERSION=${RUST_VERSION} \\\n  --build-arg ALPINE_VERSION=${ALPINE_VERSION} \\\n  -t taskchampion-sync-server .\n```\n\nNow to run it, simply exec.\n```sh\ndocker run -t -d \\\n  --name=taskchampion \\\n  -p 8080:8080 \\\n  taskchampion-sync-server\n```\n\nThis start TaskChampion Sync-Server and publish the port to host. Please\nnote that this is a basic run, all data will be destroyed after stop and\ndelete container. You may also set `DATA_DIR`, `CLIENT_ID`, or `LISTEN` with `-e`, e.g.,\n\n```sh\ndocker run -t -d \\\n  --name=taskchampion \\\n  -e LISTEN=0.0.0.0:9000 \\\n  -p 9000:9000 \\\n  taskchampion-sync-server\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgothenburgbitfactory%2Ftaskchampion-sync-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgothenburgbitfactory%2Ftaskchampion-sync-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgothenburgbitfactory%2Ftaskchampion-sync-server/lists"}