A keyboard-first Todoist bar widget for Omarchy.
Part of the AROICE family of tools.
Features • Install • Usage • Contributing • Case Study

The bar shows how many tasks are due today or overdue; click it for a popup with the full list, a checkbox to complete each task, and a box to quickly add new ones — all without leaving the keyboard.
📖 Read the case study for the story behind this plugin — why it exists, the keyboard-first design constraints, and a few things that didn't work the first time.

p1–p4 priority,
#Project, @label, and natural-language due dates (tomorrow at 5pm,
next Monday) all work exactly like typing into Todoist itself. A bare
task with no date in it (Buy milk) defaults to due today.today | overdue).
omarchy plugin add https://github.com/aryan-techie/omarchy-todoist.git --enable
Add the bar icon (skip this if --enable already placed it):
omarchy bar put io.github.aryan-techie.todoist --section right
That's it — the panel switches to your task list and the bar icon lights up.
The panel drops right below its bar icon (not centered on the bar), at a fixed size you control — see Settings → Advanced below. Content that doesn't fit scrolls inside the panel instead of resizing it. The bar icon itself is a fixed-size slot regardless of task count, so the panel's anchor point never shifts as your count changes.
omarchy-shell shell toggle io.github.aryan-techie.todoist.p1, #Project, dates).p) opens Settings, organized into Account,
Default filter, Keyboard shortcut, General (Refresh now,
Keyboard shortcuts), and Advanced (popup size) sections.r while the panel's open.The whole panel is operable without a mouse:
| Key | Action |
|---|---|
Escape | Back out of Settings to the task list (works from any Settings field too); press again to close the panel. While the Add-a-task box has focus, just leaves the box instead |
Tab / Shift+Tab | Cycle Today → Inbox → All. Inside Settings, instead walks every control in order — token field, Save/Remove token, filter field + Apply, keybind buttons, and the General/Advanced buttons and steppers — scrolling as needed to keep the focused control in view |
t / i / a | Jump straight to the Today, Inbox, or All view. Inside Settings, t opens Todoist in the browser instead |
p | Toggle Settings open/closed |
↑/↓ or k/j | Move the selection up/down the task list |
Enter | Open the selected task on the Todoist website, then close the panel |
Space | Complete the selected task |
e | Edit the selected task's title in place |
x | Delete the selected task (asks for confirmation first) |
q | Jump into the Add-a-task box |
r | Refresh |
? | Toggle a shortcuts cheat-sheet overlay (also a button in Settings) |
Completing a task strikes it through and dims it for a moment before it disappears from the list, so the click reads as "done" rather than "vanished."
Typing in the token, filter, or quick-add fields (or recording a shortcut)
temporarily suspends these so normal typing works. x for delete matches
this shell's own convention (see Ui/PanelKeyCatcher.qml) rather than the
physical Delete key, which has no printable character for a panel's key
handler to see.
In Settings, click Ctrl+Super+Y to use that shortcut, or Record
custom… to press your own combo (any number of Super/Ctrl/Alt/Shift plus
one key). Applying it edits ~/.config/hypr/bindings.lua — the file is
backed up first, Hyprland is reloaded, and if the reload reports any config
error the backup is restored automatically. Remove takes the line back
out the same safe way. No shortcut is set until you explicitly choose one
here; the plugin never touches your Hyprland config on its own.
Note: pressing the shortcut again while the panel is open closes it — that's the built-in way to close the panel from the keyboard. Your existing "close window" keybind is untouched and still closes whatever app window is focused, not this panel (that's a Hyprland layer-shell limitation shared by every panel in the shell, not something specific to Todoist).
This plugin runs curl, mkdir, chmod, bash, awk, cp, xdg-open
(only when you press Enter on a task, to open it in your browser), and
(only for the optional keyboard shortcut) hyprctl via Quickshell's
Process — all standard on any Omarchy install, no extra packages required.
curl is the only thing that talks to the network; every request goes
straight to https://api.todoist.com/api/v1/ with your token in an
Authorization: Bearer header. Nothing else is contacted, and nothing runs
with elevated
privileges.
The only system file this plugin can modify is
~/.config/hypr/bindings.lua, and only if you set a keyboard shortcut from
Settings. set-keybind.sh then:
bindings.lua to bindings.lua.bak.<unix-timestamp> (not
auto-deleted — clean these up yourself periodically if you change the
shortcut often).o.bind(...) line that toggles Todoist,
identified by matching the exact omarchy-shell shell toggle io.github.aryan-techie.todoist command string — no other line is ever
touched.hyprctl reload and checks hyprctl configerrors.This never happens automatically — only when you click Ctrl+Super+Y,
Record custom… + Apply, or Remove in Settings. Adding/removing
the bar icon itself only touches your own ~/.config/omarchy/shell.json bar
layout, the same as any other bar widget you add or remove through
omarchy bar.
~/.local/state/omarchy/io.github.aryan-techie.todoist/settings.json —
your Todoist API token, filter, quick-view, keyboard shortcut, and popup
size. Created
on first save; the file is chmod 600'd right after writing since it holds
a secret. Delete it (or use Remove token in Settings) to disconnect the
plugin from your account.~/.config/hypr/bindings.lua.bak.<timestamp> — backups from every
keyboard-shortcut change (see above). Safe to delete once you're happy with
your shortcut.omarchy plugin remove io.github.aryan-techie.todoist removes the plugin
files but does not touch the two locations above — if you set a keyboard
shortcut, remove it from Settings first (or delete the matching o.bind
line from bindings.lua yourself), and delete the state directory if you
want your token gone too.
Uses the Todoist API v1:
GET /tasks/filter (or plain GET /tasks for the All view), POST /tasks/quick (Quick Add, natural-language parsing) for new tasks, POST /tasks/{id} to edit a task's title, POST /tasks/{id}/close to complete,
DELETE /tasks/{id} to delete. Enter opens
https://app.todoist.com/app/task/{id} in your default browser. The older
REST API v2 was retired by Todoist in February 2026, so this plugin only
supports the current API.
Contributions are welcome — see CONTRIBUTING.md for the project layout, conventions, and how to test a change locally before opening a PR. This project follows a Code of Conduct.
qs log output) that make it fixable quickly.See CHANGELOG.md for what's changed in each version.
MIT — see LICENSE. The Todoist icon used above is a third-party asset under a separate license — see assets/NOTICE.md.
Aryan Techie (Aryan Jangra)
Made with ❤️ by AROICE
Clear tools for a clear mind.
33 commits
QML
94.1%
JavaScript
4.8%
Shell
1.2%
A keyboard-first Todoist bar widget for Omarchy.
Part of the AROICE family of tools.
Features • Install • Usage • Contributing • Case Study

The bar shows how many tasks are due today or overdue; click it for a popup with the full list, a checkbox to complete each task, and a box to quickly add new ones — all without leaving the keyboard.
📖 Read the case study for the story behind this plugin — why it exists, the keyboard-first design constraints, and a few things that didn't work the first time.

p1–p4 priority,
#Project, @label, and natural-language due dates (tomorrow at 5pm,
next Monday) all work exactly like typing into Todoist itself. A bare
task with no date in it (Buy milk) defaults to due today.today | overdue).
omarchy plugin add https://github.com/aryan-techie/omarchy-todoist.git --enable
Add the bar icon (skip this if --enable already placed it):
omarchy bar put io.github.aryan-techie.todoist --section right
That's it — the panel switches to your task list and the bar icon lights up.
The panel drops right below its bar icon (not centered on the bar), at a fixed size you control — see Settings → Advanced below. Content that doesn't fit scrolls inside the panel instead of resizing it. The bar icon itself is a fixed-size slot regardless of task count, so the panel's anchor point never shifts as your count changes.
omarchy-shell shell toggle io.github.aryan-techie.todoist.p1, #Project, dates).p) opens Settings, organized into Account,
Default filter, Keyboard shortcut, General (Refresh now,
Keyboard shortcuts), and Advanced (popup size) sections.r while the panel's open.The whole panel is operable without a mouse:
| Key | Action |
|---|---|
Escape | Back out of Settings to the task list (works from any Settings field too); press again to close the panel. While the Add-a-task box has focus, just leaves the box instead |
Tab / Shift+Tab | Cycle Today → Inbox → All. Inside Settings, instead walks every control in order — token field, Save/Remove token, filter field + Apply, keybind buttons, and the General/Advanced buttons and steppers — scrolling as needed to keep the focused control in view |
t / i / a | Jump straight to the Today, Inbox, or All view. Inside Settings, t opens Todoist in the browser instead |
p | Toggle Settings open/closed |
↑/↓ or k/j | Move the selection up/down the task list |
Enter | Open the selected task on the Todoist website, then close the panel |
Space | Complete the selected task |
e | Edit the selected task's title in place |
x | Delete the selected task (asks for confirmation first) |
q | Jump into the Add-a-task box |
r | Refresh |
? | Toggle a shortcuts cheat-sheet overlay (also a button in Settings) |
Completing a task strikes it through and dims it for a moment before it disappears from the list, so the click reads as "done" rather than "vanished."
Typing in the token, filter, or quick-add fields (or recording a shortcut)
temporarily suspends these so normal typing works. x for delete matches
this shell's own convention (see Ui/PanelKeyCatcher.qml) rather than the
physical Delete key, which has no printable character for a panel's key
handler to see.
In Settings, click Ctrl+Super+Y to use that shortcut, or Record
custom… to press your own combo (any number of Super/Ctrl/Alt/Shift plus
one key). Applying it edits ~/.config/hypr/bindings.lua — the file is
backed up first, Hyprland is reloaded, and if the reload reports any config
error the backup is restored automatically. Remove takes the line back
out the same safe way. No shortcut is set until you explicitly choose one
here; the plugin never touches your Hyprland config on its own.
Note: pressing the shortcut again while the panel is open closes it — that's the built-in way to close the panel from the keyboard. Your existing "close window" keybind is untouched and still closes whatever app window is focused, not this panel (that's a Hyprland layer-shell limitation shared by every panel in the shell, not something specific to Todoist).
This plugin runs curl, mkdir, chmod, bash, awk, cp, xdg-open
(only when you press Enter on a task, to open it in your browser), and
(only for the optional keyboard shortcut) hyprctl via Quickshell's
Process — all standard on any Omarchy install, no extra packages required.
curl is the only thing that talks to the network; every request goes
straight to https://api.todoist.com/api/v1/ with your token in an
Authorization: Bearer header. Nothing else is contacted, and nothing runs
with elevated
privileges.
The only system file this plugin can modify is
~/.config/hypr/bindings.lua, and only if you set a keyboard shortcut from
Settings. set-keybind.sh then:
bindings.lua to bindings.lua.bak.<unix-timestamp> (not
auto-deleted — clean these up yourself periodically if you change the
shortcut often).o.bind(...) line that toggles Todoist,
identified by matching the exact omarchy-shell shell toggle io.github.aryan-techie.todoist command string — no other line is ever
touched.hyprctl reload and checks hyprctl configerrors.This never happens automatically — only when you click Ctrl+Super+Y,
Record custom… + Apply, or Remove in Settings. Adding/removing
the bar icon itself only touches your own ~/.config/omarchy/shell.json bar
layout, the same as any other bar widget you add or remove through
omarchy bar.
~/.local/state/omarchy/io.github.aryan-techie.todoist/settings.json —
your Todoist API token, filter, quick-view, keyboard shortcut, and popup
size. Created
on first save; the file is chmod 600'd right after writing since it holds
a secret. Delete it (or use Remove token in Settings) to disconnect the
plugin from your account.~/.config/hypr/bindings.lua.bak.<timestamp> — backups from every
keyboard-shortcut change (see above). Safe to delete once you're happy with
your shortcut.omarchy plugin remove io.github.aryan-techie.todoist removes the plugin
files but does not touch the two locations above — if you set a keyboard
shortcut, remove it from Settings first (or delete the matching o.bind
line from bindings.lua yourself), and delete the state directory if you
want your token gone too.
Uses the Todoist API v1:
GET /tasks/filter (or plain GET /tasks for the All view), POST /tasks/quick (Quick Add, natural-language parsing) for new tasks, POST /tasks/{id} to edit a task's title, POST /tasks/{id}/close to complete,
DELETE /tasks/{id} to delete. Enter opens
https://app.todoist.com/app/task/{id} in your default browser. The older
REST API v2 was retired by Todoist in February 2026, so this plugin only
supports the current API.
Contributions are welcome — see CONTRIBUTING.md for the project layout, conventions, and how to test a change locally before opening a PR. This project follows a Code of Conduct.
qs log output) that make it fixable quickly.See CHANGELOG.md for what's changed in each version.
MIT — see LICENSE. The Todoist icon used above is a third-party asset under a separate license — see assets/NOTICE.md.
Aryan Techie (Aryan Jangra)
Made with ❤️ by AROICE
Clear tools for a clear mind.
33 commits
QML
94.1%
JavaScript
4.8%
Shell
1.2%