Generate Universally Unique Lexicographically Sortable Identifiers
ULID Generator
Generate Universally Unique Lexicographically Sortable Identifiers
26 characters, all caps, no hyphens — and the first 10 encode when it was made
That's the whole ULID format. It's shorter than a UUID (26 vs 36 characters), has no special characters so you can paste it anywhere without encoding, and every ULID sorts in the order it was created because the timestamp is in the first 10 characters. The Decode section here extracts that timestamp so you can see exactly when a ULID was generated, down to the millisecond. This is occasionally useful for debugging when you have a list of IDs and want to know which one came first without checking a separate created_at column. If two ULIDs are generated within the same millisecond, monotonic mode guarantees they still sort correctly by incrementing the random portion slightly rather than generating independent randomness.
The main reason to choose ULID over UUID v7 is readability
Both give you time-ordered identifiers. UUID v7 has better ecosystem support right now — it's in the RFC, supported in recent versions of major languages' standard libraries, and recognized by most UUID-aware tooling. ULID is simpler to type, easier to read aloud, and doesn't have the hex-pairs-with-dashes visual noise. If you're starting a new project and the team will see a lot of these IDs in logs and database queries, ULID is genuinely nicer to work with day to day. If you're integrating with existing systems that already expect UUID format, stick with UUID v7.
