Open-source project
FLEXTool/FLEX avatar
FLEXTool/FLEX

FLEX: In-App Debugging for iOS Without an LLDB Session

An in-app debugging and exploration tool for iOS

14,640 stars1,793 forksObjective-CNOASSERTION

At a glance

What is it?
FLEX is an Objective-C debugging and exploration toolkit that runs inside your iOS app, letting you inspect views, objects, network history and databases from a toolbar overlay. It suits iOS developers debugging on device or in the simulator, and it is not a remote or cross-platform tool.
Who is it for?
FLEX is for iOS engineers who need to inspect live object state, view hierarchies, network history or sandbox databases without attaching a debugger, especially on physical devices. Skip it if you need tvOS support out of the box, since the README states FLEX does not support tvOS and points to third-party forks, or if you need Android tooling.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 110 days ago.
What is it written in?
Mainly Objective-C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What FLEX Solves for iOS Debuggers

Attaching LLDB through Xcode gives you a console and breakpoints, but it ties you to a host machine and a debug session. FLEX takes a different route: it runs entirely inside your app, so the README states you do not need to be connected to LLDB/Xcode or a different remote debugging server. The toolbar lives in a window above your application and exposes nearly every piece of runtime state.

The audience is narrow and specific. This is an iOS development tool written in Objective-C, aimed at engineers who need to poke at a running app on a physical device, in the simulator, or in a build handed to a tester. The README lists the capabilities plainly: inspecting and modifying views in the hierarchy, reading properties and ivars on any object, calling instance and class methods dynamically, viewing network request history with timing and headers, scanning the heap for live objects, browsing the app sandbox file system, and opening SQLite or Realm databases.

It is not a general-purpose observability platform. There is no server component, no dashboard, and no data leaving the device unless you use the file sharing option to move a file out. That containment is the point, and it is also the boundary.

How the Toolbar and Runtime Inspection Work

The mechanism is a manager singleton that presents an explorer window on top of your app. When you call showExplorer, FLEX builds a toolbar and a navigation stack of inspectors. From the toolbar you select a view, and FLEX resolves that view to its backing object, then exposes its properties and ivars for reading and, in many cases, writing.

Several subsystems sit behind that UI. The heap explorer queries malloc for all live allocated memory blocks and searches for ones that look like objects, according to the README. The address explorer takes an arbitrary address and opens the object only if FLEX can verify the address points to a valid object; when it is unsure it warns and refuses to dereference, with an Unsafe Explore option for the user who knows better. Network history hooks requests made through NSURLConnection or NSURLSession, and settings control which response bodies get cached and the maximum response cache size.

The file browser reads the app bundle and sandbox container, showing file sizes and image previews and pretty-printing .json and .plist files. The database browser handles .db and .sqlite files plus Realm databases, listing tables that can be sorted by tapping column headers. Each of these is a read path into state the app already holds, not a separate instrumentation layer.

Installing FLEX and Showing the Explorer

The repository ships a FLEX.podspec and a Package.swift, and the README badges mark it as available through CocoaPods and compatible with Carthage. The Example directory contains FLEXample-Cocoapods.xcodeproj and FLEXample-SPM.xcodeproj, so both integration paths have a working sample to compare against.

Once linked, the shortest path to a running explorer is the manager call. The README gives this Objective-C form:

objc
[[FLEXManager sharedManager] showExplorer];

The Swift equivalent is equally short:

swift
FLEXManager.shared.showExplorer()

In the iOS simulator you do not even need that call. The README states that pressing the f key toggles the FLEX toolbar, and the ? key lists all shortcuts. For a gesture-driven entry point, the README shows a more complete pattern that imports FLEXManager only under a DEBUG guard and calls showExplorer from a recognized tap recognizer:

objc
#if DEBUG
#import "FLEXManager.h"
#endif

- (void)handleSixFingerQuadrupleTap:(UITapGestureRecognizer *)tapRecognizer
{
#if DEBUG
    if (tapRecognizer.state == UIGestureRecognizerStateRecognized) {
        [[FLEXManager sharedManager] showExplorer];
    }
#endif
}

What you should see after either path is the FLEX toolbar layered above your app's own UI, with the explorer navigation available from it.

Where FLEX Stops Being the Right Tool

The most concrete limitation is platform coverage. The README states plainly that FLEX itself does not support tvOS out of the box, and that others have ported it to tvOS in forks, pointing to one such fork. If tvOS is your target, you are maintaining someone else's port, not using the upstream project.

The second limitation is the debug guard. Every usage example in the README wraps the import and the call in #if DEBUG. That is a signal about intent: this code is meant to be compiled out of shipping builds. FLEX can modify nearly every piece of state in a running app, which is useful while developing and dangerous if reachable in production. The README does not document a runtime kill switch or a remote disable mechanism, so the guard is the control you have.

There is also a memory cost implied by the network settings. Response bodies are cached up to a configurable maximum size, and the heap explorer walks live allocated memory blocks. Both features touch real memory, and neither is described as free. The README does not publish overhead figures, so treat enabling network debugging on a memory-constrained device as something to measure yourself rather than assume.

FLEX Against Xcode's Own View Debugger

The obvious comparison is Xcode's built-in view debugger and LLDB console. The difference in approach is where the inspection runs. Xcode's tools require a debug session attached from the host, which means a cable or network connection and a running Xcode instance. FLEX runs inside the app process, so the README's claim that it works well in the simulator and on physical devices is really a claim about independence from the host.

That independence buys you cases Xcode handles poorly: a build installed on a colleague's device, a tester reproducing a layout bug away from your desk, or a session where you want to inspect network history and a SQLite database in the same overlay. It costs you breakpoints, stepping, and the expression evaluator. FLEX is not a debugger in that sense. It is an inspector you drive by tapping.

The two are complementary rather than substitutes. If you need to stop execution and walk a stack, LLDB is the answer. If you need to see why a view is the wrong size on a device you are holding, FLEX removes the host machine from the loop.

Maintenance Status, Licence and Upgrade Cost

The repository is not archived. Its last push was on 2026-06-11, which is recent enough that the project cannot be described as dormant on the evidence available. The release history tells a different story from the commit activity: the most recent listed release is 5.22.10 from 2022-10-20, with 4.7.0 and 4.6.1 before it in April 2022. Between the last tagged release and the last push there is a long stretch of untagged development, so if you pin to a published version you are pinning to something from 2022.

Upgrade cost therefore depends on how you consume it. Pinning through CocoaPods or Swift Package Manager to a tagged release gives you a stable, older surface. Tracking master gives you the current code but no release notes to read. The repository has a generate-spm-headers.sh script and a Package.swift, which suggests the Swift Package Manager path is maintained alongside the podspec, but the README does not document a migration guide between major versions.

The licence is listed as NOASSERTION, which means the repository metadata does not declare a recognised SPDX identifier. The README's badge links to a LICENSE file in the Flipboard/FLEX repository path. Read that file directly and have someone qualified confirm what it permits for your distribution model; this article cannot give you legal advice, and the NOASSERTION label is exactly the case where you should not assume.

Editorial conclusion

FLEX is for iOS engineers who need to inspect live object state, view hierarchies, network history or sandbox databases without attaching a debugger, especially on physical devices. Skip it if you need tvOS support out of the box, since the README states FLEX does not support tvOS and points to third-party forks, or if you need Android tooling. Before adopting, verify the licence terms, since the repository is listed as NOASSERTION, and confirm the 5.22.10 release notes cover the API surface you plan to call.

Frequently asked questions

Does FLEX work on Android?

No. FLEX is described as a set of in-app debugging and exploration tools for iOS development, written in Objective-C, with no Android target in the repository layout.

Where can I download FLEX?

The README badges link to CocoaPods, and the repository contains a FLEX.podspec, a Package.swift for Swift Package Manager, and a Carthage-compatible badge. The Example directory includes separate Xcode projects for the CocoaPods and SPM integration paths.

Do I need Xcode or LLDB attached to use FLEX?

No. The README states that FLEX runs entirely inside your app, so you do not need to be connected to LLDB/Xcode or a different remote debugging server, and that it works well in the simulator and on physical devices.

How do I open the FLEX toolbar in the simulator?

The README states that pressing the f key toggles the FLEX toolbar in the iOS simulator, and the ? key shows a full list of shortcuts.

Can FLEX inspect databases inside the app sandbox?

Yes. The README describes a database browser for SQLite files with .db or .sqlite extensions and for Realm database files, where all tables can be viewed and sorted by tapping column headers.

Official sources

  1. FLEXTool/FLEX on GitHub
  2. Issues
  3. README
  4. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/flextool-flex.svg)](https://hysenlabs.com/projects/flextool-flex)