TravStats vs. Jetlog
Jetlog is a small, self-hostable personal flight tracker and viewer (GPL-2.0): one Docker container, a SQLite file, a world map and statistics. It does one thing and keeps it simple. If you are weighing it against TravStats, the real question is how much you want your logbook to do.
At a glance
Section titled “At a glance”| TravStats | Jetlog | |
|---|---|---|
| Hosting | Your server (Docker) | Your server (Docker) |
| What runs | App container + PostgreSQL/PostGIS (bundled in the compose file) | One container, SQLite in a mounted folder |
| License | AGPL-3.0 | GPL-2.0 |
| Stack | Node.js, React, PostgreSQL | FastAPI, React, SQLite |
| Adding flights | Drop a booking email, PDF or boarding pass → automatic; manual form | Manual form; flight-number lookup via adsbdb |
| List imports | Flightradar24 CSV, any logbook CSV, own spreadsheet | MyFlightradar24 CSV, custom CSV |
| Export | Whole-logbook spreadsheet (re-importable), JSON, database backup | CSV, iCal |
| Statistics | Per domain plus cross-domain; punctuality, records, year in review | Flight statistics, including visited countries |
| Cruises | Yes | No |
| Hotels / stays | Yes — a domain of its own since 2.6.0 | No |
| Trips | Yes, spanning every domain | No |
| Achievements | 270+ | No |
| Multiple users | Yes, built for about 1–10 | Yes |
| Two-factor / passkeys | Yes, per account | — |
| API for scripts | REST + OpenAPI, scoped Personal Access Tokens | — |
| Mobile | Web (responsive); a Companion app in testing, beta | Web (responsive) |
A dash means the Jetlog README does not describe it — not necessarily that it cannot be done.
Where TravStats wins
Section titled “Where TravStats wins”1. Records without typing
Section titled “1. Records without typing”Jetlog asks you to enter each flight; a flight number can fill in some
of it. TravStats reads the booking confirmation you already have — an
.eml, an .msg, pasted text, a PDF — or a photographed boarding
pass, and shows the result on a review screen before saving. For a
backlog of years, that is the difference between an evening and a
month of evenings.
The parser is strongest with a local language model (Ollama), which needs several gigabytes of RAM. Without one, built-in templates handle single-leg bookings on common European carriers. See Imports & Parsers.
2. The rest of the journey
Section titled “2. The rest of the journey”Jetlog logs flights. TravStats also logs cruises — ship, ports, sea days, the route on the map — and hotel stays, and ties them together as trips. Countries are counted by what proves you were there, so a country you reached by ship or car and slept in counts, and a change of planes can be told apart from a visit. See Countries & passport.
3. Depth of statistics
Section titled “3. Depth of statistics”Beyond totals and maps, TravStats computes punctuality, records, a year in review, costs in the currency you paid, and 270+ achievements. The numbers are also reachable over the REST API with a Personal Access Token.
Where Jetlog wins
Section titled “Where Jetlog wins”1. It is tiny
Section titled “1. It is tiny”Jetlog is one container and a SQLite file. There is no database server to run, and a backup is a copy of a folder. TravStats needs PostgreSQL with PostGIS next to it — bundled in the compose file, but still a second service with its own volume and upgrades. On a small NAS, that difference is real.
2. Nothing to learn
Section titled “2. Nothing to learn”Jetlog’s interface is a map, a flight list, statistics and a settings page. TravStats has domain tabs, trips, an inbox, a beta switch and an admin panel. If you want to log flights and look at a map, Jetlog gets out of the way sooner.
3. External calls, one switch
Section titled “3. External calls, one switch”Jetlog uses one outside service (adsbdb) for flight lookups and turns
it off with a single environment variable, ENABLE_EXTERNAL_APIS.
TravStats talks to more services by design — flight-data providers,
exchange rates, airline logos — each configured on its own.
4. Calendar export
Section titled “4. Calendar export”Jetlog exports your flights as iCal, so they can sit in a calendar app. TravStats has no calendar export.
Migrating your data from Jetlog
Section titled “Migrating your data from Jetlog”There is no Jetlog importer in TravStats, but Jetlog’s CSV export goes through the column-mapping wizard under Settings → Import → “From any logbook (CSV)”. Export from Jetlog’s settings page, then map:
| Jetlog CSV | TravStats field |
|---|---|
date | date |
origin | departure airport |
destination | arrival airport |
flight_number | flight number |
airline | airline |
airplane | aircraft |
tail_number | registration |
notes | notes |
Airports resolve by ICAO or IATA code, so Jetlog’s ICAO codes are fine.
Times need one fix: Jetlog stores HH:MM, and the wizard reads
HH:MM:SS. Either leave departure_time and arrival_time unmapped,
or append :00 in a spreadsheet before importing — a row with a time
it cannot read is reported as an error and skipped. Seat, cabin class
and purpose have no column in the wizard today. The whole run is one
batch and can be reverted — see
Import & Export.
Verdict
Section titled “Verdict”If you want a flight log that costs almost nothing to run and nothing to learn, Jetlog is a well-made answer, and there is no shame in staying.
If you have years of booking emails, travel that is not only flying, or a household that wants statistics deep enough to argue over, TravStats does more — at the price of a database server and a bigger interface.