Drop any macOS application to see what makes it tick.
AppXray is a native macOS app that inspects .app bundles (and bare Mach-O executables) and tells you, in plain language, what they're built with. Drag an app onto the window and AppXray scans its bundle structure, linked libraries, Info.plist, and — when needed — the raw bytes of the executable to identify the frameworks, languages, runtimes, and distribution tooling behind it.
It started life as a small "is this AppKit or SwiftUI?" curiosity and has grown into a broad fingerprinting tool that recognizes everything from Electron and Flutter to Unity, Tauri, Wails, .NET, and statically-linked Qt.
AppXray groups its findings into four categories. Each detected technology is listed individually in the results, with its own SF Symbol icon.
| Technology | Notes |
|---|---|
| AppKit | The classic macOS UI framework |
| UIKit | iOS UI framework (seen on Catalyst / iOS-on-Mac apps) |
| SwiftUI | Apple's declarative UI framework |
| WebKit | System web view |
| Carbon | Legacy macOS C API |
| Automator | Automator applets |
| Mac Catalyst | iPad apps brought to the Mac via UIKit + AppKit |
| iOS on Mac | Unmodified iOS apps running on Apple Silicon |
| Electron | Chromium + Node.js desktop shell (VS Code, Slack, …) |
| CEF (Chromium) | Chromium Embedded Framework (Spotify, Steam, …) |
| Chromium | Raw Chromium browsers (Chrome, Brave, Edge, Vivaldi) |
| Gecko | Firefox-family browser engine (Firefox, Tor, LibreWolf) |
| NW.js | node-webkit, Electron's older cousin |
| Flutter | Google's cross-platform UI toolkit |
| Tauri | Rust core + the system WebView |
| Wails | Go core + the system WebView |
| React Native | JS/React with native views (incl. Hermes) |
| Capacitor | Ionic/Capacitor web-to-native bridge |
| Qt | The Qt C++ framework, including statically-linked and non-standard layouts |
| wxWidgets | Cross-platform C++ widgets |
| GTK | The GTK toolkit (GIMP-style apps) |
| SDL | Simple DirectMedia Layer (games, emulators) |
| JavaFX | Java's modern UI toolkit |
| Platypus | Shell-script-wrapped apps |
| Technology | Notes |
|---|---|
| Swift | Detected from libswiftCore |
| Objective-C | Detected from libobjc |
| C++ | Detected from libc++ |
| JavaScript | Implied by Electron / CEF / React Native / Capacitor / NW.js |
| Python | Bundled Python.framework / libpython |
| Java | Bundled JRE, .jar payloads, or classic Java/Eclipse layouts |
| Rust | Tauri markers or general Rust toolchain strings |
| Go | Wails markers or Go build-ID strings |
| Kotlin | Kotlin/Native symbols |
| AppleScript | Compiled .scpt scripts in Resources/Scripts |
| Technology | Notes |
|---|---|
| Unity | UnityPlayer.dylib, IL2CPP, globalgamemanagers |
| Godot | .pck packages or an embedded PCK in the executable |
| Unreal Engine | -Mac-Shipping executables, UE4/UE5 payloads |
| .NET | CoreCLR, single-file AppHosts, MAUI assemblies |
| Avalonia | The cross-platform .NET UI framework |
| Mono | Mono / Xamarin.Mac runtime |
| Technology | Notes |
|---|---|
| Sparkle | The dominant non-App-Store auto-updater |
| Squirrel | The updater commonly bundled with Electron apps |
AppXray also reports the platform type (macOS, Mac Catalyst, or iOS-on-Mac) and lists any embedded/nested apps it finds (helper apps, login items, framework-hosted apps), analyzing each of them too.
Detection runs on a background thread through a four-phase pipeline, ordered from fastest to slowest. Phases accumulate into a single result that's published to the UI in one hop, so the window never flickers through partial states.
-
Bundle structure scan — pure filesystem checks for known paths and file markers. Examples:
Frameworks/Electron Framework.framework,FlutterMacOS.framework,Resources/app.asar,Data/globalgamemanagers(Unity),*.pck(Godot),Contents/MonoBundle,Contents/UE5,Resources/Scripts/*.scpt(AppleScript). This phase also handles Qt in non-standard locations (e.g. Ableton'sContents/Qt/lib) and managed-DLL scans acrossFrameworks,MonoBundle, andResources. -
Info.plist analysis — reads the bundle's property list for identifiers like the Electron ASAR-integrity key,
DTPlatformName == iphoneos(iOS-on-Mac), Automator/Carbon flags, and Java markers. -
Dependency analysis — runs LLVM
objdump(--macho --dylibs-used) on the main executable and walks its transitive dependencies, deduplicating along the way. Linked libraries reveal Swift, Objective-C, C++, AppKit, SwiftUI, WebKit, Qt, SDL, GTK, Sparkle, Squirrel, and more. Catalyst is confirmed when UIKit is loaded from an/System/iOSSupport/path. -
Binary string analysis — a last resort for stacks with no reliable on-disk signal: Tauri/Rust, Wails/Go, Kotlin/Native, embedded-PCK Godot, .NET single-file AppHosts, and statically-linked Qt. To stay fast on multi-gigabyte game and Electron binaries, AppXray reads only a bounded prefix of the file and skips this phase entirely when a definitive heavy framework (Electron, CEF, Flutter, Unity, Unreal, …) is already known.
The scan also recurses into nested .app bundles under Contents/MacOS and Contents/Frameworks, can be cancelled mid-flight (when you close the window or drop a new file), and holds security-scoped access so sandboxed reads of the dropped bundle succeed.
AppXray is a SwiftUI macOS application using an AppKit lifecycle (AppDelegate + a storyboard for the menu bar). Each window owns a small state machine that drives the UI between the empty drop zone, a loading spinner, the results screen, and the "not an executable" error state. It targets macOS 12+. See Sources/AppXray/README.md for an architecture walkthrough.
- LLVM objdump: license
A full list is available in the app via AppXray ▸ About ▸ Third-Party Licenses.
An llvm-objdump binary needs to be present in the LLVM folder before building. The binary bundled with Xcode works fine for development:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/llvm-objdump
Copy or symlink it into LLVM/, then open AppXray.xcodeproj and build.
Note: The app icon set is intentionally empty pending a new icon; the project builds and runs without it (falling back to the system app icon).
Based on the original 5 GUIs by ZeeZide, inspired by Joe Groff's tweet naming macOS "Five GUIs" for its mix of UI frameworks. AppXray keeps that spirit but covers far more than five — hence the rename. The original work is licensed under Apache 2.0; ZeeZide's attribution is retained in the source, this README, and the in-app About panel.