<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hendrik Haustein</title>
    <description>The latest articles on DEV Community by Hendrik Haustein (@hdk).</description>
    <link>https://dev.to/hdk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3705996%2F417422c6-87c0-4823-9f00-5ac90f3dd9d6.png</url>
      <title>DEV Community: Hendrik Haustein</title>
      <link>https://dev.to/hdk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hdk"/>
    <language>en</language>
    <item>
      <title>Never WordPress Again: Why the Legacy Giant Feels Like a Prison for Modern Devs (2026)</title>
      <dc:creator>Hendrik Haustein</dc:creator>
      <pubDate>Tue, 13 Jan 2026 01:09:56 +0000</pubDate>
      <link>https://dev.to/hdk/never-wordpress-again-why-the-legacy-giant-feels-like-a-prison-for-modern-devs-2026-5dpi</link>
      <guid>https://dev.to/hdk/never-wordpress-again-why-the-legacy-giant-feels-like-a-prison-for-modern-devs-2026-5dpi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"For WordPress, modern web development still feels like 'uncharted territory' (or as we say in Germany: Neuland)."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  WordPress Today: Why It Feels Like a Step Backward
&lt;/h2&gt;

&lt;p&gt;You love the precision of your editor. Every line of code has its place; every semicolon follows a logic. Your terminal is your cockpit, Git is your safety net.&lt;/p&gt;

&lt;p&gt;But the moment the project is named "WordPress," the rhythm dies. Suddenly, you leave your natural habitat. You trade the keyboard for the mouse.&lt;/p&gt;

&lt;p&gt;If you are into modern web engineering, the WordPress backend often feels like a digital regression. It’s the friction between two worlds: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On one side stands your toolchain of Vite, TypeScript, or Next.js. On the other side waits an admin panel that degrades you to a data-entry clerk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of pouring logic into functions, you configure plugins in nested menus. You bury settings in a database instead of versioning them cleanly in a repository.&lt;/p&gt;

&lt;p&gt;The system that once democratized publishing now feels like a sluggish relic. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WordPress forces developers into a corset that promises flexibility but delivers complexity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every click in the dashboard feels like a betrayal of your own efficiency. You become an administrator of your own site. The GUI becomes a barrier between you and your product.&lt;/p&gt;

&lt;p&gt;We live in an era of declarative UIs and CI/CD pipelines. WordPress, however, remains stuck in workflows reminiscent of the early 2000s. If you understand code as a language, this "obligation to click" feels like an unnecessary translation layer. Control slips away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are no longer the architect controlling the foundation, but a passenger in software that patronizes you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This break in Developer Experience (DX) is not just a nuisance—it is the reason why a whole generation of developers is turning its back on the web dinosaur. Including me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Pain Points: When the Admin Panel Kills Productivity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Clicking replaces Coding.&lt;/strong&gt;&lt;br&gt;
Your workday shifts from the code editor to a bloated dashboard. What used to be a line of CSS or a short script now requires navigating through nested menus. Every plugin cooks its own UI soup. Consistency is missing. Your keyboard, actually your sharpest tool, degenerates into an input device for passwords and search fields. It steals time and nerves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurations belong in the repo, not a database.&lt;/strong&gt;&lt;br&gt;
In WordPress, almost every setting lands in the &lt;code&gt;wp_options&lt;/code&gt; table. Anyone wanting to version changes fails at unreadable SQL dumps or stubborn migration plugins. A clean Git workflow is barely possible under these conditions. Sure, you can push code, but the actual logic of the site remains trapped in the database. This makes teamwork a minefield and deployments a game of Russian roulette.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context switching destroys the flow.&lt;/strong&gt;&lt;br&gt;
You jump back and forth between VS Code and the browser. Instead of instant feedback via Hot Module Replacement, you wait for the admin panel to reload after every click on "Save." This rhythm is sluggish. It interrupts the creative flow. While modern frameworks support you with speed and type safety, working in the WordPress backend feels like operating machinery from a bygone era. You are managing foreign states instead of developing your own solutions. The admin panel is no longer a tool; it is an obstacle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content as Code: Why Git is the Better Backend
&lt;/h2&gt;

&lt;p&gt;The liberation begins with a simple question: &lt;strong&gt;Why do we separate content from code when both ultimately serve the same goal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In classic web development, you drag around a heavy database system that painstakingly assembles fragments with every page request. That is technical overhead for static information.&lt;/p&gt;

&lt;p&gt;The paradigm shift is called &lt;strong&gt;"Content as Code."&lt;/strong&gt; Here, text is no longer buried in opaque SQL tables but lives as Markdown files directly in your repository.&lt;/p&gt;

&lt;p&gt;You use the tools you already master. Git takes over the role of the backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every change is a &lt;strong&gt;commit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Every revision remains &lt;strong&gt;traceable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Every error is corrected by a &lt;strong&gt;rollback&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of clicking through overloaded menus, you open your IDE. Your writing flow remains in a familiar environment. You benefit from syntax highlighting and a local preview that actually reflects what goes live later.&lt;/p&gt;

&lt;p&gt;This approach eliminates the artificial separation between design, logic, and content. If you change a structure, you do it system-wide via refactoring, not by manually editing a hundred database entries. Branching strategies allow you to prepare entire article series in the background without an unfinished draft corrupting the live site. Pull Requests become your editorial system: Code reviews and content checks merge into a single, clean workflow.&lt;/p&gt;

&lt;p&gt;You regain sovereignty over your data. Your content is portable, secure, and—above all—independent of the mercy of proprietary database formats. Anyone who grasps Content as Code makes the web fast and maintainable again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agony of Choice: Modern Tools That Let You Code Again
&lt;/h2&gt;

&lt;p&gt;The market today offers tools that reward technical craftsmanship again. You choose between maximum abstraction and pure control.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqqa3gqgc78b2gi1e5j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqqa3gqgc78b2gi1e5j.webp" alt="Astro framework" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static Site Generators (SSG)&lt;/strong&gt; mark the beginning of this new freedom.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/a&gt; breaks the habit of shipping unnecessary JavaScript to the client. The architecture follows the principle of partial hydration: Only what needs to be interactive is loaded.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt; serves the heavyweights. It is the choice when your project grows beyond a pure blog and requires complex application logic.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gohugo.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/a&gt; remains the tool for efficiency fanatics. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone wanting to render thousands of posts in fractions of a second uses the raw computing power of Go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjsu4wat8wr9mjhube53.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjsu4wat8wr9mjhube53.webp" alt="Hugo SSG framework" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofyzk6rd38tn8ut9mbyn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofyzk6rd38tn8ut9mbyn.webp" alt="NextJS React framework" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the workflow demands a GUI. Maybe you don't write alone, or you appreciate the comfort of an input mask. &lt;strong&gt;Headless systems like Strapi or Sanity&lt;/strong&gt; resolve this contradiction. They decouple administration from layout. Your content lies structured in a cloud or on your own server but reaches your frontend cleanly via API. You build the chassis; the CMS only delivers the fuel. Separation of concerns is not a buzzword here; it’s lived practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ultimate independence is writing directly in the IDE.&lt;/strong&gt; Markdown and its extension, MDX, transform text into real code components. You use Git branches for correction loops and merges for publication. Your editor becomes the command center.&lt;/p&gt;

&lt;p&gt;For developers who want to skip maintenance entirely, platforms like &lt;strong&gt;Dev.to&lt;/strong&gt; or &lt;strong&gt;Hashnode&lt;/strong&gt; exist. They serve as a ready-made ecosystem with a built-in community. If you publish there, you leverage their reach but secure authority via Canonical Links.&lt;/p&gt;

&lt;p&gt;You remain the architect, no matter how many layers you delegate. Each of these tools pursues one goal: Eliminating the barrier between your logic and the finished product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next-Gen Hosting: Say Goodbye to the LAMP Stack
&lt;/h2&gt;

