The Duty & FTL desk is your duty log with the live calculator over it, laid out for a monitor. You record or import duties, and the desk works out where you stand against the limits of your regime, EASA ORO.FTL or FAA Part 117, with the rule reference beside every figure. The line at the foot of the overview, "Personal planning only.", is the module's standing framing: your operator's crew control and OM-A remain the authority on what you may fly.
Find your way around
The desk is one frame. The masthead at the top states the duty's condition once: a status chip (On duty, Off duty, Reporting soon or In crew rest), the instant that matters next ("Reported Wed 23 Sep 13:30Z"), the station chain of the duty on its own mono line, and a fact ledger reading Regime, Home base, Acclimatised, Consecutive duty days and Rostered ahead (plus Since release while you are off duty). Its right-hand controls are Log reserve, Ground / day off, Import, Roster board, Export (duties as CSV) and New duty. The Guided tours key in the top bar offers the Duty & FTL walk while you are here - about five minutes through the masthead, the rail, the console and each canvas, built for the desk's current state.
The section rail on the left keeps every section one click away:
| Group | Row | What it shows |
|---|---|---|
| Live | Overview | The current duty, its limits and alerts |
| Live | Today | A 24-hour ruler of duty, sectors and rest for one day |
| Log | Roster | Every duty on file: the Ahead, All, Calendar and Year views on one canvas |
| Plan | Reserve | Standby and reserve periods with their assessment |
| Plan | What-if | Hypothetical duty days side by side against your limits |
| Tools | Roster board | A whole month in one grid |
| Tools | Import roster | The import console: Import, History and Operator config tabs |
| Tools | Saved reports | The duty calculation reports you have saved, each with its hash check |
| Tools | Rules guide | How the calculator works |
Every section has its own address (/ftl?segment=roster, /ftl?view=today,
/ftl?view=compare), so a bookmark or a command deck entry lands on the
section you meant.

