Skip to content

Semantic generators

Semantic generators produce domain-shaped synthetic values without retaining a source value vocabulary. The built-in catalog currently uses the English locale. Apply unique explicitly where the schema requires uniqueness; most semantic domains are not unique by construction.

These generators accept text, take no arguments, and stream deterministic catalog draws:

DomainKinds
Personperson.first_name, person.last_name, person.full_name, person.username, person.title
Internetinternet.email, internet.domain, internet.url, internet.ipv4, internet.ipv6, internet.user_agent
Phonephone.number, phone.country_code
Companycompany.name, company.department, company.job_title
Addressaddress.line1, address.line2, address.city, address.region, address.postcode, address.country
Commercecommerce.currency
Texttext.word, text.sentence, text.paragraph, text.slug
Filefile.name, file.extension, file.mime_type
Networknetwork.mac
columns:
name:
generator: { kind: person.full_name }
email:
generator: { kind: internet.email }
modifiers: [{ kind: unique }]

Independent generators do not coordinate their semantics. For example, file.name, file.extension, and file.mime_type chosen independently need not agree; use the file.metadata planner for a coherent tuple.

address.latitude and address.longitude accept decimal or text, take no arguments, and draw from the full global ranges at six decimal places. Use the geo.coordinate_pair planner when latitude and longitude need shared custom bounds or coordinated ownership.

KindArgumentsAcceptsNotes
commerce.product_namenonetextTwo capitalized synthetic words
commerce.skunonetextAAA-###-#### shape
commerce.moneymin=0, max=1000, scale=2decimal, textOrdered bounds; scale 0..18
commerce.quantitymin=1, max=100integer, big_integerInclusive non-negative range

Independent money columns do not preserve accounting equations. Use commerce.order_family for coordinated line items, subtotal, tax, discounts, shipping, and total.

KindArgumentsAcceptsNotes
file.sizemin=1, max=10000000integer, big_integerSize in bytes
network.portmin=1, max=65535integer, big_integerInclusive port range
durationmin=0, max=86400integer, big_integerDuration in seconds

Every minimum must not exceed its maximum. These generators produce one value; they do not coordinate with file-name or temporal endpoint columns.

length=32, alphabet=alphanumeric, prefix="". Alphabets are alphanumeric, hex, numeric, alpha, and url_safe.

length=21, alphabet=url_safe, prefix="". This is NanoID-shaped output; choose an explicit length if another system expects a fixed width.

No arguments. Emits a 26-character Crockford-base32 ULID-shaped identifier.

length=64. Emits lowercase hexadecimal text. This is random hash-shaped data, not a digest of another generated column.

KindArgumentsRangeAccepts
datenone1970-01-01 through 2035-12-31date_time, text
timenone00:00:00 through 23:59:59date_time, text
datetimenone1970-01-01 through 2035-12-31date_time, text

The bounds of these single-column generators are fixed. Use a temporal planner for configurable ranges and ordering across several columns.

before and after read a required sibling source column. They accept date_time or text and use min_seconds=1, max_seconds=86400 by default.

columns:
created_at:
generator: { kind: datetime }
expires_at:
generator:
kind: after
source: created_at
min_seconds: 3600
max_seconds: 86400

The source must exist and contain a supported timestamp format at runtime. It may be declared anywhere — evaluation follows the read dependency, so the source is produced first — but the two columns must not read each other in a cycle. Bounds must be ordered and fit the supported timestamp arithmetic range.