&lt;p&gt;The liberation from the logic of WordPress-based monoliths doesn't end in the IDE. It continues where your code meets reality: hosting.&lt;/p&gt;

&lt;p&gt;Anyone still synchronizing directories via FTP or struggling with PHP configurations today is wasting their life. Modern platforms like Vercel or Netlify have radically simplified the process. A &lt;code&gt;git push&lt;/code&gt; is enough to start the machinery. The pipeline takes over building, compressing, and distributing your assets. Your content lands directly on global edge networks, close to the user and far away from classic latency issues.&lt;/p&gt;

&lt;p&gt;If your heart is attached to an existing Apache server, that changes little about your new efficiency. You simply host the &lt;strong&gt;static export&lt;/strong&gt; of your project there.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I recently did exactly this. Read my case study on how I moved my portfolio from PHP to Next.js and why my server briefly thought I was DDOSing it: &lt;a href="https://dev.to/hdk/modernizing-my-portfolio-from-vanilla-php-to-nextjs-and-why-my-server-thought-i-was-ddosing-it-59hf"&gt;Modernizing my Portfolio from Vanilla PHP to NextJS and why my Server thought I was DDoSing it.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Where no database rattles in the background, no SQL injections exist. Where no PHP interpreter runs, most security gaps disappear by themselves. You reduce the attack surface to zero and increase speed to the physical maximum. Your classic webspace mutates into a simple, extremely fast file sender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Warning:&lt;/strong&gt;&lt;br&gt;
Of course, at the end of the scale, Kubernetes awaits. A technical masterpiece, undoubtedly. But be warned: &lt;strong&gt;Anyone spinning up a K8s cluster for a blog usually doesn't want to publish content but wants to tame complex systems.&lt;/strong&gt; It is the ultimate form of overengineering for individualists. Unless you are bored to death, choose the shorter path. Your focus belongs to the finished product, not the management of the management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Become the Pilot of Your Own Projects Again
&lt;/h2&gt;

&lt;p&gt;WordPress remains a compromise for those who do not want to build. But anyone who understands code as a craft needs no system that hides them behind colorful buttons.&lt;/p&gt;

&lt;p&gt;The switch to modern architectures gives you back sovereignty over every byte. You no longer manage foreign plugins; you develop precise solutions. &lt;strong&gt;Statics and Git erase the risks of the past.&lt;/strong&gt; Security holes disappear with the database. Performance becomes the standard, not a tedious correction.&lt;/p&gt;

&lt;p&gt;This path demands discipline but delivers clarity. Your content follows your code, not rigid database logic. You own your project completely again.&lt;/p&gt;

&lt;p&gt;End the era of administration. Go from passenger to pilot of your own architecture. The web is too fast for old baggage.&lt;/p&gt;

&lt;h3&gt;
  
  
  🇩🇪 German Original
&lt;/h3&gt;

&lt;p&gt;This article was originally published in German on my personal blog. If you prefer reading in your native language or want to check out my other projects, head over here:&lt;br&gt;
&lt;a href="https://promptbard.de/blog/wordpress-alternativen-entwickler" rel="noopener noreferrer"&gt;&lt;strong&gt;Nie wieder WordPress: Moderne CMS-Alternativen für Entwickler&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>jamstack</category>
      <category>ssg</category>
    </item>
    <item>
      <title>Modernizing my Portfolio: From Vanilla PHP to Next.js (and why my server thought I was DDOSing it)</title>
      <dc:creator>Hendrik Haustein</dc:creator>
      <pubDate>Mon, 12 Jan 2026 20:43:57 +0000</pubDate>
      <link>https://dev.to/hdk/modernizing-my-portfolio-from-vanilla-php-to-nextjs-and-why-my-server-thought-i-was-ddosing-it-59hf</link>
      <guid>https://dev.to/hdk/modernizing-my-portfolio-from-vanilla-php-to-nextjs-and-why-my-server-thought-i-was-ddosing-it-59hf</guid>
      <description>&lt;p&gt;A deep dive into migrating my portfolio to Next.js, optimizing for SEO 2026, and the pitfalls of prefetching on shared hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modernizing my Portfolio Website
