Pull the timestamp and randomness back out of a ULID — decode one or paste many, with UTC, ISO and local time — 100% in your browser
- Runs locally
- Category Developer & DevOps
- Best for Formatting, validating, shrinking, or inspecting code-adjacent text.
Multiple lines decode at once — one ULID per line.
Paste a ULID above to split out its timestamp and randomness.
Tip: a plain alphabetical sort of ULIDs is also a sort by creation time, since the timestamp lives in the leading characters.
What this tool does
Decode a ULID in your browser: paste any 26-character Crockford Base32 ULID and read its embedded creation time and random tail. A ULID splits, most-significant first, into a 48-bit millisecond timestamp in the first 10 characters and 80 bits of randomness in the last 16, so this tool is the exact inverse of generation: it pulls the timestamp out as a Unix-ms number and renders it as ISO 8601, a readable UTC time and your local time, then shows the 16-character random part on its own. It validates the Crockford alphabet (no I, L, O or U), rejects a wrong length, and refuses a first character above 7 that would overflow the 48-bit time, so a mistyped ID is caught immediately. Paste many ULIDs, one per line, to decode a whole batch from a log file at once, and copy any value with one click. Because the timestamp lives in the leading characters, a plain alphabetical sort of ULIDs is also a sort by creation time. Nothing is uploaded; all decoding runs locally.
Tool details
- Input
- Text
- The page exposes text boxes, numeric controls, file pickers, or structured inputs depending on the tool.
- Output
- Live result + Copy
- The result area focuses on usable output, with copy, download, or preview actions when supported.
- Privacy
- Browser-side processing
- The main tool logic does not call an external API, so inputs normally stay in the current tab.
- Save / share
- Shareable URL state
- Key settings are encoded in the URL so another person can reopen the same setup.
- Performance budget
- Initial JS <= 9 KB
- No WASM budget is declared, keeping the tool quick to open on mobile.
- Best fit
- Developer & DevOps · Developer
- Category and role tags drive related tools, internal links, and quick fit checks.
How to use
-
1. Input
Paste or drop your content into the tool panel.
-
2. Process
Click the button. All processing is local in your browser.
-
3. Copy / Download
Copy the result or download to disk in one click.
How ULID Decoder fits into your work
Use it in the small gaps between coding, reviewing, debugging, and shipping.
Developer jobs
- Formatting, validating, shrinking, or inspecting code-adjacent text.
- Preparing snippets for documentation, tickets, commits, or handoff.
- Checking a small payload quickly without switching tools.
Developer checks
- Run irreversible transforms like minify or obfuscate on a copy.
- Keep secrets out of pasted snippets unless the tool explicitly stays local.
- Use your normal tests or linter before shipping transformed code.
Good next steps
These links move the current task into a more complete workflow.
- 1 JWT Decoder Decode JWT header / payload / signature — verify structure, check exp, copy claims — browser-only Open
- 2 File Hash Calculator Compute SHA-1, SHA-256, SHA-384, or SHA-512 hashes for uploaded files entirely in the browser. Open
- 3 ULID Generator Sortable, URL-safe unique IDs — batch generate, monotonic mode, decode the timestamp back out — 100% in your browser Open
Real-world use cases
Find when a record was created from its ID alone
A support ticket quotes a row ID like 01ARZ3NDEK... and you need to know when it was created without database access. Paste it into the decoder and read the exact millisecond plus a readable UTC and local time. The timestamp is baked into the first 10 characters, so there is no created_at lookup and no query — the ID answers the question by itself.
Triage a log file full of ULIDs at once
You have a log dump where every line is a ULID and you want the timeline. Paste the whole block, one ULID per line, and the batch view decodes every row to its timestamp and UTC time. Bad or truncated lines are flagged as invalid instead of silently mis-decoding, so you can spot the corrupt entries while you read off the order.
Verify a ULID is well-formed before storing it
An upstream service hands you IDs and you suspect some are malformed. Paste one in: the decoder rejects any string that is not 26 Crockford Base32 characters, that contains I, L, O or U, or whose first character is above 7 (which would overflow the 48-bit time). A clean decode means it is a valid ULID; an error means reject it at the door.
Confirm two ULIDs are in the order you expect
You rely on ULIDs sorting by time but a result set looks off. Decode the two IDs in question and compare their timestamps directly — the milliseconds tell you which was minted first, independent of any string comparison. It is the fast way to confirm that ORDER BY id really is giving you creation order before you debug further up the stack.
Common pitfalls
Validating a ULID with the full A-Z alphabet. Crockford Base32 excludes I, L, O and U, so a regex that allows every letter will accept malformed IDs and silently mis-decode them. Check against the exact 32-symbol set, which is what this tool does — paste one with an I or O and it flags the error instead of guessing.
Reading the timestamp out of the wrong end. The time is the first 10 characters, not the last; the trailing 16 are pure randomness with no time in them. Slicing from the back, or treating the whole 26 characters as the time, gives a nonsense date. The split is always 10 timestamp + 16 randomness.
Treating the random tail as a secret or a checksum. The 80 random bits make collisions effectively impossible, but they are not a signature and they verify nothing. A ULID is an identifier, not a token — never rely on its randomness as a security check, and remember the timestamp half is fully readable by anyone who has the ID.
Privacy
Every decode runs in your browser tab — the Crockford Base32 arithmetic, the timestamp extraction and the date formatting are all plain JavaScript with no network call. A ULID you paste to inspect is never uploaded or logged, and batch input stays entirely local. One thing to weigh: the shareable URL encodes whatever you typed in the query string, so a "share link" pasted into chat will record those ULIDs in the recipient server's access log. Since a ULID reveals its creation time, use the copy button instead of the URL when that timing is sensitive.
FAQ
Tool combos
Folks in your role tend to reach for these alongside this tool.
- 555 Timer Calculator Astable f = 1.44/((R1+2R2)C) + monostable t = 1.1RC — pick R1, R2, C in Ω/kΩ and µF/nF, read frequency, duty cycle and pulse width — browser-only
- Add Line Numbers Number every line of pasted text — set start, step and separator, zero-pad to align, skip blanks, or strip numbers back off — browser-only
- AES Text Encryptor Encrypt & decrypt text with a password — AES-256-GCM + PBKDF2 via WebCrypto — 100% in your browser, nothing uploaded
- Affine Cipher Encoder & Decoder Encrypt and decrypt the ax+b affine cipher with live modular-inverse check, browser-only