| name | fake-content |
| description | Generate realistic fake content for HTML prototypes. Use when populating pages with sample text, products, testimonials, or other content. NOT generic lorem ipsum. |
| allowed-tools | Read, Write, Edit, Bash |
Fake Content Skill
Generate realistic fake content using @faker-js/faker. Create contextually appropriate sample data for prototypes and development.
Philosophy
- Realistic over generic - Use proper names, realistic prices, believable text
- Contextually appropriate - Match content to the page purpose
- Consistent within context - Same person name throughout a section
- Locale-aware - Match content to page language
Setup
Install faker as a dev dependency:
npm install @faker-js/faker --save-dev
Content Types
Person
Generate realistic user data:
import { faker } from '@faker-js/faker';
const person = {
name: faker.person.fullName(),
email: faker.internet.email(),
phone: faker.phone.number(),
jobTitle: faker.person.jobTitle(),
avatar: faker.image.avatar(),
bio: faker.person.bio()
};
HTML Template:
<article class="team-member">
<img src="[avatar URL]" alt="[name]"/>
<h3>[name]</h3>
<p class="title">[jobTitle]</p>
<p class="bio">[bio]</p>
<a href="mailto:[email]">[email]</a>
</article>
Product
Generate e-commerce product data:
import { faker } from '@faker-js/faker';
const product = {
name: faker.commerce.productName(),
description: faker.commerce.productDescription(),
price: faker.commerce.price({ min: 10, max: 500, dec: 2 }),
category: faker.commerce.department(),
sku: faker.string.alphanumeric(8).toUpperCase(),
rating: faker.number.float({ min: 3.5, max: 5, fractionDigits: 1 }),
reviews: faker.number.int({ min: 10, max: 500 })
};
HTML Template:
<product-card sku="[sku]">
<img src="/assets/images/placeholder/product-400x400.svg"
alt="[name]"/>
<h3>[name]</h3>
<p>[description]</p>
<data class="price" value="[price]">$[price]</data>
<p class="category">[category]</p>
<p class="rating">[rating] stars ([reviews] reviews)</p>
</product-card>
Testimonial
Generate customer testimonials:
import { faker } from '@faker-js/faker';
const testimonial = {
quote: faker.lorem.sentences({ min: 2, max: 4 }),
author: faker.person.fullName(),
company: faker.company.name(),
role: faker.person.jobTitle(),
avatar: faker.image.avatar()
};
HTML Template:
<blockquote class="testimonial">
<p>"[quote]"</p>
<footer>
<img src="[avatar]" alt="[author]"/>
<cite>[author]</cite>
<span class="role">[role], [company]</span>
</footer>
</blockquote>
Article
Generate blog posts and news articles:
import { faker } from '@faker-js/faker';
const article = {
title: faker.lorem.sentence({ min: 5, max: 10 }),
author: faker.person.fullName(),
date: faker.date.recent({ days: 30 }),
excerpt: faker.lorem.sentences(2),
body: faker.lorem.paragraphs(5),
category: faker.helpers.arrayElement(['Technology', 'Business', 'Lifestyle', 'Health']),
readTime: faker.number.int({ min: 3, max: 15 })
};
HTML Template:
<article class="blog-post">
<header>
<h2>[title]</h2>
<p class="meta">
By <span class="author">[author]</span> |
<time datetime="[date ISO]">[date formatted]</time> |
[readTime] min read
</p>
</header>
<img src="/assets/images/placeholder/card-400x225.svg"
alt="Article illustration"/>
<p class="excerpt">[excerpt]</p>
<div class="content">[body as paragraphs]</div>
</article>
Company
Generate business/organization data:
import { faker } from '@faker-js/faker';
const company = {
name: faker.company.name(),
catchPhrase: faker.company.catchPhrase(),
buzzPhrase: faker.company.buzzPhrase(),
industry: faker.company.buzzNoun(),
phone: faker.phone.number(),
email: faker.internet.email({ provider: 'company.com' }),
website: faker.internet.url(),
address: {
street: faker.location.streetAddress(),
city: faker.location.city(),
state: faker.location.state({ abbreviated: true }),
zip: faker.location.zipCode(),
country: faker.location.country()
}
};
HTML Template:
<div class="company-info">
<h3>[name]</h3>
<p class="tagline">[catchPhrase]</p>
<address>
[street]<br/>
[city], [state] [zip]<br/>
[country]
</address>
<p>
<a href="tel:[phone]">[phone]</a><br/>
<a href="mailto:[email]">[email]</a><br/>
<a href="[website]">[website]</a>
</p>
</div>
Event
Generate event/calendar data:
import { faker } from '@faker-js/faker';
const event = {
title: faker.lorem.sentence({ min: 3, max: 7 }),
description: faker.lorem.paragraph(),
date: faker.date.future({ years: 1 }),
startTime: faker.date.future(),
endTime: faker.date.future(),
location: {
venue: faker.company.name(),
address: faker.location.streetAddress(),
city: faker.location.city()
},
organizer: faker.person.fullName(),
price: faker.commerce.price({ min: 0, max: 200 }),
capacity: faker.number.int({ min: 20, max: 500 })
};
HTML Template:
<article class="event-card">
<time datetime="[date ISO]">
<span class="month">[month]</span>
<span class="day">[day]</span>
</time>
<div class="details">
<h3>[title]</h3>
<p>[description]</p>
<p class="location">[venue], [city]</p>
<p class="time">[startTime] - [endTime]</p>
<data class="price" value="[price]">$[price]</data>
</div>
</article>
FAQ
Generate question/answer pairs:
import { faker } from '@faker-js/faker';
const faq = {
question: faker.lorem.sentence().replace('.', '?'),
answer: faker.lorem.sentences({ min: 2, max: 4 })
};
// Generate multiple FAQs
const faqs = faker.helpers.multiple(
() => ({
question: faker.lorem.sentence().replace('.', '?'),
answer: faker.lorem.sentences({ min: 2, max: 4 })
}),
{ count: 8 }
);
HTML Template:
<details class="faq-item">
<summary>[question]</summary>
<p>[answer]</p>
</details>
Locale Support
Faker supports 70+ locales. Match content to your page's language:
// Import locale-specific faker
import { fakerDE } from '@faker-js/faker'; // German
import { fakerFR } from '@faker-js/faker'; // French
import { fakerES } from '@faker-js/faker'; // Spanish
import { fakerJA } from '@faker-js/faker'; // Japanese
// Use locale-specific instance
const germanPerson = {
name: fakerDE.person.fullName(), // "Max Müller"
city: fakerDE.location.city(), // "München"
phone: fakerDE.phone.number() // "+49 30 12345678"
};
Common Locales:
| Code | Language | Import |
|---|---|---|
de |
German | fakerDE |
fr |
French | fakerFR |
es |
Spanish | fakerES |
it |
Italian | fakerIT |
pt_BR |
Portuguese (Brazil) | fakerPT_BR |
ja |
Japanese | fakerJA |
zh_CN |
Chinese (Simplified) | fakerZH_CN |
ko |
Korean | fakerKO |
ar |
Arabic | fakerAR |
nl |
Dutch | fakerNL |
Detect Page Language:
// Get lang from HTML
const lang = document.documentElement.lang || 'en';
// Map to faker locale
const fakerLocales = {
'en': faker,
'de': fakerDE,
'fr': fakerFR,
'es': fakerES
};
const localFaker = fakerLocales[lang] || faker;
Content Guidelines
Text Length
| Content Type | Recommended Length |
|---|---|
| Product name | 2-5 words |
| Product description | 15-30 words |
| Testimonial | 20-50 words |
| Bio | 15-25 words |
| Headline | 5-10 words |
| Article excerpt | 20-40 words |
| Article body | 5-10 paragraphs |
| FAQ question | 8-15 words |
| FAQ answer | 30-60 words |
| Event description | 20-40 words |
| Company tagline | 5-10 words |
Realistic Proportions
// Good: Realistic price range
faker.commerce.price({ min: 19.99, max: 299.99 })
// Good: Realistic rating
faker.number.float({ min: 3.5, max: 5, fractionDigits: 1 })
// Good: Varying review counts
faker.number.int({ min: 5, max: 500 })
Consistency
Keep related data consistent within a section:
// Generate person once, reuse data
const author = {
firstName: faker.person.firstName(),
lastName: faker.person.lastName()
};
// Use consistently
const fullName = `${author.firstName} ${author.lastName}`;
const email = faker.internet.email({
firstName: author.firstName,
lastName: author.lastName
});
Seeding for Reproducibility
Use seeds to generate consistent data across runs:
import { faker } from '@faker-js/faker';
// Set seed for reproducible results
faker.seed(12345);
// Same seed = same output every time
const name = faker.person.fullName(); // Always "John Smith"
Generate Multiple Items
import { faker } from '@faker-js/faker';
// Generate array of products
const products = faker.helpers.multiple(
() => ({
name: faker.commerce.productName(),
price: faker.commerce.price(),
description: faker.commerce.productDescription()
}),
{ count: 10 }
);
// Generate with index
const items = faker.helpers.multiple(
(_, index) => ({
id: index + 1,
name: faker.commerce.productName()
}),
{ count: 5 }
);
Quick Reference
| Need | Faker Method |
|---|---|
| Full name | faker.person.fullName() |
| First name | faker.person.firstName() |
faker.internet.email() |
|
| Phone | faker.phone.number() |
| Job title | faker.person.jobTitle() |
| Company | faker.company.name() |
| Catchphrase | faker.company.catchPhrase() |
| Product name | faker.commerce.productName() |
| Price | faker.commerce.price() |
| Department | faker.commerce.department() |
| Description | faker.commerce.productDescription() |
| Paragraph | faker.lorem.paragraph() |
| Paragraphs | faker.lorem.paragraphs(5) |
| Sentences | faker.lorem.sentences(3) |
| Recent date | faker.date.recent() |
| Future date | faker.date.future() |
| Street address | faker.location.streetAddress() |
| City | faker.location.city() |
| Country | faker.location.country() |
| UUID | faker.string.uuid() |
| URL | faker.internet.url() |
| Avatar URL | faker.image.avatar() |
| Random from array | faker.helpers.arrayElement([...]) |
| Multiple items | faker.helpers.multiple(fn, { count }) |
Checklist
When generating fake content:
- Use faker methods, not lorem ipsum
- Match content length to context
- Keep related data consistent
- Use realistic value ranges
- Consider using seed for reproducibility
- Generate appropriate count for the UI
Related Skills
- content-author - Write quality content for HTML documents
- patterns - Reusable HTML page patterns and component blocks
- xhtml-author - Write valid XHTML-strict HTML5 markup
- placeholder-images - Generate SVG placeholder images for prototypes