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
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 || soloSelfAttendeeAll-day events and provider immovable flags need explicit UI blocks — edit dialog rejects reschedule for unsupported shapes today.
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.