katlab tools/decode support on Ko-fi

Decode Anything · Multi-Layer Auto-Decoder

Paste a string that was encoded once, twice or five times. Each layer — Base64, URL, hex, HTML entities, escapes, gzip, JWT — is detected and peeled until plain data is left.

Everything is decoded locally. Safe for tokens, cookies and payloads with secrets.

Encoded input

How to decode a string that was encoded several times

Paste the string and the decoder works from the outside in. At each step it tests every supported encoding against the current data, picks the most likely one, decodes it and shows the result as a numbered layer card with the detected encoding and a confidence level. Then it tries again on that output, until nothing applies any more or 10 layers have been peeled. A cookie that is URL-encoded Base64 of gzipped JSON comes apart in three cards, and the last one is the JSON.

Detection can be wrong in both directions, so every card has two controls. Stop here keeps that layer as the final result and drops everything after it — useful when the tool keeps going past the value you actually wanted. Force as… decodes that layer with the encoding you pick, and everything below it is recomputed. When the chain ends, the last card offers the same select, so you can push one more layer that the guards declined.

What it detects

EncodingRecognised by
Base64 / Base64urlOnly the Base64 alphabet, valid length, optional = padding, line breaks allowed, data:…;base64, prefix stripped
URL encoding%XX sequences; + becomes a space unless you untick the option
Hex48656c6c6f, 0x48656c6c6f, or byte-separated 48 65 6c / 48:65:6c
HTML entities<, ', / — named entities are resolved by the browser's own HTML parser
Escapes\uXXXX, \u{…}, \xNN (UTF-8 byte runs like \xe2\x82\xac become €), \n, \", or a whole quoted JSON string
Quoted-printable=C3=A9 byte escapes and = soft line breaks
gzip / zlib / raw deflateMagic bytes 1f 8b and the zlib header check on decoded bytes; raw deflate is tried only on binary data that nothing else explains
JWTThree dot-separated Base64url segments whose first part is a JSON header

Why plain text is left alone

Plenty of ordinary strings are technically valid Base64 or hex: Test1234, deadbeef, a UUID, a date written as digits. A naive decoder turns them into garbage. Here a layer is only accepted if its output makes sense: text must be valid UTF-8 (checked strictly, not with replacement characters) and at least 95% printable, and short inputs need a minimum length. Base64 that decodes to binary is only accepted when the input is long and looks like real Base64 — mixed upper case, lower case and digits — or when the bytes start with a known file signature. Hex that decodes to binary is only accepted with a known signature such as gzip, PNG or ZIP, because hex digits are already a readable view of those bytes. Sentences with spaces are never treated as Base64 or hex.

Binary results, gzip and JWTs

When the final layer is binary — a key, an image, a compressed blob the browser can't inflate — the result switches to a hex dump with offsets and an ASCII column, and a download button saves the exact bytes. gzip and zlib data is inflated with the browser's native DecompressionStream, capped at 64 MB of output. A JWT is split into header and payload and shown as JSON; the signature is not verified, and the JWT decoder is one click away for expiry dates and claims.

Frequently asked questions

Which encodings can it detect?

Base64 and Base64url (with or without padding, line breaks allowed, data: URIs), URL percent-encoding, hex (plain, 0x-prefixed or byte-separated), HTML entities (named, decimal and hex), JavaScript/JSON string escapes such as \uXXXX and \xNN, quoted-printable, gzip, zlib and raw deflate, and JSON Web Tokens.

Why wasn't my string decoded?

Every layer must pass validity checks before it is accepted: the result has to be valid UTF-8 text with almost no control characters, or recognisable binary. Short words, UUIDs and plain sentences are deliberately left alone. If you know better, use the force as select on any layer to decode it your way.

How many layers can it peel?

Up to 10 layers per input. It stops earlier as soon as no encoding applies, and you can cut the chain at any layer with stop here.

Does it verify JWT signatures?

No. It decodes the JWT header and payload so you can read them, and links to the JWT decoder for a closer look. Decoding a token does not prove it is genuine.

Is my data uploaded?

No. Detection and decoding, including gzip and deflate decompression through the browser's native DecompressionStream, run entirely on your device. Nothing you paste leaves the tab.