Custom Test Mock Data Generator Tool
Generate Test Data for Your Database and Software
Define your custom data structure and options to generate fake realistic data and that offers developers and tester better accuracy when testing.
Custom Test Mock Data Generator: Realistic Fake Data for Testing, Prototyping, and Database Seeding
Every application eventually needs to be filled with data before it can be properly tested — rows in a database, names in a user list, addresses on a checkout form, transactions on a dashboard. The Custom Test Mock Data Generator exists so that data can be realistic, structured, and plentiful, without a single real person's information ever being involved.
This guide explains what mock, fake, and dummy data actually mean, why realistic test data catches bugs that random data misses, and exactly which data categories the generator at onlinewebtoolkit.com/generatedata can produce — from full person profiles and international addresses to payment card numbers, hashes, and color palettes.
Whether you're populating a staging database before a demo, building UI mockups that need to look believable, stress-testing an API with thousands of rows, or simply trying to avoid putting a real customer's name into a screenshot, this page walks through the reasoning and the practical "how" behind generating data that behaves like the real thing without being the real thing.
What is Test Data, Fake Data, or Dummy Data?
Test data, fake data, dummy data, mock data, and synthetic data are all names for the same general idea — artificially produced values used in place of real, sensitive, or not-yet-available information — but they sit at slightly different points on a realism spectrum, and the differences matter once you're choosing the right approach for a specific task.
Dummy data
Dummy data is the simplest and least realistic tier: placeholder values that exist purely to occupy a field. Typing "Test Test" into a name box, "111-111-1111" into a phone field, or "[email protected]" into an email box is dummy data. It's fast to produce by hand, but it rarely resembles anything a real user would actually type, which limits how useful it is for catching real-world bugs.
Fake data
Fake data steps up in realism — it follows the correct format and reads as plausible, even though it isn't tied to a real person. "John Smith" with the email "[email protected]" is fake data: it looks like something a human would enter, and it passes basic format validation, but its content is generic and somewhat repetitive when produced in bulk.
Mock data / synthetic data
Mock data, often called synthetic data, is the most realistic tier. It's algorithmically generated to follow the actual statistical patterns, formatting rules, and edge cases found in real production data — varied names from different cultural backgrounds, correctly formatted addresses for the right country, valid-but-unusable payment numbers, and realistic distributions of ages, prices, or timestamps. This is the tier the Custom Test Mock Data Generator is built to produce.
In practice: most teams use the terms "mock data," "fake data," and "test data" interchangeably in conversation. What actually matters is the realism tier you're generating — and for anything beyond a quick UI placeholder, the more realistic tier almost always produces better testing results.
Why is Test Data Important?
Software has to be exercised with data before anyone can trust that it works, and using real production data to do that exercising creates problems of its own — privacy exposure, compliance risk, and the simple fact that real data usually doesn't exist yet for a feature that hasn't shipped. Test data solves all three problems at once.
It protects real people
Pasting a real customer's name, email, or payment details into a staging environment, a bug report, or a shared screenshot creates exposure that a privacy or security team has to account for. Generated test data carries the same shape and structure without any of that risk, because there's no real person behind it.
It's available before production data exists
A brand-new feature, by definition, has no real usage history yet. Test data lets a team populate a UI, exercise an API, or load-test a database before a single real user has touched the system, which means testing can happen in parallel with development instead of waiting for traffic to accumulate.
It makes tests repeatable
Real production data changes constantly — rows get updated, deleted, or migrated. A test built against ever-shifting real data is fragile and hard to reproduce. Generated test data, especially with a fixed random seed, can be regenerated identically every time, which is exactly what automated test suites need to stay reliable.
It enables edge-case coverage on demand
Real datasets rarely contain every edge case a system needs to handle — a name with an apostrophe, an address with no street number, a price of exactly zero. A good test data generator can be configured to deliberately include these edge cases, something that's much harder to guarantee when relying purely on whatever real data happens to exist.
Why is Realistic Data Important?
Not all test data is equally useful. A field filled with a random string of characters technically "has a value," but it often fails to trigger the specific behaviors that only show up with genuinely realistic input — and that gap is exactly where bugs hide until they reach production.
Realistic data exposes layout and validation bugs
A random 24-character string in a name field might overflow a card layout that was only ever tested with short names like "Jane Doe." A realistic name generator, by contrast, naturally produces the full range of name lengths, special characters like apostrophes and hyphens, and multi-word surnames that real users actually have — which means layout and validation bugs surface during testing instead of after launch.
Realistic data respects field relationships
Real-world data isn't just individually valid — it's relationally consistent. A realistic generator keeps a city, state or province, and postal code aligned with each other, keeps a person's age plausible relative to their date of birth, and keeps a country code consistent with a phone number's format. Purely random data ignores these relationships entirely, which can hide bugs in any logic that depends on that consistency.
Realistic data builds stakeholder trust in demos
A product demo, investor pitch, or internal review filled with rows like "asdf," "test123," and "111-111-1111" undermines confidence in the product, even when the underlying functionality is solid. Realistic mock data — plausible names, real-sounding companies, sensible prices — lets a demo look and feel finished, which matters as much for perception as it does for technical correctness.
The core tradeoff: dummy data is faster to type but cheaper to test with; realistic data takes a generator to produce at scale but catches a meaningfully wider range of real-world bugs.
Data Format Support by the Test Data Generator
Ten categories cover the overwhelming majority of fields a real application is likely to contain. Each one is generated using real-world patterns — correct formats, valid checksums, plausible distributions — rather than arbitrary random characters, so the output is genuinely useful for testing, not just technically present.
Person
Full names, gender, age, job titles, and usernames — built from real naming patterns rather than random character strings.
Gender: Female · Age: 34
Job Title: Marketing Director
Username: e.vance34
Address / Country / Language
Street addresses, cities, states or provinces, postal codes, countries, and BCP-47 language codes, kept internally consistent with each other.
Asheville, NC 28801
United States · en-US
Number / Digit / Boolean
Integers and floats within a defined range, single digits, and true/false booleans — useful for IDs, prices, ratings, and flags.
Float: 482.19
Digit: 7 · Boolean: true
Text / String
Words, sentences, paragraphs, lorem-ipsum style filler, fixed-length strings, and URL-friendly slugs for content fields.
sed gravida quam semper et."
Slug: modern-test-data-tools
Phone Number
Locale-aware phone numbers formatted correctly for a specific country, including area codes and international dialing prefixes.
UK: +44 20 7946 0958
BD: +880 1812-345678
Company Information
Company names, taglines or catchphrases, industries, departments, and job titles for B2B and HR-style test scenarios.
"Streamlined neural solutions"
Industry: Renewable Energy
Date Time
Past, future, and recent dates, custom date ranges, and timestamps in multiple formats including full ISO 8601.
DOB: 1988-06-14
Relative: 3 days ago
E-mail / Domain / Network Address / Browser
Email addresses on reserved test domains, domain names, IPv4/IPv6 addresses, MAC addresses, and realistic browser user-agent strings.
Payment / Credit Card
Card numbers that pass the Luhn checksum and follow real issuer formats (Visa, Mastercard, Amex) while using reserved, non-chargeable ranges, plus expiry dates, CVVs, and IBANs.
Visa · Exp 09/27 · CVV 342
IBAN: GB29 NWBK 6016 1331 9268 19
Image / Color / Barcode / Hash
Placeholder image URLs at custom dimensions, hex and RGB color values, UPC/EAN barcodes, and hash strings (MD5, SHA-1, SHA-256).
EAN-13: 4006381333931
MD5: 9e107d9d372bb6826bd81d3542a419d6
Data Format Support by Our Test Data Generator
- Name Title (Random)
- Male Name Title (e.g. Mr.)
- Female Name Title (e.g. Ms.)
- Name Suffix (e.g. Jr.)
- Full Name
- First Name (Random (Male/Female))
- First Name (Male)
- First Name (Female)
- Last Name
Person
- City Prefix
- Secondary Address
- State Abbreviation
- State
- City Suffix
- Street Suffix
- Building Number
- City
- Street Name
- Street Address
- Postcode
- Address
- Country
- Latitude
- Longitude
- Locale (e.g. en_US)
- Country Code (e.g. US)
- Language Code (e.g. en)
- Currency Code (e.g. EUR)
- Emoji
Address / Country / Language
- Universally Unique Identifier (UUID)
- Random Digit
- Random Number
- Random Float
- Random Number (Long Range)
- Boolean
Number / Digit / Boolean
- Random Letter
- Random Word
- Text [Max 200 Characters]
- Single Sentence
- Multiple Sentence (Paragraph)
Text / String
- Phone Number
- Toll Free Phone Number (e.g. (888) 999-1234)
- e164 Phone Number (e.g. +38543456412)
Phone Number
- Full Phrase Company Name
- Company Service / Slogan
- Company Name
- Company Suffix
- Employee Job Title / Designation
Company Information
- Unix Time (NOW)
- Date Time (ISO)
- Date Time (YYYY-MM-DD)
- Time (hh:mm:ss)
- AM/PM
- Day of Month
- Day of Week
- Month
- Month Name
- Year
- Century
- Time Zone
Date Time
- Email Address
- Safe Domain Email (e.g. [email protected])
- Free Domain Email (e.g. [email protected])
- Company Email (e.g. [email protected])
- Free Email Domain
- Safe Email Domain
- User Name / Login Account
- Password
- Domain Name
- Domain Word
- Top Level Domain
- URL
- Slug
- IP Address v4 (e.g. 110.123.132.152)
- Local IP Address v4 (e.g. 10.102.55.10)
- IP Address v6 (e.g. fe80:cd12:0:0:1235:0:211e:729c)
- MAC Address
- Browser Information - User Agent
E-mail / Domain / Network Address / Browser
- Credit Card Type
- Credit Card Number
- Credit Card Expiration Date
- ISBN
- SWIFT Code - Bank Identifier Code (BIC)
Payment / Credit Card
- HEX Color (e.g. #ffcc00)
- RGB Color
- Color Name
- File Extension
- MIME Type
- Image Url / Path
- EAN13 Barcode Number
- EAN8 Barcode Number
- ISBN13 Barcode Number
- ISBN10 Barcode Number
- MD5 Hash Number
- SHA1 Hash Number
- SHA256 Hash Number
Image / Color / Barcode / Hash
Note on payment data: generated card numbers are mathematically valid (they pass the Luhn algorithm used to catch typos) but are drawn from ranges reserved for testing and documentation, so they cannot be charged or linked to a real account.
Key Features of the Custom Test Mock Data Generator Tool
Beyond simply producing values, the generator is built around a handful of features that make the output genuinely usable for real testing and development work rather than just placeholder filler.
Custom field selection
Instead of generating a fixed, one-size-fits-all record, you choose exactly which fields you need — for example, just name, email, and signup_date — and the generator builds rows matching only that schema, so the output drops directly into your existing table or API contract without extra columns to strip out.
Locale-aware generation
Names, addresses, and phone numbers can be generated for a specific country or language, which matters when testing how an interface handles internationalized text, right-to-left scripts, or region-specific formatting like postal codes or date order (DD/MM/YYYY vs MM/DD/YYYY).
Format-valid, not just type-valid
Generated values follow the actual rules of their format — credit card numbers pass the Luhn checksum, email addresses use correctly structured local-part-at-domain syntax, IP addresses fall within valid octet ranges — so the data exercises real validation logic instead of slipping past it accidentally.
Adjustable volume
Generate a handful of rows for a quick UI mockup, or scale up to thousands of rows in a single batch for load testing and bulk database seeding, without changing your workflow.
Multiple export formats
Results can be copied or exported as CSV for spreadsheets, JSON for APIs and mock servers, SQL insert statements for direct database seeding, or XML for legacy systems — covering the formats most development and testing workflows already expect.
Reproducible output with seeding
When a fixed seed value is used, the same configuration produces the same dataset every time, which is essential for automated tests that need to assert against predictable values rather than data that changes on every run.
How to Use the Custom Test Mock Data Generator Tool
Open onlinewebtoolkit.com/generatedata and you'll find a field-by-field builder, a quantity selector, and an export panel. No account or installation is required. Here's the complete workflow from blank schema to ready-to-use dataset:
Select the fields you need
Build your schema by choosing from the available data categories — Person, Address, Number, Text, Phone, Company, Date Time, Email/Network, Payment, and Image/Color/Hash — adding only the fields your table, form, or API actually requires.
Set quantity, ranges, and locale
Specify how many rows to generate, narrow a number or date field to a specific range, and choose a country or language for locale-sensitive fields like names, addresses, and phone numbers.
Generate the records
Run the generator to produce your dataset instantly. Each row follows the field rules you configured, with correctly formatted, internally consistent values across every column.
Export in the format you need
Download or copy the result as CSV, JSON, SQL insert statements, or XML, ready to drop into a spreadsheet, a mock API, a database seed script, or a test fixture file.
Build your first dataset
Pick your fields, set a quantity, and generate realistic test data in seconds.
A worked example, start to finish
Say a checkout flow needs 25 realistic customer rows for a staging environment, each with a name, email, shipping address, and a test payment card. Select Person → Full Name, E-mail, Address → Street, City, Postal Code, Country, and Payment → Card Number, Expiry, set quantity to 25, choose a locale, and export as JSON:
[ { "name": "Priya Anand", "email": "[email protected]", "street": "118 Cedar Hollow Ct", "city": "Austin", "postal_code": "73301", "country": "United States", "card_number": "4539148803436467", "expiry": "09/27" } // ...24 more rows]That JSON array can be pasted directly into a mock API response, a fixtures file, or a database seed script — no manual reformatting required.
Custom Test Mock Data Generator Uses and Applications
Generated test data shows up across nearly every stage of building and selling software, not just inside a QA team's test suite. Here's where it earns its keep most often.
QA and test automation
Automated test suites need predictable, repeatable inputs to assert against. Generated records — especially seeded ones that regenerate identically every run — give QA engineers a reliable supply of valid and edge-case data without manually authoring every test fixture by hand.
UI/UX prototyping
Designers and frontend developers need realistic-looking content to judge whether a layout actually works — a table of three rows looks very different from a table of three hundred, and a name field that's never seen a long surname will hide its own overflow bug until a real user finds it.
Database seeding
New environments — a fresh staging database, a local development setup, a demo instance — need to start with something in them. Bulk-generated rows seed these environments instantly, instead of waiting for organic data to accumulate or manually inserting rows one at a time.
API mocking
Frontend teams often need to build against an API that doesn't exist yet, or that's still under development. Mock data lets a mock server or a tool like a request interceptor return realistic responses immediately, decoupling frontend progress from backend completion.
Sales and product demos
A demo environment filled with believable companies, names, and transaction histories looks finished and trustworthy in a way that an empty database or one full of "Test Test" entries simply doesn't.
Machine learning model training and testing
Synthetic datasets are increasingly used to test data pipelines, validate preprocessing logic, and benchmark model behavior before real, sensitive training data is introduced into a workflow.
Load and performance testing
Simulating production-scale traffic requires production-scale data. Generating tens of thousands of realistic rows lets a team measure how a database query, an API endpoint, or a search index performs under real-world volume well before launch day.
Mock Data vs Real Data vs Anonymized Data
It's worth being precise about a distinction that gets blurred a lot: mock data and anonymized data are not the same thing, even though both are sometimes used as privacy-friendly substitutes for real data.
Anonymized data starts as real records — actual customer names, actual transaction histories — and then has identifying details stripped, masked, or generalized. The problem is that anonymization isn't always permanent or perfect: combining a handful of supposedly "anonymous" attributes (a birth date, a postal code, a gender) has been shown, in well-documented research, to re-identify specific individuals in datasets that were assumed to be safe.
Mock or synthetic data sidesteps that risk entirely by never starting from real records in the first place. A generated name, address, or transaction has no underlying real person to re-identify, because the generation process invents the value rather than transforming an existing one.
That said, real data still has one advantage neither alternative can fully replace: it reflects whatever genuinely unpredictable, messy patterns exist in your actual user base. Mock data is excellent for structural, functional, and load testing — but for deep behavioral analytics on how real users actually behave, real (properly governed) data is still necessary at some point in the product lifecycle.
| Property | Real Data | Anonymized Data | Mock / Synthetic Data |
|---|---|---|---|
| Source of values | Real individuals | Real individuals, masked | Generated synthetically |
| Privacy/compliance risk | High | Reduced, but not zero | Effectively none |
| Available before launch | No | No — needs existing data | Yes — generated on demand |
| Reproducible on demand | No | Limited | Yes, with a fixed seed |
| Statistical realism | Highest (it's real) | High, inherited from source | High, by design |
Privacy and Compliance Considerations
One of the strongest practical reasons teams adopt mock data generation is regulatory: privacy laws like the EU's GDPR, California's CCPA, and similar frameworks elsewhere place real obligations on how personal data is collected, stored, and used — obligations that simply don't apply to data that was never derived from a real person in the first place.
Because synthetic data has no connection to an identified or identifiable individual, it generally falls outside the legal definition of "personal data" that these regulations are built around. That makes it a practical way to keep staging environments, demo databases, support tickets, and shared screenshots free of regulated information without slowing down development.
Where teams still need to be careful
- Don't confuse "masked" with "synthetic." A real record with the name swapped out but the original purchase history, IP address, or account ID left intact may still count as personal data under some regulations, since other fields can still be linked back to a real person.
- Watch for accidental real-data leakage. If a generator is ever seeded or trained using real customer records, double check that no actual values can resurface in the generated output.
- Compliance still depends on context. Regulated industries (healthcare, finance) often have sector-specific rules layered on top of general privacy law, so teams in those spaces should confirm specifics with their own legal or compliance function rather than relying on a general rule of thumb.
This page is general informational content, not legal advice — if your use case touches regulated data categories, it's worth a direct conversation with whoever owns compliance at your organization.
Benefits of Using a Free Custom Test Mock Data Generator Online Tool
Choosing a dedicated generator over manual entry or a one-off script pays off in time saved, risk avoided, and bugs caught earlier. Here's what changes once it becomes part of a regular workflow:
Saves development time
Stop hand-typing placeholder rows or writing one-off scripts just to populate a form, table, or test fixture.
Protects real users
Keep actual customer names, emails, and payment details out of staging environments, screenshots, and bug reports entirely.
Available before launch
Populate a brand-new feature with believable data before a single real user has touched the system.
Catches more real bugs
Realistic field lengths, formats, and edge cases surface layout and validation issues that plain random strings miss.
Scales to any volume
Generate a handful of demo rows or hundreds of thousands of records for load testing from the same workflow.
Reduces compliance exposure
Synthetic records carry no personal data, simplifying privacy reviews for test and demo environments.
Reproducible test fixtures
Seeded generation produces the same dataset every run, keeping automated tests stable and predictable.
Free and instant
No installation, account, or cost — open the page and start generating structured data immediately.
Best Practices for Using Mock Data in Testing
Generating realistic data is only half the job — using it well in a testing workflow is what actually turns it into better software. A few habits make the difference between mock data that genuinely helps and mock data that just fills space.
Match volume to the test's purpose
A UI mockup might only need five to ten rows to look believable. A pagination bug, on the other hand, won't show up until there's enough data to actually paginate — and a performance bottleneck might only appear at tens of thousands of rows. Generate the volume the test actually needs, not a fixed default every time.
Deliberately include edge cases
Don't rely on randomness alone to surface edge cases. Explicitly generate records with empty optional fields, maximum-length strings, minimum and maximum numeric boundaries, and unusual but valid characters (apostrophes in names, accented letters, hyphenated surnames) to confirm your application handles them correctly.
Keep a seed for reproducible bugs
When a generated dataset triggers a bug, save the seed or the exact dataset that caused it. Reproducibility is what turns "it broke once" into a fixable, verifiable bug report — and a regression test that can be run again with confidence.
Separate test data generation from test logic
Keep the code or configuration that generates mock data separate from the code that tests behavior. This keeps test logic readable and makes it easy to swap in a different volume, locale, or schema later without touching the actual test assertions.
Document and version your schema
Treat the field definitions behind a generated dataset — which formats, which ranges, which locale — as part of your project, not a one-off setting you'll remember later. Saving that configuration alongside your test suite means a teammate (or you, six months from now) can regenerate an equivalent dataset without reverse-engineering what the original fields were meant to represent. This matters even more once multiple environments — local development, CI, staging — are expected to behave consistently against the same shape of data.
Common mistakes to avoid
- Using the same handful of records everywhere. Reusing one tiny, memorized dataset across every test hides bugs that only appear with variety — generate fresh data for each meaningful test case.
- Ignoring locale. Testing only with US-formatted names, addresses, and phone numbers will miss bugs that surface the moment a real international user signs up.
- Mixing test and production data sources. Never let a test or staging environment quietly fall back to querying a production database "just this once" — it defeats the purpose of using mock data in the first place.
- Treating mock data as a substitute for real user testing. Mock data is excellent for structural and functional testing, but usability and real-world behavior still need genuine user feedback at some point.
Rule of thumb: generate the smallest dataset that still exercises the behavior you're trying to test — then scale up deliberately for volume and performance testing as a separate, explicit step.
Glossary: Key Terms Used Throughout This Guide
A quick reference for the vocabulary that comes up repeatedly when discussing mock, fake, and synthetic test data.
| Term | Meaning |
|---|---|
| Mock data | Artificially generated data used to stand in for real data during development, testing, or demonstrations. |
| Synthetic data | Data generated algorithmically to mimic the statistical patterns and structure of real data, with no direct link to any real individual or record. |
| Dummy data | Minimal placeholder values used to fill a field with little regard for realism, such as "Test Test" or "asdf123". |
| Anonymized data | Real data that has had identifying details removed or masked, while still originating from actual records. |
| PII (Personally Identifiable Information) | Any data that can identify a specific individual, such as a name, email address, phone number, or government ID. |
| Seed (random seed) | A starting value that makes a generator's "random" output reproducible — the same seed and configuration will always produce the same dataset. |
| Luhn algorithm | A checksum formula used to validate identification numbers, most commonly credit card numbers, by detecting accidental single-digit errors. |
| Locale | A set of formatting conventions tied to a language and region, affecting how names, addresses, dates, and numbers are generated and displayed. |
| Database seeding | The process of populating a database with an initial set of records, often using generated data, before an application is used. |
| API mocking | Simulating an API's responses with generated data so frontend or integration work can proceed before the real backend is complete. |
Frequently Asked Questions
Answers to the questions that come up most often when generating and working with mock, fake, and synthetic test data.
The three terms are used almost interchangeably in everyday conversation, but they carry slightly different emphasis. Dummy data is usually placeholder filler with little concern for realism, like "Test Test" in a name field. Fake data implies values that look plausible, like a real-looking name or a valid-format phone number, without belonging to a real person. Mock data is the broadest term, describing any artificially generated dataset used to stand in for real data during development, testing, or demonstrations.
No. Anonymized data starts from real records and strips or masks identifying details, but it can still carry residual patterns from the original dataset and, in some cases, be re-identified. Mock data is generated entirely synthetically, with no connection to any real person or record, which removes that re-identification risk entirely.
Yes. Generated records can be structured to match your table schema and exported in formats commonly used for seeding databases, including SQL insert statements, CSV, and JSON, so they can be imported directly into MySQL, PostgreSQL, or similar systems.
This depends on the specific configuration, but most online generators support anywhere from a handful of rows for a quick UI mockup up to several thousand rows for load testing or bulk database seeding in a single batch.
Synthetic mock data that isn't derived from real individuals' information generally falls outside the scope of personal data protection regulations like GDPR, since it doesn't relate to an identified or identifiable natural person. Compliance always depends on exactly how the data is generated and used, so teams handling regulated industries should confirm specifics with their own legal or compliance team.
Yes. A well-built mock data generator supports multiple export formats so the same generated dataset can be dropped into a spreadsheet, an API mock server, a database seed script, or a legacy XML-based system without manual reformatting.
Yes. Generated payment data follows the correct format and checksum rules, such as the Luhn algorithm, so it looks and validates like a real card number structurally, while drawing from reserved test ranges that cannot be charged or linked to a real account.
Yes. Locale-aware generators can produce names, addresses, and phone numbers formatted for a specific country or language, which is important for testing how an application handles internationalization and regional formatting differences.
Reputable generators use reserved domains, such as example.com, and reserved number ranges specifically set aside for documentation and testing purposes, which significantly reduces the chance of accidentally generating a value that belongs to a real person or service.
Random data satisfies a field's basic type and length requirements but ignores real-world patterns, such as valid postal code formats or plausible name and age combinations. Realistic data follows the actual structure, distribution, and constraints found in production data, which makes it far more effective at catching bugs that only appear with genuinely realistic inputs.
Yes. Generating thousands or millions of realistic records is one of the most common uses for mock data, since it lets teams test how a database, API, or application performs under production-scale volume without waiting for real data to accumulate.
The tool is free to use directly in the browser, with no installation or account required to generate and export test data.
Ready to generate your dataset?
Person, address, numbers, text, phone, company, dates, email, payment, or image data — built to your schema, exported your way.

