Lukas

sakulstra.github.io

My personal blog. Next.js (App Router) + Markdown, statically exported and served from GitHub Pages at sakulstra.github.io.

Writing a post

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.

Development

npm install
npm run dev     # http://localhost:3000

Build

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.

Deployment

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.