&lt;/h2&gt;

&lt;p&gt;In web engineering, standing still is not an option. My portfolio is more than just a digital business card; it's my sandbox for testing modern web architectures. To meet the performance, scalability, and SEO requirements of 2026, I've completely rethought the entire infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before: PHP &amp;amp; Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro52hx0hztn42vpskhoo.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro52hx0hztn42vpskhoo.webp" alt="Design before with PHP and Tailwind CSS. Intro." width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouophl3j3fr826q3xx9t.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouophl3j3fr826q3xx9t.webp" alt="Design before with PHP and Tailwind CSS. About." width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh8ejwxrusxpjxapm2yn.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh8ejwxrusxpjxapm2yn.webp" alt="Design before with PHP and Tailwind CSS. Portfolio." width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What a sh... bad design, or?&lt;/p&gt;

&lt;h3&gt;
  
  
  After: Next.js and Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggp0pmetjxqfficp3wi1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggp0pmetjxqfficp3wi1.webp" alt="Design with NextJS and Tailwind CSS." width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kldhrde9vfzh11wlhla.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kldhrde9vfzh11wlhla.webp" alt="Design with NextJS and Tailwind CSS: New About" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8v1am270ta18urqqpxm8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8v1am270ta18urqqpxm8.webp" alt="Design with NextJS and Tailwind CSS: New Section" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7fdxvxmzlyk0hhbk3xg.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7fdxvxmzlyk0hhbk3xg.webp" alt="Design with NextJS and Tailwind CSS: New Portfolio" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jiep9ouy07h0z4owgyr.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jiep9ouy07h0z4owgyr.webp" alt="Design with NextJS and Tailwind CSS: New contact me" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;New, clean, fast, and smooth. I love this new design. While I know there are countless incredibly creative designers out there—whose work I truly admire—this transition is a milestone for me. It’s more than just a fresh look; it’s a reflection of my evolution as a (Spring Boot) developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Change: From Vanilla PHP to React/Next.js
&lt;/h2&gt;

&lt;p&gt;While vanilla PHP served me well for years, the desire for a seamless user experience and optimized rendering required a technology pivot. Switching to Next.js allows me to utilize Static Site Generation (SSG).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Before: Server-side rendering on every request, wasting precious milliseconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now: Pre-rendered HTML pages served instantly. The result is an "instant-on" experience. If I ever need dynamic data, I can easily fetch it via client-side APIs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SEO Optimizations: The Technical Foundation
&lt;/h2&gt;

&lt;p&gt;Good SEO isn't an add-on; it's rooted deep in the architecture. Inspired by my own &lt;a href="https://promptbard.de/blog/seo-lernen-guide-programmierer/" rel="noopener noreferrer"&gt;SEO strategies for Devs&lt;/a&gt; (german) , I've implemented the following:&lt;/p&gt;

&lt;h3&gt;
  
  
  Schema.org (JSON-LD)
&lt;/h3&gt;

&lt;p&gt;I use structured data to make my identity machine-readable. Via a central Person schema, I link my portfolio to my tools on Blogkurs (a Blog of mine). By using sameAs and rel="me", I validate my identity across different domains.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic HTML5
&lt;/h3&gt;

&lt;p&gt;Code quality means information architecture. By using &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, and correct header hierarchies (h1-h6), I help crawlers understand content relevance without guesswork.&lt;/p&gt;

&lt;h3&gt;
  
  
  Meta-Management
&lt;/h3&gt;

