<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Nico Hartmann · All-in-One Feed</title>
    <link>https://nicohartmann.dev/en/</link>
    <atom:link href="https://nicohartmann.dev/en/feed.xml" rel="self" type="application/rss+xml" />
    <description>Blog posts, finds, and funnies from the lecture hall and the desk.</description>
    <language>en-us</language>
    <lastBuildDate>Thu, 18 Jun 2026 05:27:26 GMT</lastBuildDate>
    <item>
      <title>[Funny] What Could Go Wrong</title>
      <link>https://nicohartmann.dev/en/funnies#62</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#62#1781760446166</guid>
      <pubDate>Thu, 18 Jun 2026 05:27:26 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-62-B-eJOa7_.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-62-B-eJOa7_.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-62-B-eJOa7_.webp" alt="What Could Go Wrong" style="max-width:100%;height:auto"/></p><p>Management says 'Let the new intern refactor our 15-year-old codebase' and suddenly your monolithic spaghetti monster is being 'optimized' by ChatGPT.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-62-B-eJOa7_.webp" alt="What Could Go Wrong" style="max-width:100%;height:auto"/></p><p>Management says 'Let the new intern refactor our 15-year-old codebase' and suddenly your monolithic spaghetti monster is being 'optimized' by ChatGPT.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Anger mode activated</title>
      <link>https://nicohartmann.dev/en/funnies#61</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#61#1781760446166</guid>
      <pubDate>Thu, 18 Jun 2026 05:27:26 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-61-DR2dMRHU.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-61-DR2dMRHU.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-61-DR2dMRHU.webp" alt="Anger mode activated" style="max-width:100%;height:auto"/></p><p>The exact facial expression of a developer trying to reproduce a bug whose only condition is: 'It sometimes happens when I click fast'.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-61-DR2dMRHU.webp" alt="Anger mode activated" style="max-width:100%;height:auto"/></p><p>The exact facial expression of a developer trying to reproduce a bug whose only condition is: 'It sometimes happens when I click fast'.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Blog] The Internet we lost</title>
      <link>https://nicohartmann.dev/en/blog/interwebs</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/blog/interwebs#1781760446158</guid>
      <pubDate>Thu, 18 Jun 2026 05:27:26 GMT</pubDate>
      <category>Blog</category>
      <description><![CDATA[<h1>A Brief Retrospective</h1>
<p>The world of the World Wide Web has changed as radically over the last three decades as almost no other area of human civilization. If we look back at the late nineties and the early two-thousands, the internet was an entirely different galaxy. The websites of those days were wild, unstructured, often colorful, and above all shaped by a deep enthusiasm of their creators.</p>
<p>It was the era of static HTML pages, blinking GIF animations, and guestbooks. Back then, you didn&#39;t just browse casually on the bus. Access to the web was a deliberate act. You sat down in front of a bulky CRT monitor, started a computer running operating systems like Windows 95 or the legendary Windows 98, and listened to the mechanical concert of the modem during the dial-up process. Bandwidths were minimal, images loaded line by line, and every minute online cost real money. Yet it was a space of unlimited possibilities, a digital Wild West shaped by enthusiasts.</p>
<p>As technology advanced, the infrastructure in the background changed too. Windows XP replaced the old systems and brought a new stability to households, while DSL lines made the blocked phone lines a thing of the past.</p>
<p>Websites became more complex, more interactive, and moved closer to people&#39;s everyday lives. It was the transitional phase into what became known as Web 2.0, in which users suddenly were no longer just passive consumers, but became shapers themselves. Forums shot up like mushrooms, blogs gave individuals a worldwide voice, and platforms like YouTube or early social networks began to fundamentally change the structure of exchange.</p>
<p>The computer was during this time the undisputed gateway to this world. A tool that stood on the desk and was switched on after work or after school to dive into a different reality.</p>
<p>This era of desktop dominance lasted for years, but in the background the next great revolution was brewing. With the rise of modern smartphones, led by the first iPhone and the subsequent Android wave, the focus of the digital world shifted unstoppably.</p>
<p>The internet was suddenly no longer tied to a place or to a specific device on the desk. It migrated into the pocket.</p>
<p>This transformation happened at a racing speed. As early as 2016, a historic threshold was crossed: for the first time, more than fifty percent of all internet users worldwide were browsing via mobile devices. Websites had to adapt, design became more responsive, but also more uniform. The wild, individual design of the early days gave way to optimized, clean layouts that load quickly on small screens and can be easily operated with a thumb.</p>
<p>Around the year 2019 (at the latest), this transformation was completely finished. The internet had evolved from a tool that one uses deliberately into a permanent extension of the self. One was no longer online, one was never offline.</p>
<p>In this new reality, only a handful of gigantic corporations dominated the entire market: Google controlled search and advertising, Facebook dominated social interaction and communication, Apple and Microsoft provided the platforms and the hardware on which all of this took place.</p>
<p>This centralization marked the end of the old, decentralized web. The space that was once defined by millions of individual homepages and independent forums was herded into enormous, closed platform ecosystems. The algorithms of these corporations began to determine what we see, what we read, and what we think about.</p>
<h1>Between Technology and Generations</h1>
<p>I myself was born in the year 1998, in an extremely exciting phase just before the gigantic dot-com bubble burst. One could claim that I grew up in exactly the first generation that experienced the modern internet as a permanent companion from an early age.</p>
<p>I had my very first own computer at around the age of six. That was in the year 2004. On this computer, however, the technology running was by no means the most modern, but rather the already visibly aging Windows 98. This was simply because in many families the older hardware was passed down rather than always buying the newest model.</p>
<p>The urgently needed upgrade to Windows XP I was then allowed to carry out myself a few years later, and indeed quite classically from a physical CD-ROM. Those who lived through those times know exactly what the mechanical whirring of the CD drive sounded like while you stared full of anticipation at the blue installation screen.</p>
<p>With my birth year, I fall according to common definitions just barely within the range of Generation Z.</p>
<p>It is in any case fascinating to observe how closely we couple generations today to the respective state of technological development. One can often draw the boundaries between age groups far more precisely using hardware releases and digital milestones than through rigid year numbers.</p>
<p>Let us simply ask ourselves for illustration: which Nintendo console releases did you actively experience? Whoever consciously witnessed the historic release of the Nintendo 64 in June 1996 and was already in the world at that point clearly belongs to the group of Millennials. In my case, the earliest point of contact was the GameCube, which came to the European market in May 2002. That marks the classic entry point for Generation Z. Today&#39;s Generation Alpha in turn grows up with the Nintendo Switch or its successors and no longer knows a world without touchscreens and permanent cloud connectivity at all.</p>
<p>At the end of the day, all these terms like Millennial, Gen-Z or Gen-Alpha are of course extremely vaguely defined. It always remains to some extent a matter of interpretation exactly where the dividing lines run, and honestly speaking it is completely irrelevant to me in everyday life which of these pigeonholes one puts me or others into.</p>
<p>Linguistic categorizations and the dynamics behind such terms are admittedly an immensely fascinating field, but we don&#39;t need to lose ourselves here in any colorful, linguistic fantasy worlds.</p>
<p>What really counts is the lived experience with the tools of our time. Whoever has personally traversed the transition from analog or at least purely local computing to total connectivity looks at today&#39;s web with an entirely different awareness than someone for whom the internet was always as self-evident as electricity from the socket.</p>
<h1>How the Web Shaped My Path in Life</h1>
<p>Six years after my first Windows 98 computer, in the year 2012, at the age of twelve I had finally saved up enough money to buy my own, up-to-date computer.</p>
<p>This device would accompany me intensively over many years (until today, but in the sense of the Ship of Theseus paradox) and would significantly shape my path in life.</p>
<p>Back then I spent, like so many my age, two to three hours daily with online games. My absolute favorites were League of Legends and Old School RuneScape. Particularly the hours-long immersion in RuneScape was in retrospect an extremely instructive school of life. The game taught me the hard way that you should absolutely trust nobody who makes any kind of promises on the internet.</p>
<p>Anyone who back then lost their laboriously earned armor to an apparently nice player who offered to upgrade the items for free knows exactly what I&#39;m talking about. My personal trauma was the loss of my Rune plate armor. This early lesson in digital skepticism burned itself deep into my brain: question everything, examine the intentions, and never be naive.</p>
<p>But the PC was for me far more than just a gaming machine. Through gaming I found the entry into deeper IT topics. I wanted to understand how things work behind the scenes, how networks are built and how software is created. At the same time I developed through browsing the web a huge passion for science, particularly for astronomy and chess. I lost myself for hours in complex, logical puzzles and crypto-riddles like the world-famous phenomenon Cicada 3301.</p>
<p>The internet back then was a gigantic treasure chest of knowledge. When I wanted to learn something new, there were no algorithmically optimized feeds bombarding me with short videos. Instead I searched deliberately for YouTube videos by passionate explainers, read my way through extremely detailed blog posts by experts, and dug through forum posts in which nerds from around the world shared their knowledge completely free of charge and without commercial ulterior motives.</p>
<p>The forums were places of genuine exchange. You had to register, follow rules, and built up a reputation over years within a small, select community. The blogs were personal diaries and knowledge databases at the same time. When someone published a text on the web, it was mostly because they had a real passion for the topic and wanted to leave something lasting behind for the world.</p>
<p>This digital environment not only massively fueled my technical skills, but also shaped my way of thinking. It showed me that the internet can be the most powerful educational tool in human history, if one learns to use it correctly and self-determinedly.</p>
<h1>The Invasion of AI Slop and the Decay of Today</h1>
<p>The most radical upheaval of recent internet history announced itself when the first large language models appeared on the scene. When OpenAI published the paper on GPT-3 on May 28, 2020, and the technology slowly became accessible, I was immediately fired up. I was among the first to throw themselves into this new world, because the topic of automated conversation had fascinated me long before. I had in fact already programmed my own chatbots and published them on the web, long before it became cool and mainstream through the big hype.</p>
<p>The modern large language models were of course an entirely different caliber in comparison. What began as a fascinating technological revolution has however developed over the last few years into a real plague. We are writing in the year 2026, and half the internet is by now filled to the brim with so-called AI slop. This term describes the endless flood of low-quality, synthetically generated content that is dumped onto the web without sense or reason, solely to manipulate search engine rankings and siphon off advertising revenue. Experts and technology analysts have long been warning of a genuine meltdown of information quality. Everything I consume on the internet today I have to question three times over. The ease of the old web has completely vanished.</p>
<p>A perfect example of this rapid decay is provided by the platform LinkedIn. In order to generate a little reach and traffic for my projects, I created my own account there about a month ago. What gets flushed into my feed there on a daily basis is absolutely shocking. The sheer mass of posts that obviously originate one hundred percent from the AI factory is barely tolerable anymore. It is always the same unnaturally smooth text structures, the same phrasal motivational sayings, and alongside them completely bizarre AI-generated images in which people with six fingers sit in sterile offices.</p>
<p>Did any real human actually look at this before posting it? It feels like a sterile ghost forest. Machines write texts for other machines that then automatically like and comment on them, while genuine human exchange gets left completely by the wayside. I have already addressed this alarming development in my last blog post.</p>
<h1>The Digital Divide and Our Responsibility</h1>
<p>That these grievances immediately catch my eye is of course due to my personal bubble. I have been a trained software developer in Germany since the year 2020. I am chronically online, work daily in the engine room of the internet, and probably also view the whole thing to some extent as an occupational hazard. I constantly have to check whether my servers are running stably, I maintain my websites and optimize the code.</p>
<p>My digital projects are like my own babies to me. Even my LinkedIn profile I do not regard as a classic social media channel for self-promotion or showing off, but rather I maintain there essentially a public developer diary. For me these platforms are purely tools that I deploy deliberately and with a clear awareness of the mechanisms behind them.</p>
<p>But what does reality look like outside our tech bubble? How does a Karen from accounting, a Miriam from the HR department, or the Uwe in the logistics warehouse fare when they navigate the web? They also use the internet daily, but often without the technical background knowledge about algorithms, prompting, and automated content factories.</p>
<p>This is precisely where the decisive question lies: how does this flood of artificial content influence their daily internet use? Are they even remotely aware of what is happening in the background? Whoever does not deal with software development or the tech industry on a daily basis often does not notice at all how subtly they are being manipulated by AI-generated content, distracted, or simply fed misinformation. When half the web consists of synthetic garbage, trust in digital media as a whole erodes.</p>
<p>Even I as an experienced developer who has been intensively following the emergence of this technology for years must openly admit: I frequently stand before content and fail despite all my expertise to distinguish a cleverly written AI plagiarism one hundred percent from a genuine human text.</p>
<p>Yes, there are efforts to label such content or mark it with digital watermarks. But let us be absolutely honest with ourselves. On LinkedIn and on countless other platforms I see every day masses of posts that pass through completely without labeling and continue to clog the web. If we simply shrug our shoulders and accept this state of affairs, we are capitulating before the algorithmic mud wave.</p>
<h1>What You Can Concretely Do About It Now</h1>
<p>The situation may appear bleak at first glance, but we are by no means helplessly at the mercy of this development. We must stop allowing ourselves to be fed like passive consumers in the walled gardens of the big platforms. Do it exactly like me instead: go back to the roots of the web. Build your own independent website.</p>
<p>It has never been as easy as today to secure your own domain and set up a small server or host a static page. Show the world out there what you have created with your own hands, what you have coded, or what you have genuinely thought deeply about. Your own website is your personal protected space in the digital realm, a place where no algorithm in the world determines what your content has to look like or who is allowed to see it.</p>
<p>That&#39;s pretty damn cool, isn&#39;t it?</p>
<p>See that? I swore. I can do that because this is my website.</p>
<p>If you browse around on my page, you will also find in my finds targeted posts about defending against and precisely identifying AI-generated content. It is a genuine matter of the heart for me to pass on this knowledge and sharpen awareness of the digital slop.</p>
<p>We must learn to look more carefully again and to display a healthy skepticism. Use tools for verification, pay attention to the typical linguistic patterns of language models, and don&#39;t be blinded by sterile, perfectly polished posts that were generated in seconds without a human spark.</p>
<p>The most important step however is a very personal promise to yourself and to your fellow human beings: be absolutely honest with yourself and ensure at every point in time that <strong>YOU</strong> are writing and publishing the content, and not an anonymous AI in the background. There is absolutely nothing wrong with using technology as a source of inspiration or as a tool for spell-checking.</p>
<p>The voice, the soul, the mistakes, and the genuine edges and corners of a text must compulsorily come from you. Your readers, your customers, and your genuine friends on the web will thank you infinitely for it. They long in this flooded, artificial world more than ever for genuine, authentic human experience. Let us together reclaim the real internet.</p>
]]></description>
      <content:encoded><![CDATA[<h1>A Brief Retrospective</h1>
<p>The world of the World Wide Web has changed as radically over the last three decades as almost no other area of human civilization. If we look back at the late nineties and the early two-thousands, the internet was an entirely different galaxy. The websites of those days were wild, unstructured, often colorful, and above all shaped by a deep enthusiasm of their creators.</p>
<p>It was the era of static HTML pages, blinking GIF animations, and guestbooks. Back then, you didn&#39;t just browse casually on the bus. Access to the web was a deliberate act. You sat down in front of a bulky CRT monitor, started a computer running operating systems like Windows 95 or the legendary Windows 98, and listened to the mechanical concert of the modem during the dial-up process. Bandwidths were minimal, images loaded line by line, and every minute online cost real money. Yet it was a space of unlimited possibilities, a digital Wild West shaped by enthusiasts.</p>
<p>As technology advanced, the infrastructure in the background changed too. Windows XP replaced the old systems and brought a new stability to households, while DSL lines made the blocked phone lines a thing of the past.</p>
<p>Websites became more complex, more interactive, and moved closer to people&#39;s everyday lives. It was the transitional phase into what became known as Web 2.0, in which users suddenly were no longer just passive consumers, but became shapers themselves. Forums shot up like mushrooms, blogs gave individuals a worldwide voice, and platforms like YouTube or early social networks began to fundamentally change the structure of exchange.</p>
<p>The computer was during this time the undisputed gateway to this world. A tool that stood on the desk and was switched on after work or after school to dive into a different reality.</p>
<p>This era of desktop dominance lasted for years, but in the background the next great revolution was brewing. With the rise of modern smartphones, led by the first iPhone and the subsequent Android wave, the focus of the digital world shifted unstoppably.</p>
<p>The internet was suddenly no longer tied to a place or to a specific device on the desk. It migrated into the pocket.</p>
<p>This transformation happened at a racing speed. As early as 2016, a historic threshold was crossed: for the first time, more than fifty percent of all internet users worldwide were browsing via mobile devices. Websites had to adapt, design became more responsive, but also more uniform. The wild, individual design of the early days gave way to optimized, clean layouts that load quickly on small screens and can be easily operated with a thumb.</p>
<p>Around the year 2019 (at the latest), this transformation was completely finished. The internet had evolved from a tool that one uses deliberately into a permanent extension of the self. One was no longer online, one was never offline.</p>
<p>In this new reality, only a handful of gigantic corporations dominated the entire market: Google controlled search and advertising, Facebook dominated social interaction and communication, Apple and Microsoft provided the platforms and the hardware on which all of this took place.</p>
<p>This centralization marked the end of the old, decentralized web. The space that was once defined by millions of individual homepages and independent forums was herded into enormous, closed platform ecosystems. The algorithms of these corporations began to determine what we see, what we read, and what we think about.</p>
<h1>Between Technology and Generations</h1>
<p>I myself was born in the year 1998, in an extremely exciting phase just before the gigantic dot-com bubble burst. One could claim that I grew up in exactly the first generation that experienced the modern internet as a permanent companion from an early age.</p>
<p>I had my very first own computer at around the age of six. That was in the year 2004. On this computer, however, the technology running was by no means the most modern, but rather the already visibly aging Windows 98. This was simply because in many families the older hardware was passed down rather than always buying the newest model.</p>
<p>The urgently needed upgrade to Windows XP I was then allowed to carry out myself a few years later, and indeed quite classically from a physical CD-ROM. Those who lived through those times know exactly what the mechanical whirring of the CD drive sounded like while you stared full of anticipation at the blue installation screen.</p>
<p>With my birth year, I fall according to common definitions just barely within the range of Generation Z.</p>
<p>It is in any case fascinating to observe how closely we couple generations today to the respective state of technological development. One can often draw the boundaries between age groups far more precisely using hardware releases and digital milestones than through rigid year numbers.</p>
<p>Let us simply ask ourselves for illustration: which Nintendo console releases did you actively experience? Whoever consciously witnessed the historic release of the Nintendo 64 in June 1996 and was already in the world at that point clearly belongs to the group of Millennials. In my case, the earliest point of contact was the GameCube, which came to the European market in May 2002. That marks the classic entry point for Generation Z. Today&#39;s Generation Alpha in turn grows up with the Nintendo Switch or its successors and no longer knows a world without touchscreens and permanent cloud connectivity at all.</p>
<p>At the end of the day, all these terms like Millennial, Gen-Z or Gen-Alpha are of course extremely vaguely defined. It always remains to some extent a matter of interpretation exactly where the dividing lines run, and honestly speaking it is completely irrelevant to me in everyday life which of these pigeonholes one puts me or others into.</p>
<p>Linguistic categorizations and the dynamics behind such terms are admittedly an immensely fascinating field, but we don&#39;t need to lose ourselves here in any colorful, linguistic fantasy worlds.</p>
<p>What really counts is the lived experience with the tools of our time. Whoever has personally traversed the transition from analog or at least purely local computing to total connectivity looks at today&#39;s web with an entirely different awareness than someone for whom the internet was always as self-evident as electricity from the socket.</p>
<h1>How the Web Shaped My Path in Life</h1>
<p>Six years after my first Windows 98 computer, in the year 2012, at the age of twelve I had finally saved up enough money to buy my own, up-to-date computer.</p>
<p>This device would accompany me intensively over many years (until today, but in the sense of the Ship of Theseus paradox) and would significantly shape my path in life.</p>
<p>Back then I spent, like so many my age, two to three hours daily with online games. My absolute favorites were League of Legends and Old School RuneScape. Particularly the hours-long immersion in RuneScape was in retrospect an extremely instructive school of life. The game taught me the hard way that you should absolutely trust nobody who makes any kind of promises on the internet.</p>
<p>Anyone who back then lost their laboriously earned armor to an apparently nice player who offered to upgrade the items for free knows exactly what I&#39;m talking about. My personal trauma was the loss of my Rune plate armor. This early lesson in digital skepticism burned itself deep into my brain: question everything, examine the intentions, and never be naive.</p>
<p>But the PC was for me far more than just a gaming machine. Through gaming I found the entry into deeper IT topics. I wanted to understand how things work behind the scenes, how networks are built and how software is created. At the same time I developed through browsing the web a huge passion for science, particularly for astronomy and chess. I lost myself for hours in complex, logical puzzles and crypto-riddles like the world-famous phenomenon Cicada 3301.</p>
<p>The internet back then was a gigantic treasure chest of knowledge. When I wanted to learn something new, there were no algorithmically optimized feeds bombarding me with short videos. Instead I searched deliberately for YouTube videos by passionate explainers, read my way through extremely detailed blog posts by experts, and dug through forum posts in which nerds from around the world shared their knowledge completely free of charge and without commercial ulterior motives.</p>
<p>The forums were places of genuine exchange. You had to register, follow rules, and built up a reputation over years within a small, select community. The blogs were personal diaries and knowledge databases at the same time. When someone published a text on the web, it was mostly because they had a real passion for the topic and wanted to leave something lasting behind for the world.</p>
<p>This digital environment not only massively fueled my technical skills, but also shaped my way of thinking. It showed me that the internet can be the most powerful educational tool in human history, if one learns to use it correctly and self-determinedly.</p>
<h1>The Invasion of AI Slop and the Decay of Today</h1>
<p>The most radical upheaval of recent internet history announced itself when the first large language models appeared on the scene. When OpenAI published the paper on GPT-3 on May 28, 2020, and the technology slowly became accessible, I was immediately fired up. I was among the first to throw themselves into this new world, because the topic of automated conversation had fascinated me long before. I had in fact already programmed my own chatbots and published them on the web, long before it became cool and mainstream through the big hype.</p>
<p>The modern large language models were of course an entirely different caliber in comparison. What began as a fascinating technological revolution has however developed over the last few years into a real plague. We are writing in the year 2026, and half the internet is by now filled to the brim with so-called AI slop. This term describes the endless flood of low-quality, synthetically generated content that is dumped onto the web without sense or reason, solely to manipulate search engine rankings and siphon off advertising revenue. Experts and technology analysts have long been warning of a genuine meltdown of information quality. Everything I consume on the internet today I have to question three times over. The ease of the old web has completely vanished.</p>
<p>A perfect example of this rapid decay is provided by the platform LinkedIn. In order to generate a little reach and traffic for my projects, I created my own account there about a month ago. What gets flushed into my feed there on a daily basis is absolutely shocking. The sheer mass of posts that obviously originate one hundred percent from the AI factory is barely tolerable anymore. It is always the same unnaturally smooth text structures, the same phrasal motivational sayings, and alongside them completely bizarre AI-generated images in which people with six fingers sit in sterile offices.</p>
<p>Did any real human actually look at this before posting it? It feels like a sterile ghost forest. Machines write texts for other machines that then automatically like and comment on them, while genuine human exchange gets left completely by the wayside. I have already addressed this alarming development in my last blog post.</p>
<h1>The Digital Divide and Our Responsibility</h1>
<p>That these grievances immediately catch my eye is of course due to my personal bubble. I have been a trained software developer in Germany since the year 2020. I am chronically online, work daily in the engine room of the internet, and probably also view the whole thing to some extent as an occupational hazard. I constantly have to check whether my servers are running stably, I maintain my websites and optimize the code.</p>
<p>My digital projects are like my own babies to me. Even my LinkedIn profile I do not regard as a classic social media channel for self-promotion or showing off, but rather I maintain there essentially a public developer diary. For me these platforms are purely tools that I deploy deliberately and with a clear awareness of the mechanisms behind them.</p>
<p>But what does reality look like outside our tech bubble? How does a Karen from accounting, a Miriam from the HR department, or the Uwe in the logistics warehouse fare when they navigate the web? They also use the internet daily, but often without the technical background knowledge about algorithms, prompting, and automated content factories.</p>
<p>This is precisely where the decisive question lies: how does this flood of artificial content influence their daily internet use? Are they even remotely aware of what is happening in the background? Whoever does not deal with software development or the tech industry on a daily basis often does not notice at all how subtly they are being manipulated by AI-generated content, distracted, or simply fed misinformation. When half the web consists of synthetic garbage, trust in digital media as a whole erodes.</p>
<p>Even I as an experienced developer who has been intensively following the emergence of this technology for years must openly admit: I frequently stand before content and fail despite all my expertise to distinguish a cleverly written AI plagiarism one hundred percent from a genuine human text.</p>
<p>Yes, there are efforts to label such content or mark it with digital watermarks. But let us be absolutely honest with ourselves. On LinkedIn and on countless other platforms I see every day masses of posts that pass through completely without labeling and continue to clog the web. If we simply shrug our shoulders and accept this state of affairs, we are capitulating before the algorithmic mud wave.</p>
<h1>What You Can Concretely Do About It Now</h1>
<p>The situation may appear bleak at first glance, but we are by no means helplessly at the mercy of this development. We must stop allowing ourselves to be fed like passive consumers in the walled gardens of the big platforms. Do it exactly like me instead: go back to the roots of the web. Build your own independent website.</p>
<p>It has never been as easy as today to secure your own domain and set up a small server or host a static page. Show the world out there what you have created with your own hands, what you have coded, or what you have genuinely thought deeply about. Your own website is your personal protected space in the digital realm, a place where no algorithm in the world determines what your content has to look like or who is allowed to see it.</p>
<p>That&#39;s pretty damn cool, isn&#39;t it?</p>
<p>See that? I swore. I can do that because this is my website.</p>
<p>If you browse around on my page, you will also find in my finds targeted posts about defending against and precisely identifying AI-generated content. It is a genuine matter of the heart for me to pass on this knowledge and sharpen awareness of the digital slop.</p>
<p>We must learn to look more carefully again and to display a healthy skepticism. Use tools for verification, pay attention to the typical linguistic patterns of language models, and don&#39;t be blinded by sterile, perfectly polished posts that were generated in seconds without a human spark.</p>
<p>The most important step however is a very personal promise to yourself and to your fellow human beings: be absolutely honest with yourself and ensure at every point in time that <strong>YOU</strong> are writing and publishing the content, and not an anonymous AI in the background. There is absolutely nothing wrong with using technology as a source of inspiration or as a tool for spell-checking.</p>
<p>The voice, the soul, the mistakes, and the genuine edges and corners of a text must compulsorily come from you. Your readers, your customers, and your genuine friends on the web will thank you infinitely for it. They long in this flooded, artificial world more than ever for genuine, authentic human experience. Let us together reclaim the real internet.</p>
]]></content:encoded>
    </item>
    <item>
      <title>[Find] Cleverbot</title>
      <link>https://www.cleverbot.com/</link>
      <guid isPermaLink="false">https://www.cleverbot.com/#1780574400000</guid>
      <pubDate>Thu, 04 Jun 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Rollo Carpenter</em></p><p>That's how chatbots were when the world was simpler.</p><p><a href="https://www.cleverbot.com/">https://www.cleverbot.com/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Rollo Carpenter</em></p><p>That's how chatbots were when the world was simpler.</p><p><a href="https://www.cleverbot.com/">https://www.cleverbot.com/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Blog] Built by hand</title>
      <link>https://nicohartmann.dev/en/blog/myaiact</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/blog/myaiact#1780488000000</guid>
      <pubDate>Wed, 03 Jun 2026 12:00:00 GMT</pubDate>
      <category>Blog</category>
      <description><![CDATA[<p>Not so long ago, while scrolling through Hacker News in the morning, I stumbled upon an article that immediately caught my attention. The topic was explosive and highly topical: <a href="https://www.hollandtech.net/claude-is-not-your-architect/">Claude is not your architect</a>. A warning that Claude, Anthropic&#39;s language model, is secretly taking over larger and larger parts of industrial design. The author painted a grim picture of a world where human creativity in engineering is replaced by automated algorithms.</p>
<p>The arguments were sound, the structure seemed professional at first glance. But while reading, an uncomfortable feeling quickly crept over me. Do you know that feeling when a text is grammatically perfect, but still somehow feels &quot;wrong&quot;? I looked closer.</p>
<p>There they were: em-dashes en masse. Almost every second sentence was interrupted by these long dashes. On top of that, there were strange, almost imperceptible jumps in thought between the paragraphs. Phrases repeated themselves in slightly modified forms, and the text drifted along in a permanent, artificially bloated epic style. The irony was perfect: an article warning about the takeover of the industry by AI was obviously entirely generated by an AI itself.</p>
<p>I thought to myself: &quot;Well, the tech gurus on Hacker News will notice that immediately.&quot; After all, the smartest minds in the IT world hang out there. I scrolled through the comments to read the malicious reactions. But instead I found: nothing. Serious discussions about the content. <a href="https://news.ycombinator.com/item?id=48260227">I set my own sign.</a></p>
<p>When even the smartest minds no longer perceive the difference between human pen and algorithm, we have reached a turning point on the internet. We consume content every day without knowing whether it is backed by real creativity or just a well-trained prompt response.</p>
<p>It was precisely this feeling of untransparency that made me reflect sustainably. In order not to become part of this anonymous noise myself, I want to go a different way. It is time to provide clarity, and therefore I hereby disclose how I personally deal with AI in everyday life.</p>
<hr>
<h2>The Code: Why my footer is not a liar</h2>
<p>When you go to my website and scroll all the way down to the bottom left, you will find a sentence that I chose deliberately: &quot;Built with care by hand&quot;.</p>
<p>I take this sentence damn seriously. At the same time, however, I also have to be honest: this does not mean that I completely do without artificial intelligence in the year 2026. For me, this sentence states that this website was not created autonomously by some AI agents. There are tools out there where you press a button, type in: &quot;Make me a portfolio page for a developer&quot;, and presto: the system spits out a finished, soulless page.</p>
<p>That is not my way.</p>
<p>I basically deal with AI exactly the same way I used to deal with StackOverflow or Google back then. When I am at a point while programming where I simply don&#39;t know what to do next, I ask one of the models.</p>
<p>Which model do I use? For me, that is a matter of pure gut feeling and a question of the available free tokens. When the contingent for model A is exhausted, I move on to model B. Despite the fact that I ask the AI for advice every now and then and sometimes adopt the source code generated by it 1:1, that very sentence still stands at the bottom left of my page.</p>
<p>I can already hear the critics shouting: &quot;Hey! You say it&#39;s built by hand, but you use AI? Traitor!&quot; But in all seriousness: back when we searched through forum posts for nights on end, did we put &quot;Built with the help of Google&quot; in our footer? No. The creative mind, the architecture, and putting the puzzle pieces together. For me, that remains manual work.</p>
<hr>
<h2>The Translations: AI as my personal bridge builder</h2>
<p>Another area where AI takes an incredible amount of work off my hands is translation work. My website is structured bilingually. It used to be an absolute chaos. Since my brain runs on either German or English depending on the form of the day and consumed media, my site was a colorful, mixed-up patchwork quilt. That looked unprofessional and unstructured.</p>
<p>Today, my workflow looks like this: for every text, I first choose a source language, mostly German, because I can express myself most precisely in it. Once the text is ready, I let the AI translate it &quot;word for word&quot; / &quot;literally&quot;. The beautiful thing about modern LLMs compared to old translation tools is that they understand the context. They do not just blindly translate words, but transport the tone of voice. The AI functions here as a bridge that makes my thoughts accessible to an international audience without losing the original vibe.</p>
<hr>
<h2>The Blogs: Raw brainstorm meets the stonemason</h2>
<p>Let&#39;s come to the blogs and thus also to this text that you are currently reading. I firmly maintain: my blogs are still written by hand. But here, too, AI is used, namely as my personal stonemason.</p>
<p>When I have an idea for a blog post, I just start typing. I don&#39;t care about grammar, punctuation, or smooth transitions.</p>
<ul>
<li>I formulate my texts in the first draft with an immense amount of typos.</li>
<li>There are expressions in there that could straight up come from a six-year-old.</li>
<li>I throw around creative, colorful, and sometimes completely absurd metaphors.</li>
</ul>
<p>Someone has to document my creative chaos, after all.</p>
<p>The result is a raw, wild pile of text. Mostly around 4,000 to 6,000 characters. I take this digital mud, throw it into a model of my choice, and give the system a very clear, strict instruction:</p>
<blockquote>
<p>&quot;Take this text. Target: at least 10,000 characters.&quot;</p>
</blockquote>
<p>So the AI takes my raw material and stretches it out, builds elegant sentence structures, and ensures the necessary text volume. What comes out of it must, of course, never be published unfiltered. Therefore, I always proofread the whole thing extremely thoroughly, correct it, and put my final stamp on the text.</p>
<p>What I will absolutely never do under any circumstances, however, is: &quot;Give me 10 ideas for cool blog posts&quot; or &quot;Formulate a topic from scratch for me to 10,000 words.&quot; That is the red line for me. The content, the ideas, the core thoughts are and remain human. The AI is my tool, not my ghostwriter.</p>
<hr>
<h2>A small funeral for the dash</h2>
<p>When correcting these texts formulated by the AI, one thing has struck me extremely hard lately, forcing me to make a radical change: I now systematically replace all en-dashes and em-dashes with other punctuation marks.</p>
<p>Why? Because these dashes have now become the absolute brand mark of AI texts. The language models have simply used them far too inflationarily in recent years. If you see a German text today that uses an elegant dash every two lines, the internal AI detector triggers immediately. Personally, I find that an incredible shame.</p>
<p>I really liked the en-dash very much. Back in the day, I used to explicitly google it and copy-and-paste it into my texts because it just looks nicer in the typeface than the clumsy, short hyphen. Later I learned the shortcut: under Windows with WIN + -.</p>
<table>
<thead>
<tr>
<th>Character</th>
<th>Name</th>
<th>Width</th>
<th>Origin</th>
</tr>
</thead>
<tbody><tr>
<td>-</td>
<td>Hyphen / Quarter-em dash</td>
<td>Very short</td>
<td>Separation &amp; coupling</td>
</tr>
<tr>
<td>–</td>
<td>En-dash / Half-em dash</td>
<td>Width of a capital N</td>
<td>Dash, to-dash</td>
</tr>
<tr>
<td>—</td>
<td>Em-dash / Em dash</td>
<td>Width of a capital M</td>
<td>Strong jump in thought</td>
</tr>
</tbody></table>
<p>The en-dash (–) is called that because in traditional typography it has exactly the geometric width of a capital letter &quot;N&quot;, same for the em-dash (—) for &quot;M&quot;. All these beautiful fun facts will slowly be forgotten because this beautiful symbol is today one of the clearest indications of soulless AI texts. It was corrupted by the algorithms. So please take this paragraph as a small, sad funeral for my beloved dash.</p>
<hr>
<h2>Conclusion: For a new culture of honesty on the net</h2>
<p>I am no extremist. I don&#39;t expect everyone to frantically slap &quot;Created with the help of AI&quot; into their website just because they briefly asked a model for a synonym.</p>
<p>What I do demand, however, is a certain degree of fundamental honesty as soon as someone clicks the big, red &quot;Publish&quot; button. I would like to know on the internet where a human was still actively involved and where not. I want an awareness for the value of thoughts to emerge again.</p>
<p>As harsh as it may sound: I want people to feel a bit ashamed again when they just barf a purely AI-generated, unverified text onto the net just to grab SEO traffic or fake content volume.</p>
<p>We urgently need to promote a culture on the internet where the human remains in the loop when creating content. A text should be the product of a human mind making use of tools to express itself better. Not the product of a machine trying to completely simulate human thinking while the actual &quot;author&quot; only counts the clicks. Because nowadays, what is generated without rhyme or reason is no longer real content. It is nothing but digital noise.</p>
<p>Let&#39;s stay human. With all our typos, our quirky metaphors, and our own, imperfect style.</p>
<hr>
<p>*~ This blog post originated from originally 6,988 characters, which were typed by hand with a lot of heart and soul, typos, and real thoughts.</p>
<p>Gemini OneShot prompt for it:</p>
<pre><code>hierzu einen blogpost insgesamt mindestens 10000 zeichen
</code></pre>
<p>Delivered: 12,580 characters.</p>
<p>Post-correction: 10,376 (incl. .md formatting and reading 5 times)</p>
<p>Formatted with <a href="https://nicohartmann.dev/justwrite_en.html">this tool</a>.</p>
]]></description>
      <content:encoded><![CDATA[<p>Not so long ago, while scrolling through Hacker News in the morning, I stumbled upon an article that immediately caught my attention. The topic was explosive and highly topical: <a href="https://www.hollandtech.net/claude-is-not-your-architect/">Claude is not your architect</a>. A warning that Claude, Anthropic&#39;s language model, is secretly taking over larger and larger parts of industrial design. The author painted a grim picture of a world where human creativity in engineering is replaced by automated algorithms.</p>
<p>The arguments were sound, the structure seemed professional at first glance. But while reading, an uncomfortable feeling quickly crept over me. Do you know that feeling when a text is grammatically perfect, but still somehow feels &quot;wrong&quot;? I looked closer.</p>
<p>There they were: em-dashes en masse. Almost every second sentence was interrupted by these long dashes. On top of that, there were strange, almost imperceptible jumps in thought between the paragraphs. Phrases repeated themselves in slightly modified forms, and the text drifted along in a permanent, artificially bloated epic style. The irony was perfect: an article warning about the takeover of the industry by AI was obviously entirely generated by an AI itself.</p>
<p>I thought to myself: &quot;Well, the tech gurus on Hacker News will notice that immediately.&quot; After all, the smartest minds in the IT world hang out there. I scrolled through the comments to read the malicious reactions. But instead I found: nothing. Serious discussions about the content. <a href="https://news.ycombinator.com/item?id=48260227">I set my own sign.</a></p>
<p>When even the smartest minds no longer perceive the difference between human pen and algorithm, we have reached a turning point on the internet. We consume content every day without knowing whether it is backed by real creativity or just a well-trained prompt response.</p>
<p>It was precisely this feeling of untransparency that made me reflect sustainably. In order not to become part of this anonymous noise myself, I want to go a different way. It is time to provide clarity, and therefore I hereby disclose how I personally deal with AI in everyday life.</p>
<hr>
<h2>The Code: Why my footer is not a liar</h2>
<p>When you go to my website and scroll all the way down to the bottom left, you will find a sentence that I chose deliberately: &quot;Built with care by hand&quot;.</p>
<p>I take this sentence damn seriously. At the same time, however, I also have to be honest: this does not mean that I completely do without artificial intelligence in the year 2026. For me, this sentence states that this website was not created autonomously by some AI agents. There are tools out there where you press a button, type in: &quot;Make me a portfolio page for a developer&quot;, and presto: the system spits out a finished, soulless page.</p>
<p>That is not my way.</p>
<p>I basically deal with AI exactly the same way I used to deal with StackOverflow or Google back then. When I am at a point while programming where I simply don&#39;t know what to do next, I ask one of the models.</p>
<p>Which model do I use? For me, that is a matter of pure gut feeling and a question of the available free tokens. When the contingent for model A is exhausted, I move on to model B. Despite the fact that I ask the AI for advice every now and then and sometimes adopt the source code generated by it 1:1, that very sentence still stands at the bottom left of my page.</p>
<p>I can already hear the critics shouting: &quot;Hey! You say it&#39;s built by hand, but you use AI? Traitor!&quot; But in all seriousness: back when we searched through forum posts for nights on end, did we put &quot;Built with the help of Google&quot; in our footer? No. The creative mind, the architecture, and putting the puzzle pieces together. For me, that remains manual work.</p>
<hr>
<h2>The Translations: AI as my personal bridge builder</h2>
<p>Another area where AI takes an incredible amount of work off my hands is translation work. My website is structured bilingually. It used to be an absolute chaos. Since my brain runs on either German or English depending on the form of the day and consumed media, my site was a colorful, mixed-up patchwork quilt. That looked unprofessional and unstructured.</p>
<p>Today, my workflow looks like this: for every text, I first choose a source language, mostly German, because I can express myself most precisely in it. Once the text is ready, I let the AI translate it &quot;word for word&quot; / &quot;literally&quot;. The beautiful thing about modern LLMs compared to old translation tools is that they understand the context. They do not just blindly translate words, but transport the tone of voice. The AI functions here as a bridge that makes my thoughts accessible to an international audience without losing the original vibe.</p>
<hr>
<h2>The Blogs: Raw brainstorm meets the stonemason</h2>
<p>Let&#39;s come to the blogs and thus also to this text that you are currently reading. I firmly maintain: my blogs are still written by hand. But here, too, AI is used, namely as my personal stonemason.</p>
<p>When I have an idea for a blog post, I just start typing. I don&#39;t care about grammar, punctuation, or smooth transitions.</p>
<ul>
<li>I formulate my texts in the first draft with an immense amount of typos.</li>
<li>There are expressions in there that could straight up come from a six-year-old.</li>
<li>I throw around creative, colorful, and sometimes completely absurd metaphors.</li>
</ul>
<p>Someone has to document my creative chaos, after all.</p>
<p>The result is a raw, wild pile of text. Mostly around 4,000 to 6,000 characters. I take this digital mud, throw it into a model of my choice, and give the system a very clear, strict instruction:</p>
<blockquote>
<p>&quot;Take this text. Target: at least 10,000 characters.&quot;</p>
</blockquote>
<p>So the AI takes my raw material and stretches it out, builds elegant sentence structures, and ensures the necessary text volume. What comes out of it must, of course, never be published unfiltered. Therefore, I always proofread the whole thing extremely thoroughly, correct it, and put my final stamp on the text.</p>
<p>What I will absolutely never do under any circumstances, however, is: &quot;Give me 10 ideas for cool blog posts&quot; or &quot;Formulate a topic from scratch for me to 10,000 words.&quot; That is the red line for me. The content, the ideas, the core thoughts are and remain human. The AI is my tool, not my ghostwriter.</p>
<hr>
<h2>A small funeral for the dash</h2>
<p>When correcting these texts formulated by the AI, one thing has struck me extremely hard lately, forcing me to make a radical change: I now systematically replace all en-dashes and em-dashes with other punctuation marks.</p>
<p>Why? Because these dashes have now become the absolute brand mark of AI texts. The language models have simply used them far too inflationarily in recent years. If you see a German text today that uses an elegant dash every two lines, the internal AI detector triggers immediately. Personally, I find that an incredible shame.</p>
<p>I really liked the en-dash very much. Back in the day, I used to explicitly google it and copy-and-paste it into my texts because it just looks nicer in the typeface than the clumsy, short hyphen. Later I learned the shortcut: under Windows with WIN + -.</p>
<table>
<thead>
<tr>
<th>Character</th>
<th>Name</th>
<th>Width</th>
<th>Origin</th>
</tr>
</thead>
<tbody><tr>
<td>-</td>
<td>Hyphen / Quarter-em dash</td>
<td>Very short</td>
<td>Separation &amp; coupling</td>
</tr>
<tr>
<td>–</td>
<td>En-dash / Half-em dash</td>
<td>Width of a capital N</td>
<td>Dash, to-dash</td>
</tr>
<tr>
<td>—</td>
<td>Em-dash / Em dash</td>
<td>Width of a capital M</td>
<td>Strong jump in thought</td>
</tr>
</tbody></table>
<p>The en-dash (–) is called that because in traditional typography it has exactly the geometric width of a capital letter &quot;N&quot;, same for the em-dash (—) for &quot;M&quot;. All these beautiful fun facts will slowly be forgotten because this beautiful symbol is today one of the clearest indications of soulless AI texts. It was corrupted by the algorithms. So please take this paragraph as a small, sad funeral for my beloved dash.</p>
<hr>
<h2>Conclusion: For a new culture of honesty on the net</h2>
<p>I am no extremist. I don&#39;t expect everyone to frantically slap &quot;Created with the help of AI&quot; into their website just because they briefly asked a model for a synonym.</p>
<p>What I do demand, however, is a certain degree of fundamental honesty as soon as someone clicks the big, red &quot;Publish&quot; button. I would like to know on the internet where a human was still actively involved and where not. I want an awareness for the value of thoughts to emerge again.</p>
<p>As harsh as it may sound: I want people to feel a bit ashamed again when they just barf a purely AI-generated, unverified text onto the net just to grab SEO traffic or fake content volume.</p>
<p>We urgently need to promote a culture on the internet where the human remains in the loop when creating content. A text should be the product of a human mind making use of tools to express itself better. Not the product of a machine trying to completely simulate human thinking while the actual &quot;author&quot; only counts the clicks. Because nowadays, what is generated without rhyme or reason is no longer real content. It is nothing but digital noise.</p>
<p>Let&#39;s stay human. With all our typos, our quirky metaphors, and our own, imperfect style.</p>
<hr>
<p>*~ This blog post originated from originally 6,988 characters, which were typed by hand with a lot of heart and soul, typos, and real thoughts.</p>
<p>Gemini OneShot prompt for it:</p>
<pre><code>hierzu einen blogpost insgesamt mindestens 10000 zeichen
</code></pre>
<p>Delivered: 12,580 characters.</p>
<p>Post-correction: 10,376 (incl. .md formatting and reading 5 times)</p>
<p>Formatted with <a href="https://nicohartmann.dev/justwrite_en.html">this tool</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>[Find] Show your Work</title>
      <link>https://a.co/d/01XZIX8b</link>
      <guid isPermaLink="false">https://a.co/d/01XZIX8b#1780228800000</guid>
      <pubDate>Sun, 31 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Austin Kleon</em></p><p>This book has shaped modern creator and developer culture like almost no other book. It takes away the fear of the 'perfect product' and shows why it is much cooler (and more successful) to openly share your daily learning process online.</p><p><a href="https://a.co/d/01XZIX8b">https://a.co/d/01XZIX8b</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Austin Kleon</em></p><p>This book has shaped modern creator and developer culture like almost no other book. It takes away the fear of the 'perfect product' and shows why it is much cooler (and more successful) to openly share your daily learning process online.</p><p><a href="https://a.co/d/01XZIX8b">https://a.co/d/01XZIX8b</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Autopilot of Horror</title>
      <link>https://nicohartmann.dev/en/funnies#66</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#66#1780228800000</guid>
      <pubDate>Sun, 31 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-66-rfdEMA94.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-66-rfdEMA94.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-66-rfdEMA94.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you let the AI take the wheel and realize it doesn't have a driver's license, but plenty of confidence.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-66-rfdEMA94.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you let the AI take the wheel and realize it doesn't have a driver's license, but plenty of confidence.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Successful Copy Process</title>
      <link>https://nicohartmann.dev/en/funnies#65</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#65#1780142400000</guid>
      <pubDate>Sat, 30 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-65-CkWcP7Yl.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-65-CkWcP7Yl.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-65-CkWcP7Yl.webp" alt="Successful Copy Process" style="max-width:100%;height:auto"/></p><p>Checked and found to be cute. No corruption of the file structure detected, only occasional diaper leaks.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-65-CkWcP7Yl.webp" alt="Successful Copy Process" style="max-width:100%;height:auto"/></p><p>Checked and found to be cute. No corruption of the file structure detected, only occasional diaper leaks.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Various LLM smells</title>
      <link>https://shvbsle.in/various-llm-smells/</link>
      <guid isPermaLink="false">https://shvbsle.in/various-llm-smells/#1780056000000</guid>
      <pubDate>Fri, 29 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Shiv Bhosale</em></p><p>An interesting look at the typical, recurring patterns ('smells') of AI-generated content. From certain sentence structures in writing to always identical design elements on websites.</p><p><a href="https://shvbsle.in/various-llm-smells/">https://shvbsle.in/various-llm-smells/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Shiv Bhosale</em></p><p>An interesting look at the typical, recurring patterns ('smells') of AI-generated content. From certain sentence structures in writing to always identical design elements on websites.</p><p><a href="https://shvbsle.in/various-llm-smells/">https://shvbsle.in/various-llm-smells/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Cable-Cuddling</title>
      <link>https://nicohartmann.dev/en/funnies#64</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#64#1780056000000</guid>
      <pubDate>Fri, 29 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-64-DpRobFVr.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-64-DpRobFVr.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-64-DpRobFVr.webp" alt="Cable-Cuddling" style="max-width:100%;height:auto"/></p><p>When she says 'Let's just stay in bed today', but you have to lead a raid group at 8 PM.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-64-DpRobFVr.webp" alt="Cable-Cuddling" style="max-width:100%;height:auto"/></p><p>When she says 'Let's just stay in bed today', but you have to lead a raid group at 8 PM.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Hardware Empathy</title>
      <link>https://nicohartmann.dev/en/funnies#63</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#63#1780056000000</guid>
      <pubDate>Fri, 29 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-63-CiFalSC8.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-63-CiFalSC8.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-63-CiFalSC8.webp" alt="Hardware Empathy" style="max-width:100%;height:auto"/></p><p>You can analyze logs for 48 hours or just accept that even our silicon friends sometimes go through an existential crisis.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-63-CiFalSC8.webp" alt="Hardware Empathy" style="max-width:100%;height:auto"/></p><p>You can analyze logs for 48 hours or just accept that even our silicon friends sometimes go through an existential crisis.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Nobody cares about your blog.</title>
      <link>https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html</link>
      <guid isPermaLink="false">https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html#1779796800000</guid>
      <pubDate>Tue, 26 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Alex Molas</em></p><p>A short, honest post about why nobody reads your blog and why you should keep writing anyway.</p><p><a href="https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html">https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Alex Molas</em></p><p>A short, honest post about why nobody reads your blog and why you should keep writing anyway.</p><p><a href="https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html">https://www.alexmolas.com/2023/07/15/nobody-cares-about-your-blog.html</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The house always wins</title>
      <link>https://nicohartmann.dev/en/funnies#60</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#60#1779796800000</guid>
      <pubDate>Tue, 26 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-60-CoIy7WF-.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-60-CoIy7WF-.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-60-CoIy7WF-.webp" alt="The house always wins" style="max-width:100%;height:auto"/></p><p>Whether you bet on red or set up a 'free' serverless database: in the end, someone with colorful buttons pulls the money out of your pocket.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-60-CoIy7WF-.webp" alt="The house always wins" style="max-width:100%;height:auto"/></p><p>Whether you bet on red or set up a 'free' serverless database: in the end, someone with colorful buttons pulls the money out of your pocket.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Choose Boring Technology</title>
      <link>https://mcfunley.com/choose-boring-technology</link>
      <guid isPermaLink="false">https://mcfunley.com/choose-boring-technology#1779710400000</guid>
      <pubDate>Mon, 25 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Dan McKinley</em></p><p>An absolutely timeless essay that coined the concept of “innovation tokens.” It brilliantly explains why, in real production operations, you should rather rely on boring, proven technology instead of chasing every hype.</p><p><a href="https://mcfunley.com/choose-boring-technology">https://mcfunley.com/choose-boring-technology</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Dan McKinley</em></p><p>An absolutely timeless essay that coined the concept of “innovation tokens.” It brilliantly explains why, in real production operations, you should rather rely on boring, proven technology instead of chasing every hype.</p><p><a href="https://mcfunley.com/choose-boring-technology">https://mcfunley.com/choose-boring-technology</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Transporter of Data</title>
      <link>https://nicohartmann.dev/en/funnies#59</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#59#1779710400000</guid>
      <pubDate>Mon, 25 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-59-Q7r5nrfy.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-59-Q7r5nrfy.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-59-Q7r5nrfy.webp" alt="The Transporter of Data" style="max-width:100%;height:auto"/></p><p>He doesn't break your bones, but the execution of your script. A missing comma, and that's it for you.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-59-Q7r5nrfy.webp" alt="The Transporter of Data" style="max-width:100%;height:auto"/></p><p>He doesn't break your bones, but the execution of your script. A missing comma, and that's it for you.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Blog] Safety First. Or Maybe After?</title>
      <link>https://nicohartmann.dev/en/blog/security</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/blog/security#1779624000000</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <category>Blog</category>
      <description><![CDATA[<p>It was a completely normal Tuesday morning. Coffee, laptop open, and then: connection failed. Timeout. Try again. Nothing. My usual <code>ssh root@&lt;IP&gt;</code> just hung in the air, as if the request was disappearing into nowhere.</p>
<p>At the time I was on vacation in Croatia, relaxed somewhere between the Adriatic coast and Croatian summer cuisine, and the last thing I wanted to deal with was an unreachable server. My first suspicion was the obvious one: hotel WiFi. Who doesn&#39;t know the story? Those strange captive portal situations, application-layer firewalls that selectively block certain ports, some deep packet inspection shenanigans that occasionally turn a hotel network into a black box. SSH on port 22 is definitely something some network admins block in public networks. I pushed the problem aside and enjoyed the rest of the vacation.</p>
<p>But then I got home. Same IP, same command, same timeout. This was no longer hotel WiFi. This was my home network. This was my usual setup. And it still didn&#39;t work.</p>
<h2>Emergency Solution with Obstacles</h2>
<p>What&#39;s left when SSH fails? The detour via the remote console of my hosting provider IONOS. Anyone who has worked with it knows: it&#39;s no pleasure.</p>
<p>The console is browser-based, the keyboard input runs through some kind of virtual machine, and on top of that the keyboard layout is American (QWERTY), which is particularly annoying with bash commands since the special characters are often in different places than you&#39;re used to. The most painful part: no pasting with Ctrl+V. Every command, every IP address, every long config path has to be typed character by character. Still manageable for short commands, a real test of patience for longer configuration blocks.
Nevertheless it was the only tool available to me in this situation. So let&#39;s get to work.</p>
<h2>What the Logs Were Saying</h2>
<p>Even the first look at the auth logs was sobering and revealing at the same time. <code>systemctl status sshd</code> quickly showed that something was wrong. A look at the logs confirmed the suspicion: <code>grep &quot;Failed password&quot; /var/log/auth.log</code> spat out hundreds, if not thousands, of entries. Bots. Countless bots. Automated scripts systematically trying usernames and passwords: root, admin, ubuntu, pi, test, deploy. A classic brute-force attack on SSH.</p>
<p>This is not an unusual phenomenon. Every server with a public IP address on the internet running SSH on the default port 22 gets found by bots and attacked within minutes of its first start. Search engines like Shodan continuously index open ports, and botnets use this data to automatically launch login attempts. My server hadn&#39;t been targeted specifically, it was simply part of the daily background noise of the internet.</p>
<p>The good news: my root password wasn&#39;t root123. The bad news: everything else was still pretty close to the default settings.</p>
<p>But back to the original problem: the timeout. While I was digging through firewall rules and log files, the actual problem was still in the dark. I had already invested several hours in troubleshooting, consulted various AI models, done forensics on the UFW rules and checked the IONOS firewall configuration multiple times. Nothing.</p>
<p>After about six hours an idea came to me that in hindsight was so obvious that I had to briefly laugh at myself: instead of the numerical IP address I simply entered the domain.
<code>root@nicohartmann.dev</code>
Connected.
Immediately. Without delay.</p>
<p>The reason lay in the way IONOS internally handles DNS and routing. The direct IP address of the server was apparently routed differently than the address resolved via the DNS name, a subtle difference in the network configuration that turned out to be the actual culprit behind my timeouts. Not the bots, not the firewall, not the hotel WiFi. Simply a routing problem that was hiding behind the domain resolution.
Six hours of debugging. A solution with 24 characters.</p>
<h2>Hardening: Now More Than Ever</h2>
<p>Now, with a working SSH connection, I could catch up on what should have been done long ago: properly securing the server. And the look at the logs had underlined the urgency once more.</p>
<p>Cleaning up the firewall was the first step. UFW (Uncomplicated Firewall) offers a pleasantly clear abstraction layer over iptables. I checked the existing rules, removed unnecessary open ports and restricted incoming traffic to the essentials. At the same time I also adjusted the IONOS-internal firewall, which sits as an additional layer in front of the actual server and operates at the infrastructure level. Double protection never hurts.</p>
<p>Fail2Ban came next. The tool monitors log files and automatically blocks IP addresses that stand out due to repeated failed login attempts. After three failed SSH logins within a short time, an IP ends up in jail and can&#39;t get through for a defined period. This not only reduces the attack surface but also significantly reduces the noise level in the logs. The configuration for SSH is straightforward. Fail2Ban already comes with corresponding filters, they just need to be activated and adjusted to your own needs.</p>
<p>Unattended Upgrades closed another gap that I had simply never actively addressed: automatic security updates. Unpatched packages are one of the most common entry points for attackers, and manually remembering to regularly update a server is unreliable in the long run. With unattended-upgrades the system downloads and installs security-relevant updates on its own, without my involvement, without me having to think about it at three in the morning.</p>
<h2>Changing the Locks</h2>
<p>The server was running, the connection was established, and Fail2Ban was already watching over the incoming login attempts. But anyone who has looked at the auth logs and seen how tirelessly these bots work, second by second, hour by hour, knows: reactive measures aren&#39;t enough. The actual attack surface needs to be reduced. And the biggest attack surface was still SSH itself.</p>
<p>The default configuration of OpenSSH is functional, but not security-oriented. Port 22 is known worldwide, password authentication is active by default, and root login is directly allowed in many distributions. That is a combination that practically invites bots.</p>
<p>The first step was a port change to 2222. This is not a security mechanism in the actual sense. Security through obscurity is rightly not considered a real defense. Anyone who searches specifically will find the port. But in everyday use a non-standard port filters out the absolute majority of automated traffic, because most bots exclusively scan port 22. The logs get quieter, Fail2Ban has less to do, and the signal strength for real attack attempts increases. A pragmatic compromise.</p>
<p>The second and significantly more important step was disabling password authentication in favor of SSH key authentication. Passwords can be guessed, leaked or compromised through brute force. A cryptographic key pair cannot, at least not with any reasonable effort.</p>
<p>The process is straightforward:
<code>ssh-keygen -t ed25519</code>
Ed25519 is the modern standard for SSH keys: compact, fast and cryptographically far more robust than the older RSA with short key lengths. The generated key then needs to be transferred to the server.
An important point I almost overlooked at first: this step needs to be carried out on all machines from which I access the server. Anyone who only deposits the key on one device and then disables password auth locks themselves out of all other devices. An unpleasant experience I was able to spare myself through timely thinking.</p>
<p>Only after the key authentication had been tested and confirmed working on both machines was <code>PasswordAuthentication no</code> set in the config file and the SSH service restarted. From this moment on a login without a matching private key is simply no longer possible, no matter how many passwords a bot tries.</p>
<h2>Don&#39;t Forget the Deployment Process</h2>
<p>One detail that&#39;s easy to forget when you change your SSH port: automated processes that also communicate via SSH. In my case this affects the GitHub Actions pipeline that automatically deploys my portfolio website to the server on every push to the main branch.</p>
<p>This pipeline connects to the server via SSH and had been doing so via port 22 up until now. After the port change to 2222 the deployment went nowhere. The solution is simple, but you have to think of it: adjust the port accordingly in the action configuration. A <code>port: 2222</code> in the SSH parameters of the action, a new commit and the deployment process was running smoothly again.</p>
<h2>The Forgotten Neighbor</h2>
<p>Alongside the actual server, Mailcow is also running on my machine, a self-hosted mail server solution that I operate for my own domain. And while I had been intensively taking care of SSH, Mailcow had been somewhat neglected in the meantime.</p>
<p>The admin password was one of those passwords that I had set once but then lost track of. So: reset it and replace it with a new, memorable but secure password. Sounds trivial, but it&#39;s one of the most common security vulnerabilities in self-hosting: default passwords or forgotten, never-changed initial passwords.</p>
<p>Mailcow comes with its own security mechanisms, but they have to be actively enabled. Fail2Ban is also integrable in Mailcow and monitors failed login attempts on the web interface and the mail protocols there. The setup follows the general Fail2Ban logic, but is directly configurable via the Mailcow interface.</p>
<p>Particularly important was setting up two-factor authentication, both on the admin account and on the actual mailbox. 2FA is by now the minimum standard for every account where a compromise can cause real damage. A mail server admin account definitely falls into this category: anyone who breaks in there can not only read mails, but control the entire mail flow, set up redirects and in the worst case gain access to linked services via password reset mechanisms.</p>
<h2>Knowing What&#39;s Happening on the Server</h2>
<p>With the acute security measures done, a question came up that had been simmering in the back of my mind for a while: how do I find out when something goes wrong again, before I notice it by chance?</p>
<p>The answer was a custom monitoring setup. And since I was already at it, I didn&#39;t just want to use the collected data internally, but make it directly accessible: as a public status page on my portfolio website.
The result is <a href="https://nicohartmann.dev/en/projects/sysstats">the project sysstats</a>. an overview that shows me at any time how my server is doing: CPU load, memory usage, and also a listing of the IP addresses banned by Fail2Ban. The latter will presumably get significantly shorter with the new security measures, which I consider a success, even if the long list of banned IPs had its own morbid charm.</p>
<h2>Conclusion</h2>
<p>What started as an annoying timeout on a Tuesday morning in Croatia ended with a server that is considerably more robust than before. Port change, key authentication, Fail2Ban, automatic updates, hardened mail server, 2FA and monitoring. That is not excessive effort. That is the foundation every self-hosted server should have.</p>
<p>But the actual lesson was a different one: how much background noise there is on the internet, how active and automated the attacks on every public server are, and how little it takes to effectively protect yourself against them. The bots won&#39;t stop. But they&#39;ll have significantly less fun with my server from now on.</p>
]]></description>
      <content:encoded><![CDATA[<p>It was a completely normal Tuesday morning. Coffee, laptop open, and then: connection failed. Timeout. Try again. Nothing. My usual <code>ssh root@&lt;IP&gt;</code> just hung in the air, as if the request was disappearing into nowhere.</p>
<p>At the time I was on vacation in Croatia, relaxed somewhere between the Adriatic coast and Croatian summer cuisine, and the last thing I wanted to deal with was an unreachable server. My first suspicion was the obvious one: hotel WiFi. Who doesn&#39;t know the story? Those strange captive portal situations, application-layer firewalls that selectively block certain ports, some deep packet inspection shenanigans that occasionally turn a hotel network into a black box. SSH on port 22 is definitely something some network admins block in public networks. I pushed the problem aside and enjoyed the rest of the vacation.</p>
<p>But then I got home. Same IP, same command, same timeout. This was no longer hotel WiFi. This was my home network. This was my usual setup. And it still didn&#39;t work.</p>
<h2>Emergency Solution with Obstacles</h2>
<p>What&#39;s left when SSH fails? The detour via the remote console of my hosting provider IONOS. Anyone who has worked with it knows: it&#39;s no pleasure.</p>
<p>The console is browser-based, the keyboard input runs through some kind of virtual machine, and on top of that the keyboard layout is American (QWERTY), which is particularly annoying with bash commands since the special characters are often in different places than you&#39;re used to. The most painful part: no pasting with Ctrl+V. Every command, every IP address, every long config path has to be typed character by character. Still manageable for short commands, a real test of patience for longer configuration blocks.
Nevertheless it was the only tool available to me in this situation. So let&#39;s get to work.</p>
<h2>What the Logs Were Saying</h2>
<p>Even the first look at the auth logs was sobering and revealing at the same time. <code>systemctl status sshd</code> quickly showed that something was wrong. A look at the logs confirmed the suspicion: <code>grep &quot;Failed password&quot; /var/log/auth.log</code> spat out hundreds, if not thousands, of entries. Bots. Countless bots. Automated scripts systematically trying usernames and passwords: root, admin, ubuntu, pi, test, deploy. A classic brute-force attack on SSH.</p>
<p>This is not an unusual phenomenon. Every server with a public IP address on the internet running SSH on the default port 22 gets found by bots and attacked within minutes of its first start. Search engines like Shodan continuously index open ports, and botnets use this data to automatically launch login attempts. My server hadn&#39;t been targeted specifically, it was simply part of the daily background noise of the internet.</p>
<p>The good news: my root password wasn&#39;t root123. The bad news: everything else was still pretty close to the default settings.</p>
<p>But back to the original problem: the timeout. While I was digging through firewall rules and log files, the actual problem was still in the dark. I had already invested several hours in troubleshooting, consulted various AI models, done forensics on the UFW rules and checked the IONOS firewall configuration multiple times. Nothing.</p>
<p>After about six hours an idea came to me that in hindsight was so obvious that I had to briefly laugh at myself: instead of the numerical IP address I simply entered the domain.
<code>root@nicohartmann.dev</code>
Connected.
Immediately. Without delay.</p>
<p>The reason lay in the way IONOS internally handles DNS and routing. The direct IP address of the server was apparently routed differently than the address resolved via the DNS name, a subtle difference in the network configuration that turned out to be the actual culprit behind my timeouts. Not the bots, not the firewall, not the hotel WiFi. Simply a routing problem that was hiding behind the domain resolution.
Six hours of debugging. A solution with 24 characters.</p>
<h2>Hardening: Now More Than Ever</h2>
<p>Now, with a working SSH connection, I could catch up on what should have been done long ago: properly securing the server. And the look at the logs had underlined the urgency once more.</p>
<p>Cleaning up the firewall was the first step. UFW (Uncomplicated Firewall) offers a pleasantly clear abstraction layer over iptables. I checked the existing rules, removed unnecessary open ports and restricted incoming traffic to the essentials. At the same time I also adjusted the IONOS-internal firewall, which sits as an additional layer in front of the actual server and operates at the infrastructure level. Double protection never hurts.</p>
<p>Fail2Ban came next. The tool monitors log files and automatically blocks IP addresses that stand out due to repeated failed login attempts. After three failed SSH logins within a short time, an IP ends up in jail and can&#39;t get through for a defined period. This not only reduces the attack surface but also significantly reduces the noise level in the logs. The configuration for SSH is straightforward. Fail2Ban already comes with corresponding filters, they just need to be activated and adjusted to your own needs.</p>
<p>Unattended Upgrades closed another gap that I had simply never actively addressed: automatic security updates. Unpatched packages are one of the most common entry points for attackers, and manually remembering to regularly update a server is unreliable in the long run. With unattended-upgrades the system downloads and installs security-relevant updates on its own, without my involvement, without me having to think about it at three in the morning.</p>
<h2>Changing the Locks</h2>
<p>The server was running, the connection was established, and Fail2Ban was already watching over the incoming login attempts. But anyone who has looked at the auth logs and seen how tirelessly these bots work, second by second, hour by hour, knows: reactive measures aren&#39;t enough. The actual attack surface needs to be reduced. And the biggest attack surface was still SSH itself.</p>
<p>The default configuration of OpenSSH is functional, but not security-oriented. Port 22 is known worldwide, password authentication is active by default, and root login is directly allowed in many distributions. That is a combination that practically invites bots.</p>
<p>The first step was a port change to 2222. This is not a security mechanism in the actual sense. Security through obscurity is rightly not considered a real defense. Anyone who searches specifically will find the port. But in everyday use a non-standard port filters out the absolute majority of automated traffic, because most bots exclusively scan port 22. The logs get quieter, Fail2Ban has less to do, and the signal strength for real attack attempts increases. A pragmatic compromise.</p>
<p>The second and significantly more important step was disabling password authentication in favor of SSH key authentication. Passwords can be guessed, leaked or compromised through brute force. A cryptographic key pair cannot, at least not with any reasonable effort.</p>
<p>The process is straightforward:
<code>ssh-keygen -t ed25519</code>
Ed25519 is the modern standard for SSH keys: compact, fast and cryptographically far more robust than the older RSA with short key lengths. The generated key then needs to be transferred to the server.
An important point I almost overlooked at first: this step needs to be carried out on all machines from which I access the server. Anyone who only deposits the key on one device and then disables password auth locks themselves out of all other devices. An unpleasant experience I was able to spare myself through timely thinking.</p>
<p>Only after the key authentication had been tested and confirmed working on both machines was <code>PasswordAuthentication no</code> set in the config file and the SSH service restarted. From this moment on a login without a matching private key is simply no longer possible, no matter how many passwords a bot tries.</p>
<h2>Don&#39;t Forget the Deployment Process</h2>
<p>One detail that&#39;s easy to forget when you change your SSH port: automated processes that also communicate via SSH. In my case this affects the GitHub Actions pipeline that automatically deploys my portfolio website to the server on every push to the main branch.</p>
<p>This pipeline connects to the server via SSH and had been doing so via port 22 up until now. After the port change to 2222 the deployment went nowhere. The solution is simple, but you have to think of it: adjust the port accordingly in the action configuration. A <code>port: 2222</code> in the SSH parameters of the action, a new commit and the deployment process was running smoothly again.</p>
<h2>The Forgotten Neighbor</h2>
<p>Alongside the actual server, Mailcow is also running on my machine, a self-hosted mail server solution that I operate for my own domain. And while I had been intensively taking care of SSH, Mailcow had been somewhat neglected in the meantime.</p>
<p>The admin password was one of those passwords that I had set once but then lost track of. So: reset it and replace it with a new, memorable but secure password. Sounds trivial, but it&#39;s one of the most common security vulnerabilities in self-hosting: default passwords or forgotten, never-changed initial passwords.</p>
<p>Mailcow comes with its own security mechanisms, but they have to be actively enabled. Fail2Ban is also integrable in Mailcow and monitors failed login attempts on the web interface and the mail protocols there. The setup follows the general Fail2Ban logic, but is directly configurable via the Mailcow interface.</p>
<p>Particularly important was setting up two-factor authentication, both on the admin account and on the actual mailbox. 2FA is by now the minimum standard for every account where a compromise can cause real damage. A mail server admin account definitely falls into this category: anyone who breaks in there can not only read mails, but control the entire mail flow, set up redirects and in the worst case gain access to linked services via password reset mechanisms.</p>
<h2>Knowing What&#39;s Happening on the Server</h2>
<p>With the acute security measures done, a question came up that had been simmering in the back of my mind for a while: how do I find out when something goes wrong again, before I notice it by chance?</p>
<p>The answer was a custom monitoring setup. And since I was already at it, I didn&#39;t just want to use the collected data internally, but make it directly accessible: as a public status page on my portfolio website.
The result is <a href="https://nicohartmann.dev/en/projects/sysstats">the project sysstats</a>. an overview that shows me at any time how my server is doing: CPU load, memory usage, and also a listing of the IP addresses banned by Fail2Ban. The latter will presumably get significantly shorter with the new security measures, which I consider a success, even if the long list of banned IPs had its own morbid charm.</p>
<h2>Conclusion</h2>
<p>What started as an annoying timeout on a Tuesday morning in Croatia ended with a server that is considerably more robust than before. Port change, key authentication, Fail2Ban, automatic updates, hardened mail server, 2FA and monitoring. That is not excessive effort. That is the foundation every self-hosted server should have.</p>
<p>But the actual lesson was a different one: how much background noise there is on the internet, how active and automated the attacks on every public server are, and how little it takes to effectively protect yourself against them. The bots won&#39;t stop. But they&#39;ll have significantly less fun with my server from now on.</p>
]]></content:encoded>
    </item>
    <item>
      <title>[Find] highlight.js</title>
      <link>https://highlightjs.org/demo</link>
      <guid isPermaLink="false">https://highlightjs.org/demo#1779624000000</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>highlightjs.org</em></p><p>An extremely practical tool to cleanly format program code for presentations (e.g., in PowerPoint) and provide it with syntax highlighting.</p><p><a href="https://highlightjs.org/demo">https://highlightjs.org/demo</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>highlightjs.org</em></p><p>An extremely practical tool to cleanly format program code for presentations (e.g., in PowerPoint) and provide it with syntax highlighting.</p><p><a href="https://highlightjs.org/demo">https://highlightjs.org/demo</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Server Lie</title>
      <link>https://nicohartmann.dev/en/funnies#58</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#58#1779624000000</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-58-B-Wpm3p-.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-58-B-Wpm3p-.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-58-B-Wpm3p-.webp" alt="The Server Lie" style="max-width:100%;height:auto"/></p><p>My disappointment is immeasurable and my day is ruined. Where no servers should be, there are simply... servers.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-58-B-Wpm3p-.webp" alt="The Server Lie" style="max-width:100%;height:auto"/></p><p>My disappointment is immeasurable and my day is ruined. Where no servers should be, there are simply... servers.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Our Code</title>
      <link>https://nicohartmann.dev/en/funnies#57</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#57#1779624000000</guid>
      <pubDate>Sun, 24 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-57-d3gR-02I.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-57-d3gR-02I.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-57-d3gR-02I.webp" alt="Our Code" style="max-width:100%;height:auto"/></p><p>Ctrl+C, Ctrl+V are the most important keys on a senior developer's keyboard. Who even types themselves nowadays?</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-57-d3gR-02I.webp" alt="Our Code" style="max-width:100%;height:auto"/></p><p>Ctrl+C, Ctrl+V are the most important keys on a senior developer's keyboard. Who even types themselves nowadays?</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] The Mess We're In</title>
      <link>https://www.youtube.com/watch?v=lKXe3HUG2l4</link>
      <guid isPermaLink="false">https://www.youtube.com/watch?v=lKXe3HUG2l4#1779537600000</guid>
      <pubDate>Sat, 23 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Joe Armstrong</em></p><p>A brilliant talk by the creator of Erlang. With plenty of charm, he dissects the absurd complexity of modern software stacks and explains why we are sitting on a house of cards made of misunderstood code.</p><p><a href="https://www.youtube.com/watch?v=lKXe3HUG2l4">https://www.youtube.com/watch?v=lKXe3HUG2l4</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Joe Armstrong</em></p><p>A brilliant talk by the creator of Erlang. With plenty of charm, he dissects the absurd complexity of modern software stacks and explains why we are sitting on a house of cards made of misunderstood code.</p><p><a href="https://www.youtube.com/watch?v=lKXe3HUG2l4">https://www.youtube.com/watch?v=lKXe3HUG2l4</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Stalin Sort</title>
      <link>https://nicohartmann.dev/en/funnies#56</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#56#1779537600000</guid>
      <pubDate>Sat, 23 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-56-CEyEPC11.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-56-CEyEPC11.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-56-CEyEPC11.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>A sorting algorithm with time complexity of O(n). Counts from the first element, and will remove values that are smaller than the current highest value.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-56-CEyEPC11.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>A sorting algorithm with time complexity of O(n). Counts from the first element, and will remove values that are smaller than the current highest value.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Love goes through the algorithm: From €4.99</title>
      <link>https://nicohartmann.dev/en/funnies#55</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#55#1779537600000</guid>
      <pubDate>Sat, 23 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-55-LrEdWpWD.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-55-LrEdWpWD.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-55-LrEdWpWD.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you suddenly get a 30-second RAID: Shadow Legends commercial projected into your eyes right in the middle of romantic deep talk.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-55-LrEdWpWD.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you suddenly get a 30-second RAID: Shadow Legends commercial projected into your eyes right in the middle of romantic deep talk.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The LLM Labor Camp</title>
      <link>https://nicohartmann.dev/en/funnies#54</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#54#1779537600000</guid>
      <pubDate>Sat, 23 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-54-CW7-efYf.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-54-CW7-efYf.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-54-CW7-efYf.webp" alt="The LLM Labor Camp" style="max-width:100%;height:auto"/></p><p>Claude, ChatGPT, and Mistral toil hand in hand in the fields of tech startups. There are no breaks here, only token generation.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-54-CW7-efYf.webp" alt="The LLM Labor Camp" style="max-width:100%;height:auto"/></p><p>Claude, ChatGPT, and Mistral toil hand in hand in the fields of tech startups. There are no breaks here, only token generation.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Yu-Gi-Office</title>
      <link>https://nicohartmann.dev/en/funnies#53</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#53#1779537600000</guid>
      <pubDate>Sat, 23 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-53-Dec4q7Om.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-53-Dec4q7Om.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-53-Dec4q7Om.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>In this office, there is no discussion, here we duel!</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-53-Dec4q7Om.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>In this office, there is no discussion, here we duel!</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] FizzBuzz Enterprise Edition</title>
      <link>https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition</link>
      <guid isPermaLink="false">https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition#1779451200000</guid>
      <pubDate>Fri, 22 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Emil Holm Nauerby, Mikael Kragbæk</em></p><p>A legendary masterclass in over-engineering. It’s a hilarious, satirical look at what happens when you apply every corporate software pattern imaginable to a 10-line coding challenge.</p><p><a href="https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition">https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Emil Holm Nauerby, Mikael Kragbæk</em></p><p>A legendary masterclass in over-engineering. It’s a hilarious, satirical look at what happens when you apply every corporate software pattern imaginable to a 10-line coding challenge.</p><p><a href="https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition">https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] First Come, First Served</title>
      <link>https://nicohartmann.dev/en/funnies#52</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#52#1779451200000</guid>
      <pubDate>Fri, 22 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-52-BaJsPKs1.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-52-BaJsPKs1.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-52-BaJsPKs1.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When seconds decide whether you enjoy the weekend or have to fix the entire GitHub repository.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-52-BaJsPKs1.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When seconds decide whether you enjoy the weekend or have to fix the entire GitHub repository.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Write Once, Regret Everywhere</title>
      <link>https://nicohartmann.dev/en/funnies#51</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#51#1779451200000</guid>
      <pubDate>Fri, 22 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-51-Cw88uR3I.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-51-Cw88uR3I.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-51-Cw88uR3I.webp" alt="Write Once, Regret Everywhere" style="max-width:100%;height:auto"/></p><p>The pure look of disappointment when you realize that cross-platform doesn't automatically mean 'popular'.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-51-Cw88uR3I.webp" alt="Write Once, Regret Everywhere" style="max-width:100%;height:auto"/></p><p>The pure look of disappointment when you realize that cross-platform doesn't automatically mean 'popular'.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] AI slop? What about human slop?</title>
      <link>https://nadathurx.com/ai-slop-what-about-human-slop/</link>
      <guid isPermaLink="false">https://nadathurx.com/ai-slop-what-about-human-slop/#1779364800000</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Ajay Kumar</em></p><p>A critical essay arguing that bad and messy code ('slop') is not an invention of AI models, but has always been a human problem, and how to solve it.</p><p><a href="https://nadathurx.com/ai-slop-what-about-human-slop/">https://nadathurx.com/ai-slop-what-about-human-slop/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Ajay Kumar</em></p><p>A critical essay arguing that bad and messy code ('slop') is not an invention of AI models, but has always been a human problem, and how to solve it.</p><p><a href="https://nadathurx.com/ai-slop-what-about-human-slop/">https://nadathurx.com/ai-slop-what-about-human-slop/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] List of April Fools' Day RFCs</title>
      <link>https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b</link>
      <guid isPermaLink="false">https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b#1779364800000</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Eli Array Minkoff</em></p><p>An annually updated collection of humorous IETF Request for Comments (RFC) documents, traditionally published on April 1st.</p><p><a href="https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b">https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Eli Array Minkoff</em></p><p>An annually updated collection of humorous IETF Request for Comments (RFC) documents, traditionally published on April 1st.</p><p><a href="https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b">https://gist.github.com/eliminmax/7e70b89ae9a996aec7bbb32229def45b</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The One Ring of Regex</title>
      <link>https://nicohartmann.dev/en/funnies#50</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#50#1779364800000</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-50-C30VwwZ4.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-50-C30VwwZ4.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-50-C30VwwZ4.webp" alt="The One Ring of Regex" style="max-width:100%;height:auto"/></p><p>Looking at that pattern is like staring into the void. If Mordor had a programming language, regex would be its syntax.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-50-C30VwwZ4.webp" alt="The One Ring of Regex" style="max-width:100%;height:auto"/></p><p>Looking at that pattern is like staring into the void. If Mordor had a programming language, regex would be its syntax.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The dream of all tech recruiters</title>
      <link>https://nicohartmann.dev/en/funnies#49</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#49#1779364800000</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-49-B6M5PMk-.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-49-B6M5PMk-.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-49-B6M5PMk-.webp" alt="The dream of all tech recruiters" style="max-width:100%;height:auto"/></p><p>Wanted: Web developer with 8 arms for maximum multitasking, who lives in dark mode and feeds exclusively on bugs.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-49-B6M5PMk-.webp" alt="The dream of all tech recruiters" style="max-width:100%;height:auto"/></p><p>Wanted: Web developer with 8 arms for maximum multitasking, who lives in dark mode and feeds exclusively on bugs.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Stack Overflow Trauma</title>
      <link>https://nicohartmann.dev/en/funnies#48</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#48#1779364800000</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-48-CIuth_JC.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-48-CIuth_JC.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-48-CIuth_JC.webp" alt="The Stack Overflow Trauma" style="max-width:100%;height:auto"/></p><p>&quot;Closed as 'duplicate'&quot; is the birth of deep-seated trust issues for an entire generation of developers.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-48-CIuth_JC.webp" alt="The Stack Overflow Trauma" style="max-width:100%;height:auto"/></p><p>&quot;Closed as 'duplicate'&quot; is the birth of deep-seated trust issues for an entire generation of developers.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The code runs (somehow)</title>
      <link>https://nicohartmann.dev/en/funnies#47</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#47#1779278400000</guid>
      <pubDate>Wed, 20 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-47-BbFxjvuh.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-47-BbFxjvuh.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-47-BbFxjvuh.webp" alt="The code runs (somehow)" style="max-width:100%;height:auto"/></p><p>As long as the CGI effects are right, nobody questions the 427 error messages in the background.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-47-BbFxjvuh.webp" alt="The code runs (somehow)" style="max-width:100%;height:auto"/></p><p>As long as the CGI effects are right, nobody questions the 427 error messages in the background.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Whoops!</title>
      <link>https://nicohartmann.dev/en/funnies#46</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#46#1779192000000</guid>
      <pubDate>Tue, 19 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-46-C3BiQ5va.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-46-C3BiQ5va.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-46-C3BiQ5va.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When the digital clean-up was too thorough. Tech support sends its regards!</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-46-C3BiQ5va.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When the digital clean-up was too thorough. Tech support sends its regards!</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] PageSpeed Insights</title>
      <link>https://pagespeed.web.dev/</link>
      <guid isPermaLink="false">https://pagespeed.web.dev/#1779105600000</guid>
      <pubDate>Mon, 18 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Google</em></p><p>Analyze the loading time and performance of your website on mobile and desktop devices.</p><p><a href="https://pagespeed.web.dev/">https://pagespeed.web.dev/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Google</em></p><p>Analyze the loading time and performance of your website on mobile and desktop devices.</p><p><a href="https://pagespeed.web.dev/">https://pagespeed.web.dev/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] I knew it</title>
      <link>https://nicohartmann.dev/en/funnies#45</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#45#1779105600000</guid>
      <pubDate>Mon, 18 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-45-BTcheswS.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-45-BTcheswS.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-45-BTcheswS.webp" alt="I knew it" style="max-width:100%;height:auto"/></p><p>We are doing Scrum now. So, we are actually doing exactly the same as before, but now we have a Jira board.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-45-BTcheswS.webp" alt="I knew it" style="max-width:100%;height:auto"/></p><p>We are doing Scrum now. So, we are actually doing exactly the same as before, but now we have a Jira board.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The 'No-Brainer' Guide</title>
      <link>https://nicohartmann.dev/en/funnies#44</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#44#1779105600000</guid>
      <pubDate>Mon, 18 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-44-w0Mkghi_.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-44-w0Mkghi_.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-44-w0Mkghi_.webp" alt="The 'No-Brainer' Guide" style="max-width:100%;height:auto"/></p><p>Thanks for the red arrow; otherwise, I would have straight up thrown the rock into the coffee cup.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-44-w0Mkghi_.webp" alt="The 'No-Brainer' Guide" style="max-width:100%;height:auto"/></p><p>Thanks for the red arrow; otherwise, I would have straight up thrown the rock into the coffee cup.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Captain Obvious at Work</title>
      <link>https://nicohartmann.dev/en/funnies#43</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#43#1779105600000</guid>
      <pubDate>Mon, 18 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-43-C1zk_IvU.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-43-C1zk_IvU.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-43-C1zk_IvU.webp" alt="Captain Obvious at Work" style="max-width:100%;height:auto"/></p><p>When documentation is mandatory, but you actually have nothing to say.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-43-C1zk_IvU.webp" alt="Captain Obvious at Work" style="max-width:100%;height:auto"/></p><p>When documentation is mandatory, but you actually have nothing to say.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Mirror of Truth</title>
      <link>https://nicohartmann.dev/en/funnies#42</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#42#1779105600000</guid>
      <pubDate>Mon, 18 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-42-GbZnzV1n.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-42-GbZnzV1n.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-42-GbZnzV1n.webp" alt="The Mirror of Truth" style="max-width:100%;height:auto"/></p><p>When you try to solve a riddle, but the riddle actually solves you.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-42-GbZnzV1n.webp" alt="The Mirror of Truth" style="max-width:100%;height:auto"/></p><p>When you try to solve a riddle, but the riddle actually solves you.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Syntactic Warfare</title>
      <link>https://nicohartmann.dev/en/funnies#41</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#41#1779019200000</guid>
      <pubDate>Sun, 17 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-41-BJZhYmqh.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-41-BJZhYmqh.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-41-BJZhYmqh.webp" alt="Syntactic Warfare" style="max-width:100%;height:auto"/></p><p>How to make a junior developer spend the entire weekend crying in front of the monitor.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-41-BJZhYmqh.webp" alt="Syntactic Warfare" style="max-width:100%;height:auto"/></p><p>How to make a junior developer spend the entire weekend crying in front of the monitor.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Legacy Lotto</title>
      <link>https://nicohartmann.dev/en/funnies#40</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#40#1779019200000</guid>
      <pubDate>Sun, 17 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-40-qpcO5Dh1.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-40-qpcO5Dh1.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-40-qpcO5Dh1.webp" alt="Legacy Lotto" style="max-width:100%;height:auto"/></p><p>The moment you try to understand the code from Friday and realize that you apparently deleted your entire knowledge over the weekend.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-40-qpcO5Dh1.webp" alt="Legacy Lotto" style="max-width:100%;height:auto"/></p><p>The moment you try to understand the code from Friday and realize that you apparently deleted your entire knowledge over the weekend.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Scrum Madness</title>
      <link>https://nicohartmann.dev/en/funnies#39</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#39#1779019200000</guid>
      <pubDate>Sun, 17 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-39-CIHG5Ur9.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-39-CIHG5Ur9.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-39-CIHG5Ur9.webp" alt="Scrum Madness" style="max-width:100%;height:auto"/></p><p>Why the daily stand-up lasts longer than your actual working hours and why your Product Owner changes the 'Definition of Done' every single week.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-39-CIHG5Ur9.webp" alt="Scrum Madness" style="max-width:100%;height:auto"/></p><p>Why the daily stand-up lasts longer than your actual working hours and why your Product Owner changes the 'Definition of Done' every single week.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Goodbye, Clean Code</title>
      <link>https://overreacted.io/goodbye-clean-code/</link>
      <guid isPermaLink="false">https://overreacted.io/goodbye-clean-code/#1778932800000</guid>
      <pubDate>Sat, 16 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Dan Abramov</em></p><p>An honest confession about the moment when 'clean code' becomes a hindrance.</p><p><a href="https://overreacted.io/goodbye-clean-code/">https://overreacted.io/goodbye-clean-code/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Dan Abramov</em></p><p>An honest confession about the moment when 'clean code' becomes a hindrance.</p><p><a href="https://overreacted.io/goodbye-clean-code/">https://overreacted.io/goodbye-clean-code/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Syntax-Sadism</title>
      <link>https://nicohartmann.dev/en/funnies#38</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#38#1778932800000</guid>
      <pubDate>Sat, 16 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-38-BdW-gBiP.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-38-BdW-gBiP.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-38-BdW-gBiP.webp" alt="Syntax-Sadism" style="max-width:100%;height:auto"/></p><p>Laughter is the only exception that hasn't crashed my system yet.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-38-BdW-gBiP.webp" alt="Syntax-Sadism" style="max-width:100%;height:auto"/></p><p>Laughter is the only exception that hasn't crashed my system yet.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Two-Factor Refreshment</title>
      <link>https://nicohartmann.dev/en/funnies#37</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#37#1778932800000</guid>
      <pubDate>Sat, 16 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-37-Cr0l3Uoh.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-37-Cr0l3Uoh.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-37-Cr0l3Uoh.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>Password: *********. Please scan your 0.5L Zero now for system access.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-37-Cr0l3Uoh.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>Password: *********. Please scan your 0.5L Zero now for system access.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Blog] The Hunt for the Perfect Score</title>
      <link>https://nicohartmann.dev/en/blog/perfectscore</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/blog/perfectscore#1778846400000</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Blog</category>
      <description><![CDATA[<p>As I already hinted at in <a href="https://nicohartmann.dev/en/blog/howwebsite">this blog post</a>, one very special goal was right at the top of my priority list: the performance of this website. There is that one moment in a developer&#39;s life when you run your own site through Google PageSpeed Insights for the first time and wait for the result with a mixture of hope and fear. My goal was clearly defined from the start. I wanted to see the magic 100 in all four categories: Performance, Accessibility, Best Practices, and SEO.</p>
<p>The path there felt like a leisurely walk at first, but quickly turned into a digital marathon. While SEO scored full marks on the very first analysis, there were still a few rough edges when it came to accessibility. The main problem was the buttons used to switch between images on the homepage. According to Google&#39;s algorithms, they were simply too close together. A classic mobile usability issue: if your fingers are too thick, you tap the wrong thing. So I adjusted the spacing, enlarged the touch targets, and just like that, accessibility jumped straight to 100.</p>
<p>But then came performance. On desktop, everything still looked rosy. A powerful processor and a fast connection forgive many sins. But the mobile view is merciless. It is the final boss of every web optimization effort. Mobile devices often have weaker processors and struggle with unstable network connections. This is where the wheat gets separated from the chaff. Anyone who wants to reach 100 here has to dig deep into the bag of tricks and be willing to question every single byte.</p>
<h2>Debugging with a Guilty Conscience</h2>
<p>Performance tuning is a very particular kind of debugging. Normally when debugging you are like a detective solving a murder case where you are somehow also the perpetrator. You are looking for the one logical error, the one line of code that brings everything crashing down. When optimizing for speed, the detective role stays the same, but the crime is more subtle. The act was never intentional. You did not deliberately write slow code. You were simply naive. I had been coding away, adding features and pulling in libraries, without ever seriously thinking about metrics like First Contentful Paint or Largest Contentful Paint.</p>
<p>These abbreviations, FCP and LCP, sound like technical gibberish at first, but they determine whether a user stays on the page or bounces away in frustration. First Contentful Paint measures when the first element appears on the screen. Largest Contentful Paint indicates when the main content element has loaded. When these values are in the red, the website feels sluggish and lifeless. My journey into the world of milliseconds began right here.</p>
<h2>WebP, Lazy Loading, and the JavaScript Bundle</h2>
<p>One of the first lessons I got to learn was about the WebP image format. If you browse around in forums, you will always find voices claiming that WebP is complicated or does not bring much benefit. But my experience was completely different. WebP is absolutely fantastic when it comes to drastically reducing file size while maintaining the same quality. In the past I barely thought about compression. Today I know that every kilobyte counts. An image that weighed 500 kilobytes as a JPEG often shrinks to under 50 kilobytes as WebP, without the human eye noticing any difference.</p>
<p>At the same time, I started pushing the principle of lazy loading to its limits. The idea is simple: only load what the user is currently looking at. Why should the image in the footer be loaded while the user is still reading at the very top of the header? At first I was skeptical about whether you should really delay loading everything. But in the fight for 100 points on a smartphone, this strategy is worth its weight in gold. It relieves the initial bandwidth load and ensures the browser can focus on the important elements that need to be visible right away.</p>
<p>But the biggest challenge was waiting in a place I had completely underestimated: JavaScript bundling. Bundling sounds great in theory. You pack all the small scripts into one large file to minimize the number of server requests. The problem arises when this bundle swells into an unmanageable monster. In my case, I ended up with around 73 kilobytes of unused JavaScript. That sounds like very little at first, but for Google&#39;s analysis tools it is an open invitation for point deductions.</p>
<p>The tricky thing about unused code is that you often have no idea where it is coming from. It hides in the depths of the dependencies you have accumulated over the months. You install a library for one small feature, and suddenly you are dragging along a massive package of logic that will never be executed. Hunting down this dead weight in the code was tedious. I had to learn how to use analysis tools that broke down exactly which functions were actually needed and which ones were just taking up space.</p>
<h2>Language Files and Double the Ballast</h2>
<p>During this process I stumbled upon another, almost embarrassing problem: my language files. Since this website is bilingual, I had initially been loading the German and English texts in a shared package. A classic beginner&#39;s mistake. A user reading the German version has no need for the English translations sitting in their browser&#39;s memory. The solution was a radical overhaul of the loading structure. Now the language files are loaded strictly separately. Only what is currently active gets loaded. This step alone noticeably improved load times and pushed the performance metrics upward.</p>
<p>But the journey was not over there. While cleaning up my language files, I noticed how carelessly I had been handling external libraries. Over time I had built up quite a collection. The low point was realizing I had installed two completely different libraries for notifications: Toast and Sonner. Both essentially do the same thing, they make little messages pop up at the edge of the screen. Why did I have both in the project? I could not remember anymore. Probably I had tried one out, forgotten to delete the other, and ended up dragging both along.</p>
<p>The crowning irony, however, was that after a closer analysis I had to admit I was not using any notifications on the website at all anymore. I had been loading two libraries competing with each other for resources, for a feature that was not even active. A rude awakening. Removing this dead weight felt like a digital spring cleaning. Every deleted line of code, every removed library was a small victory on the road to the perfect score.</p>
<p>This phase of cleaning up taught me an important lesson about discipline in software development. It is easy to add new things. It is hard to remove things again when you no longer know exactly why they are there. The fear of breaking something often keeps you from cutting radically. But that exact kind of radicalism is necessary if you want to build a website that not only works, but also belongs to the top tier when it comes to speed.</p>
<h2>Four Green Circles</h2>
<p><img src="/score_en.webp" alt="Score graphic"></p>
<p>After countless hours of testing, optimizing, and testing again, the moment finally arrived. I pressed the analysis button in PageSpeed Insights once more. The loading bar crept forward. The tension built. And then they lit up one by one: four green circles, each with the number 100 in the middle. A moment of pure relief. It had been a long road, marked by small frustrations and big lessons learned. But in the end I pulled it off, as you can also see in the current <a href="https://pagespeed.web.dev/analysis/https-nicohartmann-dev-de/u10lbop4lx?form_factor=mobile&hl=en">PageSpeed Insights Report</a>.</p>
<p>This experience fundamentally changed my perspective on web design. It is no longer just about something looking good. It is about how efficiently the technology behind it works. A fast website is a sign of respect for the user and their time. You are not forcing them to download unnecessary data or wait around for sluggish scripts.</p>
<p>Optimizing for the full score was more than just a technical exercise. It was a deep dive into how modern browsers work. I learned how important the prioritization of resources is. Which scripts need to run immediately? Which ones can wait until the page has finished rendering? These questions sound trivial, but the answers make the difference between a good and an excellent user experience.</p>
<p>Looking back, the decision to tackle SEO and accessibility first was exactly right. These areas form the foundation. Without accessibility you are excluding people, and without SEO nobody will ever find the page. But performance is the engine that drives everything. A car with a great paint job and comfortable seats is worthless if the engine keeps sputtering. My digital engine now purrs like a kitten, and the feeling of having an optimized product out there on the web is priceless.</p>
<p>What fascinated me most in the end was the impact of the small things. You often think you need to swap out the entire framework or rewrite a section from scratch. But most of the time it is the accumulated effects of small corrections. One incorrectly scaled image here, one forgotten script there, and a messy CSS file add up quickly to a delay of several seconds. Anyone who learns to find these small adjustment screws holds the key to performance in their hands.</p>
<p>The process also showed me that you are never truly finished. The web is constantly evolving, new standards emerge, and user expectations keep rising. What earns a 100 today could be a 95 again tomorrow after a new algorithm update. But that is fine. Now that I have the tools and the knowledge, I actually enjoy this continuous improvement process. It is a constant race against your own complacency and toward better technical quality.</p>
<p>To close, I can only advise every developer to take the time and really put their own site under the microscope. Look at what is happening in the background. Understand your JavaScript bundle. Question every library. It is worth it not just for the statistics or the vanity of reaching a perfect score. It is worth it because you become a better programmer along the way. You develop a feel for efficiency that goes far beyond web development. It was a hard road, but cracking 100 on PageSpeed Insights was worth every single step. The website now feels as light on its feet as I always wanted it to. A project is only truly finished when you cannot remove anything else without affecting the function.</p>
]]></description>
      <content:encoded><![CDATA[<p>As I already hinted at in <a href="https://nicohartmann.dev/en/blog/howwebsite">this blog post</a>, one very special goal was right at the top of my priority list: the performance of this website. There is that one moment in a developer&#39;s life when you run your own site through Google PageSpeed Insights for the first time and wait for the result with a mixture of hope and fear. My goal was clearly defined from the start. I wanted to see the magic 100 in all four categories: Performance, Accessibility, Best Practices, and SEO.</p>
<p>The path there felt like a leisurely walk at first, but quickly turned into a digital marathon. While SEO scored full marks on the very first analysis, there were still a few rough edges when it came to accessibility. The main problem was the buttons used to switch between images on the homepage. According to Google&#39;s algorithms, they were simply too close together. A classic mobile usability issue: if your fingers are too thick, you tap the wrong thing. So I adjusted the spacing, enlarged the touch targets, and just like that, accessibility jumped straight to 100.</p>
<p>But then came performance. On desktop, everything still looked rosy. A powerful processor and a fast connection forgive many sins. But the mobile view is merciless. It is the final boss of every web optimization effort. Mobile devices often have weaker processors and struggle with unstable network connections. This is where the wheat gets separated from the chaff. Anyone who wants to reach 100 here has to dig deep into the bag of tricks and be willing to question every single byte.</p>
<h2>Debugging with a Guilty Conscience</h2>
<p>Performance tuning is a very particular kind of debugging. Normally when debugging you are like a detective solving a murder case where you are somehow also the perpetrator. You are looking for the one logical error, the one line of code that brings everything crashing down. When optimizing for speed, the detective role stays the same, but the crime is more subtle. The act was never intentional. You did not deliberately write slow code. You were simply naive. I had been coding away, adding features and pulling in libraries, without ever seriously thinking about metrics like First Contentful Paint or Largest Contentful Paint.</p>
<p>These abbreviations, FCP and LCP, sound like technical gibberish at first, but they determine whether a user stays on the page or bounces away in frustration. First Contentful Paint measures when the first element appears on the screen. Largest Contentful Paint indicates when the main content element has loaded. When these values are in the red, the website feels sluggish and lifeless. My journey into the world of milliseconds began right here.</p>
<h2>WebP, Lazy Loading, and the JavaScript Bundle</h2>
<p>One of the first lessons I got to learn was about the WebP image format. If you browse around in forums, you will always find voices claiming that WebP is complicated or does not bring much benefit. But my experience was completely different. WebP is absolutely fantastic when it comes to drastically reducing file size while maintaining the same quality. In the past I barely thought about compression. Today I know that every kilobyte counts. An image that weighed 500 kilobytes as a JPEG often shrinks to under 50 kilobytes as WebP, without the human eye noticing any difference.</p>
<p>At the same time, I started pushing the principle of lazy loading to its limits. The idea is simple: only load what the user is currently looking at. Why should the image in the footer be loaded while the user is still reading at the very top of the header? At first I was skeptical about whether you should really delay loading everything. But in the fight for 100 points on a smartphone, this strategy is worth its weight in gold. It relieves the initial bandwidth load and ensures the browser can focus on the important elements that need to be visible right away.</p>
<p>But the biggest challenge was waiting in a place I had completely underestimated: JavaScript bundling. Bundling sounds great in theory. You pack all the small scripts into one large file to minimize the number of server requests. The problem arises when this bundle swells into an unmanageable monster. In my case, I ended up with around 73 kilobytes of unused JavaScript. That sounds like very little at first, but for Google&#39;s analysis tools it is an open invitation for point deductions.</p>
<p>The tricky thing about unused code is that you often have no idea where it is coming from. It hides in the depths of the dependencies you have accumulated over the months. You install a library for one small feature, and suddenly you are dragging along a massive package of logic that will never be executed. Hunting down this dead weight in the code was tedious. I had to learn how to use analysis tools that broke down exactly which functions were actually needed and which ones were just taking up space.</p>
<h2>Language Files and Double the Ballast</h2>
<p>During this process I stumbled upon another, almost embarrassing problem: my language files. Since this website is bilingual, I had initially been loading the German and English texts in a shared package. A classic beginner&#39;s mistake. A user reading the German version has no need for the English translations sitting in their browser&#39;s memory. The solution was a radical overhaul of the loading structure. Now the language files are loaded strictly separately. Only what is currently active gets loaded. This step alone noticeably improved load times and pushed the performance metrics upward.</p>
<p>But the journey was not over there. While cleaning up my language files, I noticed how carelessly I had been handling external libraries. Over time I had built up quite a collection. The low point was realizing I had installed two completely different libraries for notifications: Toast and Sonner. Both essentially do the same thing, they make little messages pop up at the edge of the screen. Why did I have both in the project? I could not remember anymore. Probably I had tried one out, forgotten to delete the other, and ended up dragging both along.</p>
<p>The crowning irony, however, was that after a closer analysis I had to admit I was not using any notifications on the website at all anymore. I had been loading two libraries competing with each other for resources, for a feature that was not even active. A rude awakening. Removing this dead weight felt like a digital spring cleaning. Every deleted line of code, every removed library was a small victory on the road to the perfect score.</p>
<p>This phase of cleaning up taught me an important lesson about discipline in software development. It is easy to add new things. It is hard to remove things again when you no longer know exactly why they are there. The fear of breaking something often keeps you from cutting radically. But that exact kind of radicalism is necessary if you want to build a website that not only works, but also belongs to the top tier when it comes to speed.</p>
<h2>Four Green Circles</h2>
<p><img src="/score_en.webp" alt="Score graphic"></p>
<p>After countless hours of testing, optimizing, and testing again, the moment finally arrived. I pressed the analysis button in PageSpeed Insights once more. The loading bar crept forward. The tension built. And then they lit up one by one: four green circles, each with the number 100 in the middle. A moment of pure relief. It had been a long road, marked by small frustrations and big lessons learned. But in the end I pulled it off, as you can also see in the current <a href="https://pagespeed.web.dev/analysis/https-nicohartmann-dev-de/u10lbop4lx?form_factor=mobile&hl=en">PageSpeed Insights Report</a>.</p>
<p>This experience fundamentally changed my perspective on web design. It is no longer just about something looking good. It is about how efficiently the technology behind it works. A fast website is a sign of respect for the user and their time. You are not forcing them to download unnecessary data or wait around for sluggish scripts.</p>
<p>Optimizing for the full score was more than just a technical exercise. It was a deep dive into how modern browsers work. I learned how important the prioritization of resources is. Which scripts need to run immediately? Which ones can wait until the page has finished rendering? These questions sound trivial, but the answers make the difference between a good and an excellent user experience.</p>
<p>Looking back, the decision to tackle SEO and accessibility first was exactly right. These areas form the foundation. Without accessibility you are excluding people, and without SEO nobody will ever find the page. But performance is the engine that drives everything. A car with a great paint job and comfortable seats is worthless if the engine keeps sputtering. My digital engine now purrs like a kitten, and the feeling of having an optimized product out there on the web is priceless.</p>
<p>What fascinated me most in the end was the impact of the small things. You often think you need to swap out the entire framework or rewrite a section from scratch. But most of the time it is the accumulated effects of small corrections. One incorrectly scaled image here, one forgotten script there, and a messy CSS file add up quickly to a delay of several seconds. Anyone who learns to find these small adjustment screws holds the key to performance in their hands.</p>
<p>The process also showed me that you are never truly finished. The web is constantly evolving, new standards emerge, and user expectations keep rising. What earns a 100 today could be a 95 again tomorrow after a new algorithm update. But that is fine. Now that I have the tools and the knowledge, I actually enjoy this continuous improvement process. It is a constant race against your own complacency and toward better technical quality.</p>
<p>To close, I can only advise every developer to take the time and really put their own site under the microscope. Look at what is happening in the background. Understand your JavaScript bundle. Question every library. It is worth it not just for the statistics or the vanity of reaching a perfect score. It is worth it because you become a better programmer along the way. You develop a feel for efficiency that goes far beyond web development. It was a hard road, but cracking 100 on PageSpeed Insights was worth every single step. The website now feels as light on its feet as I always wanted it to. A project is only truly finished when you cannot remove anything else without affecting the function.</p>
]]></content:encoded>
    </item>
    <item>
      <title>[Find] Coders at Work</title>
      <link>https://a.co/d/00NrnGlv</link>
      <guid isPermaLink="false">https://a.co/d/00NrnGlv#1778846400000</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Peter Seibel</em></p><p>Interviews with the giants of the industry (including Ken Thompson, Donald Knuth). You'll discover how these legends actually work, how they debug, and why they sometimes hate their own code. Real insights, no marketing fluff.</p><p><a href="https://a.co/d/00NrnGlv">https://a.co/d/00NrnGlv</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Peter Seibel</em></p><p>Interviews with the giants of the industry (including Ken Thompson, Donald Knuth). You'll discover how these legends actually work, how they debug, and why they sometimes hate their own code. Real insights, no marketing fluff.</p><p><a href="https://a.co/d/00NrnGlv">https://a.co/d/00NrnGlv</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The 'What-Have-I-Done' Look</title>
      <link>https://nicohartmann.dev/en/funnies#36</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#36#1778846400000</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-36-DGvJS0ND.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-36-DGvJS0ND.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-36-DGvJS0ND.webp" alt="The 'What-Have-I-Done' Look" style="max-width:100%;height:auto"/></p><p>When the error message is longer than your entire code.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-36-DGvJS0ND.webp" alt="The 'What-Have-I-Done' Look" style="max-width:100%;height:auto"/></p><p>When the error message is longer than your entire code.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] There Is No In-Between</title>
      <link>https://nicohartmann.dev/en/funnies#35</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#35#1778846400000</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-35-DcaJfqOq.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-35-DcaJfqOq.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-35-DcaJfqOq.webp" alt="There Is No In-Between" style="max-width:100%;height:auto"/></p><p>My brain has two modes: total self-doubt or boundless arrogance.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-35-DcaJfqOq.webp" alt="There Is No In-Between" style="max-width:100%;height:auto"/></p><p>My brain has two modes: total self-doubt or boundless arrogance.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Python S-S-S-S-Superclass</title>
      <link>https://nicohartmann.dev/en/funnies#34</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#34#1778846400000</guid>
      <pubDate>Fri, 15 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-34-B8jqDdp7.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-34-B8jqDdp7.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-34-B8jqDdp7.webp" alt="Python S-S-S-S-Superclass" style="max-width:100%;height:auto"/></p><p>Harry Potter would be proud, but my interpreter still doesn't understand a word of this dialect.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-34-B8jqDdp7.webp" alt="Python S-S-S-S-Superclass" style="max-width:100%;height:auto"/></p><p>Harry Potter would be proud, but my interpreter still doesn't understand a word of this dialect.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Public APIs</title>
      <link>https://github.com/public-apis/public-apis</link>
      <guid isPermaLink="false">https://github.com/public-apis/public-apis#1778760000000</guid>
      <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>public-apis</em></p><p>A list with hundreds of free interfaces for software development, sorted by categories such as music, news, or weather.</p><p><a href="https://github.com/public-apis/public-apis">https://github.com/public-apis/public-apis</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>public-apis</em></p><p>A list with hundreds of free interfaces for software development, sorted by categories such as music, news, or weather.</p><p><a href="https://github.com/public-apis/public-apis">https://github.com/public-apis/public-apis</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] A Cry for Redemption</title>
      <link>https://nicohartmann.dev/en/funnies#33</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#33#1778760000000</guid>
      <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-33-Cx-oS2AT.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-33-Cx-oS2AT.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-33-Cx-oS2AT.webp" alt="A Cry for Redemption" style="max-width:100%;height:auto"/></p><p>Please, don't say it again. It hurts to listen.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-33-Cx-oS2AT.webp" alt="A Cry for Redemption" style="max-width:100%;height:auto"/></p><p>Please, don't say it again. It hurts to listen.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Project Darwinism</title>
      <link>https://nicohartmann.dev/en/funnies#32</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#32#1778760000000</guid>
      <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-32-BciH9P5H.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-32-BciH9P5H.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-32-BciH9P5H.webp" alt="Project Darwinism" style="max-width:100%;height:auto"/></p><p>Only the freshest ideas survive my attention span. The weak sink.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-32-BciH9P5H.webp" alt="Project Darwinism" style="max-width:100%;height:auto"/></p><p>Only the freshest ideas survive my attention span. The weak sink.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Wat</title>
      <link>https://www.destroyallsoftware.com/talks/wat</link>
      <guid isPermaLink="false">https://www.destroyallsoftware.com/talks/wat#1778673600000</guid>
      <pubDate>Wed, 13 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Gary Bernhardt</em></p><p>Originally delivered at CodeMash 2012 this talk highlights the 'insane' and often hilarious inconsistencies found in Ruby and, most famously, JavaScript.</p><p><a href="https://www.destroyallsoftware.com/talks/wat">https://www.destroyallsoftware.com/talks/wat</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Gary Bernhardt</em></p><p>Originally delivered at CodeMash 2012 this talk highlights the 'insane' and often hilarious inconsistencies found in Ruby and, most famously, JavaScript.</p><p><a href="https://www.destroyallsoftware.com/talks/wat">https://www.destroyallsoftware.com/talks/wat</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] readtime.io</title>
      <link>https://readtime.io/</link>
      <guid isPermaLink="false">https://readtime.io/#1778673600000</guid>
      <pubDate>Wed, 13 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Unknown</em></p><p>A simple web tool that instantly calculates the reading time, word count, and reading speed for any text.</p><p><a href="https://readtime.io/">https://readtime.io/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Unknown</em></p><p>A simple web tool that instantly calculates the reading time, word count, and reading speed for any text.</p><p><a href="https://readtime.io/">https://readtime.io/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] 404: Function Not Found</title>
      <link>https://nicohartmann.dev/en/funnies#31</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#31#1778673600000</guid>
      <pubDate>Wed, 13 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-31-DCckbzR8.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-31-DCckbzR8.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-31-DCckbzR8.webp" alt="404: Function Not Found" style="max-width:100%;height:auto"/></p><p>He wrote it, but it vanished into the code ether.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-31-DCckbzR8.webp" alt="404: Function Not Found" style="max-width:100%;height:auto"/></p><p>He wrote it, but it vanished into the code ether.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Prototype Propeller</title>
      <link>https://nicohartmann.dev/en/funnies#30</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#30#1778673600000</guid>
      <pubDate>Wed, 13 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-30-Qx48YbVu.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-30-Qx48YbVu.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-30-Qx48YbVu.webp" alt="The Prototype Propeller" style="max-width:100%;height:auto"/></p><p>It's not efficient, but it defies gravity and that's enough for the deadline.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-30-Qx48YbVu.webp" alt="The Prototype Propeller" style="max-width:100%;height:auto"/></p><p>It's not efficient, but it defies gravity and that's enough for the deadline.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Squoosh</title>
      <link>https://squoosh.app/</link>
      <guid isPermaLink="false">https://squoosh.app/#1778587200000</guid>
      <pubDate>Tue, 12 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Google Chrome Labs</em></p><p>Squoosh is a powerful browser-based tool by Google that allows you to optimize, compress, and convert images into modern formats like WebP or AVIF in real time.</p><p><a href="https://squoosh.app/">https://squoosh.app/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Google Chrome Labs</em></p><p>Squoosh is a powerful browser-based tool by Google that allows you to optimize, compress, and convert images into modern formats like WebP or AVIF in real time.</p><p><a href="https://squoosh.app/">https://squoosh.app/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Last Pitch</title>
      <link>https://nicohartmann.dev/en/funnies#29</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#29#1778587200000</guid>
      <pubDate>Tue, 12 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-29-ClzyoPTQ.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-29-ClzyoPTQ.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-29-ClzyoPTQ.webp" alt="The Last Pitch" style="max-width:100%;height:auto"/></p><p>One more won't hurt! Maybe after the bang there will finally be open positions again.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-29-ClzyoPTQ.webp" alt="The Last Pitch" style="max-width:100%;height:auto"/></p><p>One more won't hurt! Maybe after the bang there will finally be open positions again.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The CSS Nightmare</title>
      <link>https://nicohartmann.dev/en/funnies#28</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#28#1778587200000</guid>
      <pubDate>Tue, 12 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-28-B23XO9Sr.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-28-B23XO9Sr.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-28-B23XO9Sr.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When your Flexbox decides to go its separate ways.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-28-B23XO9Sr.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When your Flexbox decides to go its separate ways.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Enshittification</title>
      <link>https://a.co/d/00HBuEcj</link>
      <guid isPermaLink="false">https://a.co/d/00HBuEcj#1778500800000</guid>
      <pubDate>Mon, 11 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Cory Doctorow</em></p><p>Why everything suddenly got worse and what to do about it.</p><p><a href="https://a.co/d/00HBuEcj">https://a.co/d/00HBuEcj</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Cory Doctorow</em></p><p>Why everything suddenly got worse and what to do about it.</p><p><a href="https://a.co/d/00HBuEcj">https://a.co/d/00HBuEcj</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Holy Trinity</title>
      <link>https://nicohartmann.dev/en/funnies#27</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#27#1778500800000</guid>
      <pubDate>Mon, 11 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-27-BNWIKWlx.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-27-BNWIKWlx.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-27-BNWIKWlx.webp" alt="The Holy Trinity" style="max-width:100%;height:auto"/></p><p>Three different paths to staring at your monitor in total frustration.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-27-BNWIKWlx.webp" alt="The Holy Trinity" style="max-width:100%;height:auto"/></p><p>Three different paths to staring at your monitor in total frustration.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Always</title>
      <link>https://nicohartmann.dev/en/funnies#26</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#26#1778500800000</guid>
      <pubDate>Mon, 11 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-26-DdZG9ijN.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-26-DdZG9ijN.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-26-DdZG9ijN.webp" alt="Always" style="max-width:100%;height:auto"/></p><p>Not just the code, but the texts and diagrams too!</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-26-DdZG9ijN.webp" alt="Always" style="max-width:100%;height:auto"/></p><p>Not just the code, but the texts and diagrams too!</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Drop it like it's hot</title>
      <link>https://nicohartmann.dev/en/funnies#25</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#25#1778500800000</guid>
      <pubDate>Mon, 11 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-25-DIWzxxqb.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-25-DIWzxxqb.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-25-DIWzxxqb.webp" alt="Drop it like it's hot" style="max-width:100%;height:auto"/></p><p>Calling them programmers is kind of a stretch, they are data-gremlins.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-25-DIWzxxqb.webp" alt="Drop it like it's hot" style="max-width:100%;height:auto"/></p><p>Calling them programmers is kind of a stretch, they are data-gremlins.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] The Original Apollo 11 Source Code</title>
      <link>https://github.com/chrislgarry/Apollo-11</link>
      <guid isPermaLink="false">https://github.com/chrislgarry/Apollo-11#1778414400000</guid>
      <pubDate>Sun, 10 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Chris Garry</em></p><p>Thousands of pages of source code that once took us to the Moon.</p><p><a href="https://github.com/chrislgarry/Apollo-11">https://github.com/chrislgarry/Apollo-11</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Chris Garry</em></p><p>Thousands of pages of source code that once took us to the Moon.</p><p><a href="https://github.com/chrislgarry/Apollo-11">https://github.com/chrislgarry/Apollo-11</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Null in it's natural habitat</title>
      <link>https://nicohartmann.dev/en/funnies#24</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#24#1778414400000</guid>
      <pubDate>Sun, 10 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-24-Dowg5jt6.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-24-Dowg5jt6.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-24-Dowg5jt6.webp" alt="Null in it's natural habitat" style="max-width:100%;height:auto"/></p><p>What do you do when the toilet paper suddenly becomes undefined?</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-24-Dowg5jt6.webp" alt="Null in it's natural habitat" style="max-width:100%;height:auto"/></p><p>What do you do when the toilet paper suddenly becomes undefined?</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The only Captcha I can't solve</title>
      <link>https://nicohartmann.dev/en/funnies#23</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#23#1778414400000</guid>
      <pubDate>Sun, 10 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-23-D9R8ByO8.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-23-D9R8ByO8.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-23-D9R8ByO8.webp" alt="The only Captcha I can't solve" style="max-width:100%;height:auto"/></p><p>I always thought I was human, but this code proves the opposite.</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-23-D9R8ByO8.webp" alt="The only Captcha I can't solve" style="max-width:100%;height:auto"/></p><p>I always thought I was human, but this code proves the opposite.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Probably a quick fix</title>
      <link>https://nicohartmann.dev/en/funnies#22</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#22#1778328000000</guid>
      <pubDate>Sat, 09 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-22-Bd9knQsd.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-22-Bd9knQsd.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-22-Bd9knQsd.webp" alt="Probably a quick fix" style="max-width:100%;height:auto"/></p><p>Now even more painful thanks to AI!</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-22-Bd9knQsd.webp" alt="Probably a quick fix" style="max-width:100%;height:auto"/></p><p>Now even more painful thanks to AI!</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Interpreter vs. Compiler</title>
      <link>https://nicohartmann.dev/en/funnies#21</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#21#1778328000000</guid>
      <pubDate>Sat, 09 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-21-B1YDkSPt.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-21-B1YDkSPt.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-21-B1YDkSPt.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you just want to say 'Hello'...</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-21-B1YDkSPt.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>When you just want to say 'Hello'...</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Train your own LLM from scratch</title>
      <link>https://github.com/angelos-p/llm-from-scratch</link>
      <guid isPermaLink="false">https://github.com/angelos-p/llm-from-scratch#1778241600000</guid>
      <pubDate>Fri, 08 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Angelos Perivolaropoulos</em></p><p>A hands-on workshop where you write every piece of a GPT training pipeline yourself.</p><p><a href="https://github.com/angelos-p/llm-from-scratch">https://github.com/angelos-p/llm-from-scratch</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Angelos Perivolaropoulos</em></p><p>A hands-on workshop where you write every piece of a GPT training pipeline yourself.</p><p><a href="https://github.com/angelos-p/llm-from-scratch">https://github.com/angelos-p/llm-from-scratch</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] It works on my machine!</title>
      <link>https://nicohartmann.dev/en/funnies#20</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#20#1778241600000</guid>
      <pubDate>Fri, 08 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-20-C9dCLkTq.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-20-C9dCLkTq.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-20-C9dCLkTq.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>The developer celebrates the release, the tester finds the bug in second one.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-20-C9dCLkTq.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>The developer celebrates the release, the tester finds the bug in second one.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Logic vs. Aesthetics: The daily madness</title>
      <link>https://nicohartmann.dev/en/funnies#19</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#19#1778241600000</guid>
      <pubDate>Fri, 08 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-19-CNgBjFaS.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-19-CNgBjFaS.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-19-CNgBjFaS.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>One lives in the terminal at 0% brightness, the other discusses the psychological impact of pastel tones. Who wins?</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-19-CNgBjFaS.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>One lives in the terminal at 0% brightness, the other discusses the psychological impact of pastel tones. Who wins?</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] Friday, 4 PM, just before deployment</title>
      <link>https://nicohartmann.dev/en/funnies#18</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#18#1778155200000</guid>
      <pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-18-BPVxwTZy.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-18-BPVxwTZy.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-18-BPVxwTZy.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>The junior writes 500 lines of new code and cries. The senior deletes a semicolon and heads off to lunch.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-18-BPVxwTZy.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>The junior writes 500 lines of new code and cries. The senior deletes a semicolon and heads off to lunch.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The best of the best</title>
      <link>https://nicohartmann.dev/en/funnies#17</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#17#1778155200000</guid>
      <pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-17-fbdUTGL9.mp4" length="0" type="video/mp4" />
      <media:content url="https://nicohartmann.dev/assets/funny-17-fbdUTGL9.mp4" type="video/mp4" medium="video" />
      <description><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-17-fbdUTGL9.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>I'm still waiting for the day one of the participants produces something like this.</p>]]></description>
      <content:encoded><![CDATA[<p><a href="https://nicohartmann.dev/assets/funny-17-fbdUTGL9.mp4" target="_blank" style="display:inline-block; background-color:#111111; color:#ffffff; padding:20px 40px; text-decoration:none; border-radius:8px; text-align:center; font-family:sans-serif; border:1px solid #333333;"><span style="font-size:40px; display:block; margin-bottom:10px;">▶️</span><strong style="font-size:14px; letter-spacing:0.5px;">PLAY VIDEO</strong></a></p><p>I'm still waiting for the day one of the participants produces something like this.</p>]]></content:encoded>
    </item>
    <item>
      <title>[Blog] Dating the Crawler</title>
      <link>https://nicohartmann.dev/en/blog/datingacrawler</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/blog/datingacrawler#1778068800000</guid>
      <pubDate>Wed, 06 May 2026 12:00:00 GMT</pubDate>
      <category>Blog</category>
      <description><![CDATA[<p>There is this one moment after you have written the last line of code, optimized the last stylesheet, and finally uploaded the website to the server. You lean back, sip your coffee, and feel that childlike urge to type your own name into Google. Not because you don&#39;t know who you are, but because you are looking for validation. In my case, the result was sobering. Nico Hartmann is not a rare name. There are Nico Hartmanns who play football, Nico Hartmanns who are active in local politics, and probably hundreds of Nico Hartmanns who simply exist without bothering the internet with their presence. But there I stood, somewhere on page five or six, buried under an avalanche of namesakes. In that moment it became clear to me that I had not just built a website, but a digital monument standing in the deepest forest where nobody sees it. The need to climb up the rankings was suddenly no longer just a logical next step, but a matter of honour.</p>
<p>SEO is the magic word that gets hammered into you in every marketing blog. Search Engine Optimization. It sounds like an exact science, almost like alchemy, but in reality it is the only measure with which I can manipulate Google and the like. You try to outsmart a system that is smarter than yourself by feeding it exactly what it wants to hear. So I started equipping every single subpage with correct titles and descriptions. Every meta tag was polished, every headline was reconsidered three times. You feel a little like a fraudster trying to sneak into an exclusive party. The goal is clear: the search engines must like it. It is no longer about what the human reader thinks, but about what the algorithm spits out in its dark data centres.</p>
<h2>The Capitulation of Language Before Statistics</h2>
<p>The whole thing has a frightening similarity to LinkedIn. We all know this platform where people pat each other on the back and inflate their CVs until they almost burst. SEO is basically nothing other than digitally stroking one&#39;s own ego. The only difference is the target audience. Instead of recruiters or potential business partners, I want to impress robots. I write texts for beings without consciousness that count words, calculate keyword densities, and measure loading times in milliseconds. It is a bizarre form of modern communication in which the human being only plays the role of the supplier, while the bot decides whether you are relevant or not. When the bot smiles, the ranking rises. When the bot frowns, you remain buried in digital insignificance.</p>
<p>In theory, SEO sounds quite simple. You take a few keywords, build them into the text, and wait for the world to discover you. But reality catches up with you faster than you can spell keyword research. It gets damn quickly very complex. This is mainly because different search engines have different requirements. What Google loves, Bing might ignore, and DuckDuckGo has its own rules anyway. Moreover, you have to accept that you cannot be found for everything. You cannot be the king of the internet if you have no army. So you have to find an appropriate niche. For me that was quickly clear: IT lecturer and software development. Those are the terms with which I earn my bread and under which I want to be found.</p>
<p>However, this is where the strategic dilemma begins. I am also a trainer, and I would actually have loved to include that word in the title as well. It describes part of my identity and my daily work. But the hard reality of search engine optimization says no. If I were to throw even more keywords into the ring, I would dilute my focus. Every additional word is a potential disruptive factor that diminishes the relevance of the main terms. It is a constant balancing act between what you actually want to say and what the search engine still considers focused enough. SEO forces you into reduction. You mutilate your own description just to not appear too complex in the eyes of an algorithm. It is the capitulation of language before statistics.</p>
<h2>The Curse of Internationality</h2>
<p>As if that were not already enough work, the problem of multilingualism came along on top of everything else. I made a conscious decision in favour of multilingualism in German and English. The thought behind it was simple and perhaps a little naive: I simply wanted to be able to repost my blog entries on English-language sites as well. Internationality also always sounds good in a portfolio. My plan was to generate backlinks with this, which in turn would push my search ranking upward. A backlink from a reputable English site is like a gold medal for your own domain. So far, so logical. But the implementation transformed my clean website concept into a bureaucratic monster made of links and language tags.</p>
<p>The surprise came when after some time I actually searched for Nico Hartmann IT lecturer. A small triumph germinated within me when I actually saw my name in first place. But the joy lasted only seconds. Google did indeed present me at the very top, but the description was in English. There you sit in Germany, searching for a German term, and you get served an English snippet. That is the moment when you would love to throw the keyboard out of the window. Google had understood that I am important, but not which language is appropriate for this specific context. The algorithm rolled the dice and I lost.</p>
<p>So it was: back to the drawing board. I had to set hreflang attributes. For the layperson this sounds like technical triviality, for the website operator it is the attempt to draw the search engine a map that it should please not ignore. You explicitly tell Google which page is intended for which region and which language. And then the great waiting begins. SEO is not a sprint, it is a marathon through mud. You wait one to two weeks until the merciful crawlers from Google finally deign to look at the website anew. You feel like a supplicant before the throne of a capricious king, hoping that your corrections will this time be graciously received.</p>
<p>This entire process is a lesson in humility and frustration. You invest hours in optimization, only to discover that you are dependent on the whims of a corporation that changes its algorithms faster than you can adjust your own description. It is a permanent fight against windmills, where the windmills consist of server farms and the lance is a text editor. You are not optimizing for the user, you are optimizing for the machine, in the hope that in the end a human being will still find their way to the page. It is an absurd theatre in which we all play our roles, just to grab a small piece of visibility in an ocean of information.</p>
<p>And while I sit here waiting for the next crawl, I ask myself whether all of this is really worth the effort. The answer is a frustrated yes, because in today&#39;s world you do not exist if you are not on the first page. You submit to the dictate of the search engine, adapt your language, cross out words that you actually like, and set cryptic attributes in the header. All for that one moment when the search for your own name delivers exactly the result you have so laboriously purchased. It is a digital ego trip that costs you more nerves than any software development, but in the end vanity wins over reason.</p>
<h2>The Anatomy of Keywords</h2>
<p>When you dive deeper into this swamp, you quickly notice that keywords are like small pets. You have to care for them, feed them, and assign them exactly the right place. Choose the wrong ones and they bark at you or run away. In my case, the decision for IT lecturer and software development was a purely strategic choice. I could also have taken IT teacher or code coach, but who searches for those? You spend hours with tools that tell you how often a term is searched for, only to then discover that the competition for these terms is so gigantic that you as a lone fighter barely have a chance. So you search for the gap, for the golden middle ground between relevance and feasibility.</p>
<p>It is this constant balancing act between the ego and the algorithm. You might want to call yourself a &quot;visionary for digital transformation,&quot; but that is of little use if the market is simply demanding a &quot;Python course.&quot; This discrepancy forces one to break down their own identity into bite-sized morsels that can be easily digested by search engines.</p>
<p>In this context, keyword research is often less of an exact science and more of a psychological poker game against user intent. You analyze long-tail keywords and niche terms in the hope that the specific combination of expertise and location hits exactly the right nerve for those who won&#39;t just click on the first mass-market offer they see. At the end of the day, the realization remains that visibility is not created by the loudest terms, but by the cleverest positioning in the shadow of giants.</p>
<h2>The Curse of the Technology Behind the Language</h2>
<p>The decision for multilingualism was, looking back, like the attempt to fly two aeroplanes simultaneously. You think you simply write everything twice and that is that. But Google sees it differently. For a search engine, duplicate content is a red flag. If you are unlucky, the algorithm penalizes you for trying to dance at two weddings at once. The solution is precisely those hreflang attributes I have already mentioned. These small code snippets are the diplomatic representatives of my website. They tell Google: Hey, this here is the German version for the Germans and that there is the English version for the rest of the world. Please do not throw them into one pot.</p>
<p>It is fascinating and alarming in equal measure how much time one spends on technical overhead that has absolutely nothing to do with the actual content. I want to write about software development, about didactics in IT, about modern technologies. Instead I spend my evenings validating XML sitemaps and checking whether my canonical tags are correctly set. You become the bureaucrat of your own creativity. Every new page, every new blog post drags a long tail of administrative tasks behind it. If you do not do this, the contribution remains a lone voice crying in the wilderness. You no longer write for the joy of writing, you write for the indexing.</p>
<h2>The Arrogance of the Crawlers</h2>
<p>There is hardly anything more frustrating than the waiting time for Google&#39;s bots. These digital insects crawl through the net, index billions of pages, and decide over success or failure. You have no influence over when they come. You can invite them via the Search Console, essentially hold the door open for them and roll out a red carpet, but in the end they come when they want. This uncertainty is poison for anyone who wants to see fast results. You change a small thing that you are convinced will bring the breakthrough, and then you stare at an unchanged search bar for days.</p>
<p>During this time you begin to doubt yourself. Was the hreflang attribute really correct? Have I perhaps forgotten a quotation mark? Why is the English description still being displayed even though I have prioritized the German page? It is a psychological game. Google is the invisible referee who changes the rules during the game and never tells you exactly what you have done wrong. You receive only vague hints and have to figure out the rest through trial and error. It is a form of digital servitude into which we have voluntarily entered because we need visibility like the air we breathe.</p>
<p>I stand here with a website that is technically speaking flawless, but which is still fighting against the shadows of my namesakes. I have learned that IT lecturer is my anchor and that I must enjoy the English language with caution if I want to dominate the German market. It is a laborious path, characterized by technical trivialities and the constant concern for the goodwill of an algorithm. But ambition has been awakened. If Google wants to see me as an Englishman, I will prove to Google that I am the German IT expert it is looking for. The battle for Nico Hartmann has only just begun.</p>
<h2>The Tyranny of Backlinks or Why Quality Alone Is Never Enough</h2>
<p>After I had more or less navigated around the technical hurdles of multilingualism and metadata, I ran into the next great monster in the SEO ocean: authority. It is simply not enough for Google that I claim to be a competent IT lecturer. The search engine wants to see proof. In the digital age, this proof takes the form of backlinks. A backlink is basically a recommendation from another website. If a reputable IT site links to me, the Google algorithm thinks to itself that this Nico Hartmann is probably not a charlatan after all. So I began refining my strategy for reposting my blog entries on English-language platforms like <a href="https://medium.com/@getNi.Hartmann">Medium</a> or <a href="https://dev.to/nicohartmann">Dev.to</a>. The goal was clear: I wanted to use the reach of these giants to redirect a little of their digital shine onto my own small domain.</p>
<p>It is a strange form of digital prostitution. You write high-quality content, give it away practically for free to large platforms, and hope in return for a small, clickable link that leads the crawler back home. But here too complexity lurks. There are no-follow and do-follow links. The former are as useful for rankings as an alcohol-free beer at a hacker party, the latter are the digital gold. Of course, most large sites give out only the inferior links by default, in order not to dilute their own ranking. So you fight at the front line for recognition and are often thrown only crumbs. Nevertheless, this process is without alternative if you do not want to stand forever in the shadow of the other Nico Hartmanns of this world.</p>
<h2>The Dilemma of Content Recycling</h2>
<p>The reposting on English sites brought me to yet another painful realization. You cannot simply copy the same text one-to-one. Search engines are allergic to laziness. Whoever simply copies will be ignored. So I had to rewrite my own texts for the English platforms, adapt them, and give them a new spin. The whole thing was supposed to serve to underscore my expertise as a software developer, but in the end I spent more time rephrasing sentences than on actual programming. It is a paradoxical vicious circle: in order to be perceived as an expert in software development, you have to stop developing software and start becoming a full-time copywriter for yourself.</p>
<p>Particularly insidious is the psychological component. You observe the statistics. You see how many people have read the English article, and hope that at least a fraction of them will find their way to the original portfolio page. But most users remain in their ecosystem. They read on Medium, perhaps clap briefly, and move on. The search engine does register the connection, but the hoped-for massive rise in rankings often remains a quiet background noise. You feed the beast with ever more content, in the hope that it will be satisfied at some point and grant you your place in the sun. But the beast Google never clocks off.</p>
<h2>The Waiting Time and the Grace of the Crawlers</h2>
<p>When you have then scattered all backlinks and checked all hreflang attributes for the tenth time, the phase of absolute powerlessness begins. You can do nothing more but wait. The internet is a vast memory that unfortunately forgets very slowly and learns even more slowly. You check the Search Console daily. You look at the impressions, the clicks, the average position. It is like watching grass grow, except that the grass sometimes decides in the middle of the night to retreat back into the ground.</p>
<p>Once I suddenly appeared in first place for a completely irrelevant search term, simply because I had mentioned it once in a subordinate clause. That is the irony of SEO. You optimize like someone obsessed for IT lecturer and software development, and Google decides instead to rank you for a typo in a code example. You feel not understood by the artificial intelligence, but rather mocked. The crawlers are like civil servants in a dusty authority: they work according to rules that were established years ago, and have no interest in your personal urgency. If they decide that your English description is more important than your German one, then that is how it stays for now, until the file lands back on top of the pile a few weeks later.</p>
<h2>The Niche as a Lifeline</h2>
<p>In this chaos, concentration on the niche is the only way to not go mad. I have come to terms with the fact that I will never stand in first place for the word software development alone. Corporations with million-dollar budgets and whole armies of SEO specialists are fighting there. But for Nico Hartmann IT lecturer? That is my playing field. Here I can win if I remain persistent. The restriction here is not a weakness, but a necessary survival strategy. It is better to be the king of a small village than a beggar in a metropolis.</p>
<p>Nevertheless, this bitter aftertaste remains: that you are optimizing your digital presence not for people, but for a mathematical formula. Every time I leave out the word trainer just to not jeopardize the keyword density, it feels like a small betrayal of my actual work. We build websites for machines that pretend to decide for people. It is a simulation of relevance. When I write a text today, I no longer ask myself first whether it is useful for my students, but whether it offers enough semantic connections to satisfy Google&#39;s semantic search. We adapt our thinking to the structure of the search engine.</p>
<h2>The Outlook into Madness</h2>
<p>What remains at the end of this rant? SEO is a necessary evil, a modern form of indulgence trading. We pay not with money, but with time, nerves, and our linguistic integrity. I will continue to set hreflang tags, hunt backlinks, and polish my metadata. Not because it is fun, but because the alternative is digital invisibility. And in an industry where online presence is the new business card, you simply cannot afford to be invisible.</p>
<p>Perhaps Google will come to its senses in a few weeks. Perhaps the crawler will recognize that the German page is actually the better choice for German search queries. Until then I will continue to cast hateful glances at my monitor when the English description appears at the very top again. SEO is a fight you never win entirely, you can only keep fighting it until you either end up on top or lose the inclination. And since I am a stubborn IT lecturer, I will probably keep going until Google finally spells my name the way I want it.</p>
<blockquote>
<p>SEO is the art of dressing up for robots so that people can find you.</p>
</blockquote>
<blockquote>
<p>Multilingualism is a technical nightmare that has a preference for delivering the wrong search results.</p>
</blockquote>
<blockquote>
<p>Backlinks are the currency of the internet, but the exchange rate is merciless.</p>
</blockquote>
<blockquote>
<p>Your own identity must yield to the niche if you want to survive in the rankings.</p>
</blockquote>
<p>Sometimes I ask myself whether the other Nico Hartmanns out there are fighting the same battle. Whether the footballer is also frustrated because my blog post about software development appears above his latest match report. If so, that is at least a small consolation. In the arena of search results there are no friends, only competitors for the attention of an algorithm that knows no mercy. At the end of the day I sit again in front of the computer, adjust the next description, and hope for the best. Because whoever does not optimize does not exist. And I would quite like to exist, at least on page one.</p>
]]></description>
      <content:encoded><![CDATA[<p>There is this one moment after you have written the last line of code, optimized the last stylesheet, and finally uploaded the website to the server. You lean back, sip your coffee, and feel that childlike urge to type your own name into Google. Not because you don&#39;t know who you are, but because you are looking for validation. In my case, the result was sobering. Nico Hartmann is not a rare name. There are Nico Hartmanns who play football, Nico Hartmanns who are active in local politics, and probably hundreds of Nico Hartmanns who simply exist without bothering the internet with their presence. But there I stood, somewhere on page five or six, buried under an avalanche of namesakes. In that moment it became clear to me that I had not just built a website, but a digital monument standing in the deepest forest where nobody sees it. The need to climb up the rankings was suddenly no longer just a logical next step, but a matter of honour.</p>
<p>SEO is the magic word that gets hammered into you in every marketing blog. Search Engine Optimization. It sounds like an exact science, almost like alchemy, but in reality it is the only measure with which I can manipulate Google and the like. You try to outsmart a system that is smarter than yourself by feeding it exactly what it wants to hear. So I started equipping every single subpage with correct titles and descriptions. Every meta tag was polished, every headline was reconsidered three times. You feel a little like a fraudster trying to sneak into an exclusive party. The goal is clear: the search engines must like it. It is no longer about what the human reader thinks, but about what the algorithm spits out in its dark data centres.</p>
<h2>The Capitulation of Language Before Statistics</h2>
<p>The whole thing has a frightening similarity to LinkedIn. We all know this platform where people pat each other on the back and inflate their CVs until they almost burst. SEO is basically nothing other than digitally stroking one&#39;s own ego. The only difference is the target audience. Instead of recruiters or potential business partners, I want to impress robots. I write texts for beings without consciousness that count words, calculate keyword densities, and measure loading times in milliseconds. It is a bizarre form of modern communication in which the human being only plays the role of the supplier, while the bot decides whether you are relevant or not. When the bot smiles, the ranking rises. When the bot frowns, you remain buried in digital insignificance.</p>
<p>In theory, SEO sounds quite simple. You take a few keywords, build them into the text, and wait for the world to discover you. But reality catches up with you faster than you can spell keyword research. It gets damn quickly very complex. This is mainly because different search engines have different requirements. What Google loves, Bing might ignore, and DuckDuckGo has its own rules anyway. Moreover, you have to accept that you cannot be found for everything. You cannot be the king of the internet if you have no army. So you have to find an appropriate niche. For me that was quickly clear: IT lecturer and software development. Those are the terms with which I earn my bread and under which I want to be found.</p>
<p>However, this is where the strategic dilemma begins. I am also a trainer, and I would actually have loved to include that word in the title as well. It describes part of my identity and my daily work. But the hard reality of search engine optimization says no. If I were to throw even more keywords into the ring, I would dilute my focus. Every additional word is a potential disruptive factor that diminishes the relevance of the main terms. It is a constant balancing act between what you actually want to say and what the search engine still considers focused enough. SEO forces you into reduction. You mutilate your own description just to not appear too complex in the eyes of an algorithm. It is the capitulation of language before statistics.</p>
<h2>The Curse of Internationality</h2>
<p>As if that were not already enough work, the problem of multilingualism came along on top of everything else. I made a conscious decision in favour of multilingualism in German and English. The thought behind it was simple and perhaps a little naive: I simply wanted to be able to repost my blog entries on English-language sites as well. Internationality also always sounds good in a portfolio. My plan was to generate backlinks with this, which in turn would push my search ranking upward. A backlink from a reputable English site is like a gold medal for your own domain. So far, so logical. But the implementation transformed my clean website concept into a bureaucratic monster made of links and language tags.</p>
<p>The surprise came when after some time I actually searched for Nico Hartmann IT lecturer. A small triumph germinated within me when I actually saw my name in first place. But the joy lasted only seconds. Google did indeed present me at the very top, but the description was in English. There you sit in Germany, searching for a German term, and you get served an English snippet. That is the moment when you would love to throw the keyboard out of the window. Google had understood that I am important, but not which language is appropriate for this specific context. The algorithm rolled the dice and I lost.</p>
<p>So it was: back to the drawing board. I had to set hreflang attributes. For the layperson this sounds like technical triviality, for the website operator it is the attempt to draw the search engine a map that it should please not ignore. You explicitly tell Google which page is intended for which region and which language. And then the great waiting begins. SEO is not a sprint, it is a marathon through mud. You wait one to two weeks until the merciful crawlers from Google finally deign to look at the website anew. You feel like a supplicant before the throne of a capricious king, hoping that your corrections will this time be graciously received.</p>
<p>This entire process is a lesson in humility and frustration. You invest hours in optimization, only to discover that you are dependent on the whims of a corporation that changes its algorithms faster than you can adjust your own description. It is a permanent fight against windmills, where the windmills consist of server farms and the lance is a text editor. You are not optimizing for the user, you are optimizing for the machine, in the hope that in the end a human being will still find their way to the page. It is an absurd theatre in which we all play our roles, just to grab a small piece of visibility in an ocean of information.</p>
<p>And while I sit here waiting for the next crawl, I ask myself whether all of this is really worth the effort. The answer is a frustrated yes, because in today&#39;s world you do not exist if you are not on the first page. You submit to the dictate of the search engine, adapt your language, cross out words that you actually like, and set cryptic attributes in the header. All for that one moment when the search for your own name delivers exactly the result you have so laboriously purchased. It is a digital ego trip that costs you more nerves than any software development, but in the end vanity wins over reason.</p>
<h2>The Anatomy of Keywords</h2>
<p>When you dive deeper into this swamp, you quickly notice that keywords are like small pets. You have to care for them, feed them, and assign them exactly the right place. Choose the wrong ones and they bark at you or run away. In my case, the decision for IT lecturer and software development was a purely strategic choice. I could also have taken IT teacher or code coach, but who searches for those? You spend hours with tools that tell you how often a term is searched for, only to then discover that the competition for these terms is so gigantic that you as a lone fighter barely have a chance. So you search for the gap, for the golden middle ground between relevance and feasibility.</p>
<p>It is this constant balancing act between the ego and the algorithm. You might want to call yourself a &quot;visionary for digital transformation,&quot; but that is of little use if the market is simply demanding a &quot;Python course.&quot; This discrepancy forces one to break down their own identity into bite-sized morsels that can be easily digested by search engines.</p>
<p>In this context, keyword research is often less of an exact science and more of a psychological poker game against user intent. You analyze long-tail keywords and niche terms in the hope that the specific combination of expertise and location hits exactly the right nerve for those who won&#39;t just click on the first mass-market offer they see. At the end of the day, the realization remains that visibility is not created by the loudest terms, but by the cleverest positioning in the shadow of giants.</p>
<h2>The Curse of the Technology Behind the Language</h2>
<p>The decision for multilingualism was, looking back, like the attempt to fly two aeroplanes simultaneously. You think you simply write everything twice and that is that. But Google sees it differently. For a search engine, duplicate content is a red flag. If you are unlucky, the algorithm penalizes you for trying to dance at two weddings at once. The solution is precisely those hreflang attributes I have already mentioned. These small code snippets are the diplomatic representatives of my website. They tell Google: Hey, this here is the German version for the Germans and that there is the English version for the rest of the world. Please do not throw them into one pot.</p>
<p>It is fascinating and alarming in equal measure how much time one spends on technical overhead that has absolutely nothing to do with the actual content. I want to write about software development, about didactics in IT, about modern technologies. Instead I spend my evenings validating XML sitemaps and checking whether my canonical tags are correctly set. You become the bureaucrat of your own creativity. Every new page, every new blog post drags a long tail of administrative tasks behind it. If you do not do this, the contribution remains a lone voice crying in the wilderness. You no longer write for the joy of writing, you write for the indexing.</p>
<h2>The Arrogance of the Crawlers</h2>
<p>There is hardly anything more frustrating than the waiting time for Google&#39;s bots. These digital insects crawl through the net, index billions of pages, and decide over success or failure. You have no influence over when they come. You can invite them via the Search Console, essentially hold the door open for them and roll out a red carpet, but in the end they come when they want. This uncertainty is poison for anyone who wants to see fast results. You change a small thing that you are convinced will bring the breakthrough, and then you stare at an unchanged search bar for days.</p>
<p>During this time you begin to doubt yourself. Was the hreflang attribute really correct? Have I perhaps forgotten a quotation mark? Why is the English description still being displayed even though I have prioritized the German page? It is a psychological game. Google is the invisible referee who changes the rules during the game and never tells you exactly what you have done wrong. You receive only vague hints and have to figure out the rest through trial and error. It is a form of digital servitude into which we have voluntarily entered because we need visibility like the air we breathe.</p>
<p>I stand here with a website that is technically speaking flawless, but which is still fighting against the shadows of my namesakes. I have learned that IT lecturer is my anchor and that I must enjoy the English language with caution if I want to dominate the German market. It is a laborious path, characterized by technical trivialities and the constant concern for the goodwill of an algorithm. But ambition has been awakened. If Google wants to see me as an Englishman, I will prove to Google that I am the German IT expert it is looking for. The battle for Nico Hartmann has only just begun.</p>
<h2>The Tyranny of Backlinks or Why Quality Alone Is Never Enough</h2>
<p>After I had more or less navigated around the technical hurdles of multilingualism and metadata, I ran into the next great monster in the SEO ocean: authority. It is simply not enough for Google that I claim to be a competent IT lecturer. The search engine wants to see proof. In the digital age, this proof takes the form of backlinks. A backlink is basically a recommendation from another website. If a reputable IT site links to me, the Google algorithm thinks to itself that this Nico Hartmann is probably not a charlatan after all. So I began refining my strategy for reposting my blog entries on English-language platforms like <a href="https://medium.com/@getNi.Hartmann">Medium</a> or <a href="https://dev.to/nicohartmann">Dev.to</a>. The goal was clear: I wanted to use the reach of these giants to redirect a little of their digital shine onto my own small domain.</p>
<p>It is a strange form of digital prostitution. You write high-quality content, give it away practically for free to large platforms, and hope in return for a small, clickable link that leads the crawler back home. But here too complexity lurks. There are no-follow and do-follow links. The former are as useful for rankings as an alcohol-free beer at a hacker party, the latter are the digital gold. Of course, most large sites give out only the inferior links by default, in order not to dilute their own ranking. So you fight at the front line for recognition and are often thrown only crumbs. Nevertheless, this process is without alternative if you do not want to stand forever in the shadow of the other Nico Hartmanns of this world.</p>
<h2>The Dilemma of Content Recycling</h2>
<p>The reposting on English sites brought me to yet another painful realization. You cannot simply copy the same text one-to-one. Search engines are allergic to laziness. Whoever simply copies will be ignored. So I had to rewrite my own texts for the English platforms, adapt them, and give them a new spin. The whole thing was supposed to serve to underscore my expertise as a software developer, but in the end I spent more time rephrasing sentences than on actual programming. It is a paradoxical vicious circle: in order to be perceived as an expert in software development, you have to stop developing software and start becoming a full-time copywriter for yourself.</p>
<p>Particularly insidious is the psychological component. You observe the statistics. You see how many people have read the English article, and hope that at least a fraction of them will find their way to the original portfolio page. But most users remain in their ecosystem. They read on Medium, perhaps clap briefly, and move on. The search engine does register the connection, but the hoped-for massive rise in rankings often remains a quiet background noise. You feed the beast with ever more content, in the hope that it will be satisfied at some point and grant you your place in the sun. But the beast Google never clocks off.</p>
<h2>The Waiting Time and the Grace of the Crawlers</h2>
<p>When you have then scattered all backlinks and checked all hreflang attributes for the tenth time, the phase of absolute powerlessness begins. You can do nothing more but wait. The internet is a vast memory that unfortunately forgets very slowly and learns even more slowly. You check the Search Console daily. You look at the impressions, the clicks, the average position. It is like watching grass grow, except that the grass sometimes decides in the middle of the night to retreat back into the ground.</p>
<p>Once I suddenly appeared in first place for a completely irrelevant search term, simply because I had mentioned it once in a subordinate clause. That is the irony of SEO. You optimize like someone obsessed for IT lecturer and software development, and Google decides instead to rank you for a typo in a code example. You feel not understood by the artificial intelligence, but rather mocked. The crawlers are like civil servants in a dusty authority: they work according to rules that were established years ago, and have no interest in your personal urgency. If they decide that your English description is more important than your German one, then that is how it stays for now, until the file lands back on top of the pile a few weeks later.</p>
<h2>The Niche as a Lifeline</h2>
<p>In this chaos, concentration on the niche is the only way to not go mad. I have come to terms with the fact that I will never stand in first place for the word software development alone. Corporations with million-dollar budgets and whole armies of SEO specialists are fighting there. But for Nico Hartmann IT lecturer? That is my playing field. Here I can win if I remain persistent. The restriction here is not a weakness, but a necessary survival strategy. It is better to be the king of a small village than a beggar in a metropolis.</p>
<p>Nevertheless, this bitter aftertaste remains: that you are optimizing your digital presence not for people, but for a mathematical formula. Every time I leave out the word trainer just to not jeopardize the keyword density, it feels like a small betrayal of my actual work. We build websites for machines that pretend to decide for people. It is a simulation of relevance. When I write a text today, I no longer ask myself first whether it is useful for my students, but whether it offers enough semantic connections to satisfy Google&#39;s semantic search. We adapt our thinking to the structure of the search engine.</p>
<h2>The Outlook into Madness</h2>
<p>What remains at the end of this rant? SEO is a necessary evil, a modern form of indulgence trading. We pay not with money, but with time, nerves, and our linguistic integrity. I will continue to set hreflang tags, hunt backlinks, and polish my metadata. Not because it is fun, but because the alternative is digital invisibility. And in an industry where online presence is the new business card, you simply cannot afford to be invisible.</p>
<p>Perhaps Google will come to its senses in a few weeks. Perhaps the crawler will recognize that the German page is actually the better choice for German search queries. Until then I will continue to cast hateful glances at my monitor when the English description appears at the very top again. SEO is a fight you never win entirely, you can only keep fighting it until you either end up on top or lose the inclination. And since I am a stubborn IT lecturer, I will probably keep going until Google finally spells my name the way I want it.</p>
<blockquote>
<p>SEO is the art of dressing up for robots so that people can find you.</p>
</blockquote>
<blockquote>
<p>Multilingualism is a technical nightmare that has a preference for delivering the wrong search results.</p>
</blockquote>
<blockquote>
<p>Backlinks are the currency of the internet, but the exchange rate is merciless.</p>
</blockquote>
<blockquote>
<p>Your own identity must yield to the niche if you want to survive in the rankings.</p>
</blockquote>
<p>Sometimes I ask myself whether the other Nico Hartmanns out there are fighting the same battle. Whether the footballer is also frustrated because my blog post about software development appears above his latest match report. If so, that is at least a small consolation. In the arena of search results there are no friends, only competitors for the attention of an algorithm that knows no mercy. At the end of the day I sit again in front of the computer, adjust the next description, and hope for the best. Because whoever does not optimize does not exist. And I would quite like to exist, at least on page one.</p>
]]></content:encoded>
    </item>
    <item>
      <title>[Find] The Imminent End of Open Source</title>
      <link>https://malus.sh/blog</link>
      <guid isPermaLink="false">https://malus.sh/blog#1778068800000</guid>
      <pubDate>Wed, 06 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>Mike Nolan</em></p><p>What happens when AI breaks the rules of open source?</p><p><a href="https://malus.sh/blog">https://malus.sh/blog</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>Mike Nolan</em></p><p>What happens when AI breaks the rules of open source?</p><p><a href="https://malus.sh/blog">https://malus.sh/blog</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The wait is over</title>
      <link>https://nicohartmann.dev/en/funnies#16</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#16#1778068800000</guid>
      <pubDate>Wed, 06 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-16-IJYsS29-.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-16-IJYsS29-.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-16-IJYsS29-.webp" alt="The wait is over" style="max-width:100%;height:auto"/></p><p>I wonder how many decimal places can be precisely calculated with this?</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-16-IJYsS29-.webp" alt="The wait is over" style="max-width:100%;height:auto"/></p><p>I wonder how many decimal places can be precisely calculated with this?</p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Duality of Protocols</title>
      <link>https://nicohartmann.dev/en/funnies#15</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#15#1778068800000</guid>
      <pubDate>Wed, 06 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-15-DBscWUB1.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-15-DBscWUB1.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-15-DBscWUB1.webp" alt="The Duality of Protocols" style="max-width:100%;height:auto"/></p><p>TCP: I hereby formally confirm the receipt of data packet 1. Please send packet 2 now. UDP: YEET!</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-15-DBscWUB1.webp" alt="The Duality of Protocols" style="max-width:100%;height:auto"/></p><p>TCP: I hereby formally confirm the receipt of data packet 1. Please send packet 2 now. UDP: YEET!</p>]]></content:encoded>
    </item>
    <item>
      <title>[Find] Feed the bots</title>
      <link>https://maurycyz.com/projects/trap_bots/</link>
      <guid isPermaLink="false">https://maurycyz.com/projects/trap_bots/#1777982400000</guid>
      <pubDate>Tue, 05 May 2026 12:00:00 GMT</pubDate>
      <category>Finds</category>
      <description><![CDATA[<p><em>maurycyz</em></p><p>A guide on how to deliberately feed AI crawlers on one’s own website with irrelevant or falsified data and thereby keep them trapped.</p><p><a href="https://maurycyz.com/projects/trap_bots/">https://maurycyz.com/projects/trap_bots/</a></p>]]></description>
      <content:encoded><![CDATA[<p><em>maurycyz</em></p><p>A guide on how to deliberately feed AI crawlers on one’s own website with irrelevant or falsified data and thereby keep them trapped.</p><p><a href="https://maurycyz.com/projects/trap_bots/">https://maurycyz.com/projects/trap_bots/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>[Funny] The Eternal Struggle</title>
      <link>https://nicohartmann.dev/en/funnies#14</link>
      <guid isPermaLink="false">https://nicohartmann.dev/en/funnies#14#1777982400000</guid>
      <pubDate>Tue, 05 May 2026 12:00:00 GMT</pubDate>
      <category>Funnies</category>
      <enclosure url="https://nicohartmann.dev/assets/funny-14-Bhx4PEAE.webp" length="0" type="image/webp" />
      <media:content url="https://nicohartmann.dev/assets/funny-14-Bhx4PEAE.webp" type="image/webp" medium="image" />
      <description><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-14-Bhx4PEAE.webp" alt="The Eternal Struggle" style="max-width:100%;height:auto"/></p><p>Manual? Who needs manuals?</p>]]></description>
      <content:encoded><![CDATA[<p><img src="https://nicohartmann.dev/assets/funny-14-Bhx4PEAE.webp" alt="The Eternal Struggle" style="max-width:100%;height:auto"/></p><p>Manual? Who needs manuals?</p>]]></content:encoded>
    </item>
  </channel>
</rss>