How to pick your rules
The calculator follows one regime at a time.
- The first time you open the desk, answer the regime card on the Overview ("Which duty rules apply to you?"): EASA ORO.FTL or FAA Part 117.
- To change it later, scroll to the Duty settings card at the foot of the Overview canvas. The Regime row switches between EASA and FAA and states who each covers: ORO.FTL is commercial air transport by aeroplane; Part 117 is Part 121 passenger operations, while all-cargo Part 121 (unless the carrier has elected Part 117) and Part 135 run other limits that Pilot EFB does not model. The Usual crew complement row (Single, 2, 3, 4) pre-fills new duties.
- Or open Settings > Your flying profile, the row the Settings console lists as FTL regime. It sets the same regime.
If you fly under neither, the regime card's third answer, My operation is not covered (Neither on the settings row), records that; Pilot EFB has no rule set for those operations.
How to read the Overview
- Read the stat strip: FDP elapsed, FDP remaining against the max, Duty 7 days, Duty 28 days and Block 28 days against their limits, Rest required after release, and Sectors this duty.
- Read the Current duty panel. The Remaining FDP ring shows the report, max FDP, elapsed and the duty-end instant, then Planned duty end and Regulatory FDP latest underneath, and the Nearest limit line.
- Read the Flight time and Duty time tiles beside it. Each group is
headed with the rule it implements - ORO.FTL.210(b) and ORO.FTL.210(a)
under EASA, 14 CFR 117.23(b) and 117.23(c) under Part 117 - and each tile
reads used of max with the remainder or overrun, then its window ledger:
"since
Z" with the duty count, the bar as the contributing duties laid end to end (the current duty, the two newest, older duties merged), the three newest contributing duties with date, station and hours, "+N more · open ledger", and a roll-off line saying when the oldest counted duty leaves the window ("Out of window 17 Sep 23:45Z", "Drops 30 Sep 23:00Z" - a calendar-month window turns at midnight at your home base - or "Nothing rolls off yet"). The whole tile opens the same limit detail as the breakdown panel below. - Read the Provenance note under the tiles. It says: "Cumulative totals use duties recorded in Pilot EFB and are only as complete as that history - a personal estimate, not compliance evidence." Take it at its word.
- Scan the Alerts panel and the side panels (Weekly recovery rest, Days free of duty, FDP extensions), each with its rule reference and a plain line on what it does and does not check.
- Click How FDP was computed in the panel head when a figure surprises you. The explanation opens answer first: a hero card with the regime, crew and acclimatisation chips and the FDP readout (remaining as the big figure, used and max beside it, an OK / NEAR / OVER word), then a three-step reasoning rail - max, used, remaining - with the engine's sentence and its reference under each step, a cumulative-windows card with a row per window, and the rules applied as chips. At the foot, Save calculation report keeps a frozen, hash-checked copy of this evaluation and opens the print dialog for a PDF; Saved reports in the rail's Tools group lists every copy with Share PDF again and Delete report. Share and Copy pass the explanation on as text.
Off duty, the Current duty panel becomes a calm status card - a status dot with "Off duty" and the regime, then two facts, Time off (how long since the last release, with the release day and Z time) and Next report (the day and Z time and "in Xh", or "None / Nothing rostered ahead") - with one New duty action. Under it sits the Rostered ahead desk: a stat band of Next report with its countdown, Projected breach, Caution and Rest short counts and the window's worst Duty time, 7 days reading, over a seven-day lane of report-to-release blocks toned by the projected reading with the rest between duties in words, then the table itself.
How to open a limit's detail
- Scroll to the Limit breakdown panel; its header reads "Click a limit for its contributing duties".
- Click a limit row. A centred card opens with the limit name, an engine chip (Over limit or Near limit when it applies), the rolling window and the duty count.
- Read the left rail: the used-in-window figure against the cap with a fill bar, then Over by or Remaining, Limit, Duties and Usage.
- Read the ledger on the right: each duty with its date, station, Report to off times, the Counted hours and its Share of limit bar. Hover a row for Open to jump to that duty.
- Click Done or press Esc to close.
How to enter a new duty
- Press Cmd+N anywhere on the Duty desk, or click New duty in the masthead. The New duty dialog opens over the page you are on.
- Enter the Report: the reporting airport ICAO and the reporting time, then the Off duty time on the same row.
- Set Crew complement and Rest facility; switch Augmented crew on if it applies, with the minimum in-flight rest achieved in minutes.
- Add each sector on its card: departure, destination and the block window. Mark positioning legs as such.
- Open Notes, discretion and standby if you need it: notes, a discretion entry, a planned FDP extension under EASA (under Part 117, whether an extension was decided before or after takeoff), Reporting time was delayed by the operator under EASA with the original time and when the notice reached you, or Called out from standby with when the standby began.
- Read the Live FDP pane on the right. It evaluates against your maximum as you type. With nothing flagged it reads "No breach found in the N provisions Pilot EFB evaluates" - a statement about the provisions it checks, not an all-clear. The list of what is and is not modelled is the What Pilot EFB checks page (press Cmd+K and type "coverage").
- Press Enter or click Save duty. The footer reads "Enter saves, Esc closes"; Esc, the backdrop and Cancel all ask the same question on a changed draft - "Save this duty?" (or "Save your changes?" when editing) with Save duty, Discard duty and Keep editing.

How to edit or end a duty
- Click Edit duty in the Current duty panel head, or click a row in any duty table. The same dialog opens as Edit duty, the whole form and the live review on one screen with no scroll at desk size; Save changes writes it, and the page underneath re-queries in place. A reserve row opens the reserve desk in the same dialog, rail included.
- After Save changes, the confirmation reads "Duty updated" with the FDP it now uses, and carries Undo. If the edit changes how a later duty reads, the desk says so ("This changed a later duty") and offers Review.
- To go further back, scroll to Version history at the foot of the Edit duty dialog: each earlier version with its date and Zulu time, Edited or Restored, the fields that changed, and Restore behind a confirm. Ten rows show first, then Show all N versions. The history keeps the newest 50 versions of each duty in this browser and does not sync.
- To close a duty in progress, click End duty now under the ring.
- Confirm End duty in the "End duty now?" prompt. The duty's end is set to the current minute and rest is counted from there.
Delete in the Edit duty dialog's header removes the duty. A deleted duty stays on the Recently deleted page for 30 days with Restore - press Cmd+K and type "deleted duty" to reach it.
How to work the Roster desk
The Roster row on the rail is one canvas with a fixed head: a VIEW switch of Ahead, All, Calendar and Year, a live "N ahead · M recorded" caption, Import roster and Open roster board, and the roster's command row of Add duty, Add a series, Repeat across dates, Log reserve, Ground / day off and Positioning. Positioning opens the duty dialog with its sector already marked as positioning.
- Open Ahead. The stat band and the seven-day lane sit over the Rostered ahead table: Date with "in Xh Ym" under it, Report - release (a "+1" marks a next-day release), Route with the kind and sector count as a caption beneath, Duty span, Rest before / min as a bar against the minimum, and a Projected column reading Within limits, Caution, Projected breach or Not projected. Each row carries a severity stripe, and the engine's own sentence sits inline under its row with an FDP used-of-max bar when the engine gave the figures. A Recorded table of the latest released duties follows; a truncated horizon is stated in the foot.
- Read the note under the band: "Projected readings assume each rostered duty is flown as planned. Recorded rows are clock facts; the All view lists every duty by month with the engine's FDP reading."
- Open All for the full month-by-month table with the FDP reading per duty, Calendar for weekly and monthly duty load, and Year for the season as a heatmap.
- Click any row to open it in the duty editor.
How to add a ground day, a sim session or a day off
Office days, classes, simulator sessions and days off are roster entries of their own, so the plan shows them as what they are rather than as empty days.
- Click Ground / day off in the masthead or on the Roster desk. The Add roster entry page opens with a How this counts panel beside the form.
- 01 - pick what it is: Office / ground duty, Training / class or Simulator session (each chipped 100% duty, citing ORO.FTL.105(10) and 14 CFR 117.3), or Day off (Not duty, ORO.FTL.105(11)).
- 02 - add a Title (optional) ("CRM refresher") and the airport
where it happens - your base for an office day, the training centre's
airport for a sim. The field offers "Use
for times" when the airport's zone differs from the form's. - 03 - set the start and end, with Now and 2 to 10 h length chips and the 24-hour day strip. For a day off, pick the first day and how many days; up to 31 go in at once.
- Press Enter or click the save button, which names what it writes (Save training / class, Save 3 days off). The row then reads by its kind and title, for example "Training / class · CRM refresher".
The panel states the counting for the kind you picked: an office day, a class or a sim session counts in full toward the cumulative duty totals, with no flight duty period and no flight time - a rest period follows it under EASA, and under Part 117 it adds nothing to the FDP or flight-time limits. A day off adds nothing to any total and owes no rest.
How to edit a month on the roster board
- Click Roster board in the masthead, the rail's Tools group or the Roster command row. The board opens inside the desk frame with its own head: the subtitle reads "Add and edit many duties at once - nothing is written until you save", with Discard and Save on the right.
- Pick the month with the arrows, or This month. The ribbon under the month marks duty days, invalid rows and today.
- Click a cell in the Duty grid (Date, Report, Off duty, Airport, Zone, Route) and type. Enter edits, Tab moves to the next cell, Space ticks the row, Esc cancels. Click a row to open it in the full duty editor and Apply to board.
- In the board's head, beside Discard and Save, click Add duty for a new row, Import file to jump to the import console, or Repeat pattern for the repeat flow.
- Tick two or more rows to open the Bulk edit pane: Set crew complement (Single pilot to 4 pilot), Set rest facility (None, Class 3 - seat, Class 2 - seat, Class 1 - bunk), Shift all times in 15-minute or one-hour steps then Apply, and Remove N duties. Clear selection closes it.
- Review the Edited, New, Removed and Invalid counts in the grid head (Jump to first invalid finds a problem row), then click Save. Every staged change lands in one transaction: all of its rows or none.

How to import a roster
- Click Import in the masthead or Import roster on the rail. The console opens on its Import tab; History and Operator config are the other two.
- Under Bring a roster in (its chip reads "Reviewed before anything is saved"), click Pick roster file on the CSV or iCal file tile, or drop the .csv or .ics file anywhere on the window. If you have no file, Enter duties manually on the Type it in tile opens the duty dialog instead.
- For a CSV, check the mapping on Match columns to duty details. The columns are pre-filled from the header names; the Clock times in this file: are they UTC or local? panel settles the time base.
- Review on Check the roster before saving. Every parsed duty sits in
the board's grid with a status filter: All, then Invalid,
Cancelled, Conflict, Changed, Check, Duplicate,
Edited, Unchanged and Ready, each shown while it has rows. A
newer export of a roster you already imported is matched to the duties in
your log: a moved duty reads Changed with "was ... now ..." lines, a
duty the roster cancelled reads Cancelled (tick it to move it to
Recently deleted), and Conflict means you also edited that duty since
the import. Click or type into a cell to
correct it; a one-click fix under an invalid row sets the value it names.
The note under the grid is the contract: "Edits apply to this import only
- nothing is written to your log until you save."
- Tick the duties to keep (Select all / Select none; duplicates start unticked) and click Save. The result page reads "Saved to your duty log" with View my duties, Import another file and Import history.
The reader does a few things on your behalf, and tells you about them. CSV legs listed out of time order are sorted by off-block time, and the row carries a note asking you to verify them. Rows of only commas are skipped. In a calendar file the reporting airport comes from the duty's own sectors unless the event's location is plainly an airport code, so a location like "Crew Room T5" is never read as one, and reminder alerts attached to an event never change the duty they belong to.

How to repeat a duty across dates
- Click Repeat across dates on the Roster desk (or Repeat pattern on the roster board) and pick the source duty.
- Pick the dates: the weekday preset, or individual date pills.
- Check the preview, then click Add N duties.
How to compare what-if scenarios
- Open What-if on the rail. The left column carries the what-if editor: the What-if duty card ("Baseline: your active duty - what-if sectors go on top") and Add a what-if sector. Nothing here is saved to your records, and its edits are the baseline for everything on the right.
- Click chips in the Scenarios strip on the right: Report +90 min, +1 sector, Slip -1h, Slip +30m, Slip +1h, Slip +2h, End +1h later and -1 sector. Each becomes a column beside Baseline ("The duty exactly as drafted") in the comparison board under the strip.
- Read each column: Verdict, Max FDP, Planned FDP, Margin and Planned off duty. A column that would exceed a window says so in words. Remove drops a column; nothing is ranked and nothing is saved.
- Read the Draft verdict panel under the board for the baseline. Its band leads with the engine's headline ("WITHIN FDP", "NEAR LIMIT", "OVER FDP - NOT LEGAL AS PLANNED" or "LIMIT EXCEEDED - NOT LEGAL AS PLANNED"), a usage ring with the remaining or over figure, the plan line, the engine's own remaining-FDP sentence and every exceeded window named beside its ceiling. An instrument strip follows - max FDP, planned FDP with its share of the max, FDP starts, FDP ceiling and the earliest next report, each clock only when the engine anchored it - then the cumulative-windows ladder beside the engine's warnings, worst first, each citing its rule. The earliest next report keeps its own caveat: a planning baseline only, recovery and operator rules may require a later report.
- Read the Latest block-out (planning estimate) card under the verdict. For the next sector not yet flown it gives the latest push-back that keeps the duty inside the limits the engine checks, the slack against the planned block-out and the limit that binds, each constraint with its own time, and - when a later duty is rostered - the rest it needs, to the minute, and the earliest it could then report. Its Assumptions and Not assessed lists say what it leaves out (commander's discretion, slots, curfews); it is an estimate, never an authority to depart. With nothing left to push back, it says why instead.

How to log reserve and standby
- Click Log reserve in the masthead or on the Roster desk. The reserve desk opens under the trail Duty & FTL / Reserve / New reserve: the form as three numbered steps on the left, a live How this counts rail beside it from 1180 px (under it on a narrower window).
- 01 - pick the kind. The cards are radios with the duty-credit chip and the regulation cite on each. Under EASA the group is Standby or reserve type: Airport standby, Home / other standby or Reserve. Under Part 117 it is Reserve type: Short-call reserve or Long-call reserve.
- 02 - enter the airport ICAO. The field names the airport it
resolved to, with its city, country and time zone, and offers a one-click
"Use
for times" chip when the form's zone differs. - 03 - set the period: the RAP start and, if you were not called, the RAP end (availability ended). Quick-set chips fill the start with Now or the length with 4, 6, 8, 10 or 12 h (conveniences, not regulatory values), and a 24-hour day strip shows where the window sits in the local day, wrapping past midnight, with the 02:00-05:59 window of circadian low shaded "Orientation only, not a limit check." If you were called out, switch Called out on and enter the Reporting time (when called) and the End of duty; under Part 117 the strip then splits into the reserve part and the duty part and the length chips hide.
- Read the rail as you type: per window, used of max with the exact minutes this period adds, the engine's tone word, warnings worst first, and the clauses that decide how the kind counts, each with its cite; an incomplete draft says what is missing. It carries the FTL footer.
- Click Save reserve period (Enter saves, Esc cancels - both on keycaps in the action row).
The Reserve section then lists every period (Date, Airport, Kind, Report / start, End, Reserve time) with the recent periods assessed beside the table. Its footnote states how each kind is counted under your regime and ends "Your operator scheme may differ - times are as logged, in UTC."
To record a flying duty that was called out from standby, use the duty dialog's Called out from standby switch instead.
On iPhone and iPad
The phone keeps its own Duty tab with a six-way segmented control, the Live Activity duty countdown on the lock screen, and the PDF roster importer, and it caps the free tier at 20 logged duties. On Desk nothing is capped, the segments become the rail, and the roster board, the comparison board and the in-place editor exist only in the browser. A duty saved on either side reaches the other through sync. See Duty & FTL on iPhone.
Troubleshooting
A limit looks wrong. Click the limit in the Limit breakdown panel and read the ledger of contributing duties, then How FDP was computed for the table row that applied. Compare both against your OM-A.
The cumulative totals are lower than my real hours. The ladders count only duties recorded in Pilot EFB. Import or enter the missing history before treating a total as evidence, as the Provenance note says.
The board will not save. A row is marked INVALID. Click Jump to first invalid; the pane names the problem. Save is blocked until every staged row is valid.
My imported duty is flagged. Filter the review grid to Invalid or Check, click the row and correct the cell, or use the one-click fix under it. How times are read explains the reading rules.
I imported the wrong file. Open the import console's History tab, open the batch and click Remove this import's duties, then confirm Remove. The batch is marked REMOVED and leaves the log as one unit; Restore duties on the same batch brings it back.
Cmd+N opened a logbook entry. The chord means "new duty" only while the
address starts with /ftl. Open the Duty desk first.
Where next
- Logbook - the entries table and bulk editor; Build from duties turns your duty sectors into draft logbook entries.
- Overview - the live duty and the rostered-ahead read on the home desk.
- Keyboard and command deck - Cmd+N, the "?" sheet and the Cmd+K deck.