Sunday, June 26, 2022

Custom Rating Progress

MyFlightbook has long tracked your progress towards the flight experience requirements of various ratings (113 of them at last count!).  But inevitably there are some that are useful to track but that are too narrow in application for me to create.  Over the years I've had a few requests to allow for custom ratings progress.

Today I've taken that feature out.

You can create your own custom ratings on the Training->Ratings Progress page, by selecting "Custom Ratings/Progress" from the top drop-down.  When you do this, you'll see an expandable section where you can create your own rating progress.

A bit of terminology in this context:

  • Milestone is a specific criteria to meet.  For example, "40 hours of dual instruction received in a tailwheel airplane".
  • A Rating here is not really a privilege per se, it's simply a term for something to achieve when you've met all of the specified criteria.  A rating is really nothing more than a named collection of milestones.
Milestones follow the basic model of specifying a threshold that must be met, the attribute that must meet that threshold, and any constraints on the flights that qualify towards that threshold.  The constraints, in turn, are determined by a saved search.  You can also use "All flights" as the constraint.

So in the example above ("40 hours of dual instruction received in a tailwheel airplane"), the threshold is 40, the attribute here is "dual instruction received", and the "in a tailwheel airplane" is encapsulated in a saved search.

A milestone also includes 3 more fields: a regulatory reference (if one exists; otherwise, you can simply use a number as a way of sorting milestones), a title, and an optional note.

An example

Here's a simple example.  Suppose I belong to a flying club that has a tailwheel aircraft, but because of insurance requirements, I can't fly it until I have at least 300 hours of total time, at least 20 hours in tailwheel airplanes, and at least 10 hours of instruction in N6169M, the specific aircraft in question.

Step 1: Create the query for flights in N6169M.  Simple enough:

When I click "Find Matching Flights", this will be created as a query named "N6169M".  Pick any name you like, of course.

Repeat this to create a query for Tailwheel airplanes.  In my case, I'm going to name it "Tailwheel"

Step 2: Create the new rating.

Go to Training->Ratings Progress and choose "Custom Ratings/Progress, then expand the section to create a rating and fill it in:

Notice in the image above where it offers a space to fill in an optional longer description or notes; I'll show below where this appears.  For this example, I'm going to put in "This is an insurance requirement, not a regulatory requirement".  Click "Add a new rating" to create the rating and it will be available from the drop-down that contains the available custom ratings:

Notice where the note appears.  But alas, this isn't very useful yet: it has 0 milestones.  Let's create them.

Step 3: Create the milestones for the rating
Click on "Add/Edit Milestones" next to the rating:

You'll notice at the bottom of this screen that there are no milestones yet.  As we add milestones, they will appear there.

Since there's no actual regulatory requirement for this "rating", I'm just going to use 1, 2, and 3 as the Reference.

The 300 hours Total Time requirement is straightforward:

Notice that I can use simple markdown here for legibility: by surrounding words with asterisks, they will be in boldface when displayed.  You can also add hyperlinks by using the syntax "[Google](" to get it to display as Google. In this case, I added a link to the insurance documents to the note for this milestone.

Also notice that the first two milestones use "(All flights)" as the matching criteria.  When you click "Add new milestone/criteria", it shows up in the list of existing milestones:
You can add the other two milestones in the same way, choosing "Tailwheel" and "N6169M" as the "For flights matching" option as appropriate:

Note that if you make a mistake, you can click the red "x" next to a milestone and re-create it.

Step 4: Try it out

Close the milestone box above by clicking the gray "x" in the upper right corner, and you can select your custom currency from the list:

