This is a simple, free and opensource EASA-style logbook application written in golang and react.
You can clone the repo and compile the binaries yourself, or just download the latest ones for your operating system from the releases.
Once you start the app it automatically creates an SQLite local DB and starts listening on port 4000 by default. So you can open it in your standard web browser at http://localhost:4000
You also can easily export all flight records into EASA style pdf format, print it, sign and use it as a usual paper logbook.
- Fix: Corrected expiry date calculation for landing-based rules.
- New: Added a
Signmenu item to the Flight Record page, allowing flight records to be signed by an instructor or examiner. The signature now appears in the PDF logbook. - Update: Some code optimization, added error page.
- Update:
Person Roleselector now uses the dynamic roles listed from the database instead of static defaults or manual settings. - New: Added Tags field to flight records. Tags are visible in the logbook table and available as filters on the
MapandDashboardpages.
- Update: Golang and npm packages/security patches.
- Update: Added another option (dd/mm/yy) for date autorecognition during the import.
- Update: Added a circular progress indicator during database download.
- Update: Hide columns in the PDF export if the field size is set to 0.
- New: Added option to update aircraft type in Aircrafts table, which also will update all logbook entries.
The full changelog is here
If you still would like to use v2.x version:
- Latest v2 release https://github.com/vsimakhin/web-logbook/releases/tag/v2.45.0
- Docker
docker pull vsimakhin/web-logbook:v2.45.0
- Download the latest release from https://github.com/vsimakhin/web-logbook/releases
- Extract the archive to some folder/directory
- Run:
- Windows:
- Double-click on the
web-logbook.exefile. It will show you some warning about how unsafe it can be (I don't digitally sing the binary), but just run it.
- Double-click on the
- Linux/MacOS:
- Open a terminal and navigate to the directory
- Run
./web-logbook
- Open your browser, type http://localhost:4000 and the application is ready to use
- To close the application, use
Ctrl+Cin the terminal window or just close it
$ ./web-logbook -h
-cert string
certificate path (default "certs/localhost.pem")
-disable-authentication
Disable authentication (in case you forgot login credentials)
-dsn string
Data source name {sqlite: file path|mysql: user:password@protocol(address)/dbname?param=value} (default "web-logbook.sql")
-enable-https
Enable TLS/HTTPS
-engine string
Database engine {sqlite|mysql} (default "sqlite")
-env string
Environment {dev|prod} (default "prod")
-key string
private key path (default "certs/localhost-key.pem")
-port int
Server port (default 4000)
-url string
Server URL (default empty - the app will listen on all network interfaces)
-version
Prints current versionSince it's written in Golang, it can run on any system after compiling the sources. Currently, on the Release page, there are binaries available for Linux, MacOS, and Windows.
You can use any modern browser with JavaScript enabled to access the app.
- Flight records table with filter for all fields and global search through all data
- Customized set of columns
- Quick export to CSV for all and filtered data
- Export to PDF (A4, A5) formats
- Automatic totals and subtotals calculation
- Dark mode and mobile friendly
- Flight record data
- Attachments for the flight records
- Automatic night-time calculation
- Custom/user defined fields
- Flight map
- KML and GPX track attachments support for SkyDemon and FlightRadar24 (check this tool fr24-kml-splitter for flightradar24 tracks)
- Persons tracking
- Instructor/Examiner signature
- List of licenses, certificates and endorsements
- Document attachments and preview
- Expiration tracking
- Flight map
- Date filters
- Routes and airports filters
- Aircraft filters
- Simple overal stats
- Aircraft list recorded in the logbook
- Types & user defined categories
- Standard airports database (3 sources)
- Custom user defined airports and airfields
- Filters
- Persons list for the recorded flight records
- Flight list for each person
- Custom user defined roles (Captain, First officer, Crew etc)
- Dashboard with custom filters
- Stats by Year, Type and Category
- User defined fields support
- Tracking currency and flight exprerience
- Different time frames: days, calendar months, calendar years, since date and all time
- Export to EASA PDF format (A4 and A5)
- PDF export formats with custom title pages (for example, include your CV automatically)
- Adjustable settings for each export format
- Instructor/Examiner signatures also included in the PDF export
So in real life the logbook could look like

- CSV support
- Predefined formats
- WebLogbook
- Leon application (via export to CrewLounge link)
- Owner name, license and address, signature for the PDF exports
- Signature pad to automatically include signatures to the PDF exports
- Enable/Disable authentication (in case you need to expose the app to the public internet)
- Some interface settings
- Custom names for the standard flight record fields
- Custom fields for the Flight record
The app supports 3 sources:
- https://github.com/mwgg/Airports/raw/master/airports.json - main JSON database of 28k+ airports.
- (default) https://github.com/vsimakhin/Airports/raw/master/airports.json - my local fork of the main JSON database, to ensure that the app remains functional even if there are any breaking changes in the upstream.
- https://davidmegginson.github.io/ourairports-data/airports.csv - an alternate set of airports from https://ourairports.com/, which contains over 78k records, including small airfields and heliports.
If you enable the No ICAO codes filter option, the app will ignore ICAO airport codes that contain numbers and dashes, which are not commonly used ICAO codes. By default, this option is unchecked, which makes the database slightly smaller and cleaner.
Check readme for dockerized app for more details.
You can generate your own certificate and key and store it in the different directories in your operating system. For that use --key and --cert parameters to specify the exact location and wun app with --enable-https flag.
Disclaimer: the main development is based on SQLite engine, so MySQL can potentially have some bugs. If you find one, please report in the issues.
To store all data, you can use MySQL database. To get started, create a database and a user with access to it. On the first run, the application will create all necessary tables and views. If you want to migrate your data from SQLite to MySQL, you can use the export to CSV function first and then import from CSV.
The DSN format for MySQL connections
user:password@protocol(address)/dbname?param=value
For example,
./web-logbook -engine mysql -dsn "web-logbook-user:pwd@tcp(192.168.0.222)/web-logbook"
The backend exposes a REST (sort of) API for access to all logbook functionality. You can find the full list of the endpoints here https://github.com/vsimakhin/web-logbook/blob/main/app/routes.go#L26
If authentication is enabled you need to use Bearer token
# get token
TOKEN=$(curl -s -X POST http://127.0.0.1:4000/api/login -H "Content-Type: application/json" -d '{"login": "login", "password": "password"}' | jq -r '.token')
# run request
curl http://127.0.0.1:4000/api/export/A4 -H "Authorization: Bearer $TOKEN" --output logbook.pdfPowershel for Windows (generated by ChatGPT)
$response = Invoke-RestMethod -Uri "http://127.0.0.1:4000/api/login" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{"login": "login", "password": "password"}'
$token = $response.token
Invoke-WebRequest -Uri "http://127.0.0.1:4000/api/export/A4" `
-Headers @{ "Authorization" = "Bearer $token" } `
-OutFile "logbook.pdf"Download PDF A4 logbook
curl http://127.0.0.1:4000/api/export/A4 --output logbook.pdfGet distance between LKPR and EDDM airports in nautical miles
curl http://127.0.0.1:4000/api/distance/LKPR/EDDMGet night time in minutes for the flight from LKPR departed at 1600 UTC to the EDDM with arrival at 2012 UTC on 27/09/2025
curl -s -X POST http://localhost:4000/api/logbook/night \
-H "Content-Type: application/json" \
-d '{
"date": "27/09/2025",
"departure": {
"place": "LKPR",
"time": "1600"
},
"arrival": {
"place": "EDDM",
"time": "2012"
}
}' | jq -r '.data'In case you'd like to add some other features to the logbook or you found a bug, please open an "issue" here https://github.com/vsimakhin/web-logbook/issues with a description. I cannot promise I'll implement it or fix it at a reasonable time but at least I can take a look.
Thanks for bug reports, testing, improvements, and feature suggestions:
Backend:
- go-pdf https://codeberg.org/go-pdf/fpdf
- chi web-server https://github.com/go-chi/chi
- go-solar https://github.com/mstephenholl/go-solar
- sqlite https://modernc.org/sqlite
- mysql https://github.com/go-sql-driver/mysql
- golang-jwt https://github.com/golang-jwt/jwt/
- testify https://github.com/stretchr/testify
Frontend:
- ViteJS https://vite.dev/
- React https://react.dev/
- Material UI https://mui.com/material-ui/
- Material Toolpad core https://mui.com/toolpad/core/introduction/
- Material React Table https://material-react-table.com
- Openlayers https://openlayers.org/
- dayjs https://github.com/iamkun/dayjs
- TanStack Query https://tanstack.com/query/
- export-to-csv https://github.com/alexcaza/export-to-csv
- Signature Pad https://github.com/szimek/signature_pad
- PapaParse https://github.com/mholt/PapaParse
- arc.js https://github.com/springmeyer/arc.js
- compare-versions https://github.com/omichelsen/compare-versions
- file-type https://github.com/sindresorhus/file-type
- mapbox/togeojson https://github.com/mapbox/togeojson















