projects.ls
Was ich so baue
What I build
Fünf Maschinen. Ein Cluster. Kein Tutorial, das einem das Denken abnimmt.
Ich habe von Grund auf einen eigenen Proxmox-Cluster aufgebaut –
mit verteiltem Ceph-Storage, Live-Migration, High Availability
und allem, was dazugehört. Nicht weil ich musste, sondern weil ich verstehen wollte,
wie das alles wirklich funktioniert – unter der Haube, ohne Abstraktion.
Darauf läuft unter anderem Home Assistant,
mit dem ich unser Zuhause Stück für Stück smarter mache.
Jedes neue Gerät, jede neue Automatisierung – ein weiteres kleines Experiment.
Five machines. One cluster. No tutorial doing the thinking for you.
I built my own Proxmox cluster from scratch –
with distributed Ceph storage, live migration, high availability
and everything that comes with it. Not because I had to, but because I wanted to understand
how it all really works – under the hood, without abstraction.
Among other things, Home Assistant runs on it,
with which I'm making our home smarter piece by piece.
Every new device, every new automation – another small experiment.
Hardware trifft Software trifft Sport.
Ich entwickle 10 ESP32-Module –
akkubetrieben, drahtlos, jedes mit farbigen LEDs bestückt.
Das Ziel: ein physisches Reaktionsspiel, bei dem Spieler blitzschnell
reagieren müssen, sobald ihre Farbe aufleuchtet. Nicht am Bildschirm –
auf dem Platz. Mit dem ganzen Körper.
Dazu entsteht eine Android-App,
die die Module steuert, Spielmodi verwaltet und Ergebnisse auswertet.
Zwei Spielvarianten sind bereits konzipiert:
Im Team-Modus liefern sich zwei Teams
einen Wettlauf – wer trifft in der vorgegebenen Zeit öfter seine Farbe?
Im Reaktions-Modus zählt jede Millisekunde:
10 zufällige Aufleuchten, die Gesamtreaktionszeit entscheidet.
Hardware meets software meets sport.
I'm developing 10 ESP32 modules –
battery-powered, wireless, each fitted with coloured LEDs.
The goal: a physical reaction game where players must react lightning-fast
when their colour lights up. Not on a screen –
on the field. With the whole body.
A companion Android app is being built
to control the modules, manage game modes and evaluate results.
Two game modes are already designed:
In team mode, two teams race against each other –
who hits their colour more often in the given time?
In reaction mode, every millisecond counts:
10 random flashes, total reaction time decides.
Ein Problem, das eigentlich jeder kennt – aber niemand löst.
Kommunikation zwischen Eltern und Lehrern
ist heute noch oft Zettelwirtschaft, veraltete Apps mit Datenweitergabe
oder schlicht WhatsApp-Gruppen ohne jede Struktur.
Ich baue eine Alternative – mit einem klaren Grundsatz:
der Server speichert nichts.
Nachrichten, Dokumente, Bilder – alles wird nur weitergeleitet, nie gespeichert.
Lehrer können eine eigene E-Mail-Weiterleitung
in der App hinterlegen – eingehende Nachrichten landen direkt im Postfach.
Eltern können Nachrichten an Lehrer senden –
aber nicht untereinander. Die Registrierung läuft über einen
QR-Code – einscannen, fertig, drin.
A problem everyone knows – but nobody solves.
Communication between parents and teachers
is still often paper-based, outdated apps with data sharing,
or simply WhatsApp groups with no structure.
I'm building an alternative – with one clear principle:
the server stores nothing.
Messages, documents, images – everything is only forwarded, never stored.
Teachers can store their own email forwarding
in the app – incoming messages land directly in their inbox.
Parents can send messages to teachers –
but not to each other. Registration works via a
QR code – scan, done, in.
Zentraler KI-Orchestrator für mein gesamtes Heimnetz — eine OpenAI-kompatible API vor mehreren GPU-Hosts mit lokalen Modellen.
Auto-Modell-Auswahl nach Capability + Load + Quality-Bias, interne Queue mit Concurrency-Limit pro GPU, Quality-Feedback-Loop (Clients geben nach Inferenz Score zurück, das fließt in die nächste Modellwahl ein). Health-Checks, Dashboard, Video-Generierung.
Alle eigenen Projekte (LernPlus, Bug-Inbox-Triage, Market-Intelligence) sprechen ausschließlich gegen dieses Gateway statt direkt gegen einen Modell-Provider — eine Auth-Stelle, eine Rate-Limit-Stelle, eine Observability-Stelle.
Central AI orchestrator for my entire home network — an OpenAI-compatible API in front of multiple GPU hosts running local models.
Auto model selection by capability + load + quality bias, internal queue with concurrency limit per GPU, quality feedback loop (clients post a score after inference, that informs the next model choice). Health checks, dashboard, video generation.
All my projects (LernPlus, bug-inbox triage, market-intelligence) talk only to this gateway instead of a model provider directly — one auth point, one rate-limit point, one observability point.
Zentrale Error- und Audit-Event-Sammelstelle für alle eigenen Dienste — keine Sentry-SaaS, keine Datenweitergabe, alles im eigenen Netzwerk.
Services schicken Events per HTTP-POST. Dedup via Fingerprint, Status-Workflow (open → investigating → fixed/wontfix/ignored), Auto-Reopen bei Recurrence. Levels error/warning/audit/info in einer Tabelle, filterbar.
Python- und Node-Client-Libs mit non-blocking queue-based Dispatcher: ein einziges `install_log_handler()` und alle `logger.error/warning` landen automatisch in der Inbox. Framework-Rauschen (DisallowedHost, CSRF-Forbidden u.a.) wird gefiltert. Aktuell in 14 aktiven Projekten integriert.
Central error and audit event collector for all in-house services — no Sentry SaaS, no data sharing, everything stays in my network.
Services post events via HTTP. Deduplication via fingerprint, status workflow (open → investigating → fixed/wontfix/ignored), auto-reopen on recurrence. Levels error/warning/audit/info in a single table, filterable.
Python and Node client libraries with non-blocking queue-based dispatcher: a single `install_log_handler()` and all `logger.error/warning` calls land in the inbox automatically. Framework noise (DisallowedHost, CSRF-Forbidden etc.) gets filtered. Currently integrated in 14 active projects.
Steam-Spiele auf einer Ubuntu-VM mit GPU-Passthrough, gestreamt via Sunshine zu einem Raspberry Pi am Wohnzimmer-TV. Moonlight läuft direkt im Framebuffer auf dem Pi — kein Desktop, kein Window-Manager, einfach Pi anschalten und Kachel "Spielesammlung" wählen.
Eigenes Kiosk-Backend (Flask + Vanilla-JS, controllerbedienbar) mit deklarativer Spiele-Library, Spielzeit-Limits pro Tag, PIN-Gate für Adult-Titel, Steam-Logout-Detection mit Auto-Re-Login (Push aufs Handy zur Bestätigung). Aktuell in Erweiterung um Mediathek-Tiles (ARD/ZDF/KiKA via Kodi+mediathekview) für die Kinder.
Steam games on an Ubuntu VM with GPU passthrough, streamed via Sunshine to a Raspberry Pi at the living room TV. Moonlight runs directly in the framebuffer on the Pi — no desktop, no window manager, just turn the Pi on and pick the "game collection" tile.
In-house kiosk backend (Flask + vanilla JS, controller-navigable) with declarative game library, daily playtime limits, PIN gate for adult titles, Steam logout detection with auto-relogin (push to my phone for confirmation). Currently being extended with media library tiles (ARD/ZDF/KiKA via Kodi+mediathekview) for the kids.
KI-gestützter Aufgabengenerator für Berufsschulen — automatische Erstellung von Lernzielkontrollen aus offiziellen Lehrplänen.
Crawler holt Lehrpläne pro Beruf und Lehrjahr, ein Aufgabenpool wird mit lokalen LLMs durchs eigene AI-Gateway erzeugt. Lehrer kuratieren, kombinieren zu Zusammenstellungen, drucken oder exportieren. Benchmark-Modus vergleicht verschiedene Modelle auf gleichen Aufgaben.
Tailwind-UI, Postgres-Backend, dreistufiger LLM-JSON-Parser (strict → repair → jsonrepair) für robuste Modellausgaben.
AI-assisted exercise generator for vocational schools — automatic creation of learning checks from official curricula.
A crawler fetches curricula per profession and school year, an exercise pool is generated using local LLMs via the in-house AI gateway. Teachers curate, combine into custom worksheets, print or export. Benchmark mode compares models on identical tasks.
Tailwind UI, Postgres backend, three-stage LLM-JSON parser (strict → repair → jsonrepair) for robust model output.
Vereinsverwaltung als Progressive Web App — mehrvereinsfähig, rollenbasiert, datenschutzfreundlich.
Stammdaten (Mitglieder mit Familien-Gruppen, Mannschaften inkl. Spielgemeinschaften), Veranstaltungen mit strukturierten Protokollen, iCal-Export pro Verein, QR-Code-Check-in, Schichtpläne mit Konfliktprüfung und Self-Signup, Trainingsanwesenheit, Finanzbuchhaltung mit SEPA-Lastschrift-Export (pain.008), Spendenbescheinigungen nach §10b EStG, Bestandsverwaltung mit Ausleih-Historie, Sponsor-Portal via Token-Link, Web-Push, öffentliche Vereins-Seite, Datenauskunft-Export pro Mitglied (Art. 15 DSGVO), Turnier-Autogenerator.
Service-Config-Pattern: main → IONOS-Prod auf 82.165.104.133, dev → home-ubuntu mit DynDNS. Auto-Deploy via poll-deploy alle 60s.
Multi-club management as a progressive web app — role-based, privacy-friendly.
Master data (members with family groups, teams including playing communities), events with structured minutes, iCal export per club, QR code check-in, shift plans with conflict checking and self-signup, training attendance, finance accounting with SEPA direct debit export (pain.008), donation receipts per German tax law, inventory management with loan history, sponsor portal via token link, web push, public club page, data subject export per member (Art. 15 GDPR), tournament auto-generator.
Service config pattern: main → IONOS prod on 82.165.104.133, dev → home-ubuntu with DynDNS. Auto-deploy via poll-deploy every 60s.
Reproduzierbarer Bootstrap für den Moonlight-Streaming-Client am Wohnzimmer-TV. Frisches Raspberry Pi OS flashen, ein einziges Bash-Skript laufen lassen, fertig — boots direkt in moonlight-qt im Framebuffer ohne X, ohne Window-Manager.
Idempotent: läuft das Skript mehrmals durch ohne Schäden. Einziger manueller Schritt ist die Sunshine-Pairing-PIN beim ersten Start. Eingerichtet damit die Familie nach einem Hardware-Defekt ohne mein Zutun wieder auf die Spielesammlung kommt.
Reproducible bootstrap for the Moonlight streaming client at the living room TV. Flash a fresh Raspberry Pi OS, run a single bash script, done — boots straight into moonlight-qt in the framebuffer with no X, no window manager.
Idempotent: re-run the script as often as you want without damage. The only manual step is the Sunshine pairing PIN on first start. Built so the family can recover from a hardware failure without my involvement.
Eigenes LAN-Monitoring komplett selbst gebaut — kein Grafana, kein Prometheus, keine fremden Container-Images.
Hub auf einer Ubuntu-VM zuhause läuft als FastAPI-App mit SQLite und Chart.js. Die Agents sind ein einziges Python-Script auf jedem Host, das alle 30 Sekunden Host- und Container-Metriken (CPU, RAM, Load, Disks, pro Container CPU%, RAM, Restart-Count) per Push an den Hub schickt. Bearer-Token-Auth, IP-Whitelist, Trust-on-First-Use-Auto-Registrierung.
Aggregation in drei Tiers (raw 30s/6h, 1min/24h, 5min/30d), Schwellwert-Alerts gehen an die zentrale Bug-Inbox. Dashboard mit Live-Auto-Reload alle 30 s.
A self-built LAN monitoring stack — no Grafana, no Prometheus, no third-party container images.
The hub runs as a FastAPI app with SQLite and Chart.js on a home VM. Agents are a single Python script on each host, pushing host + container metrics (CPU, RAM, load, disks, per-container CPU%, RAM, restart count) every 30 seconds. Bearer-token auth, IP whitelist, trust-on-first-use auto-registration.
Three-tier aggregation (raw 30s/6h, 1min/24h, 5min/30d), threshold alerts go to a central bug inbox. Dashboard with live auto-reload every 30s.
Eigene Anlage-Recherche-Plattform — Branchen-Top-10-Listen, Depot-Strategien, KI-gestützte Auswertung von Quartalsberichten und Marktindikatoren. Baseline ist saubere Datenpersistenz: jede Datenquelle wird vor der Analyse als rohe Tabelle gespeichert, damit Backtests reproduzierbar bleiben.
Phase D im Aufbau: Strategien werden gegen historische Datenfenster gebenchmarkt, ein Empfehlungslayer triagiert via lokalem AI-Gateway. Kein externer Broker-Account, kein Trading — nur strukturiertes Wissen über das eigene Portfolio.
Personal investment research platform — sector top-10 lists, portfolio strategies, AI-assisted evaluation of quarterly reports and market indicators. The baseline is clean data persistence: every data source is saved as a raw table before analysis, so backtests stay reproducible.
Phase D in progress: strategies get benchmarked against historical data windows, a recommendation layer triages via the local AI gateway. No external broker account, no trading — just structured knowledge about my own portfolio.