- Go 84%
- HTML 8%
- PowerShell 5.1%
- NSIS 2.4%
- Just 0.5%
| .forgejo/ISSUE_TEMPLATE | ||
| assets | ||
| cmd | ||
| docs | ||
| internal | ||
| packaging | ||
| .env.example | ||
| .gitignore | ||
| go.mod | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
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 toolexorcitron.exeis installed next to the tray app but not added toPATH.exorcitron-<version>-windows-amd64.zip: the portable version, the same two programs to unpack anywhere. Before deleting it, runexorcitron-tray.exe --unregisterto remove its Start with Windows and Open with entries; itsREADME.txtlists 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
.gpxand.fplfiles: 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
.fmsgets the cycle of the navigation data that installation uses. - Listing targets:
exorcitron -targetsshows 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 todir. Without-othey 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:truestops 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 toFPLN. That folder name hasn't been confirmed against Garmin's documentation yet, so check it against your card.- Other location:
-config filemakes 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:
- Go to Waypoint Info → User Waypoint → View List.
- Select the waypoint and choose Edit.
- 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 isupdatePublicKeyincmd/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
- docs/architecture.md: code layout.
- docs/packaging.md: installer, portable zip, update signing and releases.
- docs/input-format-analysis.md: why GPX is the input format.
- docs/xplane-detection.md: how X-Plane installations and their AIRAC cycles are found.
- docs/nav-data.md: AIRAC cycles and navigation data, why routes aren't validated against them, and which database files exorcitron doesn't read.