Kvika Team·· 7 min read

Which Calendar Events Can an Algorithm Move?

External attendees stay fixed. Focus blocks move. The isEventManageable rules and isManaged opt-in that keep automatic rescheduling from cancelling your client call.

calendarschedulingengineeringproductivity

Smart calendars promise to protect focus time by moving your own blocks around meetings. The product soul is not the optimiser — it is knowing which blocks must never move. Move a client call because title keywords looked like focus time and you are done.

Kvika classifies events on sync, marks manageability, lets users opt in per event, and only then allows drag or algorithm PATCH. This post is the rules engine, not the solver.

Automatic schedule repair

The rescheduling algorithm (first-fit gap search today) finds open slots and PATCHes events where isManaged is true and isEventManageable returned true on import. Meetings with guests outside the user are never candidates — coordination cost is not something to hide.

Classification on import

On every sync from Google or Microsoft:

Any attendee email ≠ user → MEETING. Title contains focus/deep work keywords → FOCUS_TIME. Task/todo keywords → TASK. Else PERSONAL.

Keywords bootstrap; users can override types in UI. Analytics dashboards read the same eventType field — classification quality is shared infrastructure.

isEventManageable rules

typescript
if (eventType === MEETING && hasExternalAttendees) return false
if (eventType === FOCUS_TIME || eventType === TASK) return true
// PERSONAL: only if zero attendees or solo self-invite
return attendees.length === 0 || soloSelfAttendee

All-day events and provider immovable flags need explicit UI blocks — edit dialog rejects reschedule for unsupported shapes today.

"Review" in a title might be performance review (immovable) or code review block (movable). Keywords misclassify; user override matters.

User opt-in with isManaged

Event creation dialog includes "Allow Kvika to reschedule this event." Import sets isManaged from manageability heuristics; user toggles refine. Drag in the grid sets modifiedLocally and triggers push — see bidirectional sync post.

Push back to Google and Outlook

Local PATCH is not enough. Push job writes to the source provider; until success, pull sync must respect modifiedLocally. Failed push → syncStatus: ERROR with provider message. Conflict → user picks winner.

TODO still open: delete in Kvika should delete externally — today local delete may orphan provider copies. Bidirectional sync is a roadmap, not a checkbox.

Related: sync and conflicts · analytics from event types. Join the Kvika beta.

Kvika Team

Kvika unifies your calendar, email, and tasks across Google and Microsoft. Join the beta at kvika.work/waitlist.