https://github.com/mybuddymichael/sift
A terminal prioritizer for Things tasks.
https://github.com/mybuddymichael/sift
things3 tui
Last synced: 5 months ago
JSON representation
A terminal prioritizer for Things tasks.
- Host: GitHub
- URL: https://github.com/mybuddymichael/sift
- Owner: mybuddymichael
- License: mit
- Created: 2025-07-07T18:54:51.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2025-08-01T17:36:29.000Z (11 months ago)
- Last Synced: 2025-12-17T09:41:47.114Z (6 months ago)
- Topics: things3, tui
- Language: Go
- Homepage:
- Size: 127 KB
- Stars: 6
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Sift
Prioritize your tasks from Things.app, in the terminal.


## How to use
1. Install with Homebrew: `brew install mybuddymichael/tap/sift-things`
2. Run the command: `sift`
3. Use the arrow keys to start prioritizing tasks.
4. Reset all priorities with `ctrl+r`.
5. Quit with `ctrl+c`.
### Options
- `--refresh-interval `: Set the refresh interval for getting updates from Things.app (default: 3 seconds)
## How it works
- Sift requires Things.app to be installed and running on your Mac.
- It displays tasks in the Today list, and will poll Things for updates every 3
seconds by default (configurable with `--refresh-interval`).
- Sift does not write any data to Things. It only stores parent-child
relationships between tasks.
- Priorities persist across Sift and Things restarts.
## The sorting method
> [!NOTE]
> This is an in-the-weeds description of the sorting method.
- When a task is chosen, the one *not* chosen is updated to note that its parent is the task that was chosen.
- In this way, we create a tree of tasks, where each task tracks its parent.
- In order to pick the two tasks being compared, we gather all of the tasks and assign them levels.
- Tasks with no parents are at the highest level, their children are at the next level, and so on.
- We choose tasks to compare by finding the highest level with multiple tasks.
- If a level only has one task, and all its ancestors are the only tasks at each of their levels, then we know the task is fully prioritized.
- The technical term for this structure is a directed acyclic graph (DAG).
- There will never be any cycles in the DAG, which means that we assume that if task C is a child of task B, and task B is a child of task A, then task C must be lower in priority than task A.
## Tech stack
- Go
- [Bubbletea](https://github.com/charmbracelet/bubbletea) (TUI framework)
## Prior art
- [Todournament](https://github.com/alltom/todournament) by [Tom Lieber](https://github.com/alltom)