Neatbo.

Typed binary and XML plist inspector

Read all local plist objects and references with exact integer width, signedness, raw float bits and a complete typed JSON report.

Browser-local processingInputOne local binary or XML plistOutputComplete typed-object JSONUp to 8 MiB per file · File limit: 1
  1. 1Add input
  2. 2Review and run
  3. 3Get your result

Tool input and files are processed in this browser without being uploaded.

Your input

Inputs are kept temporarily in this tab when switching tools. Refreshing or closing clears them; large results may need to be regenerated.

⌘ / Ctrl + Enter to run

or drag and drop it here

Files stay on this device. Your originals stay unchanged.

.plist · .bplist · .xml

Up to 8 MiB per file · File limit: 1

    Preparing the tool…

    Before you start

    Inspect one bplist00 or UTF-8 Apple XML plist without instantiating archived classes. Validate every binary object, including unused ones; preserve a typed root, full object directory, raw references and source SHA256 in the downloadable report.

    How to use this tool

    1. Select one local binary or XML plist.
    2. Review root type, validated objects, unused objects and explicit raw-number policy.
    3. Download full typed JSON and inspect all objects/references, not only the bounded preview.

    Supported inputs and limits

    One 8 MiB file; at most 100,000 binary objects or XML elements, 64 nested containers and 200,000 expanded visits per validated object/root. Binary physical references are additionally capped 200,000. All limits apply together; full typed JSON ≤ 32 MiB, checked before shared references are serialized repeatedly.

    Supported binary types: null, boolean, ASCII/valid UTF-16BE string, data, array, unique-string-key dict, finite float32/64, date and UID ≤ 8 bytes. Integer 1/2/4 bytes is decoded unsigned; 8/16 bytes signed, retaining decimal string, width, signedness and rawHex. These raw 128-bit values do not promise universal NSObject interpretation; UID is inert numeric data only.

    XML 1.0 UTF-8 requires plist version 1.0, recognized declaration and only the standard Apple external doctype; it is never fetched. Unknown attributes, tags, PI, custom DTD/entities and unsupported types fail. XML integers preserve lexical text and decimal value in −2^127…2^128−1; binary width/sign is not inferred. Base64 must have canonical padding bits; dict order is retained.

    Dates retain binary seconds/IEEE 64-bit representations or the full XML UTC lexeme YYYY-MM-DDTHH:mm:ss[.fraction]Z, years 0001–9999, no leap seconds. ISO preview rounds original binary seconds or XML fractional seconds to nearest millisecond, ties away from zero, before adding its epoch/date; preview must fit JavaScript ISO date range. Fractional input precision remains in the report.

    Reject cycles, truncated/overlapping/duplicate offsets, bad references, unknown unused objects, nonfinite floats and malformed UTF-16. Preview only 200 root-value nodes, 2,000 UTF-16 units per cell; full JSON includes every object and reference. This is read-only parsing, not writeback, NSKeyedArchiver execution or a trust/security verdict.

    Worked example

    Example input

    Apple XML dict: date 2026-10-07T00:00:00.999999999999Z, real -0 and integer 00018446744073709551615.
    Example options
    {}

    Example output

    The original 12 fraction digits, negative-zero bits and integer lexeme remain; ISO preview is 2026-10-07T00:00:01.000Z and integer value is the exact decimal string 18446744073709551615.

    When something does not work

    Correct or export an unsupported plist with its owning application, or reduce structure/output size; then retry. A cycle, bad unused object, invalid encoding or cancellation produces no partial successful report.

    Frequently asked questions

    Can a large integer safely be read as a JavaScript number?

    Use the decimal string and rawHex. The report keeps width/signedness separately; converting it to a floating number can lose precision.

    Are UID or archived classes executed?

    No. UID remains unsigned numeric data and no archived object is instantiated.

    Documentation & further reading

    Related tools