My personal blog. Next.js (App Router) + Markdown, statically exported and served from GitHub Pages at sakulstra.github.io.
Add a Markdown file to _posts/. The file name becomes the slug, so _posts/my-post.md is served at
/posts/my-post/.
---
title: "My post"
excerpt: "Shown on the index page and used as the meta description."
date: "2026-08-10"
coverImage: "/assets/blog/my-post/cover.jpg" # optional
---
Content goes here.
Images live in public/, referenced by absolute path (/assets/...). Posts are sorted by date, descending;
the newest one is featured at the top of the index page.
npm install
npm run dev # http://localhost:3000
npm run build # static export into ./out
npx serve out # preview the exported site
output: "export" in next.config.ts makes next build emit a static site to out/. Because there is no
server, next/image optimization is off (images.unoptimized) and trailingSlash is enabled so every route
becomes a directory with an index.html.
Pushing to master triggers .github/workflows/deploy.yml, which builds the site and publishes out/ to
GitHub Pages. The Pages source must be set to GitHub Actions (Settings → Pages). public/.nojekyll keeps
Pages from discarding the _next/ directory.