Blog and SEO
Write posts in MDX. The blog index, sitemap, share images and structured data update themselves.
Write a post
Create src/content/blog/<slug>.mdx. The file name becomes the URL: how-we-price.mdx → /blog/how-we-price.
export const metadata = {
title: 'How we picked our pricing',
description: 'The three prices we tried, and why we kept the middle one.',
date: '2026-11-10',
author: 'Your Name',
};
Write the post in **Markdown**. Headings, lists, links, images and code blocks all work.
## A heading
You can also use React components in MDX.All four metadata fields are required. date is YYYY-MM-DD; posts are listed newest first.
Images go in public/, for example public/blog/pricing-chart.png, used as .
Picked up automatically
| What | Where |
|---|---|
| Blog index | /blog |
| Sitemap | /sitemap.xml |
| Share image | Generated for each post (shown when a link is shared on X, LinkedIn, WhatsApp…) |
| Structured data | BlogPosting on posts; SoftwareApplication and FAQPage on the home page |
| robots.txt | /robots.txt. Dashboard, admin and API routes are excluded from search |
Only slugs that match a real file are served; any other /blog/… URL returns a 404.
The example post
src/content/blog/welcome.mdx is an example. Delete it before launch. The "Make it yours" task deletes it and offers to draft your first post.
SEO basics already handled
- Page titles and descriptions from
siteConfiginsrc/config.ts. Keep the description under about 155 characters. - Canonical URLs and share images use
NEXT_PUBLIC_APP_URL, so set it to your real domain in production. A wrong value makes share previews and the sitemap point to the wrong site.
Submitting to Google
After you launch, add your domain in Google Search Console and submit https://yourdomain.com/sitemap.xml.