Agent skill
fake-content
Generate realistic fake content for HTML prototypes. Use when populating pages with sample text, products, testimonials, or other content. NOT generic lorem ipsum.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/fake-content
SKILL.md
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
Didn't find tool you were looking for?