<!DOCTYPE html><html lang="de" dir="ltr" data-astro-cid-qup72gqn style="--brandPrimary: #633658;--brandSecondary: #bc748f;--brandNeutral: #a59aa3;--brandOutline: #9f661e;"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><script>
      (() => {
        if (window.location.pathname !== '/') return
        try {
          const preference = localStorage.getItem('site-language')
          const browserLanguage = navigator.languages
            .map((language) => language.slice(0, 2).toLowerCase())
            .find((language) => language === 'de' || language === 'en')
          if (preference === 'en' || (preference !== 'de' && browserLanguage === 'en')) window.location.replace('/en/')
        } catch {
          if (/^en(?:-|$)/i.test(navigator.language)) window.location.replace('/en/')
        }
      })()
    </script><link rel="alternate" type="application/rss+xml" title="Rei's World RSS-Feed" href="/blog/rss.xml"><!-- favicon --><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- fonts are otherwise only discovered after the stylesheet has loaded --><link rel="preload" href="/fonts/AtkinsonHyperlegibleNext-Regular.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="/_astro/caveat-latin-wght-normal.C1hSzPvX.woff2" as="font" type="font/woff2" crossorigin><!-- theme colors from config --><title>Rei's World</title><link rel="canonical" href="https://stargazer.at/"><meta name="description" content="Persönlicher Blog über Technik, Linux, Streaming und alles, was neugierig macht."><meta name="robots" content="index, follow"><meta property="og:title" content="Rei's World"><meta property="og:type" content="website"><meta property="og:image" content="https://stargazer.at/rei-portrait.png"><meta property="og:url" content="https://stargazer.at/"><meta property="og:description" content="Persönlicher Blog über Technik, Linux, Streaming und alles, was neugierig macht."><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Rei's World"><meta name="twitter:image" content="https://stargazer.at/rei-portrait.png"><meta name="twitter:description" content="Persönlicher Blog über Technik, Linux, Streaming und alles, was neugierig macht."><meta name="author" content="Rei"><!-- Enable Astro View Transitions for all browsers --><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.CAqDO0tx.js"></script><link rel="stylesheet" href="/_astro/DefaultLayout.kP5h9Lxv.css"><style>.hero-frame[data-astro-cid-bbe6dxrz]{overflow:hidden;border:1px solid var(--border-color-subtle);border-radius:var(--radius-l);background:var(--background-color);box-shadow:var(--elevation-3)}.hero-image[data-astro-cid-bbe6dxrz]{margin:0;aspect-ratio:16 / 10}.hero-image[data-astro-cid-bbe6dxrz] img[data-astro-cid-bbe6dxrz]{display:block;width:100%;height:100%;object-fit:cover;object-position:center 38%}.hero-content[data-astro-cid-bbe6dxrz]{display:grid;justify-items:start;gap:var(--space-s);padding:var(--space-m)}.hero-content[data-astro-cid-bbe6dxrz] h1[data-astro-cid-bbe6dxrz]{margin:0;color:var(--link-color);font-size:var(--font-size-6);line-height:1.05}.eyebrow[data-astro-cid-bbe6dxrz]{margin:0;color:var(--link-color);font-size:var(--font-size--1);font-weight:700;letter-spacing:.04em;text-transform:uppercase}.hero-lede[data-astro-cid-bbe6dxrz]{margin:0;font-size:var(--font-size-0)}.hero-actions[data-astro-cid-bbe6dxrz]{display:flex;flex-wrap:wrap;gap:var(--space-s);margin-block-start:var(--space-2xs)}@media(min-width:64rem){.hero-frame[data-astro-cid-bbe6dxrz]{display:grid;min-height:30rem}.hero-image[data-astro-cid-bbe6dxrz],.hero-content[data-astro-cid-bbe6dxrz]{grid-area:1 / 1}.hero-image[data-astro-cid-bbe6dxrz]{position:relative;aspect-ratio:auto}.hero-image[data-astro-cid-bbe6dxrz]:after{position:absolute;inset:0;background:linear-gradient(90deg,rgb(24 16 26 / .94) 0%,rgb(24 16 26 / .84) 28%,rgb(24 16 26 / .4) 46%,transparent 62%);content:""}.hero-image[data-astro-cid-bbe6dxrz] img[data-astro-cid-bbe6dxrz]{position:absolute;inset:0;object-position:left center}.hero-content[data-astro-cid-bbe6dxrz]{position:relative;z-index:1;align-self:center;width:min(26rem,40%);padding:var(--space-l);color:#f6eef4}.hero-content[data-astro-cid-bbe6dxrz] h1[data-astro-cid-bbe6dxrz]{color:#fff}.eyebrow[data-astro-cid-bbe6dxrz]{color:#efbad2}}@media(min-width:64rem)and (prefers-reduced-motion:no-preference){.hero-image[data-astro-cid-bbe6dxrz] img[data-astro-cid-bbe6dxrz]{will-change:transform}}.welcome-band[data-astro-cid-6sxvzthc]{padding-block:var(--space-xl);border-block:1px solid var(--border-color-subtle);background:color-mix(in srgb,var(--brand-secondary) 12%,var(--background-color))}.welcome-grid[data-astro-cid-6sxvzthc]{display:grid;gap:var(--space-s)}.welcome-label[data-astro-cid-6sxvzthc]{margin:0;color:var(--link-color);font-family:var(--font-heading);font-size:var(--font-size-3);font-weight:700}.welcome-copy[data-astro-cid-6sxvzthc]{max-width:56rem;margin:0;font-size:var(--font-size-1)}.home-section[data-astro-cid-6sxvzthc]{padding-block:var(--space-2xl)}.section-heading[data-astro-cid-6sxvzthc]{display:flex;flex-wrap:wrap;align-items:end;justify-content:space-between;gap:var(--space-s);margin-block-end:var(--space-l)}.eyebrow[data-astro-cid-6sxvzthc]{margin:0 0 var(--space-3xs);color:var(--link-color);font-size:var(--font-size--1);font-weight:700;letter-spacing:.04em;text-transform:uppercase}.section-heading[data-astro-cid-6sxvzthc] h2[data-astro-cid-6sxvzthc]{margin:0;color:var(--link-color)}.section-link[data-astro-cid-6sxvzthc]{font-weight:700}.post-cards[data-astro-cid-6sxvzthc],.interest-grid[data-astro-cid-6sxvzthc]{display:grid;gap:var(--space-m);margin:0;padding:0;list-style:none}.post-card[data-astro-cid-6sxvzthc],.interest-card[data-astro-cid-6sxvzthc]{position:relative;height:100%;padding:var(--space-m);border:1px solid var(--border-color-subtle);border-radius:var(--radius-l);background:color-mix(in srgb,var(--brand-secondary) 7%,var(--background-color))}.post-card[data-astro-cid-6sxvzthc]{transition:border-color var(--animation-speed-fast),translate var(--animation-speed-fast)}.post-card[data-astro-cid-6sxvzthc]:hover,.post-card[data-astro-cid-6sxvzthc]:focus-within{translate:0 -3px;border-color:var(--brand-secondary)}.post-card[data-astro-cid-6sxvzthc] h3[data-astro-cid-6sxvzthc]{margin-block:var(--space-2xs);font-family:var(--font-heading);font-size:var(--font-size-2);line-height:1.15}.post-card[data-astro-cid-6sxvzthc] h3[data-astro-cid-6sxvzthc] a[data-astro-cid-6sxvzthc]:after{position:absolute;inset:0;content:""}.post-date[data-astro-cid-6sxvzthc]{margin:0;color:var(--link-color);font-size:var(--font-size--1);font-weight:700}.post-lang[data-astro-cid-6sxvzthc]{font-weight:400}.post-excerpt[data-astro-cid-6sxvzthc]{display:-webkit-box;overflow:hidden;margin:0;-webkit-box-orient:vertical;-webkit-line-clamp:4;line-clamp:4}.interest-icon[data-astro-cid-6sxvzthc]{display:inline-grid;place-items:center;width:3rem;height:3rem;border-radius:var(--radius-m);background:color-mix(in srgb,var(--brand-secondary) 22%,transparent);color:var(--link-color)}.interest-card[data-astro-cid-6sxvzthc] h3[data-astro-cid-6sxvzthc]{margin-block:var(--space-xs) var(--space-2xs);font-family:var(--font-heading);font-size:var(--font-size-2)}.interest-card[data-astro-cid-6sxvzthc] p[data-astro-cid-6sxvzthc]{margin-block:0 var(--space-xs)}.interest-card[data-astro-cid-6sxvzthc] a[data-astro-cid-6sxvzthc]{font-weight:700}@media(min-width:52rem){.post-cards[data-astro-cid-6sxvzthc],.interest-grid[data-astro-cid-6sxvzthc]{grid-template-columns:repeat(3,minmax(0,1fr))}.welcome-grid[data-astro-cid-6sxvzthc]{grid-template-columns:.7fr 1.3fr;align-items:start;gap:var(--space-l)}}
</style><style>[data-astro-transition-scope="astro-neigrlxa-1"] { view-transition-name: astro-neigrlxa-1; }@layer astro { ::view-transition-old(astro-neigrlxa-1) { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeOut; }::view-transition-new(astro-neigrlxa-1) { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeIn; }[data-astro-transition=back]::view-transition-old(astro-neigrlxa-1) { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeOut; }[data-astro-transition=back]::view-transition-new(astro-neigrlxa-1) { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeIn; } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-neigrlxa-1"],
			[data-astro-transition-fallback="old"][data-astro-transition-scope="astro-neigrlxa-1"] { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeOut; }[data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-neigrlxa-1"],
			[data-astro-transition-fallback="new"][data-astro-transition-scope="astro-neigrlxa-1"] { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeIn; }[data-astro-transition=back][data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-neigrlxa-1"],
			[data-astro-transition=back][data-astro-transition-fallback="old"][data-astro-transition-scope="astro-neigrlxa-1"] { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeOut; }[data-astro-transition=back][data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-neigrlxa-1"],
			[data-astro-transition=back][data-astro-transition-fallback="new"][data-astro-transition-scope="astro-neigrlxa-1"] { 
	animation-duration: 180ms;
	animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
	animation-fill-mode: both;
	animation-name: astroFadeIn; }</style></head> <body data-astro-cid-qup72gqn style="--brandPrimary: #633658;--brandSecondary: #bc748f;--brandNeutral: #a59aa3;--brandOutline: #9f661e;"> <header> <div class="skip-link" data-astro-cid-nwlnqdlu> <a href="#main-content" data-astro-cid-nwlnqdlu>Skip to main content</a> </div> <script>(function(){const target = "#main-content";

  // variables
  const skipLink = document.querySelector('.skip-link a')

  // execution
  skipLink.addEventListener('keydown', (event) => {
    if (!event.target.closest('a')) return
    const key = event.key

    if (key !== 'Enter') return
    event.preventDefault()

    if (document.querySelector(target)) {
      const targetElement = document.querySelector(target)
      targetElement.setAttribute('tabindex', '-1')
      targetElement.focus()
    } else if (!document.querySelector(target) && document.querySelector('h1')) {
      const h1 = document.querySelector('h1')
      h1.setAttribute('tabindex', '-1')
      h1.focus()
    } else {
      console.warn('SkipLink is not set, either missing an h1 or main content id on the page.')
    }
  })
})();</script> <!-- Initialize preference components --> <div hidden> <button class="highcontrast-toggle" aria-pressed="false" aria-label="Toggle High Contrast" data-astro-cid-e2vv7uii data-astro-transition-persist="astro-trxdy3h5-2"> <span class="icon icon-off" data-astro-cid-e2vv7uii>  <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-e2vv7uii><circle cx="12" cy="12" r="10" data-astro-cid-e2vv7uii></circle><path d="M12 18a6 6 0 0 0 0-12v12z" data-astro-cid-e2vv7uii></path></svg>  </span> <span class="icon icon-on" data-astro-cid-e2vv7uii>  <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-e2vv7uii> <path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" data-astro-cid-e2vv7uii></path> <path d="M14.084 14.158a3 3 0 0 1-4.242-4.242" data-astro-cid-e2vv7uii></path> <path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" data-astro-cid-e2vv7uii></path> <path d="m2 2 20 20" data-astro-cid-e2vv7uii></path> </svg>  </span> </button> <script>
  // Only run once
  if (!window.highContrastInitialized) {
    window.highContrastInitialized = true

    const root = document.documentElement
    let highContrast = localStorage.getItem('highContrast')

    /**
     * Dispatch highcontrast:change event for external listeners
     * @param {boolean} enabled - Whether high contrast is enabled
     */
    const dispatchChange = (enabled) => {
      document.dispatchEvent(
        new CustomEvent('highcontrast:change', {
          detail: { enabled },
          bubbles: true,
        })
      )
    }

    const enableHighContrast = (store = true) => {
      const toggles = document.querySelectorAll('.highcontrast-toggle')
      root.classList.add('high-contrast')
      toggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'true'))
      if (store) localStorage.setItem('highContrast', 'enabled')
      dispatchChange(true)
    }

    const disableHighContrast = (store = true) => {
      const toggles = document.querySelectorAll('.highcontrast-toggle')
      root.classList.remove('high-contrast')
      toggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'false'))
      if (store) localStorage.setItem('highContrast', 'disabled')
      dispatchChange(false)
    }

    const initializeHighContrast = () => {
      if (highContrast) {
        highContrast === 'enabled' ? enableHighContrast(false) : disableHighContrast(false)
      }
    }

    /**
     * Expose global highContrast API for external control
     * Can be used by launchers, command palettes, or other UI
     */
    window.highContrast = {
      enable: () => enableHighContrast(),
      disable: () => disableHighContrast(),
      toggle: () => {
        root.classList.contains('high-contrast') ? disableHighContrast() : enableHighContrast()
      },
      isEnabled: () => root.classList.contains('high-contrast'),
    }

    // execution
    initializeHighContrast()

    // Add click handlers to all toggles
    document.addEventListener('click', (e) => {
      if (e.target.closest('.highcontrast-toggle')) {
        window.highContrast.toggle()
      }
    })

    // Listen for launcher actions (integration with accessible-astro-launcher)
    document.addEventListener('launcher:action', (e) => {
      if (e.detail?.action === 'toggle-high-contrast') {
        window.highContrast.toggle()
      }
    })

    // Listen for view transitions
    document.addEventListener('astro:after-swap', () => {
      highContrast = localStorage.getItem('highContrast')
      initializeHighContrast()
    })
  }
