Skip to content

Latest commit

 

History

33 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nibkit

build status

Decompiler for compiled iOS/macOS interface files. Parses .nib and .storyboardc files (the format real apps ship), extracts object structure, wiring, custom classes, and the navigation graph. Single static Go binary, stdlib only, cross-compiles anywhere. Also runs as an MCP server, so AI coding tools can decode nibs directly.

strings gives you tokens. nibkit gives you relationships: which control fires which selector, which custom class backs which scene, how navigation flows, and what runtime attributes were set.

Install

brew install tokenbleed/tap/nibkit

or with a Go toolchain:

go install github.com/tokenbleed/nibkit@latest

Prebuilt binaries for darwin and linux (arm64 and amd64) are on the releases page. No runtime dependencies.

MCP server (AI tool integration)

nibkit mcp speaks the Model Context Protocol over stdio (newline-delimited JSON-RPC, no dependencies), exposing the read-only commands as tools: nibkit_wiring, nibkit_classes, nibkit_segues, nibkit_tree, nibkit_all, nibkit_info. Each takes one path argument (any input the CLI accepts, including .ipa and .app).

Claude Code:

claude mcp add nibkit -- nibkit mcp

opencode (opencode.json):

{
  "mcp": {
    "nibkit": {
      "type": "local",
      "command": ["nibkit", "mcp"]
    }
  }
}

Generic MCP client config: command nibkit, args ["mcp"], stdio transport. pi ships no built-in MCP client; the CLI is the same interface and extensions can wrap nibkit mcp if needed.

The on-disk formats are documented field by field in docs/format.adoc.

Usage

nibkit [command] <path...> [flags]
nibkit                       # no args + terminal: interactive menu
Command What it gives you

tree (default)

the object graph, indented, with resolved custom-class annotations (UIClassSwapper shows the real class)

wiring

the high-value command: outlets (myButton → MyViewController), actions (didTapLogin: [touchUpInside]), and runtime attributes (keyPath=value)

classes

every custom IB class with base class and scene ID, Swift-mangled names recovered

segues

the full navigation graph: storyboard segue templates (kind, identifier, selector, custom class) plus container relationships (tab-bar tabs, navigation roots) that never compile to segues. Deduped.

all

classes + wiring + navigation in one report

info

header counts only

Inputs: .ipa (auto-extracted), .nib, .storyboardc, .app, or any directory walked recursively for NIBArchive nibs. Multiple paths are aggregated.

Flags: -J / --json (single object for one nib, array for many), --frida (generate Frida hook stubs from @IBAction wiring), --mermaid (navigation graph as a Mermaid flowchart).

Examples

nibkit Foo.ipa                    # auto-extracted, no unzip step
nibkit wiring Foo.app             # outlets + actions + runtime attrs
nibkit wiring --frida Foo.app     # hooks.js: Interceptor.attach stubs
nibkit segues Foo.app             # navigation graph, container-aware
nibkit segues --mermaid Foo.app   # Mermaid flowchart (renders on GitHub in Markdown)
nibkit all Foo.app                # full report in one run
nibkit -J segues Foo.app | jq '.[] | .navigation'

Tables size to the terminal width and long reports page through $PAGER (set NIBKIT_PAGER=cat to disable). Piped output stays raw for grep and jq. For raw strings just run strings -a on the nib files.

Repository layout

main.go

CLI entry point: flags, dispatch, interactive menu

internal/nib/

format parsers (NIBArchive, keyedarchive/bplist), emitters, discovery

internal/mcp/

MCP server over stdio

docs/format.adoc

the on-disk nib formats, documented field by field

internal/nib/*_test.go

synthetic-nib builders and parser/emitter tests (no files lifted from apps)

Demo

Demo of wiring on a real app, legacy (pre-2012) class extraction, a Mermaid navigation graph, and a macOS system app:

demo

Format support

Input Status Notes

.nib, .storyboardc (NIBArchive)

supported

coder versions 9, 10, and 11; verified on apps from 2019 through current macOS 26 / iOS 27, including macOS system apps

.app bundles, directories

supported

walked recursively

.ipa

supported

extracted automatically

pre-2012 nibs (binary plist / NSKeyedArchive)

supported

iOS (UINibObjectsKey) and macOS (IB.objectdata) nibs from the keyedarchive era decode through the same commands: outlets, actions, bindings, runtime attributes

Contact

Questions, bugs, broken files: open an issue, or reach me at t.me/keybleed.

Build

go build -trimpath -ldflags="-s -w" -o nibkit .   # ~2.4 MB static binary
# cross-compile: GOOS/GOARCH (darwin/linux, arm64/amd64)

License

MIT. See LICENSE.

About

Decompiler for compiled iOS/macOS interface files (.nib, .storyboardc): object tree, wiring, custom classes, navigation graphs

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages