Xirag Calendar
Codename: The Season

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.

Local-first · IndexedDB · Cmd/Ctrl+K everything · Human or agent seats
Week of Mar 9
Mon Tue Wed Thu Fri
9a 12p 3p
Xirag roadmap10:00 – 11:30
Deep work9:00 – 12:00
Design review
No library, just pointer events

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.

TimedEventBlock · live demo snapped to 15 min
Design review 2:00 PM – 3:00 PM

Drag the card, or its bottom edge — the same pointermove handler that ships in the app.

One shortcut away

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.

K
NNew event TToday DDay WWeek MMonth AAgenda
Expanded on read, not stored pre-expanded

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.

"Every Wednesday" — expanding live
  • No UTC drift. All-day dates are compared as bare yyyy-MM-dd strings, never round-tripped through new 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.
The repository seam

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.

Views & store MonthView · WeekView · DayView · AgendaView · EventModal
CalendarRepository The only interface any of the above knows about
IndexedDB Today · no backend required
Xirag Calendar API Tomorrow · one swap, zero UI changes
Xirag's core differentiator, on the calendar

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.

Human

Meetings, deadlines, personal blocks — scheduled and moved by hand.

Agent

Automated task runs land on the same grid, same category colors, same recurrence engine.

Both

A seat can hand off between a person and an agent without the schedule ever noticing.

Your schedule, already running.