Getting started
- 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.
- Press Sign in with Google and grant calendar access. FlexCal only touches events it creates, and reads the rest to find free time.
- Open Settings (the gear in the header) and check your timezone, working hours and personal time. The scheduler plans inside them.
- 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
| Token | Meaning |
#Project | Put the task in a project (created if it doesn't exist). |
@label | Attach a label. Repeatable. |
p1 … p4 | Priority, p1 highest. Wins the slot when time is scarce and sets the event colour. |
for 2h, for 45m, for 1h30 | Duration. Default 30 minutes. |
tomorrow, friday, at 4pm, Jun 3, in 3 days | Deadline, in your timezone. |
every day, every weekday, every 2 weeks, every! month | Recurrence. 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
| Field | What it does |
| Duration | How much total time the task needs (5 min to 8 h). |
| Deadline | The task is placed before this moment. Must be in the future when you create it. |
| Earliest start | Don't schedule before this time. Useful for "after the package arrives" tasks. |
| Priority | p1 to p4. Higher priority wins contested slots. Also sets the event colour. |
| Schedule during | Work hours, personal time, or any time. See work vs personal. |
| Allow splitting | Big task? Let it be broken into chunks with a minimum chunk size, e.g. 30 min. |
| Buffer | Breathing room around this block, on top of the global buffer in Settings. |
| Notes | Free text that lands in the calendar event description. |
| Repeat | Any 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 hours | Default. Deep work, reports, code reviews. |
| Personal | Errands, admin, side projects. Lands in evenings and weekends. |
| Any time | Either window, whichever is free first. |
Habits
Habits are recurring commitments without a deadline: exercise, reading, language practice. Configure per habit:
| Setting | What it does |
| Frequency | How many times per week (1 to 7). |
| Time window | e.g. 07:00 to 09:00. With a window set, the habit may be scheduled outside working hours. |
| Preferred days | Restrict to specific weekdays, or leave open. |
| Min gap | Minimum days between two sessions, so nothing doubles up. |
| Priority | 1 (easily skipped in a busy week) to 5 (defended hard against tasks). |
| Can shrink to | Allow 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
| pending | Created, not yet placed. A solve is usually seconds away. |
| scheduled | Placed on the calendar. The timeline and the drawer show exactly when. |
| at risk | It doesn't fit before its deadline. Shorten it, split it, raise its priority, or accept it will be late. |
| overdue | The deadline passed, but the work still matters: FlexCal reschedules it as soon as possible and flags it. |
| completed | Done. 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
| Setting | Notes |
| Appearance | Light, dark, or follow the system. The moon/sun icon in the header toggles it too. |
| Timezone | Set this first. Working hours are interpreted in it. |
| Working hours | Per weekday, with off days. Work-window tasks are only scheduled inside them. |
| Personal time | Per weekday. Where personal-window tasks go. |
| Buffer | Breathing room between auto-scheduled blocks: off, 15, 30, 45 or 60 minutes. |
| Projects | Create and delete projects. Inbox is always there. |
| Advanced | Backend 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.