Help and how-to

Contactalex@bukhalov.com
ContentsFirst launch · Trip · Correction · Void · Hand over · Logbook copy · Checksum · Logbook

First launch

The first time you open the app, a short walkthrough explains in a few steps how the log works. Its final step is already the form for your first vehicle: fill in make, model and registration number and save. You can also skip the walkthrough and add the vehicle later under "Logbook" → "Vehicles" → "Add vehicle". A trip cannot be saved until a vehicle exists.

Entering a trip

  1. Tap "+" at the top right (New trip).
  2. Pick the vehicle if you have more than one, then fill in the date and the odometer readings on departure and on arrival. The starting reading is carried over from the final reading of your last trip with that vehicle; change it if the dashboard shows something else.
  3. Choose "Business", "Commute" or "Private". You choose the category; the app does not assess it.
  4. Fill in start, destination and purpose. For "Private" the odometer readings are enough, and start and destination are optional. For "Business" the purpose is required, and there is a field for the business partner.
  5. Business trips only: if you took a detour, expand "More details", switch on "Detour driven" and describe the route you actually drove.
  6. Tap "Save".

From the second trip on it gets quicker: "From" already holds the destination of your last trip with that vehicle, and the starting reading its final reading. Under "To", "Like an earlier trip" offers the way back and your recent destinations. One tap takes over destination, purpose, business partner and category, leaving the final reading. The suggestions come only from trips already in your log. When you type a destination yourself, the row narrows to earlier destinations that match.

When an odometer reading does not continue from the neighbouring trip of the same vehicle, or the trip date is more than seven days back, the form shows a hint. You can still save; the hint only describes your own figures and sets no deadline.

The list groups trips by year. Each year is headed by its kilometres, split by category; corrected and voided trips are not counted.

Putting a mistake right

There is no edit function: every change is meant to stay visible as a dated entry of its own. Swipe the row to the right, or press and hold it, and choose "Correct entry". The form shows the original entry at the top; below it you enter the right values and can add a reason.

Saving adds a further entry that refers to the old one. The old one stays in the list, struck through and marked "Corrected", and still appears in the CSV and the PDF. A correction, too, can later be put right only by another correction.

Voiding a trip

A saved trip cannot be deleted inside the app, but it can be voided. Swipe the row to the left and tap "Delete". The trip is hidden and a banner at the bottom reads "1 trip marked for voiding". "Keep it" leaves everything as it was.

When you tap "Void now" or the app goes to the background, Fahrtenheft appends a "Void" entry: chained like any other entry, referring to the voided trip, carrying its details and 0 km. The voided trip stays in the log, struck through and marked "Voided", and no longer counts in any total.

In the CSV file its "Status" column reads "Storniert am <Datum> durch Eintrag Nr. X", and the void row reads "Stornierung zu Eintrag Nr. N vom <Datum>". The PDF prints the trip in full, struck through, and lists it under "Berichtigungen".

Hand over: CSV, PDF and logbook copy

The share icon at the top right opens "Hand over". At the top, "The logbook as it stands" says whether every entry matches its checksum and links up without a gap, how many corrections and voids are included, and whether a logbook copy was ever loaded. CSV and PDF always contain every recorded trip; there is no date range to pick.

Spreadsheet (CSV)Semicolon-separated, one row per entry with every field and the columns Kettenfolge, Hash and VorherigerHash. "Nr." and "Status" describe corrections and voids in words; a closing line names every load of a logbook copy.
Print copy (PDF)Trip list with corrected and voided trips struck through, the corrections, running odometer per vehicle, checksums with the records of loaded logbook copies, and a legend in one document.
Logbook copy (JSON)A backup file of the entire log with vehicles, every raw value, checksums and the records of earlier loads. It is the only file Fahrtenheft can bring the log back from.

CSV and PDF are written in German even when the interface is in English. After you choose one, the iOS share sheet opens: put the file in the Files app, for instance, and open it once afterwards to see that it arrived complete.

Keeping and loading a logbook copy

Your trips exist only on this iPhone. If the device is lost or reset, or you delete the app, everything not contained in a saved logbook copy is gone, and the developer cannot get at it either.

When several entries exist only on the iPhone, the list suggests "Save a logbook copy" at the top; "Later" hides the suggestion for the next five entries. Under "Logbook" → "Copies", "Remind me to save a copy" can nudge you monthly, quarterly or yearly. Keep every copy somewhere other than the iPhone; only a saved file counts, and opening the share sheet on its own is not enough.

To be loaded, the logbook copy has to be in the Files app. "Load a logbook copy" reads it and first checks the checksum chain. The confirmation dialog states the number of trips, the years covered and any entries that were altered or are missing from the end, the first three by date and route and any further ones as a count. If you confirm, the copy replaces the complete log, vehicles included. Load a file only if you know where it came from.

Afterwards the list permanently states "On <date> the logbook was replaced by a logbook copy saved on <date> (<n> trips)", and the PDF (checksum section) and the CSV (closing line) state it in German: "Am <Datum> wurde das Fahrtenbuch durch eine Sicherung vom <Datum> ersetzt (<n> Fahrten)". The record travels into every later logbook copy and cannot be removed by loading another one.

Recomputing a checksum yourself

Each checksum is SHA-256, written as lowercase hexadecimal, over the UTF-8 bytes of the following fields in this order, joined with |:

  1. Entry ID (UUID, uppercase)
  2. Trip date as ISO 8601 in UTC, for example 2025-01-01T23:00:00Z
  3. Von (start)
  4. Nach (destination)
  5. Zweck (purpose)
  6. Kategorie: Geschäftlich, Arbeitsweg or Privat
  7. Marke (make)
  8. Modell (model)
  9. Kennzeichen (registration)
  10. Km-Stand Start (starting odometer) as a decimal with a point, for example 12000.0
  11. Km-Stand Ende (final odometer), the same way
  12. Erfasst am (recorded at), as ISO 8601 in UTC
  13. VorherigerHash (previous checksum; empty for the first entry)
  14. ID of the corrected or voided entry (empty if there is none)
  15. Geschäftspartner (business partner)
  16. Reiseroute (route driven)
  17. Grund der Korrektur (reason for the correction)
  18. for a void entry only: the text STORNIERUNG

In text fields a backslash is written as \\ and a vertical bar as \|. Dates are whole seconds. The ID and every raw value are in the logbook copy, where dates are stored as seconds since 1970. With the CSV columns Kettenfolge, Hash and VorherigerHash the chain can be checked row by row without the app.

The checksums have no secret key. Anyone who rewrites a logbook copy and recomputes every checksum is not caught by the chain itself; that is why the app permanently records every load of a logbook copy.

The "Logbook" sheet

The button at the top left ("Manage logbook") opens "Logbook", which has four sections:

Will this satisfy the tax office?

Fahrtenheft cannot promise that. The app supports recording and handing over, but it does not advise on tax, and there is no official seal for electronic driving logs. Whether your records are sufficient, which trips belong in them and how long to keep them is for you to settle, on your own or with a tax adviser.

When something does not work

If saving or handing over fails, look at how much storage is free on the iPhone and try once more. Do not delete the app to get rid of the error, because that would lose the log.

An email to alex@bukhalov.com reaches the developer directly. It helps to include the app version, the iOS version, the iPhone model, the last step before the problem and the precise text of any error message. Use made-up places, business partners and registration numbers in examples; real trips are almost never needed.

Fahrtenheft · Aleksei Bukhalov · Legal notice