Systems / Product Thinking · FlytBase · Live
Pilot Shift Scheduler
Scheduling a drone ROC went from a 4–6 hour Sunday problem to a 15-minute weekly task. Built for the person who will not give up Excel.

Scheduling rotating pilot teams across round-the-clock shifts was being done in spreadsheets.
Built a constraint-driven scheduler. Live, deployed, used every day.
01
The Problem
Every drone operation runs on a schedule. Every one of them lives in a spreadsheet.
"I spend Sunday evening building next week's schedule. Every week."ROC Operations Manager · 9 sites, 7 pilots, 60+ flights per day
ROC managers at drone operations companies build weekly pilot schedules in Excel or Google Sheets. One sheet per week. Updated manually. Sent by WhatsApp. When a pilot calls in sick, the manager rebuilds from scratch.
The bigger failure isn't the time. It's that the spreadsheet has no enforcement layer. Certification gaps, rest period violations, site clearance mismatches — none of these are caught by Excel. They're caught by memory. And when memory fails, a non-compliant schedule gets published. The organisation finds out when the regulator asks questions.
02
Who It's For
The person who will not give up Excel — and has very good reasons not to.
The ROC manager isn't resistant to new tools because they're not curious. They're resistant because the cost of a failed tool is higher than the cost of a slow one. A scheduling error at 06:00 on a Monday affects six pilots, nine client sites, and contracted SLAs. They cannot afford to trust a tool they haven't already proven.
One failed migration and this person returns to Excel permanently — and does not come back. This is the central design constraint of the entire project.
Goals
- Publish the weekly schedule in under 15 minutes
- Never miss a certification expiry or rest gap
- Give each pilot their schedule without a phone call
- Show clients schedule adherence with real data
Frustrations
- 4–6 hours on a task that should take 15 minutes
- Constraint errors discovered at the time of flight, not before
- Pilots missing schedule updates sent via WhatsApp
- No audit trail when a compliance question arises
Design response: Match Excel's sense of control and visibility first. Then go beyond it.
03
Governing Principle
"Enforce compliance. Don't override judgment."
The scheduler is a tool for the manager, not a replacement for them. Catch what they can't hold in their head — their certification gaps, rest period conflicts, site clearance mismatches. But never take the scheduling decision away from them.
This rules out two things immediately: forms (can't show 14 hours across 8 pilots at once), and auto-generation (overrides the manager's contextual knowledge). What it rules in: a Gantt canvas where the manager builds directly, and a constraint engine that flags problems as they're made.
04
Key Decisions
Three calls. Two were straightforward. One took the longest.
Auto-generate was built. Then killed.
The algorithm worked. Constraint-passing schedules in seconds. It was pulled back because a generated schedule that overrides the manager's judgment doesn't earn trust — it triggers abandonment back to Excel. Auto-schedule now exists as an opt-in draft in the AI Agent tab. Not a replacement for judgment. A shortcut available once trust is earned through correct publishes.
A Gantt, not a form or a calendar.
The ROC manager thinks across three axes simultaneously: time (which shift windows need covering), people (who's available and certified), sites (what each location requires). A form can't show that. A generic calendar has no constraint layer. A Gantt canvas — one row per pilot, time running left to right — mirrors how they actually think. The canvas is the form.
Constraint violations inline, not at publish.
The first build showed violations only after the entire schedule was complete. Managers finished building before seeing a cascade of warnings. Moved to running continuously — every assignment is validated at the moment it's made, inline on the affected block with no modal interruption. The constraint engine is a co-pilot, not a gatekeeper.
16 constraint rules — always on
| Rule | What it checks | Default |
|---|---|---|
| CR-1 | Overlapping shifts | Warning |
| CR-2 | Shift exceeds max duration (14h) | Warning |
| CR-3 | Pilot exceeds weekly max hours (50h) | Warning |
| CR-4 | Rest gap below minimum (10h) | Warning |
| CR-5 | Missing or expired certification | Warning |
| CR-6 | Pilot not authorised for site / BVLOS supervisor missing | Warning |
| CR-7 | Demand slot uncovered | Warning |
| CR-8 | Flights exceed operational drone limit | Hard block |
| CR-9 | Operational limit set above waiver level | Hard block |
| CR-10 | Insufficient battery for mission | Stubbed |
| CR-11 | All docks occupied or recharging at mission time | Hard block |
| CR-12 | Mission extends past shift end | Warning |
| CR-13 | Coverage below contracted SLA | Warning |
| CR-14 | Pilot exceeds overtime threshold (40h) | Warning |
| CR-15 | Pilot has approved leave on scheduled day | Hard block |
| CR-16 | Pilot scheduled beyond max consecutive days (5) | Warning |
Every rule is reconfigurable per organisation. Hard-block overrides are permitted but written to the audit trail.
05
The Product
Six screens. Each one answers a question a spreadsheet cannot.
| Screen | Question it answers | What's notable |
|---|---|---|
| Plan / Gantt | How do I build this week's schedule? | Timeline canvas, drag-drop shifts and flights, skeleton shifts, constraint violations inline. What you see is what gets published. |
| Ops Dashboard | What do I need to know right now? | Live pilot status, site badges, alert feed. Width capped at 800px — no lateral eye movement on wide screens. |
| Analytics | Are pilots flying what was scheduled? | Actual vs. scheduled bar chart. Ad-hoc flights surface automatically alongside planned ones. |
| History | What was planned, what happened, can I prove it? | Published snapshot + actual flight logs on one canvas. Five adherence states. The audit record the regulator asks for. |
| Pilot Portal | When am I working and what am I flying? | Mobile-first. Max 480px even on desktop. Calendar strip, day detail, .ics export. No new login. |
| Settings | How does this organisation operate? | Configurable notification reminders, per-org constraint rules, admin self-recovery. |

06
What Shipped
26 of 27 validated problems addressed. One deferred.
| Area | Status |
|---|---|
| Gantt — drag-drop, skeleton shifts, AI Agent, undo/redo, publish | Complete |
| Ops dashboard — live status, site-coloured alert feed, stats grid | Complete |
| Analytics — actual vs. scheduled bar chart, sortable table | Complete |
| History — published snapshot + actual logs, 5 adherence states | Complete |
| Mission panel — catalog, placement popup, preset system | Complete |
| Resource panel — supervisors and docks on the same time axis | Complete |
| Constraint engine — 15 of 16 rules active | Complete |
| CR-10 (battery sufficiency) | Stubbed — awaiting FlytBase battery telemetry API |
| Pilot portal — calendar strip, day detail, team view, .ics delivery | Complete |
| Pilot email delivery with configurable reminders | Complete |
| Structured shift handoff documentation | v2 |
07
What I'd Change
Two things that were discovered in use, not in design.
The empty canvas was paralyzing.
First-time users opened to a blank Gantt with no entry point and no guidance on what to do first. The canvas is only useful once there's a site, a pilot, and a mission to show — but nothing pointed them there. Fixed with a three-step setup checklist: first site, first pilot, first mission. Gantt appears once there's something to show.
Notifications had to be built from scratch after pilots kept missing schedules.
The first build assumed email delivery was enough. A customer flagged that pilots were missing WhatsApp messages and burying email threads. Configurable notification system added to the publish flow: formatted email, .ics attachment, multiple simultaneous reminders. Confirmed before shipping.