[Site Name]
A content-led site. Posts in MDX, images optimized at build, no client JS unless a component explicitly opts in.
Source of truth
GitHub repo is the source. Vercel auto-deploys on push to main. No CMS for v0; you write Markdown in your editor.
Tech stack
Astro 5 (Content Collections + Islands). Tailwind v4 for styling. MDX for posts, with @astrojs/mdx + expressive-code for syntax highlighting. @astrojs/image (sharp) for AVIF + WebP outputs. @astrojs/sitemap + @astrojs/rss. Deployed to Vercel as static output.
Deploy
git push origin main. Vercel runs npm run build and serves the static output. Preview deploys per PR.
File map
src/content/posts/your MDX posts, namedYYYY-MM-DD-slug.mdxsrc/content/config.tsZod schema for post frontmattersrc/pages/index.astrohomesrc/pages/posts/[slug].astropost templatesrc/pages/rss.xml.tsRSS feedsrc/pages/og/[slug].png.tsper-post OG image (Satori)src/components/PostCard, Prose, ThemeTogglesrc/layouts/Base.astroshared HTML shellastro.config.mjsintegrations, site URL
.env keys
PUBLIC_SITE_URLhttps://yourdomain.com(used by sitemap + RSS)
Hard rules
- Every post needs
title,slug,publishedAt,summary,tags. Zod will fail the build if missing. - No client JS by default. If a component needs it, opt in with
client:visibleorclient:idle. - Images use
<Image>not raw<img>. Width + height required. - One H1 per page (the title). Headings descend without skipping levels.
- Run
npm run lighthousebefore each deploy. Target: 100/100/100/100 on/. - Post slugs are kebab-case, date-prefixed in the filename, no date in the slug itself.
Recent significant changes
- 2026-05-14: Scaffolded. Locked: Astro 5 with Vercel adapter (static), MDX over plain Markdown (component embedding worth the extra ms), Satori for OG (no headless Chrome).
Next session: start here
- Edit
astro.config.mjssite URL. - Write your first post under
src/content/posts/. - Generate a favicon set with
realfavicongenerator.net, drop inpublic/. - Set up custom OG template at
src/pages/og/[slug].png.ts. - Push, deploy, attach domain.
- Run apex-seo before DNS goes live.