2024-07-09 14:56:08 +00:00
|
|
|
# mostr
|
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
An immutable nested collaborative task manager, powered by nostr!
|
2024-07-09 14:56:08 +00:00
|
|
|
|
|
|
|
## Quickstart
|
|
|
|
|
2024-07-29 11:20:49 +00:00
|
|
|
First, start a nostr relay, such as
|
|
|
|
- https://github.com/coracle-social/bucket for local development
|
2024-07-29 19:56:30 +00:00
|
|
|
- https://github.com/rnostr/rnostr for production use
|
|
|
|
|
|
|
|
Run development build with:
|
2024-07-09 14:56:08 +00:00
|
|
|
|
2024-07-29 11:20:49 +00:00
|
|
|
cargo run
|
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
A `relay` list and private `key` can be placed in config files
|
|
|
|
under `${XDG_CONFIG_HOME:-$HOME/.config}/mostr/`.
|
|
|
|
Currently, all relays are fetched and synced to,
|
|
|
|
separation is planned -
|
|
|
|
ideally for any project with different collaborators,
|
|
|
|
an own relay will be used.
|
|
|
|
If not saved, mostr will ask for a relay url
|
|
|
|
(entering none is fine too, but your data will not be persisted between sessions)
|
|
|
|
and a private key, alternatively generating one on the fly.
|
|
|
|
Both are currently saved in plain text to the above files.
|
2024-07-29 19:56:30 +00:00
|
|
|
|
|
|
|
Install latest build:
|
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
cargo install --path .
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
Creating a test task externally:
|
|
|
|
`nostril --envelope --content "test task" --kind 1621 | websocat ws://localhost:4736`
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
To exit the application, press `Ctrl-D`.
|
|
|
|
|
|
|
|
## Basic Usage
|
|
|
|
|
|
|
|
### Navigation and Nesting
|
|
|
|
|
|
|
|
Create tasks and navigate using the shortcuts below.
|
2024-08-01 18:40:15 +00:00
|
|
|
Whichever task is active (selected)
|
2024-07-30 18:04:54 +00:00
|
|
|
will be the parent task for newly created tasks
|
|
|
|
and automatically has time-tracking running.
|
|
|
|
To track task progress,
|
|
|
|
simply subdivide the task -
|
|
|
|
checking off tasks will automatically update the progress
|
|
|
|
for all parent tasks.
|
|
|
|
Generally a flat hierarchy is recommended
|
|
|
|
with tags for filtering,
|
|
|
|
since hierarchies cannot be changed.
|
|
|
|
Filtering by a tag is just as easy
|
2024-08-01 18:40:15 +00:00
|
|
|
as activating a task and more flexible.
|
2024-07-30 18:04:54 +00:00
|
|
|
|
|
|
|
Using subtasks has two main advantages:
|
|
|
|
- ability to accumulate time tracked
|
|
|
|
- swiftly navigate between related tasks
|
|
|
|
|
2024-08-10 15:10:40 +00:00
|
|
|
Managing a project with subtasks makes it continuously visible,
|
|
|
|
which is helpful if you want to be able to track time on the project itself
|
|
|
|
without a specific task,
|
2024-07-30 18:04:54 +00:00
|
|
|
Thus subtasks can be very useful for specific contexts,
|
|
|
|
for example a project or a specific place.
|
2024-08-10 15:10:40 +00:00
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
On the other hand, related tasks like chores
|
|
|
|
should be grouped with a tag instead.
|
2024-08-10 15:10:40 +00:00
|
|
|
Similarly for projects which are only sporadically worked on
|
|
|
|
when a specific task comes up, so they do not clutter the list.
|
2024-07-30 18:04:54 +00:00
|
|
|
|
|
|
|
### Collaboration
|
|
|
|
|
|
|
|
Since everything in mostr is inherently immutable,
|
|
|
|
live collaboration is easily possible.
|
|
|
|
After every command,
|
|
|
|
mostr checks if new updates arrived from the relay
|
|
|
|
and updates its display accordingly.
|
|
|
|
|
|
|
|
If a relay has a lot of events,
|
|
|
|
initial population of data can take a bit -
|
|
|
|
but you can already start creating events without issues,
|
|
|
|
updates will be fetched in the background.
|
|
|
|
For that reason,
|
|
|
|
it is recommended to leave mostr running
|
|
|
|
as you work.
|
|
|
|
|
|
|
|
### Time-Tracking
|
|
|
|
|
|
|
|
The currently active task is automatically time-tracked.
|
|
|
|
To stop time-tracking completely, simply move to the root of all tasks.
|
2024-07-24 22:02:26 +00:00
|
|
|
|
|
|
|
## Reference
|
|
|
|
|
2024-07-25 19:40:35 +00:00
|
|
|
### Command Syntax
|
|
|
|
|
2024-07-29 10:37:05 +00:00
|
|
|
`TASK` creation syntax: `NAME: TAG1 TAG2 ...`
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-08-10 15:10:40 +00:00
|
|
|
- `TASK` - create task (prefix with space if you want a task to start with a command character)
|
2024-07-24 22:02:26 +00:00
|
|
|
- `.` - clear filters and reload
|
2024-07-29 10:37:05 +00:00
|
|
|
- `.TASK`
|
2024-08-01 18:40:15 +00:00
|
|
|
+ activate task by id
|
2024-07-29 10:37:05 +00:00
|
|
|
+ match by task name prefix: if one or more tasks match, filter / activate (tries case-sensitive then case-insensitive)
|
|
|
|
+ no match: create & activate task
|
|
|
|
- `.2` - set view depth to `2`, which can be substituted for any number (how many subtask levels to show, default 1)
|
2024-08-01 18:40:15 +00:00
|
|
|
- `/[TEXT]` - like `.`, but never creates a task
|
2024-08-12 20:02:50 +00:00
|
|
|
- `||TASK` - create and activate a new task procedure (where subtasks automatically depend on the previously created task)
|
|
|
|
- `|[TASK]` - (un)mark current task as procedure or create a sibling task depending on the current one and move up
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-08-10 15:10:40 +00:00
|
|
|
Dots and slashes can be repeated to move to parent tasks.
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-08-10 17:48:57 +00:00
|
|
|
- `:[IND][PROP]` - add property column PROP at IND or end, if it already exists remove property column PROP or IND (1-indexed)
|
2024-08-11 09:05:29 +00:00
|
|
|
- `::[PROP]` - Sort by property PROP (multiple space-separated values allowed)
|
2024-08-10 17:48:57 +00:00
|
|
|
- `([TIME]` - insert timetracking with the specified offset in minutes (empty: list tracked times)
|
|
|
|
- `)[TIME]` - stop timetracking with the specified offset in minutes - convenience helper to move to root (empty: stop now)
|
2024-08-12 08:57:21 +00:00
|
|
|
- `>[TEXT]` - complete active task and move up, with optional state description
|
|
|
|
- `<[TEXT]` - close active task and move up, with optional state description
|
|
|
|
- `!TEXT` - set state for current task from text and move up
|
2024-08-01 17:04:56 +00:00
|
|
|
- `,TEXT` - add text note (comment / description)
|
2024-08-10 17:48:57 +00:00
|
|
|
- TBI: `*[INT]` - set priority - can also be used in task, with any digit
|
2024-08-01 17:00:45 +00:00
|
|
|
- `@` - undoes last action (moving in place or upwards or waiting a minute confirms pending actions)
|
2024-08-10 15:10:40 +00:00
|
|
|
- `wss://...` - switch or subscribe to relay (prefix with space to forcibly add a new one)
|
2024-07-25 07:50:53 +00:00
|
|
|
|
2024-07-29 08:15:13 +00:00
|
|
|
Property Filters:
|
|
|
|
|
2024-08-08 10:04:22 +00:00
|
|
|
- `#TAG` - set tag filter (empty: list all used tags)
|
|
|
|
- `+TAG` - add tag filter
|
|
|
|
- `-TAG` - remove tag filters
|
2024-08-10 18:25:46 +00:00
|
|
|
- `?STATUS` - filter by status (type or description) - plain `?` to reset, `??` to show all
|
2024-07-29 08:15:13 +00:00
|
|
|
|
2024-08-10 18:25:46 +00:00
|
|
|
Status descriptions can be used for example for Kanban columns or review flows.
|
|
|
|
An active tag or status filter will also set that attribute for newly created tasks.
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-07-25 19:51:12 +00:00
|
|
|
### Available Columns
|
2024-07-24 22:02:26 +00:00
|
|
|
|
|
|
|
- `id`
|
|
|
|
- `parentid`
|
|
|
|
- `name`
|
2024-08-10 18:25:46 +00:00
|
|
|
- `state` - indicator of current progress
|
|
|
|
- `status` - pure task status
|
|
|
|
- `hashtags` - list of hashtags set for the task
|
2024-07-30 06:09:54 +00:00
|
|
|
- `tags` - values of all nostr tags associated with the event, except event tags
|
|
|
|
- `desc` - last note on the task
|
|
|
|
- `description` - accumulated notes on the task
|
2024-07-24 22:02:26 +00:00
|
|
|
- `path` - name including parent tasks
|
|
|
|
- `rpath` - name including parent tasks up to active task
|
2024-07-30 14:11:43 +00:00
|
|
|
- `time` - time tracked on this task
|
|
|
|
- `rtime` - time tracked on this tasks and all recursive subtasks
|
|
|
|
- `progress` - recursive subtask completion in percent
|
|
|
|
- `subtasks` - how many direct subtasks are complete
|
2024-08-08 18:10:17 +00:00
|
|
|
- TBI `depends`
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-07-30 06:09:54 +00:00
|
|
|
For debugging: `props`, `alltags`, `descriptions`
|
|
|
|
|
2024-07-30 18:04:54 +00:00
|
|
|
## Nostr reference
|
|
|
|
|
|
|
|
Mostr mainly uses the following NIPs:
|
2024-08-07 12:04:18 +00:00
|
|
|
- Kind 1 for task descriptions
|
2024-07-30 18:04:54 +00:00
|
|
|
- Issue Tracking: https://github.com/nostr-protocol/nips/blob/master/34.md
|
|
|
|
+ Tasks have Kind 1621 (originally: git issue - currently no native markdown support)
|
|
|
|
+ Kind 1622 may be used for task comments or replace Kind 1 for descriptions
|
2024-08-07 12:04:18 +00:00
|
|
|
+ Kind 1630-1633: Task Status (1630 Open, 1631 Done, 1632 Closed, 1633 Pending)
|
2024-07-30 18:04:54 +00:00
|
|
|
- Implementing proprietary Kind 1650 for time-tracking
|
|
|
|
|
|
|
|
Considering to use Calendar: https://github.com/nostr-protocol/nips/blob/master/52.md
|
|
|
|
- Kind 31922 for GANTT, since it has only Date
|
|
|
|
- Kind 31923 for Calendar, since it has a time
|
2024-07-24 22:02:26 +00:00
|
|
|
|
2024-07-13 13:00:42 +00:00
|
|
|
## Plans
|
|
|
|
|
2024-08-08 18:10:17 +00:00
|
|
|
- Remove state filter when moving up?
|
2024-08-01 11:07:40 +00:00
|
|
|
- Task markdown support? - colored
|
|
|
|
- Time tracking: Ability to postpone task and add planned timestamps (calendar entry)
|
2024-07-30 18:04:54 +00:00
|
|
|
- Parse Hashtag tags from task name
|
|
|
|
- Unified Filter object
|
|
|
|
-> include subtasks of matched tasks
|
|
|
|
- Relay Switching
|
|
|
|
- Speedup: Offline caching & Expiry (no need to fetch potential years of history)
|
|
|
|
+ Fetch most recent tasks first
|
|
|
|
+ Relay: compress tracked time for old tasks, filter closed tasks
|
|
|
|
+ Relay: filter out task state updates within few seconds, also on client side
|
|
|
|
|
|
|
|
### Conceptual
|
|
|
|
|
|
|
|
The following features are not ready to be implemented
|
|
|
|
because they need conceptualization.
|
|
|
|
Suggestions welcome!
|
|
|
|
|
2024-08-10 18:25:46 +00:00
|
|
|
- What if I want to postpone a procedure, i.e. make it pending, or move it across kanban, does this make sense?
|
2024-08-10 12:44:52 +00:00
|
|
|
- Priorities
|
|
|
|
- Dependencies (change from tags to properties so they can be added later? or maybe as a state?)
|
|
|
|
- Templates
|
|
|
|
- Ownership
|
2024-07-30 18:04:54 +00:00
|
|
|
- Combined formatting and recursion specifiers
|
|
|
|
+ progress count/percentage and recursive or not
|
|
|
|
+ Subtask progress immediate/all/leafs
|
|
|
|
+ path full / leaf / top
|
|
|
|
|
|
|
|
### Interfaces
|
|
|
|
|
|
|
|
- TUI: Clear terminal? Refresh on empty prompt after timeout?
|
|
|
|
- Kanban, GANTT, Calendar
|
2024-07-29 19:56:30 +00:00
|
|
|
- Web Interface, Messenger integrations
|
2024-08-10 18:25:46 +00:00
|
|
|
|
|
|
|
## Notes
|
|
|
|
|
|
|
|
- TBI = To Be Implemented
|
|
|
|
- `. TASK` - create and enter a new task even if the name matches an existing one
|