(Darn, I have all the experience but haven't been able to fly N6169M yet!  Looking forward to it...)

Limitations of Custom Ratings

Regulation-driven rating requirements tend to be complicated, and for that reason I've hand coded all of the more than 100 built-in ratings in the system.  The most common complications include things like substitutions  - for example, requiring a certain number of hours of flight experience, but allowing substitution of simulator time up to some limit.  Custom ratings progress do not possess these sorts of complications.

One other common requirement for regulatory ratings are "one-off" requirements, such as a long solo cross-country flight that is at least some distance.  Easy for me to hand-code, but getting that into a custom rating regime is...harder, so I've passed on doing so for now.

Interestingly, one other wrinkle in regulation driven requirements (at least for the FAA) is that some of them can decay over time.  Specifically, the FAA often requires a certain amount of training within a particular window prior to a checkride (e.g., 3 hours of training within the 2 calendar months preceding a checkride).  Because Saved Searches can handle these sorts of date windows, custom ratings can also encapsulate these!

But the vast majority of these sorts of things are simple requirements that follow the basic template of "Make sure you have [X hours or count, as appropriate] of [Some type of experience - total time, solo time, night flight, carrier landings] in flights that meet [some criteria]", and thus can be handled by custom ratings.

Please let me know if there are scenarios I'm not handling besides the ones above.

Saturday, April 23, 2022

Default Date of Flight on iOS or Android

When using the mobile apps, the "date" field might often be filled in with a stale date - typically the date that you last flew.

So, for example, imagine that you take a flight today (the 23rd as I write this) and after the flight fill in the details of the flight and tap "Add".  The flight gets added to your account and the "New Flight" screen gets reset, including (a) the same aircraft you just used for the flight you just entered, (b) today's date (the 23rd), and (c) some other carry-forward information as appropriate (such as the aforementioned Hobbs time)  Tomorrow (the 24th) you take another flight.  When you tap on "New Flight" it will still say the 23rd because that's the data that was on that screen when you last left it.

I'm occasionally asked why this is and asked to change it so that it always defaults to "Today".  Unfortunately, there's no perfect solution here: optimizing for one scenario actually makes it worse for others, and I've always come back to the same conclusion that it would be the wrong behavior, for two main reasons:

Mostly - it changes data simply based on navigating away and then back to a screen – that’s generally badness, and there’s nothing anywhere else in this system (or any other system I can think of) that modifies data based on a view/navigate event.  For example, imagine if you were to start looking for an airline flight on a given date, then go to another tab to verify you can get the hotel you want, and then when you navigated back to the airline website tab and it had reset your date of flight or origin or destination.  

Think of “New Flight” simply as a browser tab – it’s completely independent of the other tabs, and it doesn’t update its data simply because of the passage of time.  

But perhaps the bigger reason is that it breaks a lot of very common scenarios.  

For example, if you fly today (the 23rd) and fill in some of the data after the flight, but not all of it.  Then tomorrow (the 24th) you fill in the rest of the data, it would be an error to push the date up to the 24th without you doing something.  Or, suppose you depart at 10pm on the 23rd and land after midnight on the 24th - now the date-of-flight would (incorrectly) be the 24th instead of the 23rd.

In a similar vein, it would break the scenario of entering an older flight unless you could complete it without interruption.  For example, suppose you start entering a flight from last week, but you get interrupted and have to leave the screen for a moment.  You come back and continue entering the flight but - alas - now the date has updated from last week to "today."  Not what you intended at all.

So that's why it doesn't update to "today".  But it is obviously not unusual to start a flight on a day that is after your most recent flight.  

For this reason, the apps implement a few "fail-safes" that try to ensure the date is the current (local) date, when appropriate:
  • Setting a flight start, engine start, or block-out time will all adjust the date field to be consistent.  So, for example, if I last flew on April 21st, then the date-of-flight will probably still say April 21.  But if I press “Tap for now” on block out, it will set it to whatever “Now” is locally (April 23, as I write this)
  • You can press-and-hold the date field to set it to "today".  
  • If you want to clear the form for a new flight, you can always do a “Reset” (tap the action button on the lower toolbar and you’ll see the Reset option), and that sets the date to Today

Friday, April 15, 2022

Total Approaches and autofill of enumerated approaches

In a previous entry, I describe MyFlightbook's model of logging a total approach count and then optionally describing subsets of those approaches.  The idea is to strike a balance between ease of data entry and ease of computation for things like 61.57(c) instrument currency and totals.

So, for example, if you go up and practice a bunch of approaches, you might do 2 VOR approaches and one ILS approach.  In this scenario, you'd log "3" in the "Approaches" field, and then use the "Approaches - VOR" and "Approaches - ILS" properties to log 2 and 1, respectively.  Putting "3" in the approaches field lets the currency computation for instrument currency know unambiguously that you performed 3 approaches; the remaining properties are really just for your convenience if you like to know how many ILS or VOR approaches you've performed.

Expanding on that last point a bit: it's fine if you simply log "3" in the approaches field and don't bother with any of the subset properties (although 61.51(g)(3)(i) does require that you provide the location and type of each approach; this can be done in an unstructured textual manner in the comments for the flight or in the "Approach Name(s)" property).

There are a whole bunch of possible approach types in the system (ILS, VOR, RNAV, NDB, etc. - 43 different kinds at the moment, actually!) and these are flagged as approaches.  

As a convenience, when you save a flight that has one or more of these approach properties, but that has no total approaches indicated, it assumes that you were not explicitly declaring 2 total approaches but rather that you neglected to fill in that field. For that reason, it adds up the enumerated approaches and auto-fills the Approaches field.

So, for example,

Flight has: Then:
2 ILS approaches
1 VOR approach
Empty "Approaches" field
Approaches field is auto-filled to 2 + 1 = 3
2 ILS approaches
1 VOR approach
5 in the "Approaches" field
Flight is unchanged - clearly stated there were 5 approaches, and you've described 3 of them
2 ILS approaches
1 VOR approach
2 in the "Approaches" field
Error - you've described more approaches than the total that you indicated.

A key observation about this is that the math above only works because the properties that are tagged as approaches are mutually exclusive: a given approach cannot simultaneously be an ILS approach and an NDB approach, so adding the two together is OK.

There are a number of approaches that you can describe with properties, though, that are not flagged as being approaches and thus do not result in the autofill behavior described above.

The first of these is "Approaches - Visual," for the obvious reason that you don't want this to count towards your total approaches because it would mess up your 61.57(c) currency (which requires you to flight by reference to instruments).

The other exception to the autofill rule are approaches that are not mutually exclusive with other approaches.  This includes things like Category I/II/III approaches, RNP approaches, or coupled vs. hand-flown approaches.  These are subsets of the subsets, if you will: think of them as an adjective/modifier/constraint on a procedure, as opposed to a particular type of a procedure.

So, for example, if you fly 3 ILS approaches to a runway, 1 of which was a Category II approach and the others were vanilla ILS approaches, you might log 3 ILS Approaches and 1 Category II approach, but it would be a mistake for the auto-fill feature described above to fill in "4" for the total approach count.

For that reason, these "approaches" are not flagged internally as actually being approaches, and thus will not trigger auto-fill of the approaches field; they're really for your recordkeeping benefit only.

Monday, February 7, 2022

Please help me beta test the new version of the Android app

The MyFlightbook Android app is written in the programming language Java, which was the only option 10 years ago when I first wrote it.  But over the past few years, Google has been officially pushing people to use the newer Kotlin language instead.

If none of that makes sense to you, I can just summarize it this way: I need to future-proof the app, and that means translating it into a new programming language.

Fortunately, Google has provided some excellent conversion tools that do a remarkably good job at converting from one language to another.  I spent a bunch of time over the past weekend using these tools to convert the code, and testing/tweaking to make sure that it all works.

I think it's working (indeed, I found and fixed a couple of minor bugs that exist in the current Java-based version), but here's where I need your help: before I unleash this new version to replace the old, can you help me find any remaining issues?

If you're willing, please join the Beta program for the app and send me any feedback, bug reports, etc.  Instructions for how to do so can be found here under the heading "Get beta versions of apps".   It takes a few minutes to add your account to the beta, but when it happens...well, try it out!  

You shouldn't really notice any difference (I don't want to be adding features during a transition like this), but you can tell that you're running the Kotlin version by going to the Profile tab and scrolling down to the very bottom; it should say "(Kotlin)" next to the copyright information.

