Reads, never writes, your data
Flights, friends, stats and connections come from the app's local SQLite database, opened read-only. No sync server, no scraping.
Unofficial · macOS · single binary
flightydeck reads the flights you already track in the Flighty Mac app,
straight from its local database, and adds or follows new ones through the same API
the app uses. One command line for you, one MCP server for your AI agent.
See it
$ flightydeck list --upcoming
DATE FLIGHT ROUTE DEPARTS ARRIVES STATUS
2031-03-14 QR111 PRG → DOH 22:10 +01 05:45 +03 +1d on time
2031-03-18 VN333 HAN → SGN 14:05 +07 16:15 +07 +25 min
2031-04-02 LX1486 PRG → ZRH 07:25 +02 08:40 +02 scheduled
$ flightydeck status VN333
VN333 Hanoi (HAN) → Ho Chi Minh City (SGN) Wed 18 Mar 2031
scheduled estimated actual gate terminal
departs 14:05 14:30 — 22 T1
arrives 16:15 16:40 — — T1 belt 7
delayed 25 min · times are local to each airport
$ flightydeck search --to zurich -o json | jq '.[0].departure.scheduled'
{
"utc": "2031-04-02T05:25:00Z",
"local": "2031-04-02T07:25:00+02:00",
"tz": "Europe/Prague"
}
Example output with invented flights. Exact columns may differ between versions.
Features
Flights, friends, stats and connections come from the app's local SQLite database, opened read-only. No sync server, no scraping.
Every time is shown in the airport's own zone. JSON carries utc, local and tz, so nothing is ambiguous.
Accent-insensitive matching on airports, cities and airlines: con dao finds Côn Đảo, zurich finds Zürich.
-o json on every command and stable exit codes, so a shell script or an AI agent can branch on the result instead of parsing prose.
flightydeck add QR111 2031-03-14 adds a flight you're on; follow tracks someone else's. They show up on your phone like any other.
Distance and time in the air, delay history for a route, layover lengths between your flights, and what your Flighty Friends are flying.
flightydeck mcp exposes the same functions as tools to Claude and other MCP clients. Same code path as the CLI, same safety rules.
Written in Rust. No Node, no Python, no runtime to install. Your auth token is read per call, never logged, and wiped from memory after use.
Install
Needs macOS and the Flighty Mac app, installed and signed in. Or build from source with cargo install --git https://github.com/theanhgen/flightydeck.
brew install theanhgen/tap/flightydeck
flightydeck about
flightydeck list --upcoming
MCP
Register the built-in MCP server with Claude Code, or point any MCP client at flightydeck mcp over stdio.
claude mcp add flightydeck -- flightydeck mcp
Prefer fewer tools in context? The repo ships an agent skill (skills/flightydeck/SKILL.md) that teaches agents to use the CLI with -o json instead.
Safety
Every command belongs to one safety class. The policy lives in the shared library, so the CLI and the MCP server enforce exactly the same rules.
list, get, search, current, status, delay, ics, friends, stats, connections, airports, airlines, about.
add, follow. Checks the flight isn't already tracked, and spaces out calls to the API. --dry-run looks the flight up without adding it.
FLIGHTY_READ_ONLY=1 turns off every write, and overrides everything else.
remove. Needs FLIGHTY_ALLOW_REMOVE=1 and --yes. The sync semantics it relies on aren't fully verified yet.
https://api.flightyapp.com, with redirects disabled.| Code | Meaning |
|---|---|
| 0 | OK |
| 1 | Error (including "Flighty is syncing, retry") |
| 2 | Bad input, caught before any network call |
| 3 | Not ready: Flighty not installed or signed in, token expired, schema changed, owner unresolved |
| 4 | Flighty API error |
| 5 | Refused by policy (read-only, remove not enabled) |
| 6 | Not found |
FAQ
No. flightydeck is an independent, unofficial project. It isn't made by, endorsed by, or affiliated with Flighty.
You need the Flighty Mac app installed and signed in. flightydeck can only see and do what your account in the app can.
No. It reads the Mac app's local database, so it runs on macOS only.
Reads open the database read-only. Adding and following go through the same API the app uses. Removing flights is off unless you explicitly enable it, and FLIGHTY_READ_ONLY=1 turns off all writes.
The app's database and API are private and can change without notice. flightydeck checks the schema before each query and exits with code 3, naming the missing column, rather than returning wrong data.
Only to api.flightyapp.com, in the request header, the same way the app sends it. It's never written to logs, error messages or JSON output.