EngineHoursLog
Reference

Export specifications.

Documented, versioned, open. Built so a future tool can read your data even if we're gone.

Current version · JSON v1.0 · CSV v1.0 · Sale Packet v1.0

Every export EngineHoursLog produces conforms to one of the formats below. The formats are versioned and forward-compatible — an export file made today will remain readable by future versions of this specification. This is part of our binding commitment in Terms §7.1.

1. JSON — enginehourslog.export v1.0

A single file containing every engine, every hours reading, and every part/service record in your account. Machine-readable, human-readable, diff-friendly. This is the canonical format; CSV and PDF are derived from it.

Top-level shape

{
  "format": "enginehourslog.export",
  "formatVersion": "1.0",
  "exportedAt": "2026-04-21T14:00:00.000Z",
  "specUrl": "https://enginehourslog.com/export-specs",
  "engines": [ Engine, ... ],
  "logs":    [ LogEntry, ... ],
  "parts":   [ PartRecord, ... ]
}

Engine

FieldTypeDescription
idstring (UUID)Stable identifier. Never reused, never changes.
namestringHuman-readable name ("S/V Driftwood").
identifierstringOptional serial, hull ID, VIN, or similar.
categorystring enumOne of: marine_diesel, outboard, rv, tractor, generator, heavy, mower, other. New categories may be added; consumers should treat unknown values as opaque.
hoursintegerMost recent known hours reading. Computed from the latest LogEntry.
createdAtstring (ISO 8601)When the engine was added to the log.
updatedAtstring (ISO 8601)Last mutation timestamp.

LogEntry

FieldTypeDescription
idstring (UUID)Stable identifier.
engineIdstring (UUID)FK to Engine.id.
hoursintegerHours reading at the moment of this entry.
atstring (ISO 8601)When the reading was recorded.
notestringOptional free-text note. May contain newlines.

PartRecord

FieldTypeDescription
idstring (UUID)Stable identifier.
engineIdstring (UUID)FK to Engine.id.
componentstringWhat was replaced/serviced ("Impeller," "Oil & filter").
hoursintegerHours at the time of service.
atstring (ISO 8601)When the service occurred.
vendorstringSupplier or shop.
partNumstringManufacturer part number.
costnumber | nullCost in the account's default currency.
notesstringOptional free-text notes. May be paragraphs. May contain newlines.

Compatibility rules

2. CSV — v1.0

Three files, RFC 4180 compliant, UTF-8, Unix line endings. Designed for Excel, Numbers, Google Sheets, and every command-line tool that eats CSV.

enginehourslog-engines-YYYY-MM-DD.csv

Columns (in order): id, name, identifier, category, hours, createdAt, updatedAt.

enginehourslog-logs-YYYY-MM-DD.csv

Columns: id, engineId, hours, at, note.

enginehourslog-parts-YYYY-MM-DD.csv

Columns: id, engineId, component, hours, at, vendor, partNum, cost, notes.

Quoting and escaping

3. Sale Packet — PDF v1.0

A human-readable report intended for a prospective buyer, a mechanic, a surveyor, or an estate handoff. Letter size (8.5" × 11"). Four pages:

  1. Cover. Asset name and identifier; category; current hours; year entered into the log; prepared-for slot; prepared-by slot.
  2. Summary. Total hours, years of log history, average annual use, number of entries, number of parts/service events, total documented spend. Data-provenance attestation.
  3. Parts & service by component. Grouped by component, most recent first; each group with a rollup line (event count, average interval between events, total cost) and a detailed table (hours, date, vendor/part, cost, and a full-width note row for paragraph-length notes).
  4. Hours log in full. Chronological table of every hours reading. Export-format attestation referencing this page and the shutdown guarantee.

The PDF is generated entirely client-side using the browser's native "Save as PDF" print path. No server, no library, no dependencies — the HTML that produces it is simple enough that any future browser can render it unchanged.

Locale

When present on the asset, a locale hint causes the Sale Packet to render in that locale — dates, numbers, currency, and UI chrome. This is because the buyer at the marina speaks the marina's language, not the seller's.

4. If we disappear

Per Terms §7.2, if EngineHoursLog ever ceases operations:

5. Implementing against this spec

If you want to build something that reads or writes EngineHoursLog exports — a backup tool, a migration script, a second implementation of the app — you don't need our permission. Use the formats on this page. Open an issue on our public issue tracker (link coming) if you find ambiguities. We will update the spec to clarify.

If you want to use this spec as the basis for your own logbook and call it EngineHoursLog, please don't — the brand is ours. The data formats, however, are open for anyone to implement.