Skip to content

[017] Pilot's Logbook (MVP) #17

Description

@iliall

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions