{"id":15673901,"url":"https://github.com/fornever/praefectus","last_synced_at":"2025-05-06T22:50:37.750Z","repository":{"id":40697545,"uuid":"214844446","full_name":"ForNeVeR/praefectus","owner":"ForNeVeR","description":"Programmable organizer application suite.","archived":false,"fork":false,"pushed_at":"2025-04-28T08:12:39.000Z","size":345,"stargazers_count":16,"open_issues_count":21,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-28T09:37:17.301Z","etag":null,"topics":["fsharp","gtd","gtd-application"],"latest_commit_sha":null,"homepage":"","language":"F#","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/ForNeVeR.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","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":"2019-10-13T15:28:08.000Z","updated_at":"2025-04-28T08:12:40.000Z","dependencies_parsed_at":"2025-04-09T21:28:26.593Z","dependency_job_id":"cc6b12ff-2fe1-4f9a-acbb-f5b35fc2f7ed","html_url":"https://github.com/ForNeVeR/praefectus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForNeVeR%2Fpraefectus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForNeVeR%2Fpraefectus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForNeVeR%2Fpraefectus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForNeVeR%2Fpraefectus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ForNeVeR","download_url":"https://codeload.github.com/ForNeVeR/praefectus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252782467,"owners_count":21803380,"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":["fsharp","gtd","gtd-application"],"created_at":"2024-10-03T15:42:52.125Z","updated_at":"2025-05-06T22:50:37.738Z","avatar_url":"https://github.com/ForNeVeR.png","language":"F#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: 2024-2025 Friedrich von Never \u003cfriedrich@fornever.me\u003e\n\nSPDX-License-Identifier: MIT\n--\u003e\n\nPraefectus [![Status Zero][status-zero]][andivionian-status-classifier]\n==========\n\nPraefectus is a Getting Things Done (GTD) framework that helps to manage your\ntasks.\n\n**⚠ Currently the project is in the planning state, nothing is ready yet.**\n\nGeneral Description\n-------------------\n\nPraefectus is a modern GTD framework that allows you to store the information on\nall sorts of your current tasks, manage them, view their change history, import\nor export from/into various sources.\n\nIt is also a task planning framework: it allows to schedule the tasks and\npredict their real schedule.\n\nIt is mainly distributed as a .NET library (and a bit of configuration and\nprogramming knowledge is required to use it), and offers an optional terminal\nUI (inspired by [Taskwarrior][taskwarrior]) and an API for programmatic access\nto all of its entities.\n\nPraefectus is configured in an unorthodox way: technically, you create your own\napplication that uses the Praefectus API (and configures it accordingly to your\nneeds), and then execute it with your data.\n\nDocumentation\n-------------\n- [Contributor Guide][docs.contributing]\n\n1. [Development Process][docs.1.development-process]\n2. [Configuration][docs.2.configuration]\n3. [Data Storage][docs.3.data-storage]\n4. [Task Ordering][docs.4.task-ordering]\n\n### RFCs\n\n- [Command Line Interface][docs.rfcs.command-line-interface]: an RFC for the\n  issue [#13: Simple UI/UX to navigate the database][issue-13]\n- [Tasks and Attributes][docs.rfcs.tasks-and-attributes]: an RFC for the issue\n  [#6: Foundational concept design: task attributes][issue-06]\n- [Version Control][docs.rfcs.version-control]: an RFC for the issue\n  [#7: Foundational concept design: version control][issue-07]\n\nPrerequisites\n-------------\n\nPraefectus is a .NET 9.0 library.\nTo use it on your own, [.NET 9.0 SDK][dotnet.download] is required.\n\nBuild\n-----\n\nTo build the library, tests and the example application, run the following\ncommand in the terminal:\n\n```console\n$ dotnet build --configuration Release\n```\n\nSetting Up Your Project\n-----------------------\n\nSee the example application that is built on Praefectus in [the\n`Praefectus.Example` directory][praefectus.example]. See [the corresponding\ndocumentation section][docs.2.setting-up-your-project] on details.\n\nConfigure\n---------\n\nBy default, Praefectus will use the `praefectus.json` file found in the same\ndirectory as the executable file. Default configuration distributed alongside\nthe console client will only set up the logging framework. See more information\nin [the configuration documentation][docs.2.configuration].\n\nRun\n---\n\nSee the [command line interface][docs.rfcs.command-line-interface] documentation\non possible arguments that may be passed to the application that's built on\nPraefectus; pass `--help` to see the option list.\n\nTo start the example application in the development mode, run the following\ncommand in the terminal:\n\n```console\n$ dotnet run --project Praefectus.Console -- [arguments…]\n```\n\nTest\n----\n\nTo execute the automatic test suite, run the following command in the terminal:\n\n```console\n$ dotnet test --configuration Release\n```\n\nQuestions\n---------\n\n### Why not Taskwarrior?\n\nPraefectus is very much inspired by Taskwarrior in many of its features. But,\nwhile it's very good, Taskwarrior lacks some main features I'd like to see in a\nGTD application:\n\n1. It should be cross-platform. I'm sorry, but \"POSIX-only\" is not\n   cross-platform. It is hard to use on Windows, while it shouldn't be.\n2. I would like to add thorough notes for every task. Taskwarrior allows adding\n   annotations, but these aren't very convenient.\n3. Repeated task functionality in Taskwarrior is a bit messy (in how it handles\n   dates: e.g. `wait` date will move together with the new tasks, but the\n   `scheduled` one won't).\n4. Taskwarrior offers a very centralized way to manage the tasks. If you have\n   multiple devices, then you'll have to either use a file synchronization\n   software to manage these or set up the Taskserver.\n5. Taskserver is aggressively non-cross-platform, I wasn't able to run it on my\n   computers at all.\n6. Taskwarrior has no convention of task progress: you can't say to it that this\n   task is 90% done so probably it'll take less time to finish it.\n7. Taskwarrior is not a planning application. It has no good schedule view to\n   show the upcoming tasks.\n8. The task constraints (e.g. `due`) are non-transitive: if my task with\n   `due=tomorrow` depends on some other tasks with no constrains, Taskwarrior\n   won't tell me about it (aside from slightly increasing these tasks' urgency).\n9. Taskwarrior doesn't offer an embedded periodic import/export capabilities\n   (e.g. to sync with GitHub or some other task/issue lists).\n10. Taskwarrior \"API\" (the command line one) is not the best: e.g. it has no\n    easy way to deal with the escapes in the Windows' command line (this\n    significantly complicates its usage from other programs on that particular\n    platform).\n11. Taskwarrior doesn't perform automatic backups (believe or not, I have\n    developed a habit of backing up all of my task files every morning, and it\n    saved me a lot of times).\n\nOverall, Taskwarrior is a very good application, and I recommend it to you. But\nit doesn't solve **all** of my needs, and thus I've decided to develop a GTD\napplication that will try to do it.\n\nMany of these issues may be solved by developing additional habits, writing\nscripts, shell aliases or via various automation, I agree with that. But the\nfact is that Taskwarrior doesn't offer these tools out-of-the-box — and it is\narguable whether it should or not; we'll see!\n\nFeatures\n--------\n\n### Cross-platform\n\nPraefectus is written in .NET and runs on any platform supported by .NET.\n\n### User interface\n\nPraefectus has a query tool (Taskwarrior-like), and a Text UI dashboard\napplication that runs in any terminal.\n\n### Decentralized\n\nPraefectus supports various decentralized update scenarios via the concept of\n_nodes_: these nodes may not all be directly connected, but will still deliver\ntasks to the user.\n\n### Automated import\n\nWhile most of Praefectus _nodes_ are Praefectus application instances running\nover various devices or over the network, some of them are _programmatic_ ones:\nfor example, all GitHub issues for one particular user may be considered as\nbeing managed by one _node_, your internal homegrown bugtracker is another one,\na directory with a bunch of markdown notes, a Git repository with backups,\nliterally any API could be a Praefectus node.\n\nPraefectus knows a task history for each node, and it will allow multiple nodes\nto manage single issue. Conflict resolution is sometimes performed automatically\nand is sometimes up to the user. For example, you may import a GitHub issue,\nthen add some annotations to it, change its status and then export it back:\ndepending on your settings, the status may be synchronized back to GitHub (e.g.\nan issue will be closed), and your annotations may be left on a Praefectus node\nthat authored them.\n\n### Automated export\n\nSome nodes may support Praefectus export, so it will automatically flow the\nchanges to these nodes.\n\n### Task history\n\nEach node has its own history for every task. Conflicts are inevitable in a\ndecentralized world, so Praefectus allows you to manage them in case they occur.\nOut-of-band conflict resolution (either in Praefectus itself or in any external\nmerge tool) is supported.\n\n### Task management\n\nStart tasks, merge tasks from different sources, annotate your tasks: anything\nyou expect to see in a good task management application is here in Praefectus.\n\n### (A bit of) artificial intelligence\n\nPraefectus tries to be useful with some small AI components in it: it will try\nto derive the tasks' completion percents and task estimation based on simple\nmachine learning algorithms. Everything it presumes then should be approved by\na human, so don't worry, machines aren't (yet) going to take over your tasks.\n\n### Task progress\n\nPraefectus is aware of the task progress: task may be 50% done — and Praefectus\nknown about your cognitive bias in estimating the progress, thanks to AI!\n\nPraefectus also allows you to specify the task _value_, and it will try to\nmaximize the value you gather when making your schedule.\n\n### Programmable\n\nPraefectus has good APIs for both external programs and internal scripts.\n\n### Schedules\n\nPraefectus uses some small achievements of the modern theory of economy to\nmanage the schedules: it shows critical paths in solving the tasks,\nautomatically applies transitive constraints, has an ability to show Gantt(-ish)\ncharts.\n\n### Delegation\n\nPraefectus supports some small bits of multi-actor task management: you may mark\nyour tasks as delegated to someone else, manage and control their work load and\ntheir schedules. Praefectus is still a personal task management application, not\nan enterprise one. But in our daily work/life, we often have to delegate some\nwork, and Praefectus is aware of it.\n\n### Fun\n\nIt is a mandatory detail that working on the Praefectus project should be fun.\nAnd I hope it will be fun to work _with_ Praefectus for the users.\n\nLicense\n-------\nThe project is distributed under the terms of [the MIT license][docs.license].\n\nThe license indication in the project's sources is compliant with the [REUSE specification v3.3][reuse.spec].\n\n[andivionian-status-classifier]: https://github.com/ForNeVeR/andivionian-status-classifier#status-zero-\n[docs.1.development-process]: docs/1.development-process.md\n[docs.2.configuration]: docs/2.configuration.md\n[docs.3.data-storage]: docs/3.data-storage.md\n[docs.4.task-ordering]: docs/4.task-ordering.md\n[docs.contributing]: CONTRIBUTING.md\n[docs.license]: LICENSE.txt\n[docs.rfcs.command-line-interface]: docs/rfcs/command-line-interface.md\n[docs.rfcs.tasks-and-attributes]: docs/rfcs/tasks-and-attributes.md\n[docs.rfcs.version-control]: docs/rfcs/version-control.md\n[dotnet.download]: https://dotnet.microsoft.com/download\n[issue-06]: https://github.com/ForNeVeR/praefectus/issues/6\n[issue-07]: https://github.com/ForNeVeR/praefectus/issues/7\n[issue-13]: https://github.com/ForNeVeR/praefectus/issues/13\n[praefectus.example]: Praefectus.Example\n[reuse.spec]: https://reuse.software/spec-3.3/\n[status-zero]: https://img.shields.io/badge/status-zero-lightgrey.svg\n[taskwarrior]: https://taskwarrior.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffornever%2Fpraefectus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffornever%2Fpraefectus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffornever%2Fpraefectus/lists"}