<!DOCTYPE html>
<html lang="en">
  <head>
  <meta charset="UTF-8" />

  <link rel="canonical" href="https://blog.kran.ai/sitemap.xml" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <meta
    name="description"
    content="Esben Kran"
  />

  <meta property="og:site_name" content="Esben Kran" />

  <link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicon-32.png" />
  <link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicon-16.png" />
  <link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicon-180.png" />

  <link rel="stylesheet" href="/styles.css" />

  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400..800&display=swap" rel="stylesheet" />

  
  <meta
    property="og:description"
    content="Esben Kran"
  />
   
  <meta property="og:title" content="Esben Kran" />
  <meta property="og:type" content="website" />
   

  <meta property="og:url" content="https://blog.kran.ai/sitemap.xml" />

   

  <title>
     
    &mdash; Esben Kran 
  </title>

  
</head>

  <body class="">
    <script>
      // Initial theme setup
      if (
        localStorage.theme === "dark" ||
        (!("theme" in localStorage) &&
          window.matchMedia("(prefers-color-scheme: dark)").matches)
      ) {
        document.querySelector("body").classList.add("theme-dark");
      }

      // Check terminal mode
      if (localStorage.terminalMode === "true") {
        document.querySelector("body").classList.add("theme-terminal");

        // Add terminal stylesheet dynamically
        var terminalStyle = document.createElement("link");
        terminalStyle.rel = "stylesheet";
        terminalStyle.id = "terminal-stylesheet";
        terminalStyle.href =
          '/assets/css/terminal-style.css';
        document.head.appendChild(terminalStyle);
      }
    </script>
    <nav class="flex align-center font-ui"><span class="flex-grow">
  <a class="internal-link plain brand" href="/">
    <video
      class="brain-logo"
      muted
      loop
      playsinline
      preload="auto"
      poster="/assets/brain_poster.png"
      width="120"
      height="96"
      aria-label="Rotating MRI brain"
    >
      <source src="/assets/brain_nav.mp4" type="video/mp4" />
    </video>
    <span class="brand-name">Esben Kran</span>
  </a>
  
</span>
<span class="flex-shrink ssr">
  <!-- If it is mobile width we remove /now -->
  <a href="/research" class="muted plain ssl mh hide-on-small-screen">Research</a>
  <a href="/shortform" class="muted plain ssl mh hide-on-small-screen"
    >Shortform</a
  >
</span>
<span
  id="theme-toggle"
  title="Toggle dark mode"
  aria-label="Toggle dark mode"
  type="button"
  role="switch"
  aria-checked="true"
>
  <div class="theme-toggle-slide"></div>
  <div class="theme-toggle-switch"></div>
</span>
</nav>
    <div class="wrap">
      <main class=""><?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://blog.kran.ai/about-heroes</loc>
    <lastmod>2026-06-23T08:40:12+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/audiovisual-reading</loc>
    <lastmod>2024-10-24T04:36:13+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/tools</loc>
    <lastmod>2025-04-18T23:55:13+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/agents</loc>
    <lastmod>2024-10-27T21:43:21+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/hiatus</loc>
    <lastmod>2024-10-11T06:54:27+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/cybermorphism</loc>
    <lastmod>2024-10-27T16:04:41+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/do</loc>
    <lastmod>2024-10-24T03:22:08+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/endgame</loc>
    <lastmod>2024-10-27T09:06:18+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/expensive-internet</loc>
    <lastmod>2024-10-28T12:21:19+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/optimism</loc>
    <lastmod>2024-10-29T05:34:18+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/sentware</loc>
    <lastmod>2024-11-01T20:36:15+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/misdeployment</loc>
    <lastmod>2024-11-14T07:45:13+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/the-ai-bubble</loc>
    <lastmod>2025-02-03T07:39:25+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/dont-give-up</loc>
    <lastmod>2025-05-15T02:19:51+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/agi-privacy</loc>
    <lastmod>2025-06-12T21:55:24+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/agi-security</loc>
    <lastmod>2025-06-18T23:17:39+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/learning-from-architecture</loc>
    <lastmod>2025-07-07T17:09:34+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/raising-for-the-endgame</loc>
    <lastmod>2025-07-21T06:48:06+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/how-to-host-a-hackathon</loc>
    <lastmod>2026-07-13T09:59:49+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/mediocre-intelligence-outstanding-results</loc>
    <lastmod>2025-09-08T02:12:13+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/to-an-18-year-old-me</loc>
    <lastmod>2025-09-17T21:59:33+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/surrounded-by-enemies</loc>
    <lastmod>2025-11-22T07:19:30+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/is-the-light-merely-for-the-learned</loc>
    <lastmod>2025-11-22T11:19:51+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/vibe-coding</loc>
    <lastmod>2025-12-06T19:43:06+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/falling</loc>
    <lastmod>2026-03-01T20:16:14+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/the-designer-the-craftsman-the-programmer</loc>
    <lastmod>2026-03-19T05:07:18+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/an-athletes-mind</loc>
    <lastmod>2026-05-30T08:18:42+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/codebase-is-execution-environment</loc>
    <lastmod>2026-05-30T08:26:01+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/alertbench</loc>
    <lastmod>2026-07-13T10:19:59+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/why-im-advising-10zeros</loc>
    <lastmod>2026-03-24T00:37:14+00:00</lastmod>
  </url>
  <url>
    <loc>https://blog.kran.ai/404.html</loc>
  </url>
  <url>
    <loc>https://blog.kran.ai/</loc>
  </url>
  <url>
    <loc>https://blog.kran.ai/research</loc>
  </url>
  <url>
    <loc>https://blog.kran.ai/shortform</loc>
  </url>