&lt;p&gt;Thanks to the Next.js Metadata API, every subpage is supplied with dynamic, highly optimized meta tags and OpenGraph images. This ensures better rankings and a professional look when shared on social media.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed &amp;amp; Core Web Vitals
&lt;/h3&gt;

&lt;p&gt;Speed is a ranking factor. Through image optimization (WebP/AVIF), font preloading, and eliminating render-blocking scripts, I've achieved top scores in Core Web Vitals.&lt;/p&gt;

&lt;h4&gt;
  
  
  Old Core Web Vitals stats:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpixh97kdy05gf8x289nv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpixh97kdy05gf8x289nv.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  New Core Web Vitals stats:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc5o0o99y2eo4kktxg74.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc5o0o99y2eo4kktxg74.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A real next level. Of course, Accessibility needs more work!&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges &amp;amp; Pitfalls: The "Self-DDOS"
&lt;/h2&gt;

&lt;p&gt;Switching to a JS framework increases complexity. Configuring &lt;code&gt;.htaccess&lt;/code&gt; for static exports and handling hydration errors requires deep technical knowledge to avoid SEO losses.&lt;/p&gt;

&lt;h3&gt;
  
  
  A warning on Next.js default behavior:
&lt;/h3&gt;

&lt;p&gt;Features like automatic pre-fetching of the &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; component should be disabled when using classic shared hosting (Apache).&lt;/p&gt;

&lt;p&gt;By default, Next.js prefetches all linked pages as soon as they appear in the viewport. On an Apache server, this can trigger a massive number of requests in a very short time. Security modules like &lt;code&gt;mod_evasive&lt;/code&gt; or &lt;code&gt;fail2ban&lt;/code&gt; often interpret this as a DDOS attack.&lt;/p&gt;

&lt;p&gt;This happened to me during a static export: my server automatically blocked my IP. The fix? Setting &lt;code&gt;prefetch={false}&lt;/code&gt; to maintain control over the request volume. &lt;/p&gt;

&lt;h3&gt;
  
  
  I recommend using a wrapper:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Link, { LinkProps } from 'next/link';
import { ReactNode } from 'react';

interface SafeLinkProps extends LinkProps { 
  children: ReactNode; 
  className?: string; 
}

export default function SafeLink({ children, ...props }: SafeLinkProps) {
  return (
    &amp;lt;Link {...props} prefetch={false}&amp;gt;
      {children}
    &amp;lt;/Link&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why CMS like WordPress slow me down
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Classic CMS like WordPress limit my workflow&lt;/em&gt;. I become unproductive when forced to use bulky WYSIWYG editors and cluttered menus. A CMS often feels like a foreign body in a developer's workflow. It forces a structure on me that blocks my creativity and speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  My New Workflow: Markdown &amp;amp; Full Control
&lt;/h3&gt;

&lt;p&gt;Instead, I chose an architecture that fits seamlessly into my dev environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Markdown (MDX) as Standard:&lt;/strong&gt; I write content where I write code – in my IDE. It's fast, clean, and versionable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No compromises on design:&lt;/strong&gt; Customizing every page with React and Tailwind CSS makes me faster and more relaxed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Version Control via Git:&lt;/strong&gt; Every content update is a commit. Full history, branches, and clean deployments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft39c5i9o3xifvgon46pb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft39c5i9o3xifvgon46pb.webp" alt="MDX in IDE: Dev UX!" width="800" height="235"&gt;&lt;/a&gt;&lt;br&gt;
This is Dev UX!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The switch to Next.js wasn't for its own sake. It’s the foundation for positioning my projects as a Trusted Entity on the web. If you build software today, you must speak the language of search engines fluently. For developers who feel uncomfortable in CMS environments, the path via Static Site Generators is the ultimate liberation.&lt;/p&gt;

&lt;p&gt;This article was originally published in German on my portfolio: &lt;a href="https://haustein.in" rel="noopener noreferrer"&gt;Hendrik Haustein Portfolio&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>react</category>
      <category>germandev</category>
    </item>
  </channel>
</rss>
