Seeded Generator

Derive repeatable values from one phrase, then shape them with rules into passwords, names, IDs, and other structured output.

Warning: a random extra salt is stronger, but if you lose the settings file you lose the exact namespace it depends on.

Settings file

Save an encrypted local settings file or load one back in when you need it.

Reference
How it works

The phrase is first hardened with Argon2id using scope + field + rev plus the optional extra salt as the derivation salt.

That produces a stable base key for that specific input, which is then expanded with HMAC into as many bytes as the rule needs.

The rule then renders those bytes into the final shape you want, such as a password, username, name, token, or other structured value.

phrase
  -> Argon2id(phrase, salt = scope + "|" + field + "|" + rev + "|" + extraSalt)
  -> 32-byte base key
  -> HMAC counter expansion for more bytes
  -> rule renderer
  -> final output string

Settings files store the current field list and full derivation metadata so the same structure can be reused across devices or reimplemented elsewhere.

Common uses

• Generate consistent fake identities across systems

• Derive usernames, emails, and passwords from one seed

• Create reproducible test data without storing fixtures

• Map a phrase to stable IDs or tokens

• Version values over time using rev

Guidelines

• Use a long, unique phrase for sensitive values

• Use different scopes and fields to separate contexts

• Increase rev to rotate values when needed

• Keep a backup of your settings file if you rely on it

• Use aliases for scopes if you do not want site or account names stored directly

Examples

words(2).title = first and last name

words(2).title.trim = compact username-style version

words(2).title.replace(" ", ".") = dotted username-style version

template("%s.%s",letters(8),numbers(3)) = username-style string

words(6).sentence = security question answer

hex(32) = plain lowercase hex token

letters-numbers-symbols(16) = strong password

uuid() = v4-shaped UUID string formatting

Rule DSL

blank() = intentionally leave this field empty

between("1970-01-01","1990-12-31") = one valid date inside that exact range

date(1970,1990) = one valid date between those years

hex(16) = lowercase hex digits

ipv4() = one IPv4 address

letters(12) = plain lowercase letters

letters-and-numbers(16) = mixed letters and digits

letters-numbers-symbols(16) = letters, digits, and symbols

numbers(6) = digits only

phone("1") = one phone number with the given country code

range(1,12) = one number inside the inclusive range

speakable(12) = one pronounceable block

template("%s-%s","id",hex(8)) = template-based formatting with %s placeholders

uuid() = deterministic v4-shaped UUID formatting

words(3) = three whole spaced words

Transforms

.lower = lowercase output

.replace("old","new") = replace text after generation

.sentence = capitalize the first letter and add punctuation

.title = title-case each word

.trim = remove spaces from the result

.upper = uppercase output

Use + to join parts, like acct+numbers(3) or "id-"+letters-and-numbers(6).upper.

Add a trailing # comment when you want to keep a note with a rule.

Your phrase is never saved. You can keep the field list in this browser or save it as a settings file instead. If you would rather not expose site names there, use aliases.