A tiny native macOS menubar tool: press ⌥Space, describe a task in plain language, and an LLM schedules it into your calendar and saves it as a todo.
- Instant popup — resident menubar app, global hotkey via Carbon (no
Accessibility permission needed), black-and-white terminal-style panel
(monospace,
❯prompt). Compact input line by default; submitting shows "scheduling…" then the answer inline right below the bar. ↑ reveals the history (persisted in SQLite) — one row per task with a dim ✓/✗ outcome mark; ↑/↓ move message-to-message and the selected row expands to reveal the LLM's answer, ↩ on a selected row (empty prompt) recalls its input, Esc collapses then closes. Standard editing shortcuts (⌘A/⌘C/⌘V/⌘X/⌘Z) work despite the app having no menu bar. - LLM scheduling harness — tool-calling loop against any OpenAI-compatible
chat-completions API (default: Mixedbread
toast-1). The system prompt already includes your next-7-days agenda, so most tasks schedule in a single API round-trip; the model can also callget_events(look further out) andcreate_event. - Calendar via EventKit — reads/writes through macOS Calendar, so events sync to Google Calendar (your Google account must be added in System Settings → Internet Accounts with Calendar enabled).
- Slash commands (instant, no LLM call):
/revertundoes the last LLM action — a created event is deleted, a deleted event is restored from its snapshot; repeat to walk further back./clearwipes the whole transcript history./today,/tomorrow(or/tmrw), and/view <date>(YYYY-MM-DD, DD.MM.YYYY, "15.9", or a weekday name) show that day's schedule. Typing/opens an autocomplete below the bar: ↑/↓ choose, Tab completes, ↩ completes and runs, Esc dismisses. - Local todos — SQLite at
~/Library/Application Support/Enem/todos.db; browse and check off the last 10 from the menubar menu.
scripts/install.sh— builds and launches~/Applications/Enem.app.- Grant calendar access when macOS asks (or System Settings → Privacy & Security → Calendars → Enem).
- Add your API key: menubar icon → Settings… (↩ saves), or keep it in
~/.config/enem/.env(MIXEDBREAD_API_KEYfor the default provider,OPENAI_API_KEYfor OpenAI) — a symlink to a project.envworks. A key set in the config/Settings wins over.env. - Press ⌥Space, type e.g. "prepare slides for the sales call, needs an hour, sometime before Thursday", hit ↩.
Optional: menubar → Launch at Login.
| Key | Default | Notes |
|---|---|---|
api_key |
"" |
Empty = fall back to ~/.config/enem/.env (key name matching base_url's provider), then env vars. |
base_url |
https://api.mixedbread.com/v1 |
Any OpenAI-compatible endpoint, e.g. https://api.openai.com/v1. |
model |
toast-1 |
For OpenAI use e.g. gpt-5.6-terra or gpt-5.6-luna. |
hotkey |
opt+space |
e.g. cmd+shift+space, ctrl+opt+t. |
calendar_name |
"" |
Empty = your default calendar. |
work_hours |
09:00-18:00 |
Scheduling preference given to the model. |
default_duration_minutes |
30 |
Used when the task doesn't imply a duration. |
Edit, then menubar → Reload Config (no restart needed).
swift build # debug build
scripts/build_app.sh # release build + signed dist/Enem.app
scripts/install.sh # build, install to ~/Applications, relaunchPlain SwiftPM, no dependencies. Sources/enem/: Agent.swift (LLM harness),
CalendarService.swift (EventKit), TodoStore.swift (SQLite),
PopupPanel.swift (UI), HotKey.swift (global hotkey), AppDelegate.swift
(menubar wiring). Note: notifications and launch-at-login only work from the
installed .app bundle, not swift run.