MessagePack Viewer
Decode MessagePack hex or base64 blobs and view them as JSON
What the MessagePack Viewer Does
If you have ever stared at a hex blob in a Cloudflare Worker log and wondered what is actually inside, this is the page for that. MessagePack is a binary serialization format that produces something like 83a76f726465724964a84f52442d37343231...: compact on the wire, unreadable by eye. Paste the hex (or Base64, detected automatically) into the left pane and the right pane shows the decoded value as indented JSON.
Decoding happens locally with the official @msgpack/msgpack library, the same one most Node and browser apps use. The format follows the public MessagePack wire-format spec, so any payload produced by msgpack-python, msgpack-c, msgpack-java, or any other conforming implementation works here. There is no upload step — the bytes never leave your browser, which matters when the blob carries something like customer: 'Ava Chen' or an internal subscriberId: 'SUB-1001'.
Decoding is debounced 300ms, so you can paste, edit, and re-paste without clicking anything. No Convert button, no spinner — just type and read.
How to View a MessagePack Payload
Three steps. Works for hex strings copied out of a log, base64 fields lifted from a Kafka message, or raw bytes you pasted from a debugger.
Paste hex or base64 into the left pane
Drop the encoded MessagePack into the left editor. If it parses as hex (after stripping whitespace, commas and 0x prefixes), it's treated as hex; otherwise it's read as Base64 (RFC 4648), including the URL-safe variant. Escaped byte strings such as Python's b'\x83\xa7orderId...' work too. Example of a hex-encoded order:
83a76f726465724964a84f52442d37343231a56974656d739282a3736b75a7534b552d313031a37174790282a3736b75a7534b552d323434a371747901a8637573746f6d6572a8417661204368656eThat blob decodes into an order with two line items (SKU-101 x2 and SKU-244 x1) for customer Ava Chen.
Read the decoded JSON on the right
The right pane is read-only and shows the decoded payload as pretty-printed JSON, with the same indentation as JSON.stringify(obj, null, 2). Maps render as objects, arrays as arrays, and numbers as numbers. 64-bit integers come through with all their digits intact rather than squeezed into a double. Binary blobs (the bin types, which decode to a Uint8Array) show up as an array of byte values. Timestamps from the timestamp extension type render as ISO strings.
Iterate without clicking anything
Edit the input and the JSON updates after a 300ms pause. If the bytes aren't valid MessagePack, the pane says what broke (the input ends too early, extra bytes follow the value, an invalid type byte) instead of pretending it parsed. Use the Sample msgpack button to load a known-good Order payload for comparison.
When You Will Actually Use This
Inspect a MessagePack message in a log
Your service writes msgpack-encoded payloads to a structured log as hex (it is shorter than base64 in many cases). When something breaks in production, you copy the hex out of the log line, paste it here, and instantly see what the producer actually sent — orderId ORD-7421, the right items, the wrong customer field, whatever it is.
Debug a Redis or Kafka payload
Some backends use MessagePack instead of JSON on hot paths because it's smaller on the wire: no quotes around keys, and small numbers fit in a single byte. When you pull a value off Redis or peek at a Kafka topic, the bytes often come out as Base64. Paste them here to confirm the consumer and producer agree on the shape of the data.
Verify cross-language round-trips
You encode in Python with msgpack.packb(...) and decode in Go with msgpack.Unmarshal(...). When the Go side sees a wrong type, dump the bytes from Python as hex and run them through this viewer — that tells you whether the bug is in the encoder or the decoder before you spend an afternoon arguing about it.
Read MessagePack from a saved file
You have a .msgpack file from a Jupyter notebook export, a game save, or an analytics dump. Run xxd -p on it to get the hex, paste, read. Faster than wiring up the library in a fresh Python REPL just to see what one record looks like.
Common Questions
Does my data leave the browser?
No. The decode runs entirely in this tab using the @msgpack/msgpack library bundled with the page. There is no fetch, no upload, no telemetry on the bytes. Close the tab and the data is gone. That said — treat the URL bar like a public space, do not put a payload there, and clear your clipboard if it had secrets.
Can I paste base64 instead of hex?
Yes. If the input parses as hex after stripping whitespace, commas and 0x prefixes, it's treated as hex; otherwise it's read as Base64. URL-safe Base64 (with - and _) works, and so do Python-style escaped byte strings like b'\x83\xa7orderId...'. Either form works for the same payload.
What happens with binary fields, timestamps, and extension types?
Binary (the bin family) decodes into a Uint8Array and prints as an array of byte values, like [134, 12, ...], since standard JSON has no bytes type. Timestamps from the timestamp extension type decode to Date objects, which serialize as ISO 8601 strings. Other extension types come through as { "type": 5, "data": [...] }, so you see the type code and the raw bytes.
Why is the decoded output different from what my server sent?
Two usual suspects. One: your input is truncated — log truncation often clips the last few bytes and msgpack relies on length-prefixed fields, so a missing tail produces a confusing error or partial output. Two: the producer used a custom extension type and the receiver does not know about it. Compare the bytes against the official spec if the structure looks impossible.
Can it decode huge payloads?
A few megabytes of hex pastes fine in modern browsers. Beyond that the Ace editor on the input side starts to feel sluggish — at that point you are better off reading the file directly with the library in a Node script. The decoder itself is not the bottleneck; the editor is.
How do I produce hex like the sample shows?
In Python: import msgpack; msgpack.packb(obj).hex(). In JS: Array.from(encode(obj)).map(b => b.toString(16).padStart(2, '0')).join(''). In Go with vmihailenco/msgpack: b, _ := msgpack.Marshal(obj) followed by fmt.Printf("%x", b). The resulting hex pastes here directly.
Other MessagePack Tools
Viewing is one shape — these handle the full round-trip and adjacent formats: