A terminal calendar app built with OpenTUI.
CleanShot.2026-01-06.at.00.31.45.mp4
Some earlier versions previously written in Zig + Sokol
bun install
bun dev| Key | Action |
|---|---|
[ / ] |
Previous / Next month |
h / l |
Previous / Next day |
k / j |
Previous / Next week |
t |
Jump to today |
a |
Add event |
v |
Toggle agenda side view |
g |
Go to date |
s |
Search events |
q |
Quit |
This is the full flow for adding a new shortcut and its behavior end-to-end.
- Add the command definition
- Add a new entry in the relevant module under
src/core/commands/. - Include
id,title,keys,layers, andrun.
- Add a new entry in the relevant module under
- Pick a layer
- Use an existing layer (
global,agenda,modal:add,modal:goto,modal:search) inlayers. - If you need a new context, add a new layer in
src/core/commands/keymap.ts.
- Use an existing layer (
- Wire UI handlers (if needed)
- For view-local behavior, register handlers in the component via
set...CommandHandlers.
- For view-local behavior, register handlers in the component via
- Update docs
- Add global bindings to the Keyboard Shortcuts table in this README.
Example (add n to jump to next year):
// src/core/commands/calendar.ts
export const calendarCommands = [
// ...
{
id: "calendar.nextYear",
title: "Next year",
keys: ["n"],
layers: ["global"],
run: () => goToNextYear,
},
];- Help on '?'
- Yearly view
- Settings modal
- Google Calendar sync
- iCal export/import
- Multiple day events??
- Recurring events
- cli support (cronos add ...)
- Agenda side view
- Persistent storage
- Search through event list