Format blog content into properly structured markdown files for the Next.js portfolio website. All blog posts are stored in _posts/ directory and automatically processed by the site's MDX system.
Quick Reference
- File location:
_posts/{slug}.md(slug is kebab-case of title) - Frontmatter format: See references/post-structure.md
- Template: See assets/template.md
Workflow
1. Format Existing Content
When user provides raw blog content:
-
Extract or generate title:
- If first line is a heading (H1), use it as title
- If content starts with text, extract first sentence or generate from content
- Ensure title is clear and descriptive
-
Generate excerpt:
- Extract first meaningful paragraph (150-200 characters)
- Remove markdown formatting from excerpt
- If no suitable paragraph, generate summary from first few sentences
- Keep excerpt concise and engaging
-
Set metadata:
- Date: Use current date in
YYYY-MM-DDformat if not provided - Author: Default to
'Santosh Rai'(wrapped in single quotes) - Title: Wrap in single quotes in frontmatter
- Date: Use current date in
-
Format content:
- Do NOT include an H1 heading in the content (the page component already displays the title from frontmatter)
- Start content directly with paragraphs or H2 headings
- Preserve user's original markdown formatting
- Validate markdown syntax (code blocks, lists, links)
-
Generate filename:
- Convert title to kebab-case (lowercase, hyphens for spaces)
- Remove special characters, keep only alphanumeric and hyphens
- Example: "Understanding JavaScript" →
understanding-javascript.md
-
Save file: Write to
_posts/{slug}.md
2. Create New Post
When user provides topic/title:
-
Generate frontmatter:
- Use provided title or generate from topic
- Create excerpt placeholder or generate from topic description
- Set date to current date
- Set author to
'Santosh Rai'
-
Create structure:
- Do NOT add an H1 heading (the page component already displays the title from frontmatter)
- Start content directly with paragraphs or H2 headings
- Add placeholder sections or basic outline
- Use template from
assets/template.mdas starting point
-
Save file: Write to
_posts/{slug}.md
3. Auto-Generation Rules
Excerpt generation:
- Extract first paragraph (up to 200 characters)
- Remove markdown syntax (links, bold, code)
- If paragraph is too short, include next sentence
- Ensure excerpt is complete and grammatically correct
Title to slug conversion:
- Convert to lowercase
- Replace spaces with hyphens
- Remove special characters (keep only alphanumeric and hyphens)
- Remove leading/trailing hyphens
- Examples:
- "What is JavaScript?" →
what-is-javascript - "Design Patterns With VBA" →
design-patterns-with-vba - "Simple calculator in javascript using MVC pattern" →
simple-calculator-in-javascript-using-mvc-pattern
- "What is JavaScript?" →
Date format: Always use YYYY-MM-DD (e.g., '2024-01-20')
Frontmatter Format
All posts must include this exact frontmatter structure:
yaml1--- 2title: 'Post Title' 3excerpt: 'Brief description' 4date: 'YYYY-MM-DD' 5author: 'Santosh Rai' 6---
Important: All values must be wrapped in single quotes.
Validation
Before saving, verify:
- Frontmatter has all required fields (title, excerpt, date, author)
- Date is in YYYY-MM-DD format
- All frontmatter values are wrapped in single quotes
- Content does NOT start with an H1 heading (title is displayed from frontmatter)
- Filename is valid kebab-case slug
- File will be saved in
_posts/directory
Examples
Example 1: Format existing content
User: "Here's my blog post about JavaScript closures..."
Output: Creates _posts/javascript-closures.md with:
- Title extracted/generated from content
- Excerpt from first paragraph
- Current date
- Properly formatted markdown
Example 2: Create new post
User: "Create a blog post about React hooks"
Output: Creates _posts/react-hooks.md with:
- Title: "React Hooks"
- Generated excerpt about React hooks
- Current date
- Basic structure starting with content (no H1 heading)
Reference Files
- Post structure details: See references/post-structure.md for complete format specification and examples
- Template: See assets/template.md for reusable blog post template
Integration
The formatted files integrate automatically with the existing blog system:
lib/mdx.tsreads all.mdfiles from_posts/- Posts are sorted by date (newest first)
- Individual posts accessible at
/blog/[slug] - Blog listing at
/blogdisplays all posts