</urlset>
</main>
      <footer><div class="pn2 mn2 bt">
  <p class="footer-research-follow">
    Follow me on
    <a
      class="external-link"
      href="https://x.com/esbenkc"
      rel="noopener noreferrer"
      >X</a
    >
    for more.
  </p>
</div>
</footer>
    </div>

    <script>
      // Create terminal stylesheet link if not already created
      if (!document.getElementById("terminal-stylesheet")) {
        var terminalStylesheet = document.createElement("link");
        terminalStylesheet.rel = "stylesheet";
        terminalStylesheet.href =
          '/assets/css/terminal-style.css';
        terminalStylesheet.id = "terminal-stylesheet";
        terminalStylesheet.disabled =
          !document.body.classList.contains("theme-terminal");
        document.head.appendChild(terminalStylesheet);
      }

      // Get references to toggle elements
      var darkModeToggle = document.querySelector("#theme-toggle");
      var tocToggle = document.querySelector("#toc-toggle");

      // Dark mode toggle function
      function toggleTheme() {
        document.body.classList.toggle("theme-dark");
        updateThemeState();
      }

      // Update theme state in localStorage
      function updateThemeState() {
        let isDarkMode = document.body.classList.contains("theme-dark");
        let theme = isDarkMode ? "dark" : "light";
        localStorage.setItem("theme", theme);
        if (darkModeToggle) {
          darkModeToggle.setAttribute("aria-checked", isDarkMode.toString());
        }
      }

      // Toggle table of contents function
      function toggleTOC() {
        var toc = document.querySelector(".table-of-contents");
        if (toc) {
          toc.classList.toggle("toc-visible");
          var isVisible = toc.classList.contains("toc-visible");
          localStorage.setItem("tocVisible", isVisible.toString());
          if (tocToggle) {
            tocToggle.setAttribute("aria-checked", isVisible.toString());
          }
        }
      }

      // Initialize theme and UI elements
      function initializeTheme() {
        // Set dark mode toggle state
        let isDarkMode = document.body.classList.contains("theme-dark");
        if (darkModeToggle) {
          darkModeToggle.setAttribute("aria-checked", isDarkMode.toString());
        }

        // Set TOC toggle state
        if (tocToggle) {
          let tocVisible = localStorage.getItem("tocVisible") === "true";
          tocToggle.setAttribute("aria-checked", tocVisible.toString());

          // Show/hide TOC based on stored preference
          var toc = document.querySelector(".table-of-contents");
          if (toc && tocVisible) {
            toc.classList.add("toc-visible");
          }
        }

        // (terminal-mode toggle button removed; Shift+E still toggles it)
      }

      // Terminal mode functions
      function enableTerminalMode() {
        document.body.classList.add("theme-terminal");
        var terminalStylesheet = document.getElementById("terminal-stylesheet");
        if (terminalStylesheet) {
          terminalStylesheet.disabled = false;
        }
        localStorage.setItem("terminalMode", "true");

        // Add terminal indicator
        if (!document.getElementById("terminal-indicator")) {
          var indicator = document.createElement("div");
          indicator.id = "terminal-indicator";
          indicator.textContent = "TERMINAL MODE [Shift+E to exit]";
          indicator.style.position = "fixed";
          indicator.style.bottom = "10px";
          indicator.style.right = "10px";
          indicator.style.background = "rgba(0, 50, 0, 0.7)";
          indicator.style.color = "#00ff00";
          indicator.style.padding = "5px 10px";
          indicator.style.fontFamily = "monospace";
          indicator.style.zIndex = "9999";
          indicator.style.fontSize = "12px";
          indicator.style.borderRadius = "3px";
          document.body.appendChild(indicator);
        }
      }

      function disableTerminalMode() {
        document.body.classList.remove("theme-terminal");
        var terminalStylesheet = document.getElementById("terminal-stylesheet");
        if (terminalStylesheet) {
          terminalStylesheet.disabled = true;
        }
        localStorage.setItem("terminalMode", "false");

        // Remove terminal indicator
        var indicator = document.getElementById("terminal-indicator");
        if (indicator) {
          indicator.remove();
        }
      }

      function toggleTerminalMode() {
        if (document.body.classList.contains("theme-terminal")) {
          disableTerminalMode();
        } else {
          enableTerminalMode();
        }
      }

      // Add event listeners
      if (darkModeToggle) {
        darkModeToggle.addEventListener("click", toggleTheme);
      }

      if (tocToggle) {
        tocToggle.addEventListener("click", toggleTOC);
      }

      // Global keyboard shortcuts
      window.addEventListener("keydown", function (e) {
        // Skip if in input or textarea
        if (
          document.activeElement.tagName === "INPUT" ||
          document.activeElement.tagName === "TEXTAREA"
        ) {
          return;
        }

        // Dark mode toggle with Shift+D
        if (
          e.key === "D" &&
          e.shiftKey &&
          !e.ctrlKey &&
          !e.metaKey &&
          !e.altKey
        ) {
          toggleTheme();
          e.preventDefault();
        }

        // TOC toggle with Shift+T
        if (
          e.key === "T" &&
          e.shiftKey &&
          !e.ctrlKey &&
          !e.metaKey &&
          !e.altKey
        ) {
          toggleTOC();
          e.preventDefault();
        }

        // Terminal mode toggle with Shift+E
        if (
          e.key === "E" &&
          e.shiftKey &&
          !e.ctrlKey &&
          !e.altKey &&
          !e.metaKey
        ) {
          toggleTerminalMode();
          e.preventDefault();
        }
      });

      // Initialize on page load
      initializeTheme();

      // Brain logo: an interactive rotation scrubber. Horizontal cursor position
      // over the navbar maps to the brain's rotation; a spring eases the brain
      // toward that angle and springs it back to the rest position (90%) when the
      // cursor leaves. The <video> stays paused — we only seek its frame (the mp4
      // is all-intra so arbitrary-frame seeking is instant).
      (function () {
        var brain = document.querySelector(".brain-logo");
        var nav = document.querySelector("nav");
        if (!brain || brain.tagName !== "VIDEO" || !nav) return;

        var REST = 0.9; // rest phase (fraction of the loop)
        var STIFFNESS = 0.16; // spring pull toward target
        var DAMPING = 0.72; // velocity retention (slight overshoot)
        var SPINS = 1; // full rotations across the navbar width

        var dur = 0;
        var pos = REST,
          vel = 0,
          targetFrac = REST,
          engaged = false,
          raf = 0;

        function readDur() {
          dur = brain.duration && isFinite(brain.duration) ? brain.duration : 0;
        }
        function applyRest() {
          readDur();
          if (dur) {
            try {
              brain.currentTime = REST * dur;
            } catch (e) {}
          }
        }
        if (brain.readyState >= 1) applyRest();
        else brain.addEventListener("loadedmetadata", applyRest);

        function tick() {
          vel += (targetFrac - pos) * STIFFNESS;
          vel *= DAMPING;
          pos += vel;
          if (dur) {
            var t = pos * dur;
            if (t < 0) t = 0;
            else if (t > dur) t = dur;
            try {
              brain.currentTime = t;
            } catch (e) {}
          }
          var settled =
            Math.abs(targetFrac - pos) < 0.0008 && Math.abs(vel) < 0.0008;
          if (engaged || !settled) {
            raf = requestAnimationFrame(tick);
          } else {
            pos = targetFrac;
            vel = 0;
            raf = 0;
          }
        }
        function ensureLoop() {
          if (!raf) raf = requestAnimationFrame(tick);
        }

        nav.addEventListener("mousemove", function (e) {
          if (!dur) readDur();
          var r = nav.getBoundingClientRect();
          var frac = (e.clientX - r.left) / r.width; // 0..1 across the navbar
          if (frac < 0) frac = 0;
          else if (frac > 1) frac = 1;
          engaged = true;
          targetFrac = frac * SPINS; // cursor-X -> rotation angle
          ensureLoop();
        });
        nav.addEventListener("mouseleave", function () {
          engaged = false;
          targetFrac = REST; // spring back to the rest angle
          ensureLoop();
        });
      })();
    </script>
    <script
      async
      defer
      src="https://scripts.simpleanalyticscdn.com/latest.js"
    ></script>
    <noscript
      ><img
        src="https://queue.simpleanalyticscdn.com/noscript.gif"
        alt=""
        referrerpolicy="no-referrer-when-downgrade"
    /></noscript>
  </body>
</html>
