{"id":32556663,"url":"https://github.com/szaffarano/gotas","last_synced_at":"2025-10-28T22:58:25.976Z","repository":{"id":38315694,"uuid":"408087994","full_name":"szaffarano/gotas","owner":"szaffarano","description":"Taskwarrior server implemented in Go","archived":false,"fork":false,"pushed_at":"2025-08-25T10:38:22.000Z","size":228,"stargazers_count":10,"open_issues_count":8,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-25T12:37:31.887Z","etag":null,"topics":["go","golang","taskd","taskserver","taskwarrior","tls"],"latest_commit_sha":null,"homepage":"","language":"Go","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/szaffarano.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-09-19T09:45:56.000Z","updated_at":"2025-08-25T10:38:24.000Z","dependencies_parsed_at":"2023-12-13T07:25:28.234Z","dependency_job_id":"500ebeaf-685d-46c5-ae03-1eb205c669b5","html_url":"https://github.com/szaffarano/gotas","commit_stats":{"total_commits":43,"total_committers":2,"mean_commits":21.5,"dds":0.2093023255813954,"last_synced_commit":"e7d995b7b944bad6d5803df6e4874217e7797909"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/szaffarano/gotas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/szaffarano%2Fgotas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/szaffarano%2Fgotas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/szaffarano%2Fgotas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/szaffarano%2Fgotas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/szaffarano","download_url":"https://codeload.github.com/szaffarano/gotas/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/szaffarano%2Fgotas/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281527380,"owners_count":26516845,"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","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["go","golang","taskd","taskserver","taskwarrior","tls"],"created_at":"2025-10-28T22:57:46.084Z","updated_at":"2025-10-28T22:58:25.964Z","avatar_url":"https://github.com/szaffarano.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build \nStatus](https://github.com/szaffarano/gotas/workflows/Go%20CI/badge.svg)](https://github.com/szaffarano/gotas/actions?workflow=Go%20CI)\n[![Go Report Card](https://goreportcard.com/badge/github.com/szaffarano/gotas)](https://goreportcard.com/report/github.com/szaffarano/gotas)\n[![codecov](https://codecov.io/gh/szaffarano/gotas/branch/master/graph/badge.svg?token=8UPQNA4E34)](https://codecov.io/gh/szaffarano/gotas)\n![GitHub](https://img.shields.io/github/license/szaffarano/gotas)\n\n# Gotas\n\nGotas is a [task server](https://github.com/GothenburgBitFactory/taskserver/) Go implementation.\n\nIf we already have a mature and fully functional (and official) implementation, why reinvent the wheel then? I've got \ntwo main purposes, the first one is to continue learning Go, and a good way to archive it is by doing real-world \nprojects.  I'm a [Task Warrior](https://github.com/GothenburgBitFactory/taskwarrior/) user and fan, and hence I'll doing \nsomething useful at least for my personal use.  The second reason is that I think it could be interesting to have a \nmultiplatform task server that doesn't have any 3rd party libraries dependency.\n\n## Status\n\nMerge algorithm is fully implemented, tested against different task clients, and \n[comparing](https://github.com/szaffarano/gotas/tree/master/pkg/task/testdata/payloads) \nboth taskd and gotas results. Furthermore, either the configuration files, and \nthe filesystem layout is the same, so technically, switching between taskd and \ngotas is transparent.\n\n| Feature      | Taskd | Gotas |\n|--------------|-------|-------|\n| sync         | ✅    | ✅    |\n| init         | ✅    | ✅    |\n| add user     | ✅    | ✅    |\n| remove user  | ✅    | ✅    |\n| suspend user | ✅    | ❌    |\n| resume user  | ✅    | ❌    |\n| add org      | ✅    | ✅    |\n| remove org   | ✅    | ✅    |\n| suspend org  | ✅    | ❌    |\n| resume org   | ✅    | ❌    |\n| client api   | ✅    | ❌    |\n\n\n## Getting started\n\nDisclaimer: This project is under development. Please **backup** your current \ntask server data directory to avoid any possible data loss.\n\n### Already configured taskd instance\n\nAfter **backing up** your task server data directory, stop taskd and start \ngotas using the same syntax:\n\n```sh\n$ /path/to/gotas server --data /path/to/taskd-data/dir\n```\n\nor using `TASKDDATA` environment variable\n\n```sh\n$ export TASKDDATA=\"/path/to/taskd-data/dir\"\n$ /path/to/gotas server\n```\n\nGotas will read `TASKDDATA/config` file and work as expected.\n\n### Starting from scratch\n\n1. Initialize `gotas` repository:\n\n        $ gotas init --data /path/to/taskd-data/dir\n2. Create an initial PKI setup.  Gotas includes an embedded command to deal with it:\n    1. Create a new CA\n \n            $ gotas pki -p /tmp/pki init\n            INFO    /tmp/pki/ca.pem: created successfully\n            INFO    /tmp/pki/ca.key: created successfully\n        In case you already have an existent CA, just omit this step, and from now on, use the `-p` flag pointing it to \n        the directory where the certificate and private key are located. They have to be named `ca.pem` and `ca.key`.\n        \n    3. Create a new server certificate:\n \n            gotas pki -p /tmp/pki add server -c $(hostname) # or just use any fqdn, or even localhost\n            INFO    /tmp/pki/my-hostname.pem: created successfully\n            INFO    /tmp/pki/my-hostname.key: created successfully\n        You can now configure gotas in the same way taskd, i.e.:\n\n            cat $TASKDDATA/config\n            ca.cert=/tmp/pki/ca.pem\n            server.cert=/tmp/pki/my-hostname.pem\n            server.key=/tmp/pki/my-hostname.key\n    4. Create one or more client certificates to distribute in your clients:\n\n            $ gotas pki -p /tmp/pki add client -c john\n            INFO    /tmp/pki/john.pem: created successfully\n            INFO    /tmp/pki/john.key: created successfully\n3. Start gotas\n\n            $ export TASKDDATA=\"/path/to/taskd-data/dir\"\n            $ /path/to/gotas server\n\n### Limitations\n\n- Be aware that the `--daemon` flag is not implemented yet, so gotas will run \n  in the foreground.  \n- Because gotas only runs foreground, it only logs to stdout and stderr\n- CRL (Certificate Revocation List) validation is not implemented yet, so this \n  configuration will be silently ignored.\n- Gotas does a full client validation (`trust=strict`), which means that this \n  configuration will be ignored as well. Future versions will implement it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fszaffarano%2Fgotas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fszaffarano%2Fgotas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fszaffarano%2Fgotas/lists"}