From 0df1fc0896d5355ff217bf8d0703cf584380fd4e Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Sat, 15 Aug 2026 09:56:55 +0200 Subject: [PATCH] hub intro text --- AGENTS.md | 4 ++++ hub/eleventy.config.js | 1 + hub/index.njk | 10 ++++++++++ hub/stefan-koelle-foto.jpg | Bin 0 -> 24926 bytes shared/base.css | 30 ++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+) create mode 100755 hub/stefan-koelle-foto.jpg diff --git a/AGENTS.md b/AGENTS.md index f0ecffe..f0ddc14 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -189,6 +189,10 @@ python3 -m venv .venv .venv/bin/python scripts/github-aggregator/aggregate.py ``` +## Text / Stil + +- Keine Em-Dashes (—) verwenden, stattdessen umformulieren (Komma, Satzzeichen, neu formulieren) + ## Python / pip - Niemals `pip install` direkt ausführen diff --git a/hub/eleventy.config.js b/hub/eleventy.config.js index 3246063..73d8732 100644 --- a/hub/eleventy.config.js +++ b/hub/eleventy.config.js @@ -5,6 +5,7 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy({ "shared/base.css": "shared-base.css" }); eleventyConfig.addPassthroughCopy({ "shared/favicon/hub.svg": "favicon.svg" }); eleventyConfig.addPassthroughCopy({ "hub/robots.txt": "robots.txt" }); + eleventyConfig.addPassthroughCopy({ "hub/stefan-koelle-foto.jpg": "stefan-koelle-foto.jpg" }); return { dir: { diff --git a/hub/index.njk b/hub/index.njk index 3a7cd60..a82a6ab 100644 --- a/hub/index.njk +++ b/hub/index.njk @@ -47,4 +47,14 @@ sections: href: "https://aztec-project.org" emoji: "🔷" --- +
+
+

Hey, I'm Stefan 👋

+

Welcome to moonweb, my personal corner on the internet. This is where I document my homelab, smart home setups, infrastructure experiments, retro hardware, and the code that ties it all together.

+

I'm a Senior Software Developer & Architect based in Munich with 20+ years in the trenches, from Turbo Pascal on the 486 to .NET Core, Kubernetes, and AI-driven development today. By day I build microservices and cloud architecture, by night I tinker with MQTT brokers, restore retro computers, and automate things that don't necessarily need automating.

+

Everything here runs on a homelab that has been evolving since the mid-90s, from multiple 486s and Pentiums back in the day to today's Proxmox cluster. Have a look around.

+
+ Stefan Koelle +
+ {% include "card-grid.njk" %} diff --git a/hub/stefan-koelle-foto.jpg b/hub/stefan-koelle-foto.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a031e6a36ed1faee6ce258cedc407f5482700397 GIT binary patch literal 24926 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 literal 0 HcmV?d00001 diff --git a/shared/base.css b/shared/base.css index 9c48a82..5013d86 100644 --- a/shared/base.css +++ b/shared/base.css @@ -40,6 +40,36 @@ body { main { max-width: 1100px; margin: 0 auto; padding: 2rem; } +.intro { + display: flex; + gap: 2.5rem; + align-items: center; + margin-bottom: 2.5rem; +} +.intro-text h1 { + font-size: 1.8rem; + margin: 0 0 0.75rem; + color: var(--text); +} +.intro-text p { + margin: 0 0 0.6rem; + font-size: 0.95rem; + color: #444; + line-height: 1.6; +} +.intro-photo { + width: 280px; + height: 280px; + border-radius: 50%; + object-fit: cover; + border: 3px solid var(--accent); + flex-shrink: 0; +} +@media (max-width: 700px) { + .intro { flex-direction: column-reverse; text-align: center; } + .intro-photo { width: 180px; height: 180px; } +} + .card-section { margin-bottom: 2.5rem; } .card-section h2 { font-size: 1rem;