For a long time I got by with a single-page CV site. As projects piled up, there was no room left to present them, and the site stopped representing the work I actually do. This post is a short summary of the decisions I made while rebuilding it from scratch.
Why static export?
The site lives on classic shared hosting with no Node.js runtime. Next.js's output: "export" mode is built exactly for this scenario: npm run build produces plain HTML, CSS and JavaScript files. Uploading the output over FTP is all it takes.
There is a price, of course: no server-side features, no image optimisation, no API routes. For a personal portfolio I decided I need none of them. Instead of a contact form, I use a plain email link.
The bilingual structure
Next.js's built-in i18n routing does not work with static export. The fix is simple: the language becomes part of the route.
app/[locale]/page.tsx → /tr/ and /en/
app/[locale]/projects/... → /tr/projects/ and /en/projects/
generateStaticParams produces the pages for both languages at build time. The root address redirects based on the browser language via a tiny static HTML file. For search engines, every page declares its hreflang alternates.
Where does the content live?
Project and resume data sit in TypeScript files; blog posts are MDX. There is no database and no CMS; content is versioned together with the code. Adding a new post means creating one .mdx file and running a build.
My favourite part of this setup: the whole site is a Git repository. Writing, design and code move through the same history.