</script>  <button class="reducedmotion-toggle" aria-pressed="false" aria-label="Toggle Reduced Motion" data-initial-mode="auto" data-astro-cid-d7ldshlk data-astro-transition-persist="astro-a3sr4pof-3"> <span class="icon icon-off" data-astro-cid-d7ldshlk>  <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-d7ldshlk> <rect x="14" y="3" width="5" height="18" rx="1" data-astro-cid-d7ldshlk></rect> <rect x="5" y="3" width="5" height="18" rx="1" data-astro-cid-d7ldshlk></rect> </svg>  </span> <span class="icon icon-on" data-astro-cid-d7ldshlk>  <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-d7ldshlk> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z" data-astro-cid-d7ldshlk></path> </svg>  </span> </button> <script>(function(){const initialMode = "auto";

  // Only run once
  if (!window.reducedMotionInitialized) {
    window.reducedMotionInitialized = true

    const root = document.documentElement
    let reducedMotion = localStorage.getItem('reducedMotion')

    /**
     * Dispatch reducemotion:change event for external listeners
     * @param {boolean} enabled - Whether reduced motion is enabled
     */
    const dispatchChange = (enabled) => {
      document.dispatchEvent(
        new CustomEvent('reducemotion:change', {
          detail: { enabled },
          bubbles: true,
        })
      )
    }

    const enableReducedMotion = (store = true) => {
      const toggles = document.querySelectorAll('.reducedmotion-toggle')
      root.classList.add('reduce-motion')
      toggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'true'))
      if (store) localStorage.setItem('reducedMotion', 'enabled')
      dispatchChange(true)
    }

    const disableReducedMotion = (store = true) => {
      const toggles = document.querySelectorAll('.reducedmotion-toggle')
      root.classList.remove('reduce-motion')
      toggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'false'))
      if (store) localStorage.setItem('reducedMotion', 'disabled')
      dispatchChange(false)
    }

    const checkSystemPreference = () => {
      if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
        enableReducedMotion(false)
      } else {
        disableReducedMotion(false)
      }
    }

    const initializeReducedMotion = () => {
      if (reducedMotion) {
        reducedMotion === 'enabled' ? enableReducedMotion(false) : disableReducedMotion(false)
        return
      }

      switch (initialMode) {
        case 'on':
          enableReducedMotion()
          break
        case 'off':
          disableReducedMotion()
          break
        default: // 'auto'
          checkSystemPreference()
      }
    }

    /**
     * Expose global reducedMotion API for external control
     * Can be used by launchers, command palettes, or other UI
     */
    window.reducedMotion = {
      enable: () => enableReducedMotion(),
      disable: () => disableReducedMotion(),
      toggle: () => {
        root.classList.contains('reduce-motion') ? disableReducedMotion() : enableReducedMotion()
      },
      isEnabled: () => root.classList.contains('reduce-motion'),
    }

    // execution
    initializeReducedMotion()

    // Add click handlers to all toggles
    document.addEventListener('click', (e) => {
      if (e.target.closest('.reducedmotion-toggle')) {
        window.reducedMotion.toggle()
      }
    })

    // Listen for launcher actions (integration with accessible-astro-launcher)
    document.addEventListener('launcher:action', (e) => {
      if (e.detail?.action === 'toggle-reduced-motion') {
        window.reducedMotion.toggle()
      }
    })

    // Listen for view transitions
    document.addEventListener('astro:after-swap', () => {
      reducedMotion = localStorage.getItem('reducedMotion')
      initializeReducedMotion()
    })
  }
})();</script>  </div> <div id="main-navigation" class="py-8"> <div class="container"> <a href="/" class="flex items-center gap-2 link" data-astro-cid-lhox4pm7><span class="text-sm font-bold sm:text-lg">Rei&#39;s World</span> </a> <div class="wrapper"> <nav class="desktop-menu" aria-label="Hauptnavigation"> <ul class="menu"> <li class="menu-item "> <a href="/" class="is-active link" aria-current="page" data-astro-cid-lhox4pm7>Startseite</a> </li><li class="menu-item "> <a href="/blog" class="link" data-astro-cid-lhox4pm7>Blog</a> </li><li class="menu-item "> <a href="/about" class="link" data-astro-cid-lhox4pm7>Über mich</a> </li><li class="menu-item "> <a href="/projects" class="link" data-astro-cid-lhox4pm7>Projekte</a> </li><li class="menu-item "> <a href="https://go.stargazer.at/wishlist" class="link link--external" rel="noopener noreferrer" target="_blank" data-astro-cid-lhox4pm7>Wunschliste   <svg aria-hidden="true" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-lhox4pm7> <path d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" data-astro-cid-lhox4pm7></path> </svg>  <span class="sr-only" data-astro-cid-lhox4pm7>Opens in a new tab</span>  </a> </li><li class="menu-item "> <a href="https://links.stargazer.at" class="link link--external" rel="noopener noreferrer" target="_blank" data-astro-cid-lhox4pm7>Links   <svg aria-hidden="true" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-lhox4pm7> <path d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" data-astro-cid-lhox4pm7></path> </svg>  <span class="sr-only" data-astro-cid-lhox4pm7>Opens in a new tab</span>  </a> </li> </ul> </nav> <nav class="language-switcher" aria-label="Sprache" data-astro-cid-a2mxz4y6> <a href="/" data-language="de" aria-label="Deutsch" title="Deutsch" aria-current="page" data-astro-cid-a2mxz4y6>DE</a> <a href="/en/" data-language="en" aria-label="English" title="English" data-astro-cid-a2mxz4y6>EN</a> </nav> <script type="module">document.addEventListener("click",t=>{if(t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;const a=t.target.closest(".language-switcher");if(!a)return;const r=t.target.closest("a"),o=r??a.querySelector('a:not([aria-current="page"])');o?.dataset.language&&localStorage.setItem("site-language",o.dataset.language);const e=a.querySelector('a:not([aria-current="page"])');!e||r===e||(t.preventDefault(),t.stopPropagation(),e.click())},!0);</script> <button class="darkmode-toggle" aria-pressed="false" aria-label="Hell- und Dunkelmodus umschalten" data-initial-mode="auto" title="Hell- und Dunkelmodus umschalten" data-astro-cid-pvqsmiwf data-astro-transition-persist="astro-dafcdbmg-4"> <span class="icon icon-light" data-astro-cid-pvqsmiwf> <svg width="1em" height="1em" viewBox="0 0 24 24" aria-hidden="true" data-icon="lucide:sun">   <symbol id="ai:lucide:sun"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g></symbol><use href="#ai:lucide:sun"></use>  </svg> </span> <span class="icon icon-dark" data-astro-cid-pvqsmiwf> <svg width="1em" height="1em" viewBox="0 0 24 24" aria-hidden="true" data-icon="lucide:moon">   <symbol id="ai:lucide:moon"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></symbol><use href="#ai:lucide:moon"></use>  </svg> </span> </button> <script>(function(){const initialMode = "auto";

  // Only run once
  if (!window.darkModeInitialized) {
    window.darkModeInitialized = true

    const root = document.documentElement
    let darkMode = localStorage.getItem('darkMode')

    /**
     * Dispatch darkmode:change event for external listeners
     * @param {boolean} enabled - Whether dark mode is enabled
     */
    const dispatchChange = (enabled) => {
      document.dispatchEvent(
        new CustomEvent('darkmode:change', {
          detail: { enabled },
          bubbles: true,
        })
      )
    }

    const enableDarkMode = (store = true) => {
      const darkModeToggles = document.querySelectorAll('.darkmode-toggle')
      root.classList.add('darkmode')
      root.style.colorScheme = 'dark'
      darkModeToggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'true'))
      if (store) localStorage.setItem('darkMode', 'enabled')
      dispatchChange(true)
    }

    const disableDarkMode = (store = true) => {
      const darkModeToggles = document.querySelectorAll('.darkmode-toggle')
      root.classList.remove('darkmode')
      root.style.colorScheme = 'light'
      darkModeToggles.forEach((toggle) => toggle.setAttribute('aria-pressed', 'false'))
      if (store) localStorage.setItem('darkMode', 'disabled')
      dispatchChange(false)
    }

    const checkPreference = () => {
      if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
        enableDarkMode(false)
      } else {
        disableDarkMode(false)
      }
    }

    const initializeDarkMode = () => {
      if (darkMode) {
        darkMode === 'enabled' ? enableDarkMode() : disableDarkMode()
        return
      }

      switch (initialMode) {
        case 'dark':
          enableDarkMode()
          break
        case 'light':
          disableDarkMode()
          break
        default: // 'auto'
          checkPreference()
      }
    }

    /**
     * Expose global darkMode API for external control
     * Can be used by launchers, command palettes, or other UI
     */
    window.darkMode = {
      enable: () => enableDarkMode(),
      disable: () => disableDarkMode(),
      toggle: () => {
        root.classList.contains('darkmode') ? disableDarkMode() : enableDarkMode()
      },
      isEnabled: () => root.classList.contains('darkmode'),
    }

    // execution
    initializeDarkMode()

    // Add click handlers to all toggles
    document.addEventListener('click', (e) => {
      if (e.target.closest('.darkmode-toggle')) {
        window.darkMode.toggle()
      }
    })

    // Listen for launcher actions (integration with accessible-astro-launcher)
    document.addEventListener('launcher:action', (e) => {
      if (e.detail?.action === 'toggle-dark-mode') {
        window.darkMode.toggle()
      }
    })

    // Listen for view transitions
    document.addEventListener('astro:after-swap', () => {
      darkMode = localStorage.getItem('darkMode')
      initializeDarkMode()
    })
  }
})();</script> <div class="mobile-launcher"> <div class="launcher-trigger" data-astro-cid-mqwa5cvn> <button type="button" class="trigger icon-only" aria-haspopup="dialog" data-launcher-target="site-launcher" aria-label="Tastaturmenü öffnen" title="Tastaturmenü öffnen" data-astro-cid-mqwa5cvn> <span class="wrapper" data-astro-cid-mqwa5cvn> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-mqwa5cvn> <path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-mqwa5cvn></path> </svg>  </span>  </button> </div> <script type="module">const r=()=>{const e=navigator.userAgent.toLowerCase();return e.includes("mac")?"mac":e.includes("win")?"windows":"other"},n=()=>{const e=r();document.querySelectorAll(".launcher-trigger .modifier").forEach(t=>{e==="mac"?t.innerHTML=`
          <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3"/></svg>
          <span class="sr-only">Command</span>
          `:t.textContent="Ctrl"})};n();document.addEventListener("astro:after-swap",n);</script> </div> <div class="desktop-launcher"> <div class="launcher-trigger" data-astro-cid-mqwa5cvn> <button type="button" class="trigger compact" aria-haspopup="dialog" data-launcher-target="site-launcher" aria-label="Tastaturmenü öffnen" title="Tastaturmenü öffnen" data-astro-cid-mqwa5cvn> <span class="wrapper" data-astro-cid-mqwa5cvn> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-mqwa5cvn> <path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-mqwa5cvn></path> </svg>  </span> <span class="shortcut" data-astro-cid-mqwa5cvn> <kbd class="key modifier" data-astro-cid-mqwa5cvn></kbd> <kbd class="key" data-astro-cid-mqwa5cvn>K</kbd> </span> </button> </div>  </div> <button class="responsive-toggle" aria-expanded="false" aria-label="Navigationsmenü öffnen" data-astro-cid-3qc6hvr2> <span data-astro-cid-3qc6hvr2>Menü</span> <svg width="26" height="21" aria-hidden="true" fill="var(--link-color)" xmlns="http://www.w3.org/2000/svg" data-astro-cid-3qc6hvr2><path d="M2 1.667h24m-24 8h24m-24 8h24" stroke="var(--foreground-color)" stroke-width="2.667" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-3qc6hvr2></path></svg> </button> <script type="module">document.addEventListener("astro:page-load",()=>{const o=document.querySelector(".responsive-toggle");if(!o)return;const r=document.documentElement.lang==="en",s=e=>{const n=e.querySelector("span"),t=e.querySelector("svg");!n||!t||(n.textContent=r?"Close":"Schließen",e.setAttribute("aria-expanded","true"),e.setAttribute("aria-label",r?"Close navigation menu":"Navigationsmenü schließen"),t.innerHTML='<path d="M10 10 2 2m8 8 8 8m-8-8 8-8m-8 8-8 8" stroke="var(--foreground-color)" stroke-width="2.667" stroke-linecap="round" stroke-linejoin="round"/>')},i=e=>{const n=e.querySelector("span"),t=e.querySelector("svg");!n||!t||(n.textContent=r?"Menu":"Menü",e.setAttribute("aria-expanded","false"),e.setAttribute("aria-label",r?"Open navigation menu":"Navigationsmenü öffnen"),t.innerHTML='<path d="M2 1.667h24m-24 8h24m-24 8h24" stroke="var(--foreground-color)" stroke-width="2.667" stroke-linecap="round" stroke-linejoin="round"/>')};o.addEventListener("click",()=>{const e=document.querySelector(".mobile-menu");e&&(e.classList.toggle("show"),e.classList.contains("show")?s(o):i(o))})});</script> </div> <nav class="mobile-menu" aria-label="Hauptnavigation"> <ul class="menu"> <li class="menu-item "> <a href="/" class="is-active link" aria-current="page" data-astro-cid-lhox4pm7>Startseite</a> </li><li class="menu-item "> <a href="/blog" class="link" data-astro-cid-lhox4pm7>Blog</a> </li><li class="menu-item "> <a href="/about" class="link" data-astro-cid-lhox4pm7>Über mich</a> </li><li class="menu-item "> <a href="/projects" class="link" data-astro-cid-lhox4pm7>Projekte</a> </li><li class="menu-item "> <a href="https://go.stargazer.at/wishlist" class="link link--external" rel="noopener noreferrer" target="_blank" data-astro-cid-lhox4pm7>Wunschliste   <svg aria-hidden="true" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-lhox4pm7> <path d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" data-astro-cid-lhox4pm7></path> </svg>  <span class="sr-only" data-astro-cid-lhox4pm7>Opens in a new tab</span>  </a> </li><li class="menu-item "> <a href="https://links.stargazer.at" class="link link--external" rel="noopener noreferrer" target="_blank" data-astro-cid-lhox4pm7>Links   <svg aria-hidden="true" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-lhox4pm7> <path d="M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" data-astro-cid-lhox4pm7></path> </svg>  <span class="sr-only" data-astro-cid-lhox4pm7>Opens in a new tab</span>  </a> </li> </ul> </nav> </div> </div> <script type="module">document.addEventListener("astro:page-load",()=>{const p=document.querySelector("#main-navigation");if(!p)return;const m=p.querySelector("ul"),d=[...document.querySelectorAll(".has-dropdown button")],E=()=>{const e=p.querySelectorAll("nav > ul"),t=window.location.pathname.replace(/\/$/,"")||"/";e.forEach(c=>{[...c.querySelectorAll('a[href]:not([rel*="external"])')].filter(r=>r.origin===window.location.origin).forEach(r=>{const l=r.pathname.replace(/\/$/,"")||"/";l===t||l!=="/"&&t.startsWith(`${l}/`)?(r.classList.add("is-active"),r.setAttribute("aria-current","page")):(r.classList.remove("is-active"),r.removeAttribute("aria-current"))})})},b=e=>e.getBoundingClientRect().right>(window.innerWidth||document.documentElement.clientWidth),h=e=>{const t=e.parentNode?.querySelector("ul");t&&(e.classList.add("show"),e.setAttribute("aria-expanded","true"),b(t)&&(t.style.left="auto"))},f=e=>{e.classList.remove("show"),e.setAttribute("aria-expanded","false")},w=()=>{for(let e=0;e<d.length;e++)f(d[e])},v=e=>{const t=e.target;t.getAttribute("aria-expanded")==="false"?(w(),h(t)):f(t)};m&&m.addEventListener("keydown",e=>{const t=e.target,c=t.closest("li"),s=[...m.querySelectorAll(".menu-item")],r=t.closest(".has-dropdown button"),l=t.closest(".has-dropdown li"),g=c?s.findIndex(i=>i===c):-1,a=e.key;let n=null;if(a==="ArrowRight"&&(c&&s.indexOf(c)===s.length-1?n=s[0]:c&&(n=s[g+1])),a==="ArrowLeft"&&(c&&s.indexOf(c)===0?n=s[s.length-1]:c&&(n=s[g-1])),a==="Escape"&&(n=s[0]),r){const i=r.nextElementSibling;if(i){const o=i.querySelector("li");a==="ArrowDown"&&(e.preventDefault(),h(r),n=o)}a==="Escape"&&f(r)}if(l){const i=l.parentNode;if(i){const o=[...i.querySelectorAll("li")],A=o.findIndex(u=>u===l);if(a==="ArrowDown"&&(e.preventDefault(),o.indexOf(l)===o.length-1?n=o[0]:n=o[A+1]),a==="ArrowUp"&&(e.preventDefault(),o.indexOf(l)===0?n=o[o.length-1]:n=o[A-1]),a==="Escape"){const u=i.previousElementSibling;u&&(n=u.parentElement,w())}if(a==="Tab"){const u=i.previousElementSibling;u&&o.indexOf(l)===o.length-1&&f(u)}}}if(n){const i=n.querySelector("a, button, input");i&&i.focus()}}),d&&d.forEach(e=>{e.addEventListener("click",v)}),E(),window.addEventListener("click",e=>{const t=e.target;!t.hasAttribute("aria-haspopup")&&!t.classList.contains("submenu-item")&&w()})});</script> <dialog id="site-launcher" class="launcher" aria-labelledby="site-launcher-title" aria-modal="true" data-astro-cid-5y5hbi2s> <div class="wrapper" data-astro-cid-5y5hbi2s> <div class="header" data-astro-cid-5y5hbi2s> <h2 id="site-launcher-title" class="sr-only" data-astro-cid-5y5hbi2s>Launcher</h2> <search class="search" data-astro-cid-5y5hbi2s> <label for="site-launcher-input" class="sr-only" data-astro-cid-5y5hbi2s>Seiten, Beiträge und Einstellungen durchsuchen...</label> <input type="search" id="site-launcher-input" class="input" placeholder="Seiten, Beiträge und Einstellungen durchsuchen..." aria-describedby="site-launcher-hint" aria-controls="site-launcher-results" aria-owns="site-launcher-results" aria-activedescendant="" autocomplete="off" spellcheck="false" data-astro-cid-5y5hbi2s> <button type="button" class="clear" hidden data-astro-cid-5y5hbi2s>Leeren</button> </search> <button type="button" class="close" data-astro-cid-5y5hbi2s>Schließen</button> </div> <div class="content" tabindex="-1" data-astro-cid-5y5hbi2s> <p id="site-launcher-hint" class="sr-only" data-astro-cid-5y5hbi2s> Suchbegriff eingeben. Mit den Pfeiltasten navigieren und mit Enter auswählen. </p> <div id="site-launcher-status" class="sr-only" role="status" data-template="{count} Ergebnisse für &quot;{query}&quot;" data-astro-cid-5y5hbi2s></div> <div class="results" id="site-launcher-results" data-astro-cid-5y5hbi2s>  <fieldset class="launcher-preferences" data-launcher-group="launcher-preferences-ii2uhtn" data-astro-cid-ddroou2u> <legend class="legend" data-astro-cid-ddroou2u>Einstellungen</legend> <div class="items" data-astro-cid-ddroou2u>  <div class="launcher-switch-wrapper" data-astro-cid-3agrto2f> <button id="launcher-switch-x5atw05" type="button" class="launcher-switch" role="switch" aria-checked="false" tabindex="-1" data-label="Dunkelmodus" data-keywords data-action="toggle-dark-mode" data-astro-cid-3agrto2f> <span class="led" aria-hidden="true" data-astro-cid-3agrto2f></span> <span class="text" data-astro-cid-3agrto2f> <span class="label" data-astro-cid-3agrto2f>Dunkelmodus</span> </span> <span class="type" data-astro-cid-3agrto2f> Umschalten </span> </button> </div> <script type="module">const c={"darkmode:change":"toggle-dark-mode","highcontrast:change":"toggle-high-contrast","reducemotion:change":"toggle-reduced-motion"},n=(e,o)=>{document.querySelectorAll(`.launcher-switch[data-action="${e}"]`).forEach(d=>{d.setAttribute("aria-checked",o?"true":"false")})};let a=new AbortController;const r=()=>{const{signal:e}=a;Object.entries(c).forEach(([o,i])=>{document.addEventListener(o,(d=>{n(i,d.detail.enabled)}),{signal:e})}),document.addEventListener("DOMContentLoaded",t,{signal:e}),document.addEventListener("astro:page-load",t,{signal:e}),document.addEventListener("launcher:open",t,{signal:e})},t=()=>{typeof window.darkMode<"u"&&n("toggle-dark-mode",window.darkMode.isEnabled()),typeof window.highContrast<"u"&&n("toggle-high-contrast",window.highContrast.isEnabled()),typeof window.reducedMotion<"u"&&n("toggle-reduced-motion",window.reducedMotion.isEnabled())};r();t();document.addEventListener("astro:before-swap",()=>{a.abort()});document.addEventListener("astro:after-swap",()=>{a=new AbortController,r(),t()});</script> <div class="launcher-switch-wrapper" data-astro-cid-3agrto2f> <button id="launcher-switch-c9d0gnb" type="button" class="launcher-switch" role="switch" aria-checked="false" tabindex="-1" data-label="Hoher Kontrast" data-keywords data-action="toggle-high-contrast" data-astro-cid-3agrto2f> <span class="led" aria-hidden="true" data-astro-cid-3agrto2f></span> <span class="text" data-astro-cid-3agrto2f> <span class="label" data-astro-cid-3agrto2f>Hoher Kontrast</span> </span> <span class="type" data-astro-cid-3agrto2f> Umschalten </span> </button> </div>  <div class="launcher-switch-wrapper" data-astro-cid-3agrto2f> <button id="launcher-switch-mhu9lxa" type="button" class="launcher-switch" role="switch" aria-checked="false" tabindex="-1" data-label="Weniger Bewegung" data-keywords data-action="toggle-reduced-motion" data-astro-cid-3agrto2f> <span class="led" aria-hidden="true" data-astro-cid-3agrto2f></span> <span class="text" data-astro-cid-3agrto2f> <span class="label" data-astro-cid-3agrto2f>Weniger Bewegung</span> </span> <span class="type" data-astro-cid-3agrto2f> Umschalten </span> </button> </div>   </div> </fieldset> <nav class="launcher-nav" aria-labelledby="launcher-nav-9hu1w28" data-launcher-group="launcher-nav-9hu1w28" data-astro-cid-txbnbfi3> <h3 id="launcher-nav-9hu1w28" class="heading" data-astro-cid-txbnbfi3="true">Seiten</h3> <ul class="items" role="list" data-astro-cid-txbnbfi3> <li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-9e3458e" href="/" class="launcher-link" tabindex="-1" data-label="Startseite" data-keywords data-href="/" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Startseite</span> </span> <span class="type" data-astro-cid-dzzddkgu> Öffnen </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-xv8yudo" href="/blog" class="launcher-link" tabindex="-1" data-label="Blog" data-keywords data-href="/blog" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Blog</span> </span> <span class="type" data-astro-cid-dzzddkgu> Öffnen </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-h688qy2" href="/about" class="launcher-link" tabindex="-1" data-label="Über mich" data-keywords data-href="/about" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Über mich</span> </span> <span class="type" data-astro-cid-dzzddkgu> Öffnen </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-8m577fe" href="/projects" class="launcher-link" tabindex="-1" data-label="Projekte" data-keywords data-href="/projects" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Projekte</span> </span> <span class="type" data-astro-cid-dzzddkgu> Öffnen </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-wjdgvqt" href="https://go.stargazer.at/wishlist" class="launcher-link" tabindex="-1" data-label="Wunschliste" data-keywords data-href="https://go.stargazer.at/wishlist" target="_blank" rel="noopener noreferrer" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Wunschliste</span> </span> <span class="type" data-astro-cid-dzzddkgu> Extern </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-gvjwqa9" href="https://links.stargazer.at" class="launcher-link" tabindex="-1" data-label="Links" data-keywords data-href="https://links.stargazer.at" target="_blank" rel="noopener noreferrer" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Links</span> </span> <span class="type" data-astro-cid-dzzddkgu> Extern </span> </a> </li><li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-ypt96zr" href="/" class="launcher-link" tabindex="-1" data-label="Deutsch" data-keywords data-href="/" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>Deutsch</span> </span> <span class="type" data-astro-cid-dzzddkgu> Sprache </span> </a> </li> <li class="launcher-link-wrapper" data-astro-cid-dzzddkgu> <a id="launcher-link-ihj5tar" href="/en/" class="launcher-link" tabindex="-1" data-label="English" data-keywords data-href="/en/" data-astro-cid-dzzddkgu> <span class="icon" data-astro-cid-dzzddkgu>  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-dzzddkgu> <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" data-astro-cid-dzzddkgu></path> <path d="M14 2v5a1 1 0 0 0 1 1h5" data-astro-cid-dzzddkgu></path> <path d="M10 9H8" data-astro-cid-dzzddkgu></path> <path d="M16 13H8" data-astro-cid-dzzddkgu></path> <path d="M16 17H8" data-astro-cid-dzzddkgu></path> </svg>  </span> <span class="text" data-astro-cid-dzzddkgu> <span class="label" data-astro-cid-dzzddkgu>English</span> </span> <span class="type" data-astro-cid-dzzddkgu> Sprache </span> </a> </li>  </ul> </nav> <nav class="launcher-nav" aria-labelledby="launcher-nav-59j3k8f" data-launcher-group="launcher-nav-59j3k8f" data-blog-results="true" data-astro-cid-txbnbfi3> <h3 id="launcher-nav-59j3k8f" class="heading" data-astro-cid-txbnbfi3="true">Blogbeiträge</h3> <ul class="items" role="list" data-astro-cid-txbnbfi3>  </ul> </nav>  <p class="end-of-results" data-astro-cid-5y5hbi2s>Ende der Ergebnisse</p> </div> <div class="no-results" hidden data-template="Keine Ergebnisse für &quot;{query}&quot;" data-astro-cid-5y5hbi2s> <p data-astro-cid-5y5hbi2s>Keine Ergebnisse für &quot;{query}&quot;</p> </div> </div> <div class="footer" data-astro-cid-5y5hbi2s> <div class="visual" data-astro-cid-5y5hbi2s> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--launcher-subtle-text-color)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-5y5hbi2s> <path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z" data-astro-cid-5y5hbi2s></path> </svg> </div> <div class="hints" data-astro-cid-5y5hbi2s> <div class="hint" data-astro-cid-5y5hbi2s> <span data-astro-cid-5y5hbi2s>Auswählen</span> <kbd data-astro-cid-5y5hbi2s> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-5y5hbi2s> <path d="M20 4v7a4 4 0 0 1-4 4H4" data-astro-cid-5y5hbi2s></path> <path d="m9 10-5 5 5 5" data-astro-cid-5y5hbi2s></path> </svg> <span class="sr-only" data-astro-cid-5y5hbi2s>Enter</span> </kbd> </div> <div class="hint-separator" data-astro-cid-5y5hbi2s></div> <div class="hint" data-astro-cid-5y5hbi2s> <span data-astro-cid-5y5hbi2s>Navigieren</span> <kbd data-astro-cid-5y5hbi2s> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-5y5hbi2s> <path d="M12 5v14" data-astro-cid-5y5hbi2s></path> <path d="m19 12-7 7-7-7" data-astro-cid-5y5hbi2s></path> </svg> <span class="sr-only" data-astro-cid-5y5hbi2s>Arrow down</span> </kbd> <kbd data-astro-cid-5y5hbi2s> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-5y5hbi2s> <path d="m5 12 7-7 7 7" data-astro-cid-5y5hbi2s></path> <path d="M12 19V5" data-astro-cid-5y5hbi2s></path> </svg> <span class="sr-only" data-astro-cid-5y5hbi2s>Arrow up</span> </kbd> </div> <div class="hint-separator" data-astro-cid-5y5hbi2s></div> <div class="hint" data-astro-cid-5y5hbi2s> <span data-astro-cid-5y5hbi2s>Schließen</span> <kbd data-astro-cid-5y5hbi2s>Esc</kbd> </div> </div> </div> </div> </dialog> <script type="module">let v,k,E;const b=new Map,B=()=>{const e=navigator.userAgent.toLowerCase();return e.includes("mac")?"mac":e.includes("win")?"windows":"other"},C=e=>{const t=e.querySelectorAll(".launcher-switch"),r=e.querySelectorAll(".launcher-link"),s=Array.from(t).map(c=>({element:c,wrapper:c.closest(".launcher-switch-wrapper"),label:c.dataset.label||"",keywords:c.dataset.keywords?.split(",").filter(Boolean)||[],type:"switch",action:c.dataset.action})),n=Array.from(r).map(c=>({element:c,wrapper:c.closest(".launcher-link-wrapper"),label:c.dataset.label||"",keywords:c.dataset.keywords?.split(",").filter(Boolean)||[],type:"link",href:c.dataset.href})),a=e.querySelectorAll(".launcher-switch, .launcher-link");return Array.from(a).map(c=>c.classList.contains("launcher-switch")?s.find(i=>i.element===c):n.find(i=>i.element===c))},T=e=>C(e).filter(t=>t.wrapper&&!t.wrapper.hidden),D=(e,t)=>{const r=t.toLowerCase().split(/\s+/),s=[e.label,...e.keywords].join(" ").toLowerCase();return r.every(n=>s.includes(n))},M=(e,t,r)=>{const s=e.querySelector('[role="status"]');if(!s)return;const n=s.dataset.template||'{count} results for "{query}"';s.textContent=n.replace("{count}",String(t)).replace("{query}",r)},y=(e,t)=>{const r=C(e),s=e.querySelector(".no-results"),n=s?.querySelector("p"),a=e.querySelectorAll(".launcher-preferences, .launcher-nav"),c=e.querySelector(".end-of-results");let i=0;r.forEach(o=>{const l=!t||D(o,t);o.wrapper&&(o.wrapper.hidden=!l),l&&i++});const u=i>0;if(a.forEach(o=>{const l=o.querySelectorAll(".launcher-switch-wrapper:not([hidden]), .launcher-link-wrapper:not([hidden])");o.hidden=l.length===0}),s&&(s.hidden=u,n&&t)){const o=s.dataset.template||'No results for "{query}"';n.textContent=o.replace("{query}",t)}c&&(c.hidden=!u),t&&M(e,i,t);const p=T(e);p.length>0?A(e,p[0].element):R(e)},A=(e,t)=>{const r=e.querySelector(".input");e.querySelectorAll(".launcher-switch, .launcher-link").forEach(s=>{s.removeAttribute("data-active")}),t.setAttribute("data-active","true"),r&&t.id&&r.setAttribute("aria-activedescendant",t.id),t.scrollIntoView({block:"nearest"})},R=e=>{const t=e.querySelector(".input");e.querySelectorAll(".launcher-switch, .launcher-link").forEach(r=>{r.removeAttribute("data-active")}),t&&t.setAttribute("aria-activedescendant","")},S=e=>e.querySelector(".launcher-switch[data-active], .launcher-link[data-active]"),I=(e,t)=>{const r=T(e);if(r.length===0)return;const s=S(e),n=s?r.findIndex(c=>c.element===s):-1;let a;t==="down"?a=n<r.length-1?n+1:0:a=n>0?n-1:r.length-1,A(e,r[a].element)},V=e=>{const t=S(e);if(!t)return;const r=t.classList.contains("launcher-switch"),s=t.classList.contains("launcher-link");if(r){const n=t.dataset.action;n&&document.dispatchEvent(new CustomEvent("launcher:action",{detail:{action:n}}))}else s&&(w(e),t.click())},q=(e,t)=>{const r=e.querySelector(".input"),s=e.querySelector(".clear");b.set(e,t||null),e.showModal(),document.dispatchEvent(new CustomEvent("launcher:open")),r&&(r.value="",r.focus()),s&&(s.hidden=!0),y(e,""),v=new AbortController,k=new AbortController,document.addEventListener("keydown",n=>{n.key==="ArrowDown"?(n.preventDefault(),I(e,"down")):n.key==="ArrowUp"?(n.preventDefault(),I(e,"up")):n.key==="Enter"&&S(e)&&(n.preventDefault(),V(e))},{signal:v.signal}),e.addEventListener("click",n=>{n.target===e&&w(e)},{signal:k.signal})},w=e=>{const t=b.get(e);e.close(),t&&t.focus({preventScroll:!0}),b.delete(e),v?.abort(),k?.abort()},X=(e,t)=>{const r=e.id,s=document.querySelectorAll(`[data-launcher-target="${r}"]`),n=e.querySelector(".input"),a=e.querySelector(".close"),c=e.querySelector(".clear"),i=B();if(s.length===0){console.warn(`Launcher: No trigger elements found for launcher #${r}`);return}s.forEach(l=>{l.addEventListener("click",()=>q(e,l))}),document.addEventListener("keydown",l=>{if((i==="mac"?l.metaKey:l.ctrlKey)&&l.key.toLowerCase()==="k")if(l.preventDefault(),e.open)w(e);else{const f=Array.from(s).find(m=>{const L=window.getComputedStyle(m);return L.display!=="none"&&L.visibility!=="hidden"});q(e,f)}},{signal:t}),a?.addEventListener("click",()=>w(e));let u;e.addEventListener("close",()=>{u&&clearTimeout(u),n&&(n.value=""),c&&(c.hidden=!0),y(e,""),v?.abort(),k?.abort()}),n?.addEventListener("input",l=>{const h=l.target.value;c&&(c.hidden=!h),clearTimeout(u),u=setTimeout(()=>{y(e,h)},16)}),c?.addEventListener("click",()=>{n&&(n.value="",n.focus(),y(e,""),c.hidden=!0)}),e.addEventListener("click",l=>{const h=l.target,d=h.closest(".launcher-switch"),f=h.closest(".launcher-link");if(d){const m=d.dataset.action;m&&document.dispatchEvent(new CustomEvent("launcher:action",{detail:{action:m}}))}else f&&w(e)});let p=-1,o=-1;e.addEventListener("pointermove",l=>{if(l.clientX===p&&l.clientY===o)return;p=l.clientX,o=l.clientY;const d=l.target.closest(".launcher-switch, .launcher-link"),f=d?.closest(".launcher-switch-wrapper, .launcher-link-wrapper");d&&f&&!f.hidden&&A(e,d)})},x=()=>{E?.abort(),E=new AbortController,document.querySelectorAll(".launcher").forEach(t=>X(t,E.signal))};x();document.addEventListener("astro:after-swap",x);</script> <script type="module">let h;const y=()=>(h??=fetch("/blog-search.json").then(n=>{if(!n.ok)throw new Error("Could not load the blog search index");return n.json()}).catch(()=>({de:[],en:[]})),h),g=document.querySelector("#site-launcher"),i=g?.querySelector(".input"),m=g?.querySelector('[data-blog-results="true"] .items');let d=!1,p=0;i?.addEventListener("input",async()=>{if(d)return;const n=++p,r=i.value.trim().toLocaleLowerCase(),l=location.pathname==="/en"||location.pathname.startsWith("/en/")?"en":"de",s=r.split(/\s+/).filter(Boolean),f=r?(await y())[l].filter(e=>s.every(a=>[e.title,e.slug,...e.keywords].join(" ").toLocaleLowerCase().includes(a))).slice(0,20):[];n===p&&m&&(m.replaceChildren(...f.map(e=>{const a=document.createElement("li");a.className="launcher-link-wrapper";const t=document.createElement("a");t.className="launcher-link",t.tabIndex=-1,t.dataset.label=e.title,t.dataset.keywords=e.keywords.join(","),t.dataset.href=l==="en"?`/en/blog/${e.slug}/`:`/blog/${e.slug}/`,t.href=t.dataset.href;const c=document.createElement("span");c.className="text";const o=document.createElement("span");o.className="label",o.textContent=e.title,c.append(o);const u=document.createElement("span");return u.className="type",u.textContent=l==="en"?"Post":"Beitrag",t.append(c,u),a.append(t),a})),d=!0,i.dispatchEvent(new Event("input",{bubbles:!0})),d=!1)});document.addEventListener("keydown",n=>{if(n.key!=="Escape")return;const r=document.querySelector("#site-launcher");if(!r?.open)return;n.preventDefault(),r.close(),[...document.querySelectorAll('[data-launcher-target="site-launcher"]')].find(s=>s.getClientRects().length>0)?.focus({preventScroll:!0})});</script> </header> <main id="main-content" data-astro-cid-qup72gqn style="--brandPrimary: #633658;--brandSecondary: #bc748f;--brandNeutral: #a59aa3;--brandOutline: #9f661e;" data-astro-transition-scope="astro-neigrlxa-1">  <section class="hero container my-6 md:my-8" data-astro-cid-bbe6dxrz> <div class="hero-frame" data-astro-cid-bbe6dxrz> <figure class="hero-image" data-astro-cid-bbe6dxrz> <img src="/_astro/twitch-header.BIGSfB5O_Zpv021.webp" alt="Rei's avatar wearing a headset in her streaming room" loading="eager" decoding="async" fetchpriority="high" data-astro-cid-bbe6dxrz="true" width="1200" height="480"> </figure> <div class="hero-content" data-astro-cid-bbe6dxrz> <p class="eyebrow" data-astro-cid-bbe6dxrz>Keine Kompromisse. Keine Reue. Keine Abbitte.</p> <h1 data-astro-cid-bbe6dxrz>Rei's World</h1> <p class="hero-lede" data-astro-cid-bbe6dxrz> Mein kleines Eck für alles, was meine Neugier nicht loslässt: Linux, Technik, Streaming, Open Source und das Leben jenseits des Bildschirms. </p> <div class="hero-actions" data-astro-cid-bbe6dxrz> <a href="/blog" class="button button--filled type-primary button--md" data-astro-cid-bbe6dxrz="true" data-astro-cid-lhox4pm7> <svg width="1.25rem" height="1.25rem" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-bbe6dxrz="true" data-icon="lucide:book-open">   <symbol id="ai:lucide:book-open"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v16m8.001-2A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2z"/></symbol><use href="#ai:lucide:book-open"></use>  </svg> Zum Blog</a> <a href="/about" class="button button--filled type-secondary button--md" data-astro-cid-bbe6dxrz="true" data-astro-cid-lhox4pm7>Über Rei</a> </div> </div> </div> </section>  <script type="module">let a=()=>{};document.addEventListener("astro:page-load",()=>{a();const t=document.querySelector(".hero-image img");if(!t)return;const r=window.matchMedia("(prefers-reduced-motion: reduce)"),i=window.matchMedia("(min-width: 64rem)");let n=null;const s=()=>{if(n=null,r.matches||!i.matches){t.style.removeProperty("transform");return}const o=t.getBoundingClientRect(),d=(Math.min(1,Math.max(0,(window.innerHeight-o.top)/(window.innerHeight+o.height)))-.5)*-24;t.style.transform=`translate3d(0, ${d}px, 0) scale(1.04)`},e=()=>{n===null&&(n=window.requestAnimationFrame(s))};window.addEventListener("scroll",e,{passive:!0}),window.addEventListener("resize",e),r.addEventListener("change",e),i.addEventListener("change",e),window.requestAnimationFrame(()=>window.requestAnimationFrame(e)),a=()=>{window.removeEventListener("scroll",e),window.removeEventListener("resize",e),r.removeEventListener("change",e),i.removeEventListener("change",e),n!==null&&window.cancelAnimationFrame(n)}});</script> <div class="welcome-band" data-astro-cid-6sxvzthc> <div class="container welcome-grid" data-astro-cid-6sxvzthc> <p class="welcome-label" data-astro-cid-6sxvzthc>Hallo, ich bin Rei.</p> <p class="welcome-copy" data-astro-cid-6sxvzthc>Ein bisschen nerdig, ziemlich neugierig und meistens mit mehr offenen Tabs als geplant. Hier treffen Linux und Technik auf Livestreams, Open Source, persönliche Gedanken und alles, was sonst noch hängen bleibt.</p> </div> </div> <section class="home-section" data-astro-cid-6sxvzthc> <div class="container" data-astro-cid-6sxvzthc> <div class="section-heading" data-astro-cid-6sxvzthc> <div data-astro-cid-6sxvzthc> <p class="eyebrow" data-astro-cid-6sxvzthc>Frisch aus dem Archiv</p> <h2 data-astro-cid-6sxvzthc>Neueste Beiträge</h2> </div> <a class="section-link" href="/blog/" data-astro-cid-6sxvzthc>Alle Beiträge <span aria-hidden="true" data-astro-cid-6sxvzthc>→</span></a> </div> <ol class="post-cards" data-astro-cid-6sxvzthc> <li data-astro-cid-6sxvzthc> <article class="post-card" data-astro-cid-6sxvzthc> <p class="post-date" data-astro-cid-6sxvzthc> <time datetime="2026-10-25T00:00:00.000Z" data-astro-cid-6sxvzthc> 25. Oktober 2026 </time>  </p> <h3 data-astro-cid-6sxvzthc><a href="/blog/2026-10-25-on-the-deceptive-virtues-of-the-yellow-parcel-ghost/" data-astro-cid-6sxvzthc>Die gelbe Illusion: Wie aus Zustellung Selbertragen wurde</a></h3> <p class="post-excerpt" data-astro-cid-6sxvzthc>Von verschwundenen Postboten, dem Sub-Sub-Unternehmer-Dschungel und einem ESP32 an der Klingel, der das Märchen von &#39;Sie waren nicht zuhause&#39; empirisch widerlegt.</p> </article> </li><li data-astro-cid-6sxvzthc> <article class="post-card" data-astro-cid-6sxvzthc> <p class="post-date" data-astro-cid-6sxvzthc> <time datetime="2026-10-24T00:00:00.000Z" data-astro-cid-6sxvzthc> 24. Oktober 2026 </time>  </p> <h3 data-astro-cid-6sxvzthc><a href="/blog/2026-10-24-cleaning-out-my-digital-closet/" data-astro-cid-6sxvzthc>Von der Kunst des Weglassens</a></h3> <p class="post-excerpt" data-astro-cid-6sxvzthc>Ein kurzer Abriss darüber, warum weniger Digitalmüll auf dem eigenen Server und weniger Reibung im Workflow auch mentalen Frieden bringen.</p> </article> </li><li data-astro-cid-6sxvzthc> <article class="post-card" data-astro-cid-6sxvzthc> <p class="post-date" data-astro-cid-6sxvzthc> <time datetime="2026-10-24T00:00:00.000Z" data-astro-cid-6sxvzthc> 24. Oktober 2026 </time>  </p> <h3 data-astro-cid-6sxvzthc><a href="/blog/2026-10-24-upon-the-latest-php-calamity/" data-astro-cid-6sxvzthc>Schon wieder PHP</a></h3> <p class="post-excerpt" data-astro-cid-6sxvzthc>Kaum ist der letzte Patch aufgespielt, zeichnet sich das nächste Drama in der PHP-Welt ab. Ein Hoch auf VPN-Tunnel und das konsequente Aussperren des Internets.</p> </article> </li> </ol> </div> </section> <section class="home-section" data-astro-cid-6sxvzthc> <div class="container" data-astro-cid-6sxvzthc> <div class="section-heading" data-astro-cid-6sxvzthc> <div data-astro-cid-6sxvzthc> <p class="eyebrow" data-astro-cid-6sxvzthc>Querbeet, aber mit Absicht</p> <h2 data-astro-cid-6sxvzthc>Was mich umtreibt</h2> </div> </div> <div class="interest-grid" data-astro-cid-6sxvzthc> <article class="interest-card" data-astro-cid-6sxvzthc> <span class="interest-icon" data-astro-cid-6sxvzthc><svg width="1.5rem" height="1.5rem" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-6sxvzthc="true" data-icon="lucide:terminal">   <symbol id="ai:lucide:terminal"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19h8M4 17l6-6l-6-6"/></symbol><use href="#ai:lucide:terminal"></use>  </svg></span> <h3 data-astro-cid-6sxvzthc>Technik, die bleibt</h3> <p data-astro-cid-6sxvzthc>Linux begleitet mich seit 1999. Hier geht es um Systeme, Software und die kleinen Details, die den Unterschied machen.</p>  </article><article class="interest-card" data-astro-cid-6sxvzthc> <span class="interest-icon" data-astro-cid-6sxvzthc><svg width="1.5rem" height="1.5rem" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-6sxvzthc="true" data-icon="lucide:radio">   <symbol id="ai:lucide:radio"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M16.247 7.761a6 6 0 0 1 0 8.478m2.828-11.306a10 10 0 0 1 0 14.134m-14.15 0a10 10 0 0 1 0-14.134m2.828 11.306a6 6 0 0 1 0-8.478"/><circle cx="12" cy="12" r="2"/></g></symbol><use href="#ai:lucide:radio"></use>  </svg></span> <h3 data-astro-cid-6sxvzthc>Online und mittendrin</h3> <p data-astro-cid-6sxvzthc>Streaming, Community und digitale Räume: am liebsten offen, selbstbestimmt und mit Platz für echte Gespräche.</p>  </article><article class="interest-card" data-astro-cid-6sxvzthc> <span class="interest-icon" data-astro-cid-6sxvzthc><svg width="1.5rem" height="1.5rem" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-6sxvzthc="true" data-icon="lucide:library">   <symbol id="ai:lucide:library"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m16 6l4 14M12 6v14M8 8v12M4 4v16"/></symbol><use href="#ai:lucide:library"></use>  </svg></span> <h3 data-astro-cid-6sxvzthc>Ein gemeinsames Archiv</h3> <p data-astro-cid-6sxvzthc>Persönliche und technische Beiträge finden sich jetzt gemeinsam im Blog.</p> <a href="/blog/" data-astro-cid-6sxvzthc>Zum Blog <span aria-hidden="true" data-astro-cid-6sxvzthc>→</span></a> </article> </div> </div> </section>  </main> <footer data-astro-cid-sz7xmlte> <div class="py-8" data-astro-cid-sz7xmlte> <div class="container flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between" data-astro-cid-sz7xmlte> <p data-astro-cid-sz7xmlte>&copy; 2026 Rei's World</p> <nav aria-label="Rechtliche Informationen" data-astro-cid-sz7xmlte> <ul class="flex flex-wrap gap-x-6 gap-y-2" data-astro-cid-sz7xmlte> <li data-astro-cid-sz7xmlte><a href="/accessibility-statement" class="link" data-astro-cid-sz7xmlte="true" data-astro-cid-lhox4pm7>Barrierefreiheit</a></li> <li data-astro-cid-sz7xmlte><a href="/imprint" class="link" data-astro-cid-sz7xmlte="true" data-astro-cid-lhox4pm7>Impressum</a></li> <li data-astro-cid-sz7xmlte><a href="/privacy" class="link" data-astro-cid-sz7xmlte="true" data-astro-cid-lhox4pm7>Datenschutz</a></li> <li data-astro-cid-sz7xmlte> <a href="/blog/rss.xml" class="inline-flex items-center gap-1 whitespace-nowrap link" data-astro-cid-sz7xmlte="true" data-astro-cid-lhox4pm7> <svg width="1rem" height="1rem" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-sz7xmlte="true" data-icon="lucide:rss">   <symbol id="ai:lucide:rss"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></g></symbol><use href="#ai:lucide:rss"></use>  </svg>
