ULID Generator

Generate random, lexicographically sortable ULIDs, a modern alternative to UUIDs that sort by creation time. Batch generate and decode existing ULIDs, entirely in your browser.

runs locally on your browser. Your data never leaves your device.

Quantity

Case

Configure your options and click Generate

Up to 1000 sortable ULIDs at once

Decode a ULID

Common Use Cases

Generate a batch of time-sortable primary keys for a new database table or seed script
Decode a ULID pulled from a log line or database row to see exactly when it was created
Generate backdated ULIDs for a specific timestamp when backfilling historical test data
Replace a UUID-based ID scheme with a sortable alternative that still fits in the same 26-character/128-bit shape

About ULID Generator

A ULID (Universally Unique Lexicographically Sortable Identifier) is a 26-character identifier designed to fix a common annoyance with UUIDs: a standard UUID is unique, but its characters are effectively random from end to end, so a list of UUIDs sorts in a meaningless order and gives no hint about when each one was created. A ULID encodes a 48-bit millisecond timestamp into its first 10 characters and 80 bits of randomness into its last 16, using Crockford's Base32 alphabet (no I, L, O, or U, to avoid misreading characters by eye). The result is a string that's just as collision-resistant as a UUID, but sorts, as plain text, in the same order the IDs were created, which makes ULIDs a popular primary-key choice for databases, event logs, and distributed systems where insertion order matters.

This tool generates one or many ULIDs at once, entirely with your browser's cryptographically secure random number generator. Batches use monotonic ordering by default (the ULID specification's own recommendation for generating multiple IDs within the same millisecond), meaning if two IDs in a batch would otherwise land on the exact same timestamp, the random portion increments instead of being redrawn, so every ID in a batch you generate is guaranteed to sort strictly after the one before it, never tied or out of order.

Already have a ULID and want to know when it was created? Paste it into the decoder and its embedded timestamp is extracted and shown as both a readable date and raw milliseconds, handy for debugging a database row or log entry without writing any code. The decoder is lenient about the common Crockford Base32 substitutions (a typed "O" is read as zero, "I" and "L" are read as one).

Everything, generation and decoding, runs as plain JavaScript directly in your browser. No identifier you generate or decode is ever uploaded, logged, or transmitted anywhere.

Frequently Asked Questions

How is a ULID different from a UUID?
Both are 128-bit identifiers designed to be globally unique without central coordination, but a UUID (v4, the common random variant) is random in every character, so UUIDs don't sort in any meaningful order. A ULID dedicates its first 10 characters to an encoded timestamp and only the remaining 16 to randomness, so a set of ULIDs sorts lexicographically (as plain text) in the same order they were created, useful as a database primary key, since it keeps recently-inserted rows near each other instead of scattered randomly across an index.
What does 'monotonic' mean for a batch of ULIDs?
If you generate multiple ULIDs within the same millisecond, they'd all share an identical timestamp portion, and without extra care their relative order would come down to comparing random bytes, not guaranteed to match generation order. Monotonic mode (the ULID specification's own recommended approach, on by default here) detects when two consecutive IDs in a batch share a timestamp and increments the previous ID's random portion by one instead of drawing fresh randomness, so every ID in the batch is guaranteed to sort strictly after the previous one.
Why does the ULID alphabet skip the letters I, L, O, and U?
ULIDs are encoded with Crockford's Base32, a variant of Base32 chosen specifically to avoid characters that are easy to misread when written by hand or displayed in certain fonts: capital I and lowercase l look like the digit 1, capital O looks like 0, and U is dropped to avoid accidentally forming profanity. The decoder in this tool is lenient about common substitutions: a mistyped O, I, or L in a pasted ULID is automatically read as 0 or 1, since that's how a human is likely to have meant it.
Are the random characters in a ULID cryptographically secure?
Yes. This tool sources every random byte from the Web Crypto API's getRandomValues(), the same cryptographically secure generator used for encryption keys, not Math.random(). Each ULID has 80 bits of randomness (before any monotonic increment), which is enough that generating a collision by chance is astronomically unlikely even across very large batches.
Can I generate a ULID for a specific date instead of right now?
Yes. Turn on the custom timestamp option and pick any date and time; every ULID in that batch will encode that timestamp instead of the current time. This is useful for backfilling historical records with realistically time-ordered IDs, or for testing how your application handles ULIDs from a particular point in time.
Is any ULID I generate or decode sent to a server?
No. Every ULID is generated and decoded entirely in your browser using JavaScript and the Web Crypto API. Nothing is uploaded, logged, or transmitted anywhere, and the tool keeps working even if your internet connection drops after the page has loaded.