This uses your same data, same credentials, and everything, so you can use it in place of the production version.  And if you run into any issue that makes it not work for you then you can go back to the production version by leaving the beta program (but hopefully after sending me the steps that led to the problem!!)

Thank-you in advance!

Tuesday, February 1, 2022

TAA Time in a helicopter

I got an email today from someone who flies both airplanes and helicopters asking why the "TAA" time in their totals only included their airplane time - it didn't include any of their time in technically advanced helicopters.

That's because technically (pun not intended) there is no such thing as a helicopter that is a TAA.  The 2nd "A" in "TAA" is "Airplane" - indeed, 61.1 defines TAA very explicitly as "an airplane equipped with an electronically advanced avionics system".  (61.129(j) defines it further, requiring a PFD, an MFD with a continuously visible moving map, and a two-axis autopilot).  The FAA uses "aircraft" where they mean an arbitrary flying machine, the use of "airplane" is not accidental.

Since TAA time is important for commercial airplane ratings, and because it technically only applies to airplanes, I report the TAA time in totals limited to airplanes.

So why do I allow non-airplanes to be tagged as "TAA"?  Simple: there are obviously non-airplane aircraft that meet the 61.129(j) definition but for the "airplane" part and people often want to track that.

If you want to see your time in, say, technically-advanced helicopters, you can search for flights where the flight aircraft was “TAA” and then look at the resulting helicopter totals (or better, search for flights in helicopters flagged as TAA), in which case the resulting overall totals will “TAA” (in quotes, because it’s not technically TAA) time.  

In this case, you'll see a criteria label of “Technically Advanced Aircraft” (rather than "Airplane") because it is not explicitly limited to airplanes. 

Note that if you do the search above and don't also restrict to helicopters, you may see your airplane TAA totals in your resulting totals because the search is finding all TAA (Aircraft) flights, which includes both your airplane and helicopter time, but the TAA total you see will still represent *airplane* time.  

E.g., if you were to search for TAA as above, with no other criteria, and your resulting totals had, say, 30 hours total of which 25 were in helicopters and 5 were in, say, a C172 that meets the TAA criteria, then you’d see a bottom-line total time of 30, 25 hours of helicopter time, 5 hours of ASEL time, and 5 hours of TAA time.  You could then simply look at the total helicopter time (25 hours here) and say "I have 25 hours of time in a technically advanced helicopter."

But if you search for TAA AND helicopter, then you’d get a result with only 25 hours, 25 of which were in helicopters, and you will *not* see a separate line for TAA in your totals because none of the resulting time came from airplanes.

Friday, January 7, 2022

Auto-fill functionality

I updated the mobile apps today to add support for autofill.

The website has had autofill functionality for a long time, but the mobile apps haven't.  The main reason for this is that the mobile apps can function while offline and actually measure a flight using the GPS, so they've historically been more optimized around detecting flight events in real-time.  The website, on the other hand, requires that you be online. 

So I thought it might be useful to review some of what the apps and the website can do for you automatically here.

Auto-fill Total Time, Hobbs

The mobile apps allow you to tie the total time field to block, hobbs, engine, or flight times.  This is a tight coupling: if you have both start/stop of the source defined, then any change in the value of a start or stop changes the total time field in real time.

Hobbs time similarly can be sourced from flight or engine time, and is also tightly coupled.

Automatic Cross-fill

On an aircraft-by-aircraft basis, you can specify automatic cross-fill (copying of a value from one field to another) from the Total Time field to your choice of PIC, SIC, or Instructor time.  (And if PIC, you can have it fill in your name as the PIC for that flight as well).  

The rationale for doing this on an aircraft-by-aircraft basis is that you might fly professionally in a jet during the week as a second-in-command, and fly your personal 172 on the weekends.  You'd automatically log PIC time in the 172, SIC time in the jet, and not do any cross-fill when you fly with a friend in their plane.

