{"id":20384975,"url":"https://github.com/d-e-s-o/notnow","last_synced_at":"2025-04-12T09:33:18.572Z","repository":{"id":57645872,"uuid":"136279408","full_name":"d-e-s-o/notnow","owner":"d-e-s-o","description":"A terminal based task and TODO management software.","archived":false,"fork":false,"pushed_at":"2024-05-07T13:15:39.000Z","size":1533,"stargazers_count":29,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-05-21T19:27:09.032Z","etag":null,"topics":["rust","terminal-based","todoapp","todolist"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/d-e-s-o.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2018-06-06T05:58:54.000Z","updated_at":"2024-05-31T16:08:29.853Z","dependencies_parsed_at":"2024-01-09T05:29:30.982Z","dependency_job_id":"95dd69e8-7990-41e0-a826-333490829a99","html_url":"https://github.com/d-e-s-o/notnow","commit_stats":{"total_commits":548,"total_committers":2,"mean_commits":274.0,"dds":0.005474452554744547,"last_synced_commit":"be17c8ca1287510d336080aa23484483619ba4a0"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-e-s-o%2Fnotnow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-e-s-o%2Fnotnow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-e-s-o%2Fnotnow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-e-s-o%2Fnotnow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/d-e-s-o","download_url":"https://codeload.github.com/d-e-s-o/notnow/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248546006,"owners_count":21122244,"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":["rust","terminal-based","todoapp","todolist"],"created_at":"2024-11-15T02:31:05.283Z","updated_at":"2025-04-12T09:33:18.532Z","avatar_url":"https://github.com/d-e-s-o.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"[![pipeline](https://github.com/d-e-s-o/notnow/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/d-e-s-o/notnow/actions/workflows/test.yml)\n[![coverage](https://codecov.io/gh/d-e-s-o/notnow/branch/main/graph/badge.svg)](https://codecov.io/gh/d-e-s-o/notnow)\n[![crates.io](https://img.shields.io/crates/v/notnow.svg)](https://crates.io/crates/notnow)\n[![rustc](https://img.shields.io/badge/rustc-1.66+-blue.svg)](https://blog.rust-lang.org/2022/12/15/Rust-1.66.0.html)\n\nnotnow\n======\n\n- [Changelog](CHANGELOG.md)\n\n**notnow** is a terminal based task/TODO management program.\n\nTwo of its overarching goals are to allow for tag based filtering of\ntasks, along with fully user-definable tags and views, and to support\nserver based synchronization of iCalendar-style TODO items as per [RFC\n5545][rfc-5545] using the CalDAV protocol as specified by [RFC\n4791][rfc-4791].\n\n\nStatus\n------\n\n**notnow** is being used actively on a day-to-day basis, without any\nknown issues. Most of the desired functionality exists, but not\neverything is hooked up to the UI yet:\n\n- tag based filtering is implemented and fully functionally, but not all\n  aspects of it are available through the UI\n- the program stores tasks as iCalendar TODO items\n  - it loosely follows the [Vdir storage format][vdir-format], enabling\n    task synchronization between different systems via [vdirsyncer][]\n  - \"native\" CalDAV support without a Python dependency is considered,\n    but there exist no immediate plans to get there\n\n\nConfiguration\n-------------\n\nThe program stores its configuration below `$XDG_CONFIG_HOME/notnow/`\n(which most commonly defaults to `~/.config/notnow/`). Configuration is\ntwo-fold:\n- `notnow.json` is a JSON file storing basic program state such as\n  colors and views (\"tabs\") to display\n  - when not present, defaults are being used\n  - this file will be auto-created with the default contents once the\n    user saves data from within the program (see below)\n- `tasks/` is a folder comprised of files for individual tasks\n  - the file `00000000-0000-0000-0000-000000000000` is special and\n    contains task meta data such as tag information\n  - the program takes care of creating said files as tasks are added\n\n*Note*: If you were a user of **notnow** in version `0.2.*` and want to\ncarry managed tasks and configuration over to version `0.3`, the script\nat [var/config-conversion-v02-to-v03.sh](var/config-conversion-v02-to-v03.sh)\nmay be of help.\n\n### vdirsyncer\n\nIf you would like to synchronize tasks with your CalDAV enabled calendar\nand/or share one set of tasks between different systems running\n**notnow**, [vdirsyncer][] is the recommended way to go about that.\n\nHere is a configuration template that specifies relevant settings, along\nwith some opinionated ones (typically stored at\n`$XDG_CONFIG_HOME/vdirsyncer/config`):\n\n```ini\n[general]\nstatus_path = \"~/\u003csome-path\u003e/vdirsyncer-state/status/\"\n\n[pair todos]\na = \"todos_remote\"\nb = \"todos_local\"\ncollections = [\"from a\", \"from b\"]\nconflict_resolution = [\"command\", \"nvim\", \"-d\"]\n\n[storage todos_remote]\ntype = \"caldav\"\nitem_types = [\"VTODO\"]\nurl = \"https://\u003curl-to-calendar\u003e\"\nusername = \"\u003cusername\u003e\"\npassword.fetch = [\"command\", \"sh\", \"-c\", \"pass \u003ccalendar-provider-entry\u003e | head -n1\"]\nread_only = false\n\n[storage todos_local]\ntype = \"filesystem\"\npath = \"~/\u003csome-path\u003e/vdirsyncer-state/todos/\"\nfileext = \"\"\nencoding = \"utf-8\"\n```\n\nPlease refer to its [documentation][vdirsyncer-config] for additional\ndetails.\n\nWith the configuration in place, once you `vsyncdir discover`, create a\nsymbolic link below `~/\u003csome-path\u003e/vdirsyncer-state/todos/` replacing\nthe automatically created subfolder with a reference to\n`$XDG_CONFIG_HOME/notnow/tasks/`. Next, synchronize tasks using\n`vsyncdir sync`.\n\nPlease note that task synchronization should happen before or after\nrunning **notnow**, to prevent collisions with changes happening\nconcurrently from the program.\n\n\nUsage\n-----\n\nBeing terminal based, **notnow** is controlled through its UI as opposed\nto command line parameters. The program aims to mirror Vi style bindings\nwhere that is possible. The key bindings are as follows:\n\n| Key(s) | Function                                 |\n|--------|------------------------------------------|\n| a      | Add a new task                           |\n| e      | Edit selected task's summary             |\n| t      | Edit selected task's tags                |\n| d      | Delete selected task                     |\n| y      | Copy the selected task                   |\n| p      | Paste a previously copied task           |\n| j      | Move task selection down                 |\n| k      | Move task selection up                   |\n| J      | Move selected task down                  |\n| K      | Move selected task up                    |\n| g      | Select first task on the current tab     |\n| G      | Select last task on the current tab      |\n| Space  | Toggle completion state of selected task |\n| h      | Select tab to the left                   |\n| l      | Select tab to the right                  |\n| H      | Move tab to the left                     |\n| L      | Move tab to the right                    |\n| 1-9    | Select tab #x                            |\n| 0      | Select last tab                          |\n| `      | Select previous tab                      |\n| /      | Start task search forward                |\n| ?      | Start task search backward               |\n| n      | Continue task search forward             |\n| N      | Continue task search backward            |\n| *      | Start forward search for currently       |\n|        | selected task on other views             |\n| Return | Accept text input / Edit task details    |\n| Esc    | Cancel text input                        |\n| w      | Save tasks to file                       |\n| q      | Quit program                             |\n\nIn addition, when inputting text (e.g., when **a**dding or **e**diting a\ntask), the backspace, delete, home, end, and left and right cursor keys\nhave functions similar to those they carry most commonly.\n\nThe program has support for [`libreadline`][libreadline] style task\ninput, when built with the `readline` feature flag enabled. That is,\nwhen entering actual text (as opposed to just pressing a key to, say,\nselecting a different task), `libreadline` bindings will be honored.\n\n\nExample\n-------\n\nIf you are just interested in trying out the program with some\nprogrammatically created tasks, you can use the existing example:\n```sh\n$ cargo run --example=with-test-data --features=test\n```\n\nNote that if saved, tasks will be stored in a temporary directory and\nnot overwrite user-specific configuration mentioned above.\n\n\n[rfc-4791]: https://tools.ietf.org/html/rfc4791\n[rfc-5545]: https://www.rfc-editor.org/rfc/rfc5545\n[vdir-format]: http://vdirsyncer.pimutils.org/en/stable/vdir.html\n[vdirsyncer]: https://github.com/pimutils/vdirsyncer\n[vdirsyncer-config]: http://vdirsyncer.pimutils.org/en/stable/index.html\n[libreadline]: https://tiswww.case.edu/php/chet/readline/readline.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd-e-s-o%2Fnotnow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fd-e-s-o%2Fnotnow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd-e-s-o%2Fnotnow/lists"}