Flight Plan Format Converter
  • Go 84%
  • HTML 8%
  • PowerShell 5.1%
  • NSIS 2.4%
  • Just 0.5%
Find a file
2026-11-14 08:40:38 +01:00
.forgejo/ISSUE_TEMPLATE add Forgejo issue templates 2026-11-01 23:56:24 +01:00
assets added icons for later GUI version 2026-11-01 09:46:56 +01:00
cmd upgrade golang.org/x/sys to v0.50.0 2026-11-14 07:37:55 +01:00
docs update fails with correct message on malformed update server URL 2026-11-14 08:32:54 +01:00
internal update fails with correct message on malformed update server URL 2026-11-14 08:32:54 +01:00
packaging ensure the uninstaller removes the WebView2 browser cache. Fixes issue #1 2026-11-02 00:10:33 +01:00
.env.example use just for building and releasing 2026-11-01 18:55:15 +01:00
.gitignore tray app boilerplate 2026-11-01 09:48:02 +01:00
go.mod add build documentation to README 2026-10-10 19:14:41 +02:00
justfile create separate About tab in the UI of exorcitron-tray 2026-11-01 20:51:33 +01:00
LICENSE Initial commit 2026-10-10 11:34:47 +00:00
README.md ensure consistent spelling of product name 2026-11-14 08:40:38 +01:00

exorcitron

Flight Plan Format Converter

Converts routes exported from SkyDemon into X-Plane .fms (v11) and Garmin GTN .gfp flight plans.

exorcitron is primarily a Windows application, because SkyDemon's only desktop version runs on Windows. Its other versions are for Android and iOS; the iOS app also runs on Apple Silicon Macs, but how it handles files there is unknown. The tray app is Windows-only; the command line tool also builds for macOS (see Other platforms).

Installing

Downloads are on the releases page:

  • exorcitron-<version>-setup.exe: the installer. It installs for your user only, without administrator rights, into %LOCALAPPDATA%\Programs\exorcitron, and adds a Start menu entry and an uninstaller (Settings → Apps → Installed apps). The command line tool exorcitron.exe is installed next to the tray app but not added to PATH.
  • exorcitron-<version>-windows-amd64.zip: the portable version, the same two programs to unpack anywhere. Before deleting it, run exorcitron-tray.exe --unregister to remove its Start with Windows and Open with entries; its README.txt lists the folders to delete as well.

exorcitron is not signed with a commercial code signing certificate, so Windows SmartScreen may say it "protected your PC". Click More info, then Run anyway. SHA256SUMS on the releases page lists the checksums of the downloads, e.g. to compare with Get-FileHash <file> in PowerShell.

Installing a new version over an old one keeps the settings; a running exorcitron is closed first. Uninstalling asks whether to delete the settings as well (default: keep them).

Updates

Once a day (and shortly after it starts), the tray app asks the releases page for the latest release; nothing else is sent. When there is a newer one, a notification says so and the window shows it with Install and restart: exorcitron downloads the installer, checks its signature, installs it and starts again. The portable version offers Download instead, which opens the release page. Turn the check off under Settings → General (stored as disableUpdateCheck in config.json); Check now is on the About tab. Development builds never check.

The tray app

The tray app watches a folder for SkyDemon exports and places every new route in the targets. On the first start, its window opens and asks for that folder. It offers SkyDemon's default routes folder (Documents\SkyDemon\Routes) if that exists. The welcome card stays until Done, so its other options can be set too.

Started by you (Start menu, double-click), exorcitron opens its window. Started with Windows at login, or to convert files (Open with), it stays in the tray. Closing the window keeps it running in the tray; Quit in the window or the tray menu ends it.

  • Watched folder: change it under Settings or with Watched folder… in the tray menu. Exports already in the folder at that point are left alone, and so are exports converted before.
  • Other files: drop them onto the window, or use Convert file… in the tray menu.
  • Results: each conversion shows a notification and appears in the window's history.
  • Settings: the Settings tab edits all settings and saves each change at once.
  • Open with: optionally, exorcitron appears under Open with for .gpx and .fpl files: right-click an export, Open with → exorcitron, and the route is converted right away, whichever folder it is in. Turn this on in Settings or on the welcome card. It never makes exorcitron the default app for these files, needs no administrator rights, and is removed again when the setting is turned off.

Exporting from SkyDemon

Export the route as GPX, and for the best result also as Garmin (.fpl), into the same folder under the same name:

Export Provides Required?
GPX waypoint names, positions, levels yes
Garmin .fpl exact type of each fix and navaid (VOR/NDB), and which airport is the destination rather than the alternate recommended for IFR-mode routes

You can pass either file; exorcitron picks up the other one (Hamburg - Bremen.GPX ↔ Hamburg - Bremen.fpl).

GPX alone is fine for VFR routes. Fixes are recognised by their 5-letter names, and an alternate airport by the GPX route name. Without the .fpl, navaids can't be told apart as VOR or NDB, so they are written to X-Plane as plain lat/lon points, with a warning.

SkyDemon appends a planned alternate to the end of the exported route. exorcitron recognises it and leaves it out, because neither output format can express an alternate.

Command line

exorcitron [-f fms,gtn] [-cycle YYCC] [-namelen N] [-o dir] [-gtn dir | -tds] route.gpx|route.fpl...
exorcitron -targets
exorcitron -version

Without options, the command line tool converts the given exports to the same targets as the tray app. exorcitron -h lists all options; -o, -gtn and -tds are described below.

Targets

Without -o, -gtn or -tds, exorcitron places the converted flight plans directly where they are used:

Target Location Used when
X-Plane (every installation, versions 11 and up) <X-Plane>/Output/FMS plans installation found and not disabled
TDS GTNXi (Windows) C:\ProgramData\TDS\GTNXi (user.wpt), …\FPL (.gfp) folder exists and not disabled
GTN SD card <card>/user.wpt, <card>/FPLN/*.gfp configured and the card is present
  • X-Plane installations are found automatically (see docs/xplane-detection.md).
  • AIRAC cycle: each installation's .fms gets the cycle of the navigation data that installation uses.
  • Listing targets: exorcitron -targets shows all targets, which ones are active, and the cycle each X-Plane installation reports.
  • Fallback: if no target is active, the command line tool writes the files next to the input file.

With -o, -gtn or -tds, only those locations are used, and the settings are ignored:

  • -o dir: .fms, and GTN files when no GTN folder is given, go to dir. Without -o they go next to the input file.
  • -gtn dir: a GTN data folder laid out like TDS (see GTN output).
  • -tds: short for the TDS GTNXi data folder.

Settings

Settings are optional and live in config.json in the settings folder (%APPDATA%\exorcitron on Windows, ~/Library/Application Support/exorcitron on macOS). The tray app's Settings tab edits them; the command line tool reads the same file. Everything detected is enabled by default, so the file only records exceptions:

{
  "watchDir": "C:\\Users\\me\\Documents\\SkyDemon",
  "xplane": {
    "disabled": ["D:\\XP12-Dev"],
    "extra": ["E:\\X-Plane 12 Copy"]
  },
  "gtn": {
    "nameLength": 6,
    "disableTDS": false,
    "sdCard": "F:\\",
    "sdCardFlightPlanDir": "FPLN"
  }
}
  • watchDir: the folder the tray app watches (ignored by the command line tool).
  • disableUpdateCheck: true stops the tray app from looking for new releases.
  • xplane.disabled: installations that should not receive flight plans.
  • xplane.extra: installations the X-Plane installer didn't record.
  • gtn.tdsDir: overrides the TDS GTNXi data folder.
  • gtn.sdCardFlightPlanDir: defaults to FPLN. That folder name hasn't been confirmed against Garmin's documentation yet, so check it against your card.
  • Other location: -config file makes the command line tool use a different settings file.

GTN output

The GTN export consists of two files: the .gfp flight plan and user.wpt, which carries the waypoint names (a .gfp can only hold their positions). Import user.wpt on the GTN first, then the flight plan.

An existing user.wpt is merged, never overwritten: its entries are kept, route points within 0.001° of an entry reuse it, and new names are made unique. Converting several routes therefore accumulates their waypoints.

Aerodromes without ICAO code (e.g. the glider field Tarmstedt) arrive on the GTN as ordinary user waypoints: the import files can't mark them as airports. You can change that on the GTN itself, once per aerodrome:

  1. Go to Waypoint Info → User Waypoint → View List.
  2. Select the waypoint and choose Edit.
  3. Mark it as Airport and Save.

Later imports don't undo this. The GTN reuses an existing user waypoint at the same position (within 0.001°), and exorcitron never changes entries already in user.wpt.

-gtn dir writes user.wpt to dir and flight plans to dir/FPL. -tds does the same for the TDS GTNXi data folder (C:\ProgramData\TDS\GTNXi), which must already exist. The GTN loads at most 50 flight plans from FPL; exorcitron warns when there are more.

Development

Development happens on Windows. The tasks are recipes in the justfile, which run in PowerShell 7 and call the scripts in packaging/.

Tool Needed for Install
Go 1.26 or newer everything winget install GoLang.Go
just the recipes winget install Casey.Just
PowerShell 7 the recipes and scripts winget install Microsoft.PowerShell
NSIS 3 just package, just release winget install NSIS.NSIS
Wails CLI, same version as in cmd/exorcitron-tray/go.mod just package, just release go install github.com/wailsapp/wails/v3/cmd/wails3@v3.1.0

The command line tool itself only needs Go 1.22 and has no third-party dependencies. The tray app is a separate Go module (cmd/exorcitron-tray) built with Wails v3; it needs Go 1.26 and the WebView2 runtime, which ships with Windows 10/11, but no C compiler.

Building and testing

Recipe Does
just test vets and tests both modules, checks the licence list
just build development builds of both programs: dist/exorcitron.exe, dist/exorcitron-tray.exe
just licenses regenerates the licence list of the About tab, after changing dependencies
just package 0.2.0 installer, portable zip and SHA256SUMS in dist/release/0.2.0
just release publishes a release, see below

Development builds report dev and their commit (exorcitron -version, or About in the tray app) and never look for updates. Only packaged builds carry a version: the packaging script sets it in both programs, their Windows file information and the installer. dist/ is ignored by git.

Icons, version information and the manifest of the tray app come from committed generated files; see cmd/exorcitron-tray/build/README.md for how to regenerate them.

The About tab lists the licences of all third-party code built into the programs (the Go standard library and every imported module), from cmd/exorcitron-tray/assets/licenses.json. packaging/notices generates it from go list -deps; after adding, removing or updating a dependency (or changing LICENSE), run just licenses and commit the result. just test and the packaging script fail while it is out of date. The downloads carry the same list as THIRD-PARTY-NOTICES.txt.

Releasing

Once: copy .env.example to .env (ignored by git) and fill in

  • FORGEJO_TOKEN: a Forgejo access token with the permission Repository: Read and write, limited to this repository if possible;
  • EXORCITRON_UPDATE_KEY: the path to the private update signing key, which stays outside the repository. Its public key is updatePublicKey in cmd/exorcitron-tray/updater.go; see docs/packaging.md for how the key was made.

Each release, from the commit to be released, with main pushed:

git tag -a v0.2.0 -m "exorcitron 0.2.0"
git push origin v0.2.0
just release -DryRun   # optional: everything except the upload
just release

just release checks that the working tree is clean and the tag is on HEAD and on Forgejo, runs the tests, builds and signs the downloads, and publishes them with release notes made from the commit subjects since the previous tag (just release -NotesFile notes.md for your own). A tag with a suffix, e.g. v0.3.0-rc.1, becomes a pre-release, which the updater doesn't offer. Details in docs/packaging.md.

Other platforms

The command line tool cross-compiles without extra tooling. The table lists the targets:

Target GOOS GOARCH
Windows (x64) windows amd64
Windows (ARM) windows arm64
macOS (Apple Silicon) darwin arm64
macOS (Intel) darwin amd64
$env:CGO_ENABLED = "0"; $env:GOOS = "darwin"; $env:GOARCH = "arm64"
go build -trimpath -ldflags="-s -w" -o dist/exorcitron-macos-arm64 ./cmd/exorcitron
Remove-Item Env:GOOS, Env:GOARCH, Env:CGO_ENABLED

-trimpath -ldflags="-s -w" strips local paths and debug information; CGO_ENABLED=0 makes sure the binary needs no C runtime.

On macOS, Gatekeeper blocks unsigned binaries downloaded from the internet. Either right-click → Open once, or remove the quarantine flag with xattr -d com.apple.quarantine exorcitron. Avoiding this entirely requires signing and notarising with an Apple Developer ID.

Writing the name

The name is written in lower case everywhere: in documentation, the UI, messages, and at the start of a sentence ("exorcitron converts …"). Where that reads awkwardly, rephrase ("The app …") rather than capitalise. Windows shows the name the same way: the file information (ProductName), the installer, Installed apps and notifications all say "exorcitron". Keep the tray app's appName as it is in any case: the notification registration in the registry is keyed by it, so changing it would leave the entries of existing installations behind.

Further documentation