diff --git a/.github/workflows/build-deploy.yml b/.github/workflows/build-deploy.yml
index 433c4a3..d11ecbd 100644
--- a/.github/workflows/build-deploy.yml
+++ b/.github/workflows/build-deploy.yml
@@ -3,8 +3,14 @@ name: Build & Deploy moonweb-site
on:
push:
branches: [main]
+ paths-ignore:
+ - 'stefankoelle/**'
+ - '.github/workflows/deploy-stefankoelle.yml'
pull_request:
branches: [main]
+ paths-ignore:
+ - 'stefankoelle/**'
+ - '.github/workflows/deploy-stefankoelle.yml'
# Cancel in-progress runs for the same branch
concurrency:
diff --git a/.github/workflows/deploy-stefankoelle.yml b/.github/workflows/deploy-stefankoelle.yml
new file mode 100644
index 0000000..a966b8c
--- /dev/null
+++ b/.github/workflows/deploy-stefankoelle.yml
@@ -0,0 +1,107 @@
+name: Build & Deploy stefankoelle.de
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'stefankoelle/**'
+ - 'shared/**'
+ - '.github/workflows/deploy-stefankoelle.yml'
+ pull_request:
+ branches: [main]
+ paths:
+ - 'stefankoelle/**'
+ - 'shared/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ NODE_VERSION: "22"
+
+jobs:
+ build:
+ name: Build stefankoelle.de
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+
+ - uses: actions/setup-node@v7
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: "npm"
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build stefankoelle
+ run: npm run build:stefankoelle
+
+ - name: Validate build output
+ run: |
+ if [ ! -d "dist/stefankoelle" ]; then
+ echo "Error: dist/stefankoelle not found"
+ exit 1
+ fi
+ if [ -z "$(ls -A dist/stefankoelle 2>/dev/null)" ]; then
+ echo "Error: dist/stefankoelle is empty"
+ exit 1
+ fi
+ echo "Build output:"
+ find dist/stefankoelle -type f | head -20
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v7
+ with:
+ name: dist-stefankoelle
+ path: dist/stefankoelle
+ retention-days: 7
+
+ deploy:
+ name: Deploy stefankoelle.de
+ needs: build
+ runs-on: ubuntu-latest
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
+ steps:
+ - name: Download build artifact
+ uses: actions/download-artifact@v8
+ with:
+ name: dist-stefankoelle
+ path: dist/stefankoelle
+
+ - name: Deploy via SFTP to IONOS
+ uses: wlixcc/sftp-deploy-action@v1
+ with:
+ local_path: './dist/stefankoelle/*'
+ server: ${{ secrets.IONOS_SFTP_HOST }}
+ username: ${{ secrets.IONOS_SFTP_USER }}
+ password: ${{ secrets.IONOS_SFTP_PASSWORD }}
+ server_path: '/deploy/stefankoelle/'
+ port: 22
+
+ summary:
+ name: Deploy Summary
+ needs: deploy
+ runs-on: ubuntu-latest
+ if: always()
+ steps:
+ - name: Print deployment summary
+ run: |
+ echo "## Deployment Summary" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ if [ "${{ needs.deploy.result }}" = "success" ]; then
+ echo "✅ stefankoelle.de deployed successfully!" >> $GITHUB_STEP_SUMMARY
+ else
+ echo "❌ Deployment failed. Check the deploy job for details." >> $GITHUB_STEP_SUMMARY
+ fi
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "### Site" >> $GITHUB_STEP_SUMMARY
+ echo "| Site | URL |" >> $GITHUB_STEP_SUMMARY
+ echo "|------|-----|" >> $GITHUB_STEP_SUMMARY
+ echo "| stefankoelle | https://stefankoelle.de |" >> $GITHUB_STEP_SUMMARY
+
+# Required repo secrets:
+# IONOS_SFTP_HOST — IONOS SFTP server hostname
+# IONOS_SFTP_USER — IONOS SFTP username
+# IONOS_SFTP_PASSWORD — IONOS SFTP password
diff --git a/AGENTS.md b/AGENTS.md
index 370d47c..8878f56 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -2,9 +2,9 @@
## Projektübersicht
-Monorepo für 5 statische Websites unter moonweb.org, basierend auf Eleventy (11ty), deployt auf Cloudflare Pages.
+Monorepo für 5 statische Websites unter moonweb.org + stefankoelle.de, basierend auf Eleventy (11ty).
-### Websites
+### Websites (Cloudflare Pages)
| Site | Domain | Zweck | Status |
|------|--------|-------|--------|
@@ -14,82 +14,76 @@ Monorepo für 5 statische Websites unter moonweb.org, basierend auf Eleventy (11
| code | code.moonweb.org | GitHub-Projekte (aggregiert via .moonweb.yml) | Fertig (10 Repos) |
| retro | retro.moonweb.org | Physische Retro-Hardware | Nur Übersicht (WIP) |
-### Externe Sites (nicht im Monorepo)
+### Externe Sites (SFTP-Deployment)
+
+| Site | Domain | Zweck | Status |
+|------|--------|-------|--------|
+| stefankoelle | stefankoelle.de | Lebenslauf, Kontakt, Projekte | Onepager + LED-Matrix-Detailseite |
+
+### Andere Sites (nicht im Monorepo)
-- stefankoelle.de — Lebenslauf, Kontakt (extern gehostet)
- www.moonweb.org — 2000er Internet-Zeitkapsel
- 28k8.moonweb.org — 90er BBS/Scene-Archiv
-
## Dateistruktur
```
moonweb-site/
├── hub/ # Eleventy-Config + index.njk
├── infra/ # Eleventy-Config + index.njk + 3 Subseiten
-│ ├── backup-strategy/
-│ ├── monitoring/
-│ └── dev-workflow/
├── smarthome/ # Eleventy-Config + index.njk + 6 Subseiten
-│ ├── homematic-mqtt/
-│ ├── tasmota-energy/
-│ ├── balkonpi/
-│ ├── airplay-audio/
-│ ├── octoprint/
-│ └── tubearchivist/
├── code/ # Eleventy-Config + index.njk
-│ └── _data/repos.json # Vom GitHub-Aggregator generiert
+│ └── _data/repos.json
├── retro/ # Eleventy-Config + index.njk
+├── stefankoelle/ # Eleventy-Config + Onepager
+│ ├── eleventy.config.js
+│ ├── _includes/
+│ │ ├── stefankoelle.njk # Layout (Header, Nav, Footer)
+│ │ └── cv-content.njk # CV-Partial (zentral fuer Web + PDF)
+│ ├── index.njk # Onepager (alle Sections)
+│ ├── cv-print.njk # CV-only fuer spaeteren PDF-Druck
+│ ├── assets/ # CSS, JS, Bilder, Favicons
+│ ├── ledmatrix/ # LED Matrix WebServer Dokumentation
+│ └── pdf/ # PDF-CSS (fuer spaeteren WeasyPrint-Bau)
├── shared/ # Gemeinsame Komponenten
│ ├── _includes/
│ │ ├── base.njk # Basis-Layout (Header, Site-Switcher, Footer)
│ │ └── card-grid.njk # Card-Grid Template
-│ ├── base.css # Basis-CSS (Layout, Cards, Typography)
-│ └── theme-*.css # Accent-Farben pro Site
+│ ├── base.css
+│ └── theme-*.css
├── scripts/
-│ └── github-aggregator/ # Python-Skript für code.moonweb.org
-│ ├── aggregate.py
-│ ├── example.moonweb.yml
-│ └── README.md
+│ └── github-aggregator/
├── .github/workflows/
-│ └── build-deploy.yml # CI/CD: Build + Deploy zu Cloudflare Pages
-├── DESIGN.md # Initiales Konzept mit Design-Entscheidungen (deutsch)
-├── SPEC.md # Vollständige Spezifikation (148 Zeilen)
-├── PLAN.md # Implementierungsplan (65 Zeilen)
-├── README.md # Projekt-README
-├── TODO.md # Offene Items + Workflow
-└── package.json # npm scripts für dev/build
+│ ├── build-deploy.yml # CI/CD: Cloudflare Pages (5 Sites)
+│ └── deploy-stefankoelle.yml # CI/CD: IONOS SFTP (stefankoelle.de)
+├── DESIGN.md
+├── SPEC.md
+├── PLAN.md
+├── README.md
+├── TODO.md
+└── package.json
```
-## Dokumentation
-
-- `DESIGN.md` — Initiales Konzept mit Design-Entscheidungen (deutsch)
-- `SPEC.md` — Vollständige Spezifikation (148 Zeilen)
-- `PLAN.md` — Implementierungsplan (65 Zeilen)
-- `README.md` — Projekt-README
-- `TODO.md` — Offene Items + Workflow für weitere Arbeit
-- `TODO.md` — Offene Items + Workflow für weitere Arbeit
-
## Technischer Stack
- **SSG:** Eleventy (11ty) v3.1.6
- **Templates:** Nunjucks (.njk)
- **CSS:** Variables-basiert mit Accent-Farben pro Site
-- **Deploy:** Cloudflare Pages (5 separate Projects)
-- **CI/CD:** GitHub Actions
-- **GitHub-Aggregator:** Python (liest .moonweb.yml aus Repos)
-- **Deploy:** Cloudflare Pages (5 separate Projects)
+- **Deploy (moonweb):** Cloudflare Pages (5 separate Projects)
+- **Deploy (stefankoelle):** IONOS SFTP
+- **CI/CD:** GitHub Actions (2 Workflows)
## Entwicklung
```bash
npm install
-npm run dev:hub # localhost:8081
-npm run dev:infra # localhost:8082
-npm run dev:smarthome # localhost:8083
-npm run dev:code # localhost:8084
-npm run dev:retro # localhost:8085
-npm run build # Alle Sites bauen
+npm run dev:hub # localhost:8081
+npm run dev:infra # localhost:8082
+npm run dev:smarthome # localhost:8083
+npm run dev:code # localhost:8084
+npm run dev:retro # localhost:8085
+npm run dev:stefankoelle # localhost:8086
+npm run build # Alle Sites bauen
```
## Design-Prinzipien
@@ -101,36 +95,35 @@ npm run build # Alle Sites bauen
5. **Keine Analytics** — Keine Tracking-Tools
6. **Sensible Daten** — Infra-Content wird manuell redigiert (keine IPs, Keys, Passwörter)
-## Content-Regeln (SPEC.md §5)
+## stefankoelle.de
-| Site | Detailseiten? | Regel |
-|------|---------------|-------|
-| smarthome | Ja | Nur wenn genug Content vorhanden |
-| code | Nie | Nur Übersicht + GitHub-Links |
-| infra | Kaum | Bewusst oberflächlich (sensible Daten) |
-| retro | Ja, minimal | Rudimentär, WIP erlaubt |
-
-## GitHub-Aggregator
-
-`scripts/github-aggregator/aggregate.py` liest `.moonweb.yml` aus allen public Repos von `skoelle` und schreibt `code/_data/repos.json`. Manuell ausführen:
-
-```bash
-export GITHUB_TOKEN=ghp_xxx
-python scripts/github-aggregator/aggregate.py
-```
+- Eigene Eleventy-Config (nicht shared base.njk)
+- Eigenes CSS-Design (nicht moonweb design system)
+- Onepager mit Anchor-Links (bleibt so)
+- Deploy via SFTP auf IONOS `/deploy/stefankoelle/`
+- CV-Partial zentral pflegbar (einmal aendern → Web + PDF aktualisieren)
+- LED Matrix als eigene Seite unter stefankoelle.de/ledmatrix/
## CI/CD
-`.github/workflows/build-deploy.yml` baut alle 5 Sites (hub, infra, smarthome, code, retro) und deployt sie zu Cloudflare Pages.
+### Cloudflare Pages (moonweb)
+`.github/workflows/build-deploy.yml` baut hub, infra, smarthome, code, retro.
Benötigte Secrets:
- `CLOUDFLARE_API_TOKEN`
- `CLOUDFLARE_ACCOUNT_ID`
+### IONOS SFTP (stefankoelle.de)
+`.github/workflows/deploy-stefankoelle.yml` baut stefankoelle.de und deployed per SFTP.
+
+Benötigte Secrets:
+- `IONOS_SFTP_HOST`
+- `IONOS_SFTP_USER`
+- `IONOS_SFTP_PASSWORD`
## Offene Punkte
- retro/ ist bewusst rudimentär gehalten
-- Einige Cards in smarthome/ und infra/ verlinken noch auf "#" (Placeholder)
-- Deploy erfolgt noch nicht automatisch (Phase 3 ausstehend)
-- stefankoelle.de ist extern gehostet, wird nur verlinkt (nicht im Monorepo)
+- PDF-Build fuer CV (WeasyPrint) — lokal testen, spaeter in CI integrieren
+- Querverlinkungen stefankoelle.de <-> smarthome (zukuenftig)
+- Ledmatrix ggf. nach smarthome verschieben (when ready)
diff --git a/TODO.md b/TODO.md
index 029bf22..9825c17 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,6 +1,6 @@
# TODO — moonweb-site Offene Items
-Stand: 2026-08-13
+Stand: 2026-08-14
## Aktueller Status
@@ -10,20 +10,34 @@ Stand: 2026-08-13
| Phase 1 — Content | ✅ fertig | hub, code, infra, smarthome komplett, retro bewusst rudimentär |
| Phase 2 — CI/CD | ✅ fertig | build-deploy.yml mit Caching + Validation + Summary |
| Phase 3 — Launch | ✅ fertig | Cloudflare Pages live, Smoke-Test bestanden |
-| Phase 4 — Deferred | ⏸️ zurückgestellt | Ledmatrix-Migration, 28k8, Analytics |
+| Phase 4 — Deferred | ⏸️ zurückgestellt | 28k8, Analytics |
+| Phase 5 — stefankoelle.de | ✅ fertig | Ins Monorepo migriert, Eleventy-Build, SFTP-Deployment |
## Offene Items
### P4 — Deferred (nicht dringend)
-- [ ] Ledmatrix-Migration nach smarthome
- [ ] 28k8.moonweb.org Zukunft klären
- [ ] Perplexity-Rückkanal
- [ ] Apex-Domain Redirect (moonweb.org → hub.moonweb.org)
-- [ ] stefankoelle.de in Monorepo portieren
+- [ ] PDF-Build fuer CV (WeasyPrint, lokal testen)
+- [ ] Querverlinkungen stefankoelle.de <-> smarthome
+- [ ] Ledmatrix ggf. nach smarthome verschieben
-## Schon erledigt (Stand 2026-08-13)
+## Schon erledigt (Stand 2026-08-14)
+### stefankoelle.de Migration (2026-08-14)
+- [x] Eleventy-Config + package.json erweitert
+- [x] Onepager-Layout mit Anchor-Links beibehalten
+- [x] CV-Partial (zentral fuer Web + PDF)
+- [x] CSS ausgelagert + modernisiert (Custom Properties, box-sizing)
+- [x] Assets in assets/ verschoben
+- [x] Ledmatrix als eigene Seite integriert
+- [x] Alte Dateien geloescht (index.html, browserconfig.xml, sitemap.txt)
+- [x] Deployment-Workflow fuer IONOS SFTP
+- [x] Cloudflare-Workflow um stefankoelle erweitert (paths-ignore)
+
+### Vorherige Erledigungen (Stand 2026-08-13)
- [x] Impressum angelegt + Footer-Link auf allen Sites
- [x] Favicons (SVG mit Emojis) pro Subdomain — `shared/favicon/*.svg`, per Passthrough Copy
- [x] Meta descriptions auf allen 33 Seiten
@@ -51,3 +65,7 @@ Alle 5 Sites live auf Cloudflare Pages:
- ✅ smarthome.moonweb.org — Smart Home Übersicht + Detailseiten
- ✅ infra.moonweb.org — Infra-Übersicht (redigiert)
- ✅ retro.moonweb.org — Ehrliche minimale Übersicht (WIP)
+
+stefankoelle.de live auf IONOS (SFTP-Deployment):
+- ✅ stefankoelle.de — Onepager mit CV, Projects, Languages, Impressum
+- ✅ stefankoelle.de/ledmatrix/ — LED Matrix WebServer Dokumentation
diff --git a/package.json b/package.json
index fe93e5e..b984688 100644
--- a/package.json
+++ b/package.json
@@ -9,13 +9,15 @@
"dev:smarthome": "npx @11ty/eleventy --config=smarthome/eleventy.config.js --serve --port=8083",
"dev:code": "npx @11ty/eleventy --config=code/eleventy.config.js --serve --port=8084",
"dev:retro": "npx @11ty/eleventy --config=retro/eleventy.config.js --serve --port=8085",
- "dev": "npm run dev:hub & npm run dev:infra & npm run dev:smarthome & npm run dev:code & npm run dev:retro",
+ "dev:stefankoelle": "npx @11ty/eleventy --config=stefankoelle/eleventy.config.js --serve --port=8086",
+ "dev": "npm run dev:hub & npm run dev:infra & npm run dev:smarthome & npm run dev:code & npm run dev:retro & npm run dev:stefankoelle",
"build:hub": "npx @11ty/eleventy --config=hub/eleventy.config.js",
"build:infra": "npx @11ty/eleventy --config=infra/eleventy.config.js",
"build:smarthome": "npx @11ty/eleventy --config=smarthome/eleventy.config.js",
"build:code": "npx @11ty/eleventy --config=code/eleventy.config.js",
"build:retro": "npx @11ty/eleventy --config=retro/eleventy.config.js",
- "build": "npm run build:hub && npm run build:infra && npm run build:smarthome && npm run build:code && npm run build:retro"
+ "build:stefankoelle": "npx @11ty/eleventy --config=stefankoelle/eleventy.config.js",
+ "build": "npm run build:hub && npm run build:infra && npm run build:smarthome && npm run build:code && npm run build:retro && npm run build:stefankoelle"
},
"devDependencies": {
"@11ty/eleventy": "^3.1.6"
diff --git a/stefankoelle/_includes/cv-content.njk b/stefankoelle/_includes/cv-content.njk
new file mode 100644
index 0000000..c72c241
--- /dev/null
+++ b/stefankoelle/_includes/cv-content.njk
@@ -0,0 +1,97 @@
+
+
CV
+
+
+
Stefan Kölle
+
Senior Software Developer & Software Architect
+ Neumarkter Str. 86c, 81673 München
+ E-Mail: [email protected]
+
+
+
+
Profile
+
Experienced Senior Software Developer and Software Architect with over 20 years of experience in developing and managing microservices and IT architectures. Specialized in .NET Core and Kubernetes, with hands-on experience in AI-assisted development using Claude Code. Clear focus on efficient, innovative, and sustainable solutions. Highly skilled in executing complex projects, building cloud-native services, and optimizing processes through modern technologies.
MCP-Server for ChatGPT Integration (2026) Built an MCP server for a major platform integration using Claude Code, from concept to production in 6 half-days solo. Full spec, Confluence documentation, Jira epics and stories, and PO artifacts fully generated within the same workflow.
+
AI-driven Project Documentation (2026) Using Claude Code to generate complete project documentation end-to-end, including Confluence pages, Jira epics and stories, covering the full PO process without manual overhead.
+
AI-Tooling Repository (2026): Built a structured AI-assisted development framework for the .NET team, providing reusable workflows for plan-and-implement processes, QA testing, and code reviews. Presented at internal Demo Day with full documentation.
+
Regular presenter at internal monthly Demo Days, sharing AI tooling advances and new project outcomes with the engineering organization.
+
Kubernetes Migration: Migrating background workers from Azure Docker to Kubernetes, including job restart logic, state persistence across runs, and monitoring.
+
AI-assisted Development Workflow: Established a production-ready Claude Code workflow for rapid delivery, reducing time-to-production for new services significantly.
+
Infrastructure Cost Optimization (2025) Reduced monthly infrastructure costs by €1,850 through strategic decommissioning of legacy systems and cloud routing migration, delivering ~€22,000 in annual savings.
+
QA Automation Framework Built a scalable integration test system enabling continuous, code-based QA coverage growth and cross-codebase bug detection across multiple services.
+
AI Workshop Organized and led an internal team workshop on AI-assisted search query parsing and natural language processing for job search optimization.
+
Active Services Migration to Kubernetes (2025) Planned migration of active production services from legacy hosting to Kubernetes, including documentation and architectural concepts.
+
Consistently delivering full-time output while working part-time, recognized across multiple product teams for high productivity and reliable delivery.
OpenAI Integration (2024) Integrated OpenAI-based salary data generation into a multi-tenant microservice, enabling automated, AI-driven content enrichment at scale.
+
Solely responsible for designing and building multiple core backend microservices end-to-end, including application services, geo data, feed generation, salary data, and email delivery integrations.
+
Collaborating closely with the Product Owner to create and implement new services.
Docker Host VM 110 (Proxmox PVE) Deployed new virtualized Docker host (VM 110,) with Debian 12.2 as fresh infrastructure replacement for legacy VM 101. Implemented optimized Docker engine with containerized services including Portainer, Prometheus, Grafana, Gitea, MQTT broker, and monitoring exporters. Successfully migrated nginx-proxy-manager database from Docker to MariaDB LxC for improved stability.
+
InfluxDB Time-Series Integration Deployed InfluxDB 2.x for sensor data collection from Tasmota smart plugs and HomematicIP thermostats, replacing older MySQL-based storage with modern time-series architecture.
+
LED Matrix ESP32 InfluxDB Time-Series Integration Implemented data persistence layer for LED Matrix ESP32 sensor systems (DHT22 temperature/humidity) with InfluxDB 2.x backend. Automated collection of matrix display metrics and environmental sensor data at 60-second intervals, enabling historical trend analysis and long-term performance monitoring.
+
Interactive Air Quality Dashboard (luftwerte.html) Developed dynamic HTML5 dashboard consuming real-time sensor data directly from InfluxDB backend via Flux query API. Displays aggregated temperature and humidity measurements across all network locations with responsive design supporting multiple device form factors. Serves as primary interface for environmental monitoring accessible via nginx reverse proxy.
+
Tasmota Energy Monitoring Implemented smart plug energy tracking system with 8 Tasmota-enabled devices, integrating MQTT data collection and visualization for home automation monitoring.
+
MQTT Broker Migration Migrated MQTT infrastructure from Synology NAS to Docker-based VM for improved stability and integration with modern smart home automation, while maintaining backward compatibility with legacy devices.
+
Four Managed Zyxel GS1200-8HP Switches Deployed four managed Zyxel switches across network topology with SNMP exporter integration for centralized monitoring. Serverraum (192.168.178.250), Wohnzimmer (192.168.178.251), Powerlan (192.168.178.252), and OpenWRT office (192.168.188.250). Each switch monitored via Prometheus with dedicated export ports (9436-9439) providing real-time network traffic and port status visibility.
+
Multi-WAN OpenWrt Router (Office Workstation) Implemented advanced OpenWrt routing system in office workspace with multi-WAN capabilities, connected as Zyxel switch target (192.168.188.250). Enables intelligent traffic distribution, failover support, and advanced VLAN segmentation for hybrid network connectivity during retro-computing sessions and general office networking.
+
Network Monitoring & SNMP Integration Extended Prometheus infrastructure with SNMP exporters for all managed switches, enabling unified visibility of hardware statistics, port utilization, and network performance metrics across home network environment.
+
IoT VLAN Isolation (VLAN 189) Implemented dedicated isolated network segment for IoT devices using Zyxel GS1200-8 switch with OpenWRT, separating smart home devices from legacy systems through VLAN segmentation.
+
+
+
Retro Computing (2022/2023)
+
+
MiSTer and MiST FPGA Systems for preservation.
+
DOS System, Amiga System, and Atari ST System with the environment from the early 90s.
+
+
+
Upgrade of old Atari Mega 4 (2021)
+
+
Gotek Drive
+
More RAM
+
Alternative TOS ROMs
+
SD HDD Adapter
+
+
+
Home Automation (since 2018)
+
+
Arduino/ESP32/Raspberry/Home Automation.
+
LED Matrix ESP32 for Date, Time, Weather, and Status messages (Web API).
+
+
Attached Light sensor, DHT22 Temperature Sensor (Web API).
+
Every room has its LED matrix.
+
+
dotnet core application (Master on iMac and 4 clients on Raspberry PIs).
+
MQTT for message transfer and remote control via Tasmota RF Module (433MHz).
+
Evaluation of power meters from washing machine and tumbler.
+
Info message when finished on LED matrices.
+
MP3 player (e.g., automatic play in the bathroom when the light is on).
+
One Raspberry Pi with pilight and RF433 Module for activating remote control power plugs.
+
+
+
Proxmox Server with Various LxC Linux (since 2020)
+
+
pihole
+
suricata
+
webone
+
minecraft bedrock server (multiple instances)
+
divoom-rest
+
+
+
Various Docker Systems (since 2016)
+
+
portainer
+
nginx
+
grafana
+
prometheus
+
cadvisor
+
nodeexporter
+
gitae
+
stirling-pdf
+
stretto
+
tubearchivist
+
tubesync
+
healthchecks
+
watchtower
+
+
+
Walk-on Song (2019)
+
+
When someone enters the office, their jingle is played.
+
ESP32 scans WiFi, if a known device is found for the first time per day, the jingle is played.
+
MP3 Module for playback on attached speaker.
+
+
+
Kids RFID MP3 Player (2018)
+
+
Interactive audio playback system utilizing RFID technology.
+
Powered by an Arduino Nano for compact and efficient operation.
+
Plays specific audio files when RFID-tagged objects or cards are placed on the device.
+
Designed for simplicity and intuitive use, suitable for all ages.
+
Customizable: users can upload and assign personalized audio content to RFID tags.
Used Turbo Pascal and inline assembler for Development
+
+
+
Atari ST Software Development (1990 - 1992)
+
+
Completed game 'Atom oh no' in 1992 (GFA Basic)
+
+
+
+
+
+
+
+
Programming Languages
+
+
Since 2025, AI-assisted development with Claude Code has become a core part of my workflow. This approach enables faster delivery from idea to production, better documentation artifacts, and cross-technology work across .NET, TypeScript, and Kubernetes.
+
+
.NET Core
+
+
Intensively worked with .NET Core starting in 2018 at stellenanzeigen.de GmbH & Co. KG and continued at TENHIL GmbH & Co. KG from 2022.
+
Migrated old VB and ASP-Classic applications to modern .NET Core applications.
+
Planned and implemented hosting architecture on Azure.
+
Introduced a CMS based on Squidex.
+
Developed new multi-client microservices for all brands using .NET Core 8, Docker, Terraform, Azure WebApps, Azure Tables, Azure Blobs, Uptrends, Sentry, Loki, and Quartz.NET.
+
Created microservices including Jobs Per Mail, JobApply application service, GeoService, Feedexporter, and Salary Data Service.
+
+
+
TypeScript
+
+
Started using TypeScript in professional projects in 2024 at TENHIL GmbH & Co. KG.
+
Built an MCP (Model Context Protocol) server for ChatGPT integration, developed solo from concept to production in 6 half-days using Claude Code.
+
Implemented a TypeScript-based widget renderer for AI-driven applications, including integration with the OpenAI Chat Kit.
+
Applied TypeScript as the primary language for new AI-focused microservices where it was the right technology choice.
+
+
+
Python
+
+
Using Python since 2020 for private projects and tooling.
+
Applied in various automation scripts and data processing projects in a home lab environment.
+
Since 2026, using Python increasingly in home network projects driven by AI-assisted development with Open Code.
+
+
+
.NET Framework
+
+
Gained experience with the .NET Framework between 2004 and 2010 as CTO at stellenanzeigen.de GmbH & Co. KG.
+
Led the migration from ASP Classic to the .NET Framework.
+
Hosted applications on Windows IIS and used MSSQL as the database.
+
Split software into different layers and enabled communication via SOAP web services.
+
Introduced TDD and DDD, and engaged with the .NET community through OpenSpaces and CodingDojos.
+
+
+
PHP
+
+
Developed a website CMS system (activetool.de) for multiple clients from 2003 to 2008.
+
Created a PHP Ticketing System and worked with MySQL databases.
+
+
+
ASP-Classic
+
+
Started with ASP-Classic on PC (Windows) in 1999 while working as a web developer at IXOS AG.
+
Managed the web development environment and built internal departmental websites.
+
Introduced search functions, request systems, and link checkers to optimize web servers.
+
Developed a Visual Basic application for generating static web pages.
+
Designed and implemented a workflow for maintaining the website using ASP scripts and SQL databases.
+
Led the IT and development department at stellenanzeigen.de GmbH & Co. KG from 2000 to 2003, migrating applications from idc/htx to ASP-Classic and developing a multi-client web frontend for newspaper publishers.
+
+
+
Java
+
+
Began using Java on PC (Windows) in 1998.
+
Participated in a Security Hash Team Project at iXOS Software AG, developing the Java frontend.
+
Utilized development environments such as Kawa and IBM Visual Age.
+
+
+
C++
+
+
First used C++ on PC (Windows) in 1997.
+
Worked on an R/3 Integration Project during practical work at iXOS Software AG.
+
Completed one semester of C++ on UNIX (Solaris) during studies in 1998.
+
+
+
PASCAL
+
+
Started with PASCAL on PC in 1993, using TurboPascal 6.0, 7.0, and Borland Pascal 7.0.
+
Developed DOSMENU software for DOS PCs and tools for Fidonet.
+
Created two games: a Wheel of Fortune clone and a two-player Tetris.
+
Studied PASCAL for one year in school (1994) and one semester on UNIX (Solaris) during studies in 1996.
+
+
+
Assembler
+
+
Began learning Assembler on the Atari ST in 1992, creating simple programs with Pure Assembler, part of the Pure C Pack.
+
Developed a small text mode demo with sound using DevPAK.
+
Gained experience on PC in 1994, creating four demos using inline assembler in TurboPascal.
+
+
+
C
+
+
First encountered C on the Atari ST in 1992, creating simple programs with Pure C, an advanced version of Turbo C.
+
Completed one semester of C during studies in 1997.
+
+
+
BASIC
+
+
Gained initial experience with BASIC on the EPSON HX-20 in 1988 and Atari ST in 1989.
+
Developed two small games (Bowling, LiveStyleCity) using OmicronBasic.
+
Created games such as AtomOhNo (an Atomix clone) and TOPchangethecolor with GFA-Basic and TOPpack.
+
Produced graphic demos on the Atari ST around 1991.
+
Developed simple programs using Amiga Basic in 1991.
+
Studied BASIC for two years in school (1991-1992), including coding a Snake clone during class.
+ The LED Matrix WebServer system is a fully configurable LED display solution for home networks.
+ It is based on the NodeMCU-32S ESP32 with up to 12 cascaded MAX7219 8x8 LED modules.
+ Using a simple REST API, messages can be displayed, animations controlled, and sensor data queried.
+
+
+
+
+
🎯 Easy to use
+
Web-based control
+
Control your LED matrix via HTTP REST API from anywhere in the network