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.
brew install tokenbleed/tap/nibkitor with a Go toolchain:
go install github.com/tokenbleed/nibkit@latestPrebuilt binaries for darwin and linux (arm64 and amd64) are on the releases page. No runtime dependencies.
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 mcpopencode (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.
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 ( |
wiring |
the high-value command: outlets ( |
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).
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.
|
CLI entry point: flags, dispatch, interactive menu |
|
format parsers (NIBArchive, keyedarchive/bplist), emitters, discovery |
|
MCP server over stdio |
|
the on-disk nib formats, documented field by field |
|
synthetic-nib builders and parser/emitter tests (no files lifted from apps) |
| 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 ( |
Questions, bugs, broken files: open an issue, or reach me at t.me/keybleed.
go build -trimpath -ldflags="-s -w" -o nibkit . # ~2.4 MB static binary
# cross-compile: GOOS/GOARCH (darwin/linux, arm64/amd64)MIT. See LICENSE.
