OVERVIEW
Single-user pilot logbook to record flights and view analytics and currency status. All dates/times are Zulu (UTC). Future dates are not allowed.
Build this as a Python backend service with no UI; expose the functionality below through an HTTP API.
AIRCRAFT MANAGEMENT
Fields:
- Registration/Tail No. (required), Make/Model (required), Category (required), Class (required)
- Type Designator (optional), Flags: Type rating required, Complex, High-performance, Tailwheel, Turbine
- If "Type rating required" is true, Type Designator becomes required
Categories and Classes:
- Airplane: SEL, SES, MEL, MES
- Rotorcraft: Helicopter, Gyroplane
- Glider: Glider
Uniqueness: Registration/Tail checked canonically (uppercase, spaces/hyphens removed). Stored data preserves user's original formatting.
Status: Aircraft default to Active. User can archive (set Inactive) or unarchive (set Active) aircraft. Inactive aircraft cannot be selected for new flights but remain on existing flights.
FLIGHT LOGGING
Fields:
- Date (required; today or earlier in Zulu)
- Aircraft (Active aircraft only)
- Route: Departure (required), Arrival (required), Via (optional); free text
- Times (decimal hours, must be multiples of 0.1): Total Time (required, > 0), Day Time, Night Time, PIC, SIC, Dual Given, Dual Received, Cross-country, Actual Instrument, Simulated Instrument
- Counts (non-negative integers): Day Takeoffs, Day Landings, Night Takeoffs, Night Landings, Instrument Approaches
- IFR tasks (booleans): Holds performed, Intercept/Track performed
- Notes (optional)
Validation:
- Day Time + Night Time must equal Total Time exactly
- Actual Instrument + Simulated Instrument ≤ Total Time
- PIC and SIC cannot both be > 0; their sum ≤ Total Time
- Dual Given and Dual Received cannot both be > 0; each ≤ Total Time
- Cross-country ≤ Total Time
- All times ≥ 0 and in 0.1 hr increments
Edit Flight: Allowed if aircraft is Inactive (without changing aircraft). Changing aircraft requires selecting an Active one.
Delete Flight: Permanently removes the flight from the logbook.
LOGBOOK LISTING & FILTERS
Default: most recent flights first.
Filters (combine with AND logic):
- Date range (inclusive)
- Aircraft (multi-select)
- Category/Class
- Text search across Route fields and Notes (case-insensitive substring)
Filters can be reused with Analytics.
ANALYTICS & CURRENCY
Totals:
- Presets: Last 90 days, Last 6 months, Last 12 months; or Custom range
- Metrics: Total Time, PIC, SIC, Night, Actual/Simulated Instrument, Cross-country, Approaches, Day/Night Takeoffs/Landings
- Group by: Overall, Category/Class, Make/Model
Day/Night Currency (per Category/Class; also per Type Designator when "Type rating required"):
- Window: last 90 days inclusive (flight date ≥ today − 89 days and ≤ today)
- Requirement: ≥ 3 takeoffs AND ≥ 3 landings
- Report: Current/Not Current with counts (e.g., "Day TO 2/3; Day LDG 4/3")
Instrument Currency (per Category):
- Window: 6 calendar months ending with current month (whole months). Example: 2025-11-11 → window is 2025-06-01 through 2025-11-30
- Requirement: ≥ 6 approaches AND at least one Holds performed AND at least one Intercept/Track performed
Currency results appear only for Category/Class combinations with at least one flight.
EXPORT
Scope: All flights or current filtered set. Output as CSV.
Format: UTF-8, comma-delimited, header row. Dates as YYYY-MM-DD, times with one decimal, counts as integers, booleans as true/false. Each row includes flight fields plus aircraft attributes (preserving Registration/Tail formatting). Reflects current aircraft data (edits apply retroactively).
OVERVIEW
Single-user pilot logbook to record flights and view analytics and currency status. All dates/times are Zulu (UTC). Future dates are not allowed.
Build this as a Python backend service with no UI; expose the functionality below through an HTTP API.
AIRCRAFT MANAGEMENT
Fields:
Categories and Classes:
Uniqueness: Registration/Tail checked canonically (uppercase, spaces/hyphens removed). Stored data preserves user's original formatting.
Status: Aircraft default to Active. User can archive (set Inactive) or unarchive (set Active) aircraft. Inactive aircraft cannot be selected for new flights but remain on existing flights.
FLIGHT LOGGING
Fields:
Validation:
Edit Flight: Allowed if aircraft is Inactive (without changing aircraft). Changing aircraft requires selecting an Active one.
Delete Flight: Permanently removes the flight from the logbook.
LOGBOOK LISTING & FILTERS
Default: most recent flights first.
Filters (combine with AND logic):
Filters can be reused with Analytics.
ANALYTICS & CURRENCY
Totals:
Day/Night Currency (per Category/Class; also per Type Designator when "Type rating required"):
Instrument Currency (per Category):
Currency results appear only for Category/Class combinations with at least one flight.
EXPORT
Scope: All flights or current filtered set. Output as CSV.
Format: UTF-8, comma-delimited, header row. Dates as YYYY-MM-DD, times with one decimal, counts as integers, booleans as true/false. Each row includes flight fields plus aircraft attributes (preserving Registration/Tail formatting). Reflects current aircraft data (edits apply retroactively).