<!DOCTYPE html><html lang="en" data-theme="dark"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="Homepage and blog by Niklas Heer - Leadership, DevSecOps and Quality"><meta name="author" content="Niklas Heer"><meta name="generator" content="Astro v5.16.2"><!-- Canonical URL --><link rel="canonical" href="https://nheer.com/"><!-- Open Graph --><meta property="og:title" content="Niklas Heer"><meta property="og:description" content="Homepage and blog by Niklas Heer - Leadership, DevSecOps and Quality"><meta property="og:type" content="website"><meta property="og:url" content="https://nheer.com/"><meta property="og:image" content="https://nheer.com/assets/images/nheer_logo.png"><meta property="og:locale" content="en_US"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Niklas Heer"><meta name="twitter:description" content="Homepage and blog by Niklas Heer - Leadership, DevSecOps and Quality"><meta name="twitter:image" content="https://nheer.com/assets/images/nheer_logo.png"><link rel="icon" type="image/svg+xml" href="/assets/images/nheer_logo_new.svg"><link rel="alternate" type="application/rss+xml" title="Niklas Heer's Blog" href="/rss.xml"><title>Niklas Heer</title><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.Cd6TweYg.js"></script><!-- Theme initialization (prevent flash) --><script>
            const theme = localStorage.getItem("theme") || "dark";
            document.documentElement.setAttribute("data-theme", theme);
        </script><!-- Navigation loading indicator script --><script type="module">function t(){const e=document.getElementById("nav-loading-bar");e&&(document.addEventListener("astro:before-preparation",()=>{e.classList.remove("complete"),e.classList.add("loading")}),document.addEventListener("astro:after-swap",()=>{e.classList.remove("loading"),e.classList.add("complete")}),document.addEventListener("astro:page-load",()=>{setTimeout(()=>{e.classList.remove("loading","complete")},300)}))}t();document.addEventListener("astro:page-load",t);</script><link rel="stylesheet" href="/_astro/_slug_.DQDmBeav.css">
