Self-host your flight history on a UGREEN NAS in one afternoon.
A few years ago I would have shrugged at the idea of self-hosting my travel history. Now I run a small stack of personal apps on a UGREEN NAS that does exactly this kind of work, and adding one more container is a Saturday afternoon project rather than a weekend war. JetLog is the new addition. It is a small personal flight tracker that runs in Docker, reads a CSV export of your travel history, and gives you a private dashboard you actually control.
I do fly a handful of times a year for work and a couple more for fun. That is enough to leave a mess across five different loyalty accounts and one phone app I never remember to open, but it is not enough for me to want a full subscription tracker. JetLog sits in the middle. It exists for people who want their travel data visible without paying anyone to look at it.
What it is and what it is not
JetLog is the right tool if you care about three things: keeping your travel data on your own hardware, having a clean dashboard you can open from anywhere, and not paying anyone a monthly fee. It is the wrong tool if you need real-time gate updates, premium seat alerts, or anything that pulls from a paid ADS-B feed. For the day-one use case of “I want to see my old flights in one place,” the free tier of MyFlightRadar24 will export a CSV of your entire history, and that is all JetLog needs to become useful.
The Docker image is pbogre/jetlog:latest, it is actively maintained, and it weighs in around 70 MB so it pulls fast on most home networks. There is no official mobile app, which on paper sounds like a problem. In practice it means nothing is shipping your coordinates anywhere. You can pin the dashboard to your phone’s home screen as a PWA and get most of the experience without giving up your data.
Why it fits the home-server stack I already run
Most of the apps I run on my NAS solve the same problem in slightly different ways. Password managers, photo backups, RSS readers, paperless-ngx, audiobook servers. They take data that lives in someone else’s cloud and put it back in my house. JetLog fits that pattern without any new infrastructure, and that is the real reason I added it. It is not a new category of project. It is one more container in a stack I already understand.
The other reason it fits is the data shape. Flight history is small. Even with five years of travel, you are looking at a few thousand rows of CSV. That fits on any NAS, syncs in seconds, and never triggers the kind of disk pressure that makes self-hosted apps feel like a chore. You set it up once, you forget it exists, and it is there when you need to answer a question about where you have been.
The mistake that wastes the most time on UGREEN
UGREEN’s default Docker folder permissions are read-only for the container engine, and that is the single mistake that wastes the most time in NAS guides. If Portainer cannot write into your volume, the container starts, looks healthy, and then silently loses your database every time it restarts.
The four prep steps that matter most:
- Create the right folder with the right case, or the container silently writes nowhere
- Confirm Portainer is on its latest version, since older builds fail on modern healthcheck formats
- Have your numeric user and group identifiers ready instead of pasting the tutorial defaults
- Decide which external port you want to expose, since the default of 3000 is busy on most NASes
Skipping any of those is recoverable, but doing them in order saves the afternoon.
What the stack actually contains
The JetLog stack is small. One service, one port mapping, one volume, three environment variables. The internal port is 3000 and that is what the healthcheck pings. The external port can be anything free on your NAS. The volume mounts the Docker folder you just created to the data directory inside the container, which is where the SQLite database lives.
Two values you must change before you deploy. Set the user and group identifiers to match the actual owner of your Docker folder. Set the secret key to a fresh 64-character random string. Generate it once with openssl rand -hex 32 or whatever tool you prefer, paste it in, and never reuse the placeholder from a tutorial. The placeholder value is public, and reusing it means anyone who Googles the default owns your session tokens.
The two habits that make it feel like yours
The first habit is tagging your older flights with short notes. Spend ten minutes on the imports you already have. I tag mine with the reason for the trip, the people I was with, and one-word reminders like “good wifi” or “delayed three hours.” That small habit is what turns the dashboard from a list into a memory. You can search it, filter it, and answer questions about your travel history without scrolling forever.
The second habit is logging new flights the day you take them. It takes thirty seconds, and it is the difference between a tool that fills up over time and one that stays half-empty because you forgot. If you would rather not do this by hand, keep an eye on the project. There is no first-party integration with airline APIs yet, and the maintainer has been clear that anything pulling live data would change the licensing story. That might change eventually, but it is not on the roadmap for this year.
Trade-offs
The honest list of trade-offs has five items. The first is that JetLog gives you no real-time data at all, ever. No ADS-B receiver is bundled in, no FlightAware integration is included, and gate changes do not appear in the dashboard. The second is the maintenance burden. You will be pulling new image tags yourself for the rest of the time you run this app, and the dashboard will not warn you when a new release is out. The third is that you are the only user. There is no concept of separate accounts, so anyone you share with gets your login and your data.
The fourth trade-off is the mobile experience. The dashboard works fine in a browser, and you can pin it to your home screen so it acts roughly like an app, but there is no native client for iOS or Android. Most people will not care. Some will. The fifth is that the app does not actively sync with your airline accounts, so you have to log new flights yourself, by hand, every time you fly. If you forget, the dashboard drifts out of date.
None of these are dealbreakers for the use case this app was built for, which is keeping your own travel history visible to you.
Bottom line
Pick a quiet weekend. Walk through the install in order. Set a real secret key. Import your CSV the first evening and tag the flights you remember best. The next time you fly, log it from your phone the same day. That is the whole workflow.