RSS
</a> </li> </ul> </nav> </div> </div> </footer> <script>
    (function () {
      if (window.location.hostname !== 'stargazer.at' && window.location.hostname !== 'www.stargazer.at') return

      var loaded = false

      function loadMatomo() {
        if (loaded) return
        loaded = true

        var _paq = window._paq = window._paq || []
        _paq.push(['setDoNotTrack', true])
        _paq.push(['setTrackerUrl', 'https://stats.stargazer.at/matomo.php'])
        _paq.push(['setSiteId', '3'])
        _paq.push(['enableLinkTracking'])
        _paq.push(['trackPageView'])

        var script = document.createElement('script')
        script.async = true
        script.src = 'https://stats.stargazer.at/matomo.js'
        document.head.appendChild(script)

        var lastTrackedUrl = window.location.href
        document.addEventListener('astro:page-load', function () {
          if (window.location.href === lastTrackedUrl) return
          lastTrackedUrl = window.location.href
          _paq.push(['setCustomUrl', lastTrackedUrl])
          _paq.push(['setDocumentTitle', document.title])
          _paq.push(['trackPageView'])
        })
      }

      window.addEventListener('cookie-consent', function (event) {
        if (event.detail === 'accepted') loadMatomo()
        else if (window._paq) window._paq.push(['optUserOut'])
      })

      if (localStorage.getItem('cookieConsent') === 'accepted') loadMatomo()
    })()
  </script> <div id="cookie-banner" class="cookie-banner" role="region" aria-label="Cookie-Zustimmung" hidden data-astro-cid-fzbxxtek><div class="cookie-banner-inner" data-astro-cid-fzbxxtek><p class="cookie-banner-text" data-astro-cid-fzbxxtek>Diese Website misst die Reichweite mit einem selbst betriebenen Matomo. Cookies werden nur mit deiner Zustimmung gesetzt. Ohne Zustimmung findet keine Messung statt. <a href="/privacy" data-astro-cid-fzbxxtek>Datenschutzerklärung</a></p><div class="cookie-banner-actions" data-astro-cid-fzbxxtek><button type="button" class="cookie-button" data-consent="declined" data-astro-cid-fzbxxtek>Ablehnen</button><button type="button" class="cookie-button cookie-button-primary" data-consent="accepted" data-astro-cid-fzbxxtek>Akzeptieren</button></div></div></div><script type="module">const a=["stargazer.at","www.stargazer.at"],n="cookieConsent";function e(){const t=document.getElementById("cookie-banner");t&&(t.hidden=!a.includes(location.hostname)||localStorage.getItem(n)!==null)}function s(t){localStorage.setItem(n,t),window.dispatchEvent(new CustomEvent("cookie-consent",{detail:t})),e()}document.addEventListener("click",t=>{const o=t.target,c=o?.closest("[data-consent]")?.dataset.consent;if(c)return s(c);o?.closest("[data-cookie-settings]")&&(localStorage.removeItem(n),e())});document.addEventListener("astro:page-load",e);e();</script> </body> </html>