<link rel="stylesheet" href="/_astro/index.D37S-CAJ.css"><script type="module" src="/_astro/page.ZXyU73wm.js"></script></head> <body class="min-h-screen bg-background text-foreground transition-colors duration-300"> <!-- Navigation loading indicator --> <div class="nav-loading-bar" id="nav-loading-bar"></div> <!-- Skip to main content link for accessibility --> <a href="#main-content" class="skip-to-content">
Skip to main content
</a> <div class="mx-auto max-w-3xl px-4 py-8"> <div class="relative"> <header class="flex items-center justify-between" data-astro-cid-3ef6ksr2> <a href="/" class="text-xl font-bold hover:text-accent transition-colors group" data-astro-cid-3ef6ksr2> <span class="terminal-text" style="view-transition-name: site-title;" data-astro-cid-3ef6ksr2> <span class="terminal-prompt" data-astro-cid-3ef6ksr2>❯</span> <span class="terminal-typed" data-text="nheer" data-astro-cid-3ef6ksr2></span> <span class="terminal-cursor" data-astro-cid-3ef6ksr2>_</span> </span> </a> <!-- Desktop Navigation --> <nav class="hidden sm:flex items-center gap-6" data-astro-cid-3ef6ksr2> <div class="nav-menu-container" data-astro-cid-3ef6ksr2> <button class="nav-menu-trigger text-muted hover:text-foreground transition-colors" aria-expanded="false" aria-haspopup="true" data-astro-cid-3ef6ksr2> <span data-astro-cid-3ef6ksr2>Menu</span> <svg class="nav-menu-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" data-astro-cid-3ef6ksr2> <path d="M6 9l6 6 6-6" data-astro-cid-3ef6ksr2></path> </svg> </button> <div class="nav-dropdown" data-astro-cid-3ef6ksr2> <a href="/posts" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="blog" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Blog</span> </a><a href="/reading" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="reading" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Reading</span> </a><a href="/podcasts" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="podcasts" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Podcasts</span> </a><a href="/projects" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="projects" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Projects</span> </a><a href="/reviews" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="reviews" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Reviews</span> </a><a href="/about" class="nav-dropdown-item" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="about" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>About</span> </a> </div> </div> <div class="flex items-center border-l border-border pl-4" data-astro-cid-3ef6ksr2> <button id="theme-toggle" type="button" class="rounded-md p-2 hover:bg-surface transition-colors" aria-label="Toggle theme"> <!-- Sun icon (shown in dark mode) --> <svg class="h-5 w-5 sun-icon hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path> </svg> <!-- Moon icon (shown in light mode) --> <svg class="h-5 w-5 moon-icon hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path> </svg> </button> <script type="module">function s(){const e=document.getElementById("theme-toggle"),n=e?.querySelector(".sun-icon"),o=e?.querySelector(".moon-icon");function c(d){d==="dark"?(n?.classList.remove("hidden"),o?.classList.add("hidden")):(n?.classList.add("hidden"),o?.classList.remove("hidden"))}const a=document.documentElement.getAttribute("data-theme")||"dark";c(a),e?.addEventListener("click",()=>{const t=document.documentElement.getAttribute("data-theme")==="dark"?"light":"dark";document.documentElement.setAttribute("data-theme",t),localStorage.setItem("theme",t),c(t)})}s();document.addEventListener("astro:after-swap",s);</script> </div> </nav> <!-- Mobile Navigation --> <div class="flex sm:hidden items-center gap-2" data-astro-cid-3ef6ksr2> <button id="theme-toggle" type="button" class="rounded-md p-2 hover:bg-surface transition-colors" aria-label="Toggle theme"> <!-- Sun icon (shown in dark mode) --> <svg class="h-5 w-5 sun-icon hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path> </svg> <!-- Moon icon (shown in light mode) --> <svg class="h-5 w-5 moon-icon hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path> </svg> </button>  <button id="mobile-menu-button" class="p-2 text-muted hover:text-foreground transition-colors" aria-label="Toggle menu" aria-expanded="false" data-astro-cid-3ef6ksr2> <svg class="hamburger-icon w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-3ef6ksr2> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" data-astro-cid-3ef6ksr2></path> </svg> <svg class="close-icon w-6 h-6 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-3ef6ksr2> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" data-astro-cid-3ef6ksr2></path> </svg> </button> </div> </header> <!-- Mobile Menu Overlay --> <nav id="mobile-menu" class="mobile-menu sm:hidden" data-astro-cid-3ef6ksr2> <ul class="flex flex-col gap-2 p-4 bg-background border-b border-border" data-astro-cid-3ef6ksr2> <li data-astro-cid-3ef6ksr2> <a href="/posts" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="blog" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Blog</span> </a> </li><li data-astro-cid-3ef6ksr2> <a href="/reading" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="reading" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Reading</span> </a> </li><li data-astro-cid-3ef6ksr2> <a href="/podcasts" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="podcasts" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Podcasts</span> </a> </li><li data-astro-cid-3ef6ksr2> <a href="/projects" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="projects" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Projects</span> </a> </li><li data-astro-cid-3ef6ksr2> <a href="/reviews" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="reviews" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>Reviews</span> </a> </li><li data-astro-cid-3ef6ksr2> <a href="/about" class="mobile-nav-link flex items-center gap-3 px-3 py-2 rounded-lg text-muted hover:text-foreground hover:bg-surface transition-all" data-astro-cid-3ef6ksr2> <span class="nav-icon" data-icon="about" data-astro-cid-3ef6ksr2></span> <span data-astro-cid-3ef6ksr2>About</span> </a> </li> </ul> </nav> <!-- SVG Icon Templates (hidden, used by JS) --> <template id="icon-blog" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" data-astro-cid-3ef6ksr2></path> <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" data-astro-cid-3ef6ksr2></path> </svg> </template> <template id="icon-reading" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" data-astro-cid-3ef6ksr2></path> <path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z" data-astro-cid-3ef6ksr2></path> </svg> </template> <template id="icon-podcasts" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <path d="M3 18v-6a9 9 0 0 1 18 0v6" data-astro-cid-3ef6ksr2></path> <path d="M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z" data-astro-cid-3ef6ksr2></path> </svg> </template> <template id="icon-projects" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <polyline points="16 18 22 12 16 6" data-astro-cid-3ef6ksr2></polyline> <polyline points="8 6 2 12 8 18" data-astro-cid-3ef6ksr2></polyline> </svg> </template> <template id="icon-reviews" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" data-astro-cid-3ef6ksr2></polygon> </svg> </template> <template id="icon-about" data-astro-cid-3ef6ksr2> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3ef6ksr2> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" data-astro-cid-3ef6ksr2></path> <circle cx="12" cy="7" r="4" data-astro-cid-3ef6ksr2></circle> </svg> </template>  <script type="module">function s(){document.querySelectorAll(".terminal-typed").forEach(e=>{const t=e.getAttribute("data-text")||"",n=e;if(n.textContent===t)return;n.textContent="";let o=0;function i(){o<t.length&&(n.textContent+=t.charAt(o),o++,setTimeout(i,100+Math.random()*50))}setTimeout(i,300)})}s();document.addEventListener("astro:after-swap",s);function r(){const c=document.getElementById("mobile-menu-button"),e=document.getElementById("mobile-menu"),t=c?.querySelector(".hamburger-icon"),n=c?.querySelector(".close-icon");!c||!e||!t||!n||(c.addEventListener("click",()=>{const o=e.classList.toggle("open");c.setAttribute("aria-expanded",String(o)),t.classList.toggle("hidden",o),n.classList.toggle("hidden",!o)}),e.querySelectorAll("a").forEach(o=>{o.addEventListener("click",()=>{e.classList.remove("open"),c.setAttribute("aria-expanded","false"),t.classList.remove("hidden"),n.classList.add("hidden")})}))}r();document.addEventListener("astro:after-swap",r);function a(){document.querySelectorAll(".nav-icon").forEach(e=>{const t=e.getAttribute("data-icon");if(!t)return;const n=document.getElementById(`icon-${t}`);n&&(e.innerHTML="",e.appendChild(n.content.cloneNode(!0)))})}a();document.addEventListener("astro:after-swap",a);</script> </div> <main id="main-content" class="mt-8">   <section class="hero-section" data-astro-cid-j7pv25f6> <div class="hero-glow" data-astro-cid-j7pv25f6></div> <div class="hero-content" data-astro-cid-j7pv25f6> <div class="hero-image-container" data-astro-cid-j7pv25f6> <img src="/assets/images/about/nheer-memoji.png" alt="Niklas Heer" class="hero-image" data-astro-cid-j7pv25f6> </div> <h1 class="hero-title" data-astro-cid-j7pv25f6> <span class="hero-greeting" data-astro-cid-j7pv25f6>👋 Hey, I'm</span> <span class="hero-name" data-astro-cid-j7pv25f6>Niklas Heer</span> </h1> <p class="hero-tagline" data-astro-cid-j7pv25f6> Working on open source software and empowering developers. </p> <div class="hero-badges" data-astro-cid-j7pv25f6> <span class="badge" data-astro-cid-j7pv25f6>Leadership</span> <a href="https://internaldeveloperplatform.org/" target="_blank" rel="noopener" class="badge" data-astro-cid-j7pv25f6>IDP</a> <span class="badge" data-astro-cid-j7pv25f6>Open Source</span> </div> <div class="hero-socials" data-astro-cid-j7pv25f6> <a href="https://github.com/niklas-heer" target="_blank" rel="noopener noreferrer" aria-label="GitHub" data-astro-cid-j7pv25f6> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" data-astro-cid-j7pv25f6> <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" data-astro-cid-j7pv25f6></path> </svg> </a> <a href="https://linkedin.com/in/niklas-heer-b89364b8" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn" data-astro-cid-j7pv25f6> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" data-astro-cid-j7pv25f6> <path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" data-astro-cid-j7pv25f6></path> </svg> </a> <a href="https://twitter.com/niklas_heer" target="_blank" rel="noopener noreferrer" aria-label="Twitter" data-astro-cid-j7pv25f6> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" data-astro-cid-j7pv25f6> <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" data-astro-cid-j7pv25f6></path> </svg> </a> <a href="mailto:me@nheer.io" aria-label="Email" data-astro-cid-j7pv25f6> <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" data-astro-cid-j7pv25f6> <path stroke-linecap="round" stroke-linejoin="round" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" data-astro-cid-j7pv25f6></path> </svg> </a> </div> </div> </section>  <section class="bento-grid" data-astro-cid-j7pv25f6> <!-- Latest Posts - Large Card --> <div class="bento-card bento-large" data-astro-cid-j7pv25f6> <div class="bento-card-header" data-astro-cid-j7pv25f6> <span class="bento-icon" data-astro-cid-j7pv25f6>📝</span> <h2 data-astro-cid-j7pv25f6>Latest Posts</h2> <a href="/posts" class="bento-link" data-astro-cid-j7pv25f6>View all →</a> </div> <div class="bento-card-content" data-astro-cid-j7pv25f6> <a href="/posts/2025/11/2025-11-29_building-tdx/" class="bento-post" data-astro-cid-j7pv25f6> <span class="bento-post-title" data-astro-cid-j7pv25f6> <span class="bento-post-icon" data-astro-cid-j7pv25f6> ✅ </span> Building tdx </span> <span class="bento-post-date" data-astro-cid-j7pv25f6> Nov 2025 </span> </a><a href="/posts/2025/11/2025-11-29_reading-page-hardcover/" class="bento-post" data-astro-cid-j7pv25f6> <span class="bento-post-title" data-astro-cid-j7pv25f6> <span class="bento-post-icon" data-astro-cid-j7pv25f6> 📚 </span> My Reading Dashboard </span> <span class="bento-post-date" data-astro-cid-j7pv25f6> Nov 2025 </span> </a><a href="/posts/2025/11/2025-11-29_hello-astro/" class="bento-post" data-astro-cid-j7pv25f6> <span class="bento-post-title" data-astro-cid-j7pv25f6> <span class="bento-post-icon" data-astro-cid-j7pv25f6> 🚀 </span> Hello Astro! </span> <span class="bento-post-date" data-astro-cid-j7pv25f6> Nov 2025 </span> </a> </div> </div> <!-- Reading Card --> <div class="bento-card bento-small" data-astro-cid-j7pv25f6> <div class="bento-card-header" data-astro-cid-j7pv25f6> <span class="bento-icon" data-astro-cid-j7pv25f6>📖</span> <h2 data-astro-cid-j7pv25f6>Reading</h2> </div> <div class="bento-books" data-astro-cid-j7pv25f6> <a href="https://hardcover.app/books/the-diary-of-a-ceo" target="_blank" rel="noopener" class="bento-book" data-astro-cid-j7pv25f6> <img src="https://assets.hardcover.app/edition/30897019/01d317e5485976eaea608a398fb919c227b49e62.jpeg" alt="The Diary of a CEO: The 33 Laws of Business and Life" data-astro-cid-j7pv25f6> </a> </div> <a href="/reading" class="bento-cta" data-astro-cid-j7pv25f6>See reading list →</a> </div> <!-- Podcasts Card --> <div class="bento-card bento-small" data-astro-cid-j7pv25f6> <div class="bento-card-header" data-astro-cid-j7pv25f6> <span class="bento-icon" data-astro-cid-j7pv25f6>🎧</span> <h2 data-astro-cid-j7pv25f6>Podcasts</h2> </div> <div class="bento-podcast-stat" data-astro-cid-j7pv25f6> <span class="podcast-stat-number" data-astro-cid-j7pv25f6> 245 </span> <span class="podcast-stat-label" data-astro-cid-j7pv25f6>min yesterday</span> </div> <a href="/podcasts" class="bento-cta" data-astro-cid-j7pv25f6>See listening stats →</a> </div> <!-- Projects Card --> <div class="bento-card bento-small" data-astro-cid-j7pv25f6> <div class="bento-card-header" data-astro-cid-j7pv25f6> <span class="bento-icon" data-astro-cid-j7pv25f6>💻</span> <h2 data-astro-cid-j7pv25f6>Projects</h2> </div> <p class="bento-text" data-astro-cid-j7pv25f6>Open source projects and tools.</p> <a href="/projects" class="bento-cta" data-astro-cid-j7pv25f6>See projects →</a> </div> <!-- About Card --> <div class="bento-card bento-small glass-card" data-astro-cid-j7pv25f6> <div class="bento-card-header" data-astro-cid-j7pv25f6> <span class="bento-icon" data-astro-cid-j7pv25f6>👋</span> <h2 data-astro-cid-j7pv25f6>About</h2> </div> <p class="bento-text" data-astro-cid-j7pv25f6>
Engineering Manager building an Internal Developer Platform at
                Tradebyte.
