Time, rendered live.
Month, week, day, and agenda views with real drag-to-move, drag-to-resize, and a 15-minute snap grid — running local-first today, one interface swap away from the rest of the Xirag ecosystem.
Grab it, move it, resize it
Every block below is the real interaction model — drag the body to move, drag the bottom handle to resize, everything snaps to a 15-minute grid. Try it.
Drag the card, or its bottom edge — the same pointermove handler that ships in the app.
Cmd/Ctrl+K, and you're anywhere
A single search box for creating events, jumping to today, and switching views — plus bare-key shortcuts once nothing's focused.
Recurrence that lands on the right day
Daily, weekly, or monthly, with an interval and an optional end date. All-day recurrences are walked entirely in local-calendar-date space.
- No UTC drift. All-day dates are compared as bare
yyyy-MM-ddstrings, never round-tripped throughnew Date(dateOnlyString)— that constructor parses as UTC and silently shifts the occurrence onto the wrong local day. - Capped, not runaway. Expansion stops at 366 occurrences per event, however far the visible range reaches.
- Timed events keep real instants. Duration is preserved millisecond-for-millisecond across every occurrence, DST included.
Local-first today, one seam to the network
Views, the store, the event modal, and the command palette only ever call useCalendarStore — none of them know or care where the data actually lives.
Built for every seat
An organizational seat can be filled by a human, an AI agent, or both — the calendar doesn't distinguish who's holding the meeting or running the task.
Meetings, deadlines, personal blocks — scheduled and moved by hand.
Automated task runs land on the same grid, same category colors, same recurrence engine.
A seat can hand off between a person and an agent without the schedule ever noticing.