Docs

Five minutes of reading. A lifetime of never planning your week by hand again.

Getting started

  1. Install FlexCal from the Chrome Web Store and click the extension icon. FlexCal opens in the browser side panel, so it stays open while you browse.
  2. Press Sign in with Google and grant calendar access. FlexCal only touches events it creates, and reads the rest to find free time.
  3. Open Settings (the gear in the header) and check your timezone, working hours and personal time. The scheduler plans inside them.
  4. Type your first task into the quick-add bar at the bottom of the panel. Within seconds it appears on your Google Calendar.
FlexCal writes events with an [AI] prefix so you always know which blocks it manages. Everything else on your calendar is read-only to it.

Quick add

One line, Todoist-style. Tokens can appear in any order and are stripped from the title:

Review the launch plan #Marketing @deep p1 tomorrow at 4pm for 2h every weekday

TokenMeaning
#ProjectPut the task in a project (created if it doesn't exist).
@labelAttach a label. Repeatable.
p1 … p4Priority, p1 highest. Wins the slot when time is scarce and sets the event colour.
for 2h, for 45m, for 1h30Duration. Default 30 minutes.
tomorrow, friday, at 4pm, Jun 3, in 3 daysDeadline, in your timezone.
every day, every weekday, every 2 weeks, every! monthRecurrence. Completing the task creates the next instance. every! counts from completion instead of the due date.

While you type, chips under the field show what FlexCal understood. Anything quick add cannot express (schedule window, notes, earliest start, splitting) lives in the task's edit sheet.

Task fields

FieldWhat it does
DurationHow much total time the task needs (5 min to 8 h).
DeadlineThe task is placed before this moment. Must be in the future when you create it.
Earliest startDon't schedule before this time. Useful for "after the package arrives" tasks.
Priorityp1 to p4. Higher priority wins contested slots. Also sets the event colour.
Schedule duringWork hours, personal time, or any time. See work vs personal.
Allow splittingBig task? Let it be broken into chunks with a minimum chunk size, e.g. 30 min.
BufferBreathing room around this block, on top of the global buffer in Settings.
NotesFree text that lands in the calendar event description.
RepeatAny recurrence phrase. On completion, the next instance is created automatically.

Open the Tasks drawer at the bottom of the panel and tap a task to edit all of the above in a slide-over sheet. The ring on the left marks it done (with undo). Delete removes its calendar events too.

Projects, labels, sub-tasks

  • Projects group tasks. Every account starts with an Inbox. Filter the drawer with the #project chips; create and remove projects under Settings → Projects.
  • Labels cut across projects: @deep, @calls, @errand. Filter the task list by label chips.
  • Sub-tasks nest one level under a parent. Each is scheduled on its own, so a big deliverable can be spread across the week.

How scheduling works

FlexCal uses a constraint solver (CP-SAT, the same technology used in industrial planning) over a 14-day horizon on a 15-minute grid. Every solve:

  • Syncs your calendar first, so it knows your latest meetings.
  • Places every open task inside its time window, before its deadline, never overlapping anything busy.
  • Prefers earlier slots and higher priorities. Splittable tasks flow around obstacles.
  • Writes the result to Google Calendar and cleans up its previous placements. No duplicates, no orphans.

Solves happen automatically when you create or complete a task and when the 15-minute background sync detects your calendar changed. You can always force one with Solve in the strip at the top of the panel. After a solve the strip lists what was placed and what moved; if a task cannot fit, it names the task and offers the two real fixes: allow splitting or move the deadline.

Set Buffer between blocks in Settings (15 to 60 min) and FlexCal keeps breathing room between its blocks and after your meetings.

Work vs personal time

Settings has two weekly schedules: working hours and personal time (default: weekday evenings and weekend days). Every task chooses where it may go:

Work hoursDefault. Deep work, reports, code reviews.
PersonalErrands, admin, side projects. Lands in evenings and weekends.
Any timeEither window, whichever is free first.

Habits

Habits are recurring commitments without a deadline: exercise, reading, language practice. Configure per habit:

SettingWhat it does
FrequencyHow many times per week (1 to 7).
Time windowe.g. 07:00 to 09:00. With a window set, the habit may be scheduled outside working hours.
Preferred daysRestrict to specific weekdays, or leave open.
Min gapMinimum days between two sessions, so nothing doubles up.
Priority1 (easily skipped in a busy week) to 5 (defended hard against tasks).
Can shrink toAllow a 60-minute habit to fit a 30-minute gap rather than being skipped.

Habit blocks appear on your calendar in green. Create and edit habits under the Habits chip in the Tasks drawer. Pause one from its sheet and its future blocks disappear on the next solve.

Your calendar is the interface

  • Move an event in Google Calendar and FlexCal detects it, pins the block to your chosen time, and plans around it.
  • Delete an event and the block is released and rescheduled on the next solve.
  • Pin from the panel: tap the pin on any block in the timeline to lock or unlock it. Pinned blocks get an indigo tint.
  • Colours: tasks go from graphite (lowest priority) through indigo to red (highest). Habits are green.

Task statuses

pendingCreated, not yet placed. A solve is usually seconds away.
scheduledPlaced on the calendar. The timeline and the drawer show exactly when.
at riskIt doesn't fit before its deadline. Shorten it, split it, raise its priority, or accept it will be late.
overdueThe deadline passed, but the work still matters: FlexCal reschedules it as soon as possible and flags it.
completedDone. If it repeats, the next instance is already in the queue.

Stats and morning digest

Click the chart icon in the panel header to open the stats dashboard in a full tab:

  • Scheduled task hours, habit hours and meeting hours for the next 7, 14 or 31 days.
  • Your pipeline: open, at-risk, overdue and completed counts.
  • A day-by-day bar showing how full each day actually is.

Every morning at 8:00 FlexCal sends one notification: how many blocks are on today, what's first, and how many tasks are at risk. Deadline warnings arrive up to 24 hours before a task that doesn't fit is due.

Settings

SettingNotes
AppearanceLight, dark, or follow the system. The moon/sun icon in the header toggles it too.
TimezoneSet this first. Working hours are interpreted in it.
Working hoursPer weekday, with off days. Work-window tasks are only scheduled inside them.
Personal timePer weekday. Where personal-window tasks go.
BufferBreathing room between auto-scheduled blocks: off, 15, 30, 45 or 60 minutes.
ProjectsCreate and delete projects. Inbox is always there.
AdvancedBackend URL, only relevant if you self-host the FlexCal server.

FAQ

Does FlexCal move my meetings?
Never. Anything it didn't create is read-only. It only manages its own [AI] blocks.

What if there's genuinely no room?
The task is marked at risk so you can decide: split it, extend the deadline, or drop something else. Nothing silently disappears.

Two tasks, one free hour. Who wins?
The higher priority. Ties break toward the earlier deadline and earlier placement.

Where is my data?
In your own Google Calendar and on the FlexCal server, which stores your tasks, habits and settings so it can plan for you. See the privacy policy for exactly what is stored and how to delete it.

Can I use it without opening the panel?
Mostly, yes. Moving and deleting events in Google Calendar is a fully supported way to talk back to the scheduler.

Can I run the server myself?
Yes. The backend ships as a Docker Compose stack. Point the extension at it under Settings → Advanced.