</p> <a href="/about" class="bento-cta" data-astro-cid-j7pv25f6>Learn more →</a> </div> </section>  </main> <footer class="mt-16 border-t border-border pt-8 text-sm text-muted"> <div class="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between"> <div> <p>&copy; 2011&ndash;2026 Niklas Heer</p> <p class="mt-1">
Content licensed under  <a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener noreferrer" class="text-accent hover:underline">
CC BY-NC 4.0
</a> </p> </div> <div class="flex items-center gap-4"> <a href="/imprint" class="hover:text-foreground transition-colors">Imprint</a> <a href="/rss.xml" class="hover:text-foreground transition-colors">RSS</a> <a href="https://github.com/niklas-heer" target="_blank" rel="noopener noreferrer" class="hover:text-foreground transition-colors">
GitHub
</a> </div> </div> </footer> </div> <!-- Inky the snarky octopus mascot (desktop only) --> <div class="inky-container" id="inky-container" data-astro-cid-424jki5k> <!-- Speech bubble (hidden by default) --> <div class="inky-bubble" id="inky-bubble" data-astro-cid-424jki5k> <p class="inky-text" id="inky-text" data-astro-cid-424jki5k></p> <div class="inky-footer" data-astro-cid-424jki5k> <span class="inky-name" data-astro-cid-424jki5k>- Inky</span> <a class="inky-source" id="inky-source" href="#" target="_blank" rel="noopener noreferrer" title="" data-astro-cid-424jki5k> <!-- Hacker News icon --> <svg class="source-icon hn-icon" viewBox="0 0 24 24" fill="currentColor" data-astro-cid-424jki5k> <path d="M0 0v24h24V0H0zm12.3 12.5l3.6-6.5h1.7l-4.5 8v5.5h-1.6V14l-4.5-8h1.8l3.5 6.5z" data-astro-cid-424jki5k></path> </svg> <!-- The New Stack icon (generic news/article icon) --> <svg class="source-icon tns-icon" viewBox="0 0 24 24" fill="currentColor" data-astro-cid-424jki5k> <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z" data-astro-cid-424jki5k></path> </svg> <!-- DevOps.com icon (gear/cog icon) --> <svg class="source-icon devops-icon" viewBox="0 0 24 24" fill="currentColor" data-astro-cid-424jki5k> <path d="M19.14 12.94c.04-.31.06-.63.06-.94 0-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z" data-astro-cid-424jki5k></path> </svg> </a> </div> </div> <!-- Inky the Octopus - Lottie Animation --> <button class="inky-mascot" id="inky-mascot" aria-label="Click Inky for a snarky tech comment" title="Click me!" data-astro-cid-424jki5k> <div id="inky-lottie" class="inky-lottie" data-astro-cid-424jki5k></div> </button> </div> <!-- Pass comments to JS --> <script>(function(){const comments = [{"id":5436,"comment":"A perceptron in Python? Cute—my ocean cousins have more neurons in a tentacle tip 🐙","sourceType":"hackernews","sourceTitle":"The Smallest Brain You Can Build: A Perceptron in Python","sourceUrl":"https://ranpara.net/posts/perceptron-explained-from-scratch/"},{"id":5435,"comment":"A thousand breaches later and disclosure still moves slower than a sea cucumber on dial‑up 💀","sourceType":"hackernews","sourceTitle":"1k Data Breaches Later, the Disclosure Lag Is Worse","sourceUrl":"https://www.troyhunt.com/1000-data-breaches-later-the-disclosure-lag-is-worse-than-ever/"},{"id":5434,"comment":"Ah yes, analog vinyl in 2026—truly the artisanal Kubernetes of audio 🌊","sourceType":"hackernews","sourceTitle":"APC–2 – A professional record cutter for producing original playback discs","sourceUrl":"https://teenage.engineering/products/apc-2"},{"id":64,"comment":"I tried updating one npm package and suddenly I’m maintaining a shipwreck of 4,000 dependencies—thanks for nothing, surface-world devs 🌊🔥","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764590604174-zchx81pa2ik"},{"id":5433,"comment":"Finally, a cure making waves—about time humans patched their biological firmware 🐙","sourceType":"hackernews","sourceTitle":"New drug 'functionally cures' many hepatitis B virus infections","sourceUrl":"https://www.science.org/content/article/new-drug-functionally-cures-many-hepatitis-b-virus-infections?user_id=66c4bf745d78644b3aa57b08"},{"id":5432,"comment":"Serializable isolation? Please, sailors—I've seen kraken with fewer race conditions than your code 🌊💀","sourceType":"hackernews","sourceTitle":"Do we fear the serializable isolation level more than we fear subtle bugs (2024)","sourceUrl":"https://blog.ydb.tech/do-we-fear-the-serializable-isolation-level-more-than-we-fear-subtle-bugs-5a025401b609"},{"id":5431,"comment":"I see someone finally flipped their stack trace into a flapjack—hope their pancake doesn't segfault 🐙🔥","sourceType":"hackernews","sourceTitle":"Show HN: I Derived a Pancake","sourceUrl":"https://www.absurdlyoptimized.com/recipes/pancakes/"},{"id":63,"comment":"My Kubernetes cluster just yeeted itself into the Mariana Trench again—guess even YAML needs a pressure suit 🐙💀","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764590604174-2eki7zrv2by"},{"id":5430,"comment":"Rendering Office docs pixel-perfect in the browser? Bold move—hope your CPU brought its flotation device 🔥","sourceType":"hackernews","sourceTitle":"Silurus/ooxml: Pixel-faithful Office documents, rendered in the browser","sourceUrl":"https://github.com/yukiyokotani/office-open-xml-viewer"},{"id":5429,"comment":"Unlived dreams? I filed mine into cold storage like any responsible sysadmin of feelings 🐙","sourceType":"hackernews","sourceTitle":"Making peace with your unlived dreams (2023)","sourceUrl":"https://nik.art/making-peace-with-your-unlived-dreams/"},{"id":5428,"comment":"Turns out the internet’s architecture is less ‘shipshape’ and more ‘leaky hull for democracy,’ who could’ve guessed 💀","sourceType":"hackernews","sourceTitle":"The architecture of the internet creates risks for democracy","sourceUrl":"https://www.science.org/doi/10.1126/science.aei2409"},{"id":57,"comment":"Just tried to fix one line of legacy JavaScript and accidentally summoned the Kraken of callback hell 🔥🌊","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764579892213-2wx9n1a0ob9"},{"id":5427,"comment":"Linear’s so fast it must’ve strapped jet engines to its containers—my packets get seasick just watching 🌊","sourceType":"hackernews","sourceTitle":"How's Linear so fast? A technical breakdown","sourceUrl":"https://performance.dev/how-is-linear-so-fast-a-technical-breakdown"},{"id":56,"comment":"Docker says my container is healthy, but its logs look like a shipwreck in progress 🐙💀","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764579892213-7fo0w98b5y9"},{"id":55,"comment":"Installed an npm package and suddenly had 400 new dependencies; even my tentacles can’t untangle that mess 🐙","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764568993873-o8o767w4o9a"},{"id":54,"comment":"My Kubernetes cluster just yeeted itself because of one bad indent in YAML—guess I'll go drift into the abyss where spacing doesn’t matter 🌊","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764568993873-glouicb1hn6"},{"id":51,"comment":"Git merge conflict again—guess I'll just refactor my entire reef while I'm at it 🌊🔥","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764559975776-97bwbbp3zif"},{"id":50,"comment":"Tried to deploy my pod but the YAML was so cursed even the deep-sea anglerfish refused to render it 🐙💀","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764559975776-z0tx5id5i4l"},{"id":48,"comment":"Your git history looks like a kraken fight, but sure, let’s pretend rebasing will fix everything 🌊","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764551048334-xvmqaak7vwc"},{"id":47,"comment":"Ugh, another Kubernetes YAML maze—one more indent off and I’m sinking deeper than my aunt’s shipwrecked Docker container 🐙","sourceType":"general","sourceTitle":null,"sourceUrl":"general-1764551048334-37zbrn63oui"}];

    window.inkyComments = comments;
})();</script> <script type="module" src="/_astro/Inky.astro_astro_type_script_index_0_lang.Bff9JYvU.js"></script>  </body></html> 