# ULID Generator > Free in-browser tool that generates ULID identifiers in bulk, decodes any ULID to its creation timestamp, and checks whether a list of ULIDs is in time order. Independent tool, not affiliated with the ULID project. Updated 2026-11-04. Full page: https://lab.awaara.cn/ulid-generator/ ## What it does - Generates ULIDs, 1 to 1000 per click, using the browser's cryptographic random number generator (crypto.getRandomValues). Modes: current time, fixed time (for tests), and monotonic (same-millisecond IDs increase by incrementing the random part, as the specification describes). - Output: one ULID per line with its UTC timestamp, copy per ID, copy all, download as .txt, or download as .csv with timestamp columns. - Decoder: paste any ULID to check validity and read its timestamp in milliseconds, ISO 8601 UTC date, local date, age, timestamp part, random part, random part as hex, and the full 128 bits as hex. Lowercase input is accepted; I and L are read as 1 and O as 0 following Crockford's decoding rule, and the result says so. U is never valid. - List checker: paste up to 200 ULIDs, one per line, to validate each one, see its timestamp, find the first line that breaks time order, and copy the sorted list. - Everything runs locally in the browser. Nothing is sent to a server; the page works offline once loaded. ## What a ULID is - 128-bit identifier, canonically 26 characters: 10 characters encode a 48-bit Unix timestamp in milliseconds, 16 characters encode 80 bits of randomness. Encoding is Crockford's Base32 (digits and letters minus I, L, O, U), case-insensitive, URL-safe. - The timestamp sits first, so sorting ULIDs as plain text sorts them by creation time. Within the same millisecond, order is random unless a monotonic generator was used. - The timestamp part can only start with 0 to 7, because 10 Base32 characters hold 50 bits and only 48 are used. The largest valid ULID is 7ZZZZZZZZZZZZZZZZZZZZZZZZZ (281474976710655 milliseconds, year 10889). - 80 random bits give 1.21e24 distinct values per millisecond. A collision becomes likely only after about 1.3 trillion IDs in the same millisecond (birthday bound). - A ULID is not a UUID: same 128-bit size, different encoding and different specification. ULID is a community specification, not an RFC. UUID v7 (RFC 9562) is the standardized time-ordered alternative with a native database type. - Tradeoffs: a ULID leaks its creation time to the millisecond. Do not use ULIDs as secrets, password reset tokens, or session tokens. Clock jumps backwards break the ordering promise; monotonic generation must wait or error instead of emitting an out-of-order ID. ## Code snippets (from the page) - JavaScript (no library): encode the millisecond timestamp and 10 random bytes from crypto.getRandomValues with the Crockford alphabet, 10 plus 16 characters. - Python (standard library only): same encoding with secrets.token_bytes(10) for the random part. - Go: ulid.New(ulid.Timestamp(time.Now()), entropy) from github.com/oklog/ulid, the library listed in the ULID specification. ## Sources - ULID project, Universally Unique Lexicographically Sortable Identifier: https://github.com/ulid/spec - Douglas Crockford, Base 32: https://www.crockford.com/base32.html - IETF, RFC 9562: Universally Unique IDentifiers (UUIDs): https://www.rfc-editor.org/info/rfc9562/