yotei (予定) — Japanese for "schedule" or "plan"
A lightweight Rust daemon that watches your org-mode agenda files and fires desktop notifications for scheduled tasks and deadlines, with full priority handling. Includes a TUI task list viewer.
- Desktop notifications for
SCHEDULED:andDEADLINE:timestamps - Priority-aware —
[#A]→ critical urgency,[#B]→ normal,[#C]→ low - TUI list (
yotei list) — browse all tasks sorted by priority and time - Filters — All / Upcoming (with timestamps) / Priority (A & B only)
- Zero Emacs dependency — reads raw
.orgfiles directly
git clone <repo>
cd yotei
cargo install --path .With flakes, add the input to your flake:
{
inputs.yoteid.url = "github:Moskas/yoteid";
}Then install the package directly:
# In your system or home-manager config
environment.systemPackages = [ inputs.yoteid.packages.${system}.default ];yotei ships a home-manager module that manages the config file and a systemd user service automatically.
# flake.nix
{
inputs.yoteid.url = "github:Moskas/yoteid";
}# In your home-manager configuration
{ inputs, system, ... }:
{
imports = [ inputs.yoteid.homeManagerModules.default ];
services.yotei = {
enable = true;
package = inputs.yoteid.packages.${system}.default;
settings = {
agenda_files = [
"~/org/todo.org"
"~/org/work.org"
];
notifications = {
pre_notify_minutes = 15;
deadline_pre_notify_minutes = 60;
};
daemon = {
poll_interval_secs = 60;
};
};
};
}This will:
- Install the
yoteibinary - Generate
~/.config/yotei/config.tomlfrom yoursettings - Create and enable a
yoteisystemd user service that runs the daemon
yotei init
# → creates ~/.config/yotei/config.tomlEdit the config to point at your org files:
agenda_files = [
"~/org/todo.org",
"~/org/work.org",
]
[notifications]
pre_notify_minutes = 15 # warn N minutes before SCHEDULED time
deadline_pre_notify_minutes = 60 # warn N minutes before DEADLINE
[daemon]
poll_interval_secs = 60yotei daemonThe daemon runs in the foreground and fires a notification when a task is within the configured lead-time.
yotei list| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
Tab / f |
Cycle filter (All → Upcoming → Priority) |
g / Home |
Jump to top |
G / End |
Jump to bottom |
q / Ctrl-C |
Quit |
yotei dumpyotei understands the standard org-mode format:
* TODO [#A] Make it work
SCHEDULED: <2026-03-06 Fri 18:00>
* TODO [#B] Write tests
DEADLINE: <2026-03-08 Sun>
* DONE [#C] Refactor module :work:
SCHEDULED: <2026-03-01 Sun>
Supported TODO keywords: TODO, DONE, NEXT, WAITING, PROJ,
CANCELLED, CANCELED
Priorities: [#A] (critical), [#B] (high), [#C] (normal)
Timestamp formats: with or without time, with or without weekday abbreviation.
Save as ~/.config/systemd/user/yotei.service:
[Unit]
Description=yotei org-mode notification daemon
After=graphical-session.target
[Service]
Type=simple
ExecStart=%h/.cargo/bin/yotei daemon
Restart=on-failure
RestartSec=10
[Install]
WantedBy=default.targetsystemctl --user enable --now yoteiSave as ~/Library/LaunchAgents/com.yotei.daemon.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key> <string>com.yotei.daemon</string>
<key>ProgramArguments</key>
<array>
<string>/Users/YOU/.cargo/bin/yotei</string>
<string>daemon</string>
</array>
<key>RunAtLoad</key> <true/>
<key>KeepAlive</key> <true/>
</dict>
</plist>launchctl load ~/Library/LaunchAgents/com.yotei.daemon.plist- Google Calendar sync
- Push notification bridge (Gotify / ntfy)
- Repeating timestamps (
+1w,.+1d) - Summary subcommand (today / this week)