Automatic cross-fill operates under a few rules that are important to note:

  • It will never overwrite a non-zero value.  So if you have PIC cross-fill on and fly for an hour where you and a friend each are PIC for half of the flight and you log 30 minutes as PIC, then it will NOT overwrite that 30 minutes
  • It happens on the server at the point that you save the flight.  In other words, you won't see it applied while you're entering the flight itself, but after you add the flight to your logbook, you'll see that the cross-fill has occurred.
  • It is only applied to new flights.  So if you edit an existing flight, the cross-fill will not happen.  This is important to allow you to override the cross-fill on a flight-by-flight basis (otherwise, you'd set the PIC field to 0 because someone else was flying, and the PIC time would come right back).


The mobile apps can run while offline, usually have GPS access, and can thus detect takeoffs and landings (using speed), nearest airports, and whether it is currently "night".  You can configure a variety of settings such as threshold speeds for takeoff/landing and what criteria to use for night flight or night landings (FAA and EASA rules can vary on that).  The system then updates the flight data in real time to reflect the flight in progress.

To do this, the system must use the GPS even in the background, and because that can consume battery, it only does this when a flight might be "in progress".  "in progress" is defined in this context as having (a) either a defined engine start or a defined flight start time, and (b) NOT having a defined engine end time.

What I typically do is tap "Tap for Now" on Engine Start as part of my engine start procedure, then tap "Tap for Now" on Engine End as part of my shutdown procedure.  The app will listen to the GPS between these two events.

You can also send a GPX or KML file to the MyFlightbook app on Android or iOS.  When you do this, it sets and engine start time to the timestamp of the first sample in the file, and then plays the file as if it were real-time GPS samples, and then sets the engine end time to the timestamp of the last sample.  It uses your autodetection settings for all of the intermediate GPS samples.  (This functionality has also existed on the website for many years).

Some of the things that auto-detection will fill in include:

  • Departure, arrival, and any intermediate airports
  • Total landing counts, including the subsets that are full-stop day and full-stop night
  • Night takeoffs
  • Night flight
  • Cross-country time (using a 50nm threshold; see here for why I don't do it for all cross-country flight)
It's useful to note that you can pause/play autodetection by tapping the green pause/play button on the "In the cockpit" section of the iOS or Android app.  (This button only shows when a flight is in progress).  This is useful if you, for example, fly from A to B for lunch or gas, then fly back to A and want to record it as a single flight but still get the times correct.


Because the apps have supported auto detection for years, there generally hasn't been a real need for autofill.  But there are still a few scenarios where it makes sense, which is why I've added it.

Autofill overlaps with autodetection when there is telemetry (GPS) data present.  If so, it has all of the functionality of Auto-Detect.  But it can also work without telemetry, and it fills in a few things that Auto-Detect doesn't.

Where Auto-detection tries to fill in a flight based on GPS data (or a GPS file), the philosophy behind Autofill is to try to look at the flight and see if there are missing things that can be inferred or calculated.  Naturally, the first thing Autofill tries to do is to autodetect, if appropriate GPS data is available. 

One of the things Autofill can do is to estimate night flight.  I say "estimate" because that's the best I can do without actual GPS samples.  But if you have exactly two airports in your route of flight and start/end pairs defined for any of block, engine, or flight time - and these are in a defined timezone (i.e., UTC) - Autofill will construct a synthetic GPS path that is constant speed and great circle path from the first airport to the second.  It will then perform autodetection on that synthetic path.  

This is only an approximation, of course.  Imagine you flew from San Francisco to London - a perfect great-circle route at a constant speed will imply a certain amount of night flight.  But if you actually flew further north or south (perhaps for better winds), or if you had strong headwinds during one part of the flight and strong tailwinds during another, you would obviously have experienced a different amount of actual night flight than the constant-speed great-circle estimate.

In addition to whatever autodetection can be performed (whether with actual or synthetic GPS pdata), Autofill can also fill in:

  • Total Time, if it is empty (zero) and if it can be determined from (in priority order): Hobbs time, block time, engine time, or flight time.  Note that the new Autofill functionality in the mobile apps will do this as well, even if you have an AutoTotal setting.  Imagine again that you fly a jet during the week (no Hobbs meter) and a club plane on the weekend (with a Hobbs meter), and you have AutoTotal set to use Block Time.  For your weekend flight, if you don't enter a block time but do enter a hobbs time, it will still fill in a total value for you based on that. 
  • Ending Hobbs Time, if there's a non-zero starting Hobbs and the total time is known
  • Ground Instruction given or received.  If you have both a defined Lesson Start and Lesson End time, then your flight time (hobbs, block, engine, or flight, in priority order) is subtracted from that, and the remainder is assigned to Ground Instruction Given (if you have Instructor time logged) or Ground Instruction Received (if you have Dual Received logged)
  • Cost of Flight.  If you have a private note on the aircraft that includes something in the form "#PPH:75.00#" (where the "75.00" can be any decimal number), then that is treated that as the cost per hour for that aircraft.  So in this example, if you logged a 2 hour flight in an aircraft with "#PPH:75.00#", it would record 150.00 as the cost of the flight.  (And if you are using US conventions, that would display as $150.00).
If you have other suggestions for autofill, please send them my way!

Thursday, March 18, 2021

Saved Searches and Flight Coloring

Do you ever find yourself doing the same search over and over?  Want to highlight your flight reviews or IPCs to make them easy to spot in a printout?

MyFlightbook allows you to name a search (aka "query") for future use.  It's pretty simple to use.  To give a search a name, use the drop-arrow next to the search box:

Just type in a name, and when you click "Find Matching Flights", you will not only see the results of the search, but the search will have been saved in your account as well.

The image above is from the website, but it's the same basic idea on the mobile apps; you can give it a name on the bottom of the screen where you fill in the search form.

Previously created queries are listed below the edit box where you type the name:

Click on the name of the search to apply it, or click the red "X" to delete it.  

You can update an existing saved query by simply re-using its name with a new search.

This can be super handy for common searches.  Each year at tax time, for example, I want to know about my angel flights from the previous year (that's the query that's shown above).

Flight Coloring

Saved searches are a nice power feature, but where they get really powerful is when you combine them with a relatively new feature: Flight Coloring.

Flight coloring allows you to specify a background color to use in the logbook display for flights that match a saved search that you have created.

Flight Coloring is a two step process: first, save the search with a name.  Then, go to Preferences (under the Profile menu)

You'll see all of your saved searches there; next to it, you'll see a sample area.  Click that and you can choose a background color (pale colors work best), or click "Remove Color" to remove the color.  

Your logbook will then display matching flights using the color you've selected:

You can even choose to have these flights highlighted in the print layout - this can be useful, for example, if you are going for a job interview and want to make it easy to find finds that are significant to demonstrate experience or training.

More Tips about Searching on MyFlightbook

MyFlightbook has a very rich and powerful set of search options.  You can learn more in the FAQ.

Wednesday, March 10, 2021

Pending Flights

Can a flight be in your account but not in your logbook?  Yes.  MyFlightbook supports the notion of a "pending flight", which is simply a flight that is awaiting (pending) addition to your logbook.

Pending flights are designed primarily to address two scenarios:

  • You fly professionally and have a schedule of upcoming flights.  You might want to get those into the system before you fly them, but obviously you can't claim the time or experience before actually doing so.
  • You perform a bulk import and some of the flights have errors.  The flights with errors can be moved into the list of pending flights, allowing the error-free flights to be added to your logbook.  You can then fix the errors at your leisure.

There are other scenarios as well, of course, but those are the big ones.

There are two main features of a pending flight that distinguish it from a regular flight.  The first is that it is NOT included as a flight in your logbook: it is ignored for purposes of computing totals, currency, visited airports, and so forth.  Think of it as a scratch pad for flights.  The second is that error checking is basically suppressed.  You can have a pending flight in the future, you can have one that does not have an aircraft assigned, or that violates other integrity checks.  Obviously, a pending flight with such errors in it cannot be added to your logbook until the errors are addressed.

Creating Pending Flights

The most common way for pending flights to be added to your account is via Import.  If you import a file and some flights have errors, you'll have the option to import anyhow, with flights containing errors shunted over to the pending flights list.  If so, you'll see something like this at the end of the process:

In the example above, 5 flights were imported but 2 of them had errors; they ended up in pending flights, and the other 3 were added to the logbook.

MyFlightbook can import from a variety of sources, including some scheduling programs, which often lack required information such as the aircraft used for the flight.  These sources can only import to pending flights.  If you import debriefed flights from CloudAhoy, the same holds true - you will need to review these flights before adding them to your logbook.

The other way to create a pending flight is to do so explicitly when creating a flight.  Use the drop-menu next to the "Add Flight" button and you'll see the option to save as a pending flight instead of as a regular flight in your logbook:

Note that pending flights can have telemetry associated with them, but they cannot have images; you'll need to add any images after you add the flight to your logbook.

Reviewing Pending Flights

Go to "Pending Flights" under the Logbook tab to view any flights that are pending addition to your logbook.  You'll see a list of your pending flights (if any).  At the bottom is an option to bulk-delete them if you decide they were added in error or are an artifact from an import attempt prior to a successful import.

Otherwise, you can selectively delete pending flights that you don't need, or click on a flight in the list to edit it.  When you're done editing, click "Add Flight".  If you've addressed any errors in the flight, then the flight will be added to your logbook and removed from the pending flights list.  You can also use the menu next to the "Add Flight" button to update the pending flight.  Updating the flight preserves whatever changes you made, but keeps the flight in your pending flight list.

Mobile App Support

Both the iOS and the Android apps support pending flights.  The basic model is exactly the same, except that the pending flights are integrated into the recent flights list.  You can explicitly save a new flight as pending as well.  On Android, you can do this from the menu.  On iOS, tap the "action" icon (the box with an up-arrow) along the bottom toolbar.

Note that because the mobile apps can work while offline, they have another sense of the word "pending" that does not have meaning on the website: namely, the notion of having a flight that has not yet been uploaded to the server.  I am using the terminology "Awaiting Upload" to describe these flights.  So a flight that is "awaiting upload" is still local to your device, and may be waiting to go into your logbook or into pending flights, whereas a flight that is in your pending flights list is in fact up on the server and therefore available to any of your devices.

Tuesday, January 26, 2021

Can my logbook change without me doing anything?

The short answer is "yes."  Should you be concerned?  Well, obviously the only person who can answer that is you, but I think the answer is "no" and this post will go into excruciating detail about the ways in which your logbook can change without your action, and you will at least understand my perspective for why you shouldn't be concerned.

There are three ways your logbook can change without you doing anything.  A MyFlightbook admin can make a change; this is actually the only way that you logbook can be directly affected without any interaction on your part.  The second way is that an instructor can sign flights, revoke a signature, issue an endorsement, or add flights.  The other is that your logbook can be indirectly changed through a change to crowd-sourced data upon which it relies.

Allow me to address each of these scenarios. 

Site Admin Changes

Site admins can do anything to your logbook because they can emulate your account.  (There are other admins with lesser privileges too, who do not have this ability).  Why such great power?  Customer support, primarily: I can't track down an issue if I can't see what you see.  

This is, of course completely standard industry practice: when you call Amazon or Expedia or your bank, they can get into your account to some degree or another for precisely these reasons; they wouldn't be able to fix the quantity on your purchase, fix your reservation, or explain a credit card charge if they didn't have these tools.  These are trusted employees, and (particularly where money is involved!) the tools have audit trails so they can't do anything nefarious without getting caught.  And the system works.

I am one of two site admins, and I do pretty much all of the admin work.  I would estimate that more than 95% of the time that I emulate an account, I make no changes at all - I'm trying to track down a bug report, or explain why something is happening, or I need to see some data "in context" to inform a development decision and so forth.

But there are a (very) few scenarios where I will make a change to your logbook.

The most common reason - by far - is fixing aircraft.  I have a very specific way to do anonymous aircraft and sims/training devices to avoid conflicts with registered aircraft, but people will often create aircraft with tail numbers like "BE23" for an anonymous Beech 23 (which could conflict with a Chinese aircraft, which begin with "B") or "FTD" for a sim ("F" is the prefix for French aircraft).  No big deal, it's just a naming thing, and with the press of a button I can map your flights in the misnamed aircraft to the correctly named one and thus keep the set of aircraft clean.

Another area is images.  Data admins (data admins are a distinct set of admins, with more limited capabilities than site admins; all site admins are data admins, but not all data admins are site admins - think of them as Wikipedia editors) have the ability to review images for flights and/or aircraft, and remove any deemed inappropriate.  E.g., if it's porn, if there's a copyright complaint, etc.  Been months (maybe years?) since I last deleted such an image, but I will do it periodically.

There is only one other - rare - scenario where I will modify a flight of yours, that I can think of: signed Flights can sometimes be marked as having a valid signature when they are no longer in sync with what was signed, or vice-versa.  I periodically review these flights and set the state correctly.

That's really it for what ever might happen directly to your logbook without your participation.

Instructor changes

You can have an instructor sign a flight ad-hoc, but this requires that you be face-to-face with the instructor, so I don't think that counts as "without you doing anything".
But if you set up a student/instructor relationship with an instructor, you may grant them certain permission to make changes that they can exercise unless/until you revoke those permissions.

Specifically, an instructor can:
  • Issue new endorsements.  No specific permission is required - if they're your instructor, they can do this.  They cannot delete or edit endorsements.
  • Sign flights that you have requested that they sign.
  • If you've granted the instructor permission to view your logbook, they can also sign any unsigned flight they encounter (or re-sign any flight that they had originally signed but which has been modified), even if you did not request that signature.
  • If you've granted the instructor permission to add flights to your logbook, then they can, umm, add flights to your logbook.  They can also revoke signatures from flights that they have signed (e.g., if they mistakenly signed the wrong flight).

Crowd-sourcing Changes

Perhaps of more interest is the indirect stuff.  When you log a flight in N12345, your flight entry doesn't know anything about N12345 - it's just a reference to an aircraft somewhere else in the database.  And that aircraft, in turn, references a model definition that is in yet another location in the database.  So attributes like "it's a Boeing 737" or "it has a glass cockpit" are not stored in your flight.  See here for considerably more detail about how this all works, but the important thing is that the data about aircraft and models comes from the MyFlightbook user community - and can be edited by the MyFlightbook community as well.

The key point is that if the model of an aircraft that you fly changes, or if the definition of a model used by one of your aircraft changes, then your totals and/or your currency could potentially change.  Yikes!

Or is "yikes" an overreaction?

If you (or someone else) changes an aircraft or a model and you (or they) are the only person with any logbook references to that aircraft/model, then by definition there is no problem: the change made affects the person making the change and nobody else, thus all is good.

On the other hand, if the change is to an aircraft or model that is used by pilots other than the one making the change, then obviously that could be an issue.

In this scenario, an email goes out both to any data admins on the site as well as to any pilot potentially affected by the change.  The purpose of this is twofold: (a) the data admins will review the change.  That's non-negotiable.  But - often more importantly - (b) the affected pilots can see if there's any problem with the change, and they will contact the data admins if there is.  The affected pilots, kinda by definition, actually fly these aircraft and as a result know them better than any admin could.

The vast, vast, vast majority of these changes fall into one of two categories.  The details are described here, but the gist is that most edits are either:

  • A "minor" change that actually improves the accuracy of the data.  E.g., specifying that a "C-172" is actually a "C-172 P".  Either way, it's still a C-172, and your totals/currency/etc. don't change.
  • A more significant change, which ends up resulting in the aircraft being cloned.  Two common examples here are a tail number re-assignment (N12345 was a C-172 but is now a B-737) or an aircraft that is on wheels part of the year and floats on part of the year being edited to indicate the opposite undercarriage.  In this case, your logbook still doesn't change: the clone is detected automatically, and your logbook preserves a reference to the original, not the clone.  (You still get an email, in case the clone is either more accurate for you, or in case you want both versions.)

There are the occasional edits that are in error, or otherwise require reverting.  These are very rare (a few a month, perhaps) and typically corrected within hours of occurring. That's really the primary risk here.  But it is always (a) reviewed by a data admin, so it is (b) fixed promptly.

And the benefits of the two non-erroneous edit examples above vastly outweigh the downside of the rare and short-lived erroneous data.  (And, of course, rare-and-short-lived-erroneous-data happens all the time with curated data, not just crowd-sourced).

As I write this, MyFlightbook has 6-figures of users (wow!) and 8-figures of flights in the database, and has been around for 15 years.  And the examples of this leading to problems of inaccurate computations for things like totals/currency has been...basically nil.

There's one other set of data in MyFlightbook that allows for crowd-sourcing: airports.

Airports in MyFlightbook are a bit of an odd-duck: they're in the database, but they're not "connected" to your logbook in any meaningful way.  You can add airports to your flight that aren't in the airport database and it is no problem.  I keep old airport codes around as long as I can - after all, if you flew to KOLD years ago and it's now KNEW, then KOLD should continue to work.

At a high level, I use airports for 3 purposes:

  • Mapping your flight
  • Showing where you've been
  • In ratings progress, determining if you've met cross-country distance requirements

So if you have a flight that references XYZ and XYZ isn't in the database or refers to something other than what you thought it referred to ("LCL" being a great example - people use that for local flights, but it's an airport in Cuba), then the worst downsides are that your map looks wrong, there's in error computing where you've been, or MyFlightbook thinks you have or haven't met a rating requirement. But none of those are "material" - your logbook still accurately has the record of the flights you've taken and where you visited, as you recorded it.

Most of my airport data (currently over 58,000 airports, heliports, and seaports) comes from various (free) data sources, including the FAA.  Airports entered into the system are considered "native", and cannot be overwritten or deleted by anybody - not even an admin.  Well, OK, I suppose as site developer, I can go directly into the database and delete something...but I just don't do that because direct database access is juggling with very sharp running chainsaws; the point is, there's no tool to do this.

MyFlightbook users can add their own airports (currently over 2,500!).  This is a great addition to the system, with all of the aforementioned benefits of crowdsourcing.  These airports CAN be deleted by either the user who created them, or by a data admin (if they review and decide it's inappropriate for one reason or another), but not by other users.

There are a few changes that can occur in the airport database:

  • By far, the most common is that a new airport is added.  Note that if KOLD becomes KNEW, then I don't change the KOLD entry in the airport database, I add KNEW alongside it so that either code works for the airport.  I'll probably designate KNEW as "preferred", but KOLD will continue to work.
  • If a user enters an airport that looks like its in the same location as an existing airport, and it appears to be an "official" code for the airport (typically ICAO, IATA, or FAA), then I'll "absorb" it into the system, making it native.  Then it can't be deleted.
  • If a code assigned to one airport is assigned by an official organization (ICAO, IATA, FAA) to a new airport, then I'll overwrite the existing name/location for the code with the new name/location.  This is the scenario where KOLD used to be in California but is now an airport in Florida.  
  • I have a tool that looks for user-created airports that are duplicates of existing airports (e.g., with existing FAA or ICAO or IATA codes).  The idea is to try to find where someone made up a code for an airport but that didn't need to do so.  In this tool, I usually simply coalesce the airports and mark the official one as "preferred", but I can also decide to delete the (presumably) made-up airport code, especially if I'm worried about a potential conflict.  If I do this, then the "Route" field of the creating-user's flights containing that code is updated to reflect the remaining airport.  I've only rarely deleted airports in this manner, and because this maps to a more current code, it should map correctly and compute distances correctly. [Update Jan 26: I'm removing the piece of this code that updates the route for user flights].

With the exception of the last scenario, no flights for any users are changed.  The only change that you would notice is in the third scenario: if you have a flight with KOLD in the route, then it will map using the new location rather than the previous location.  Of course, that's what it would do in ForeFlight, Garmin, or any other mapping app, as you'd expect.  

I think it's more accurate to say that changes in the airport database don't change your logbook, but they can change the map or analysis of your logbook.

And that's about it.  Personally, I think the tradeoffs - the benefits of lots of eyes keeping the data accurate and up to date - vastly outweigh the rare and ephemeral errors.

Hopefully this explains what can - and cannot - be affected by MyFlightbook's crowd-sourcing.

Sunday, January 10, 2021

Models - In Depth and Best Practices

Aircraft and models on MyFlightbook are crowd-sourced and shared amongst its users.  This has a huge benefit for the comprehensiveness of the data and - with a bit of curation - with the accuracy of the data as well.  The ability for any registered user on the system to make changes here is a powerful tool.  Any powerful tool, however, carries risk if used incorrectly.  In this post, I'll talk about how the models part of system works, how it is properly used, and how the risk is managed.  (Spoiler alert: in practice, the system works well and so the risk is negligible.)

The difference between an aircraft and a model on MyFlightbook

The important thing to understand on MyFlightbook is that a "model" encapsulates a set of attributes that are common across a set of multiple airframes.  This includes attributes like the category/class of the aircraft, whether it is turbine or piston, high-performance, has retractable gear, and so forth. For more detailed information, please read my previous post.
So, for example, there is one "Cessna C-172 R" in the system, but there are (as of this writing) nearly 1,600 distinct aircraft in the system that are tied to the "Cessna C-172 R" model.  It is the "Cessna C-172 R" model that captures the fact that it is an airplane, single-engine/land ("ASEL"), piston, not high-performance, not tailwheel, ICAO code "C172", marketing name "Skyhawk", and so forth.

Data points that vary from airframe-to-airframe are stored on that aircraft's record in the database.  The tail number (registration) is the most obvious such piece of data, but there are private notes (notes only you can see), shared notes (visible to anyone who flies that aircraft), maintenance records, glass/TAA upgrades, and other data.

It's worth briefly pointing out two special cases within this model.  The first is that not all aircraft in the system are flying machines - some are training devices/sims.  While there are some special rules around these, you use them in your account the same way you would use any other aircraft, it's just that instead of being a flying machine it's an ATD or an FTD or an FFS.  In fact, some models of aircraft (such as anything created by Frasca or Redbird) are flagged as "Sim only", so the system knows not to let you create registered aircraft with that model.  See here for more information about simulators/training devices.

The other special case is that of an "anonymous" aircraft.  An anonymous aircraft is just like any other aircraft, except that it has no specific tail number.  Internally, it has a pseudo-tailnumber that is the hash mark (#) followed by a series of digits that represent the model.  For example, the anonymous C-172R is "#000099". That tail number is used for unambiguous identification of an aircraft when importing/exporting, but in general the system will show the underlying model name ("Anonymous C-172R") rather than the #000099 tail number.  Because that's a single number for an anonymous instance of a given model, anonymous aircraft are necessarily shared amongst pilots.

Relationship between Aircraft and Models

A key attribute of how shared aircraft/models work is to understand that these relationships are all computed in real-time.  That is, an aircraft in the database does not have any information about its associated model, it only has a reference to the model.  In turn, the model holds a reference to the manufacturer and even to the category/class.

So when you see "N12345 - Cessna C-172 (ASEL)" in your account, that is all being assembled in real time: I look up "N12345" in the database and find the ID of a model.  I then look up that model and find that it has model name of "C-172", an ID of a manufacturer and an ID of a category/class.  I then look up the manufacturer that has that ID and find that the manufacturer is named "Cessna" and I look up the category/class by its ID and discover that it is "ASEL".  

Because none of this data is stored directly in the aircraft, all changes happen immediately to all related aircraft.  For example, if you were to edit the C-172 model to be a helicopter rather than ASEL, then instantly not only would N12345 become a helicopter, but ALL aircraft in the system that are linked to that model would also become helicopters.  Any subsequent totals computation or currency computation involving any aircraft tied to that model would suddenly now have helicopter time and helicopter currency.

That can be risky, but in practice it works just fine.  First and foremost, there's an honor system involved that people don't make random edits like changing a C-172 to be helicopter.  For 14 years and counting, this has worked extraordinarily well.  But as a backup ANY edit to a model results in an email being sent to the site admins, which details the specific change, and that can be reviewed and modified (or reversed) by the admin.  As it turns out, the vast majority of edits to models are minor things like indicating high-performance, or editing the name to be consistent with other similar models.

Admins also review any newly created models in the system for errors, consistency, and redundancy; if a new model is redundant with another existing model, then the two will typically be coalesced.  No notification is generated when that occurs.

Editing aircraft works in the same way, but obviously the scope of the impact is limited to pilots in that specific aircraft, and there are a few other rules involved (see this post about aircraft edits).  In this case, email about the changes is sent not only to the admins for review, but to other pilots who fly that aircraft as well.  This ensures that all changes are reviewed, and that errors are quickly caught and fixed.

Best Practices and Conventions

Please try to follow these guidelines when editing models:

  • If a specific aircraft is wrong (e.g., is the wrong model), then edit the aircraft, not the model.
  • Only edit a model if the definition of the model itself is wrong and thus if all aircraft associated with that model need to be corrected.  E.g., if you see a Boeing 737 listed as piston, then you should edit it.
  • Please do a search for existing models before creating or editing a model; there's a good chance that the model you want is already in the system.  When you create a model, the system will also check to see if it looks like you're creating a duplicate and will show you existing models that look like matches.  While it's best to re-use an existing model, you can proceed if it truly isn't a match.
  • The FAA (and other authorities) have a particular level of granularity for models; ICAO uses another.  Since MyFlightbook launched in 2006, it's been pretty clear that the community prefers more granularity/precision to less.  So you'll see many model designations on MyFlightbook that might map to the same designation within these registries.  That's OK and a good thing.  There's no problem with having more fine-grained distinctions based on upgrade packages, aircraft vintage (e.g., when one manufacturer gets sold to another), and so forth.  As a simple example, there are enough G1000-equipped C-172S’s out there that it’s got its own model designation in the system, even though it’s simply a C-172S.
  • Glass and TAA are one area where things are often confused, since these can be part of the base design (All Boeing 787's that have ever been made are glass/TAA), a factory option (even if everybody orders glass as a practical matter), or an upgrade to a specific airframe.  In general, the model should indicate glass/TAA only if it is part of the base design.  If it's a factory option, it should either be indicated on the airframe, or alternatively it's OK to create a new model that is explicitly a glass-only variant.  For example, there are so many G-1000 equipped C-172S's that there is both a "C-172S" in the system that is not marked as glass (so you'd indicate glass on the specific airframe if it is glass), but there is also a "C-172S G-1000" model in the system that is all glass.

An admin will review EVERY new model and EVERY edit to a model in order to check for redundancy and consistency.  Generally, this requires some triangulation between multiple sources.  Not only that, but I often have more granularity than any one of the sources. If two variations look identical, I’ll merge them, but otherwise I will allow it.  I do, however, try to enforce some consistency.

Here are some of the conventions I try to follow.  Some are a bit more ambiguous than others.

The “Model” field is probably the least well defined.  I tend to use a combination of:
  • The FAA registry page or comparable non-US websites.  Note that this is not always super precise (sometimes listing a C-150 as a “150” instead of, say, a “C-150M”) and if registrations have been reassigned the old one assignment might not be present.  But it will generally distinguish, say, a C-172S from a C-172P.
  • Wikipedia
  • MyFlightbook user community.  In particular, this helps with 4 specific conventions:
    • Hyphenation conventions.
    • Distinguishing float vs. wheel versions of an aircraft: generally you would name a C-172 on floats “C-172 (Float)” to highlight the distinction from its wheeled counterpart. (See here for more on floats/amphibs).
    • Distinguishing sim-only versions of an aircraft.  E.g., a Flight Safety 737 would typically be “B-737 (SIM)” so that nobody thinks they can create a real flying 737 using that model.
    • Where models can have conversions that make them high-performance or give them a constant-speed prop, we’ll generally add “(FP)” for “Fixed Prop”, “(CSP)” for “Constant Speed Prop” or “(HP)” for “High Performance next to the model name.  E.g., “C-172 M/180HP (CSP)” for the superhawk variant of the 172 M that has a constant speed prop and a 180HP engine.
Note that because of the desire for high-precision, sometimes the model in MyFlightbook will deviate from the "nameplate" model.  An example here is the PA24.  Piper made multiple PA24 models; the plain "PA-24" had a 180hp engine, while subsequent variants with more powerful engines included the horsepower after the model - e.g., "PA-24-250" with a 250hp engine, or the "PA-24-260" with a 260hp engine, and so forth.  But the 180hp engine was simply "PA-24" on the nameplate; there technically was never a "PA-24-180".  On MyFlightbook, though, there is both a "PA-24" and a "PA-24-180".  This is because the former could mean "It was a PA-24 with 180hp", or it could mean "It was a Piper PA-24, but I don't remember which variant it was."  So the latter allows you to very clearly indicate the 180hp meaning.

The ICAO designation field is much more precise, and we treat the ICAO website as an authoritative source. Note that this really only applies for Airplanes and Helicopters on MyFlightbook.  ICAO tends to lump all balloons into "BALL" and gliders into "GLID", but that's a coarser granularity than the community generally want, so please leave the ICAO field blank for anything that is not an airplane or helicopter.  

Also note that the ICAO code is very coarse: multiple different variants of an aircraft often share a single ICAO code; the C-172 is a great example: all C-172’s are “C172”, whether it’s a C-172P, C-172N, C-172RG, etc. 

For the Type Rating field (generally only jets or large aircraft), MyFlightbook treats the FAA Type ratings taxonomy as authoritative.  It isn’t totally comprehensive, but I use it when possible.

Summary - don't sweat it!

There's a lot to digest above, but the key thing to remember is that someone will review any (a) new model, (b) edit to an existing model, or (c) edit to an aircraft that has the potential to impact other pilots.  So do your best, but don't worry about getting everything just right; we've got your back.  

At the end of the day, this results in a super comprehensive and increasingly accurate data set, which benefits us all.