<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Projekte on Faffis Blog</title>
    <link>https://faffi.cloud/projekte/</link>
    <description>Recent content in Projekte on Faffis Blog</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 15 Sep 2026 10:00:00 +0200</lastBuildDate>
    <atom:link href="https://faffi.cloud/projekte/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kinderbasar Biekhofen</title>
      <link>https://faffi.cloud/projekte/kinderbasar/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/kinderbasar/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Ein Kinderflohmarkt zugunsten des Kindergartens sieht von außen harmlos aus und ist
organisatorisch ein kleines Unternehmen. Verkäufernummern werden per WhatsApp vergeben
und doppelt vergeben, die Einwilligungserklärung liegt irgendwo auf Papier, am
Verkaufstag läuft die Kasse über einen Taschenrechner, und danach sitzt jemand zwei
Abende lang und rechnet aus, wer wie viel bekommt. Wer einmal dabei war, weiß, dass der
Ärger nicht beim Verkaufen entsteht, sondern hinterher bei der Abrechnung.&lt;/p&gt;</description>
    </item>
    <item>
      <title>mAI Whisky &amp; mAI Wine</title>
      <link>https://faffi.cloud/projekte/mai-tasting/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/mai-tasting/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Die Whisky-Sammlung wuchs, und die Verkostungsnotizen standen in einem Notizbuch, in
dem sie mit der Zeit verblassen — und mit ihnen der Geschmack im Kopf. Dazu der
Klassiker: Irgendwann weiß man nicht mehr, welche Flaschen schon zu Hause stehen, und
holt die dritte aus derselben Region.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Foto vom Etikett, ein Vision-Modell erkennt die Flasche und legt sie mit Marke, Region
und Jahrgang in der Sammlung ab. Aus freien Notizen wird ein Geschmacksprofil, das als
Radar-Chart über Achsen wie rauchig, süß, fruchtig und würzig liegt. Bei einer
Verkostung bewerten Gäste über eine Web-Seite mit, ohne etwas installieren zu müssen.
Hinter beiden Apps — mAI Whisky und mAI Wine — steht ein einziges Backend. Der
App-Code liegt in einem Monorepo mit einem geteilten Workspace für UI-Komponenten und
API-Client; rund achtzig Prozent der Oberfläche sind ohnehin dieselben, der Rest ist
whisky- oder weinspezifisch.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MyTapo Event-Detection</title>
      <link>https://faffi.cloud/projekte/mytapo/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/mytapo/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Reines Energiemonitoring ist schnell langweilig. Eine Zeitreihe in Grafana zeichnet
hübsche Sägezähne und beantwortet keine der Fragen, die im Alltag tatsächlich
vorkommen: Ist die Waschmaschine fertig? Wie viele Espressi waren es diese Woche?&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Aus dem rohen Verbrauchsstrom werden diskrete Events. Eine Zustandsmaschine pro Gerät —
idle, active, cooling down — erkennt anhand von Schwellwert-Hysterese, Mindest- und
Maximaldauer und einer Cooldown-Zeit, wann ein Waschzyklus, eine TV-Session oder ein
Espressobezug beginnt und wann er endet. Kurze Stromabfälle zwischen zwei
Schleudergängen lösen dabei kein falsches Zyklusende aus. Jedes abgeschlossene Event
geht mit Spitzenleistung, Durchschnitt, Energie und Tags wie Stunde und Wochentag in
eine eigene InfluxDB-Bucket, getrennt von den Rohdaten.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NarrAItive</title>
      <link>https://faffi.cloud/projekte/narraitive/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/narraitive/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;An einem Sonntag im Jahr 2023 saß ich im Wohnzimmer und staunte über die Berge an
Bilderbüchern für unsere Kinder. Vorgelesen wurden trotzdem immer dieselben drei, und
eine Geschichte, in der das eigene Kind vorkommt, war in keinem der Stapel dabei.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Ein Stichwort genügt — „Emilia reist mit einem Einhorn nach Italien&amp;quot;. Das System
erkennt, welche Charaktere unbekannt sind, fragt nach dem Aussehen oder liest es aus
einem hochgeladenen Bild, schreibt die Geschichte in zehn Abschnitten, erzeugt zu jedem
Abschnitt ein Bild und spricht die Kapitel mit einer Stimme ein, die sich auch klonen
lässt. Geschichten, Charaktere und die Pfade zu Bildern und Audiodateien liegen in
einer DuckDB, die Oberfläche ist Streamlit. So lässt sich ein einmal erzeugtes Buch
jederzeit wieder aufschlagen.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Solar Power Prediction</title>
      <link>https://faffi.cloud/projekte/solar-prediction/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/solar-prediction/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Strom sollte dann verbraucht werden, wenn die Anlage ihn liefert. Wann sie liefert, ist
aber keine Messfrage, sondern eine Prognosefrage — und wer morgens entscheidet, ob die
Waschmaschine jetzt oder heute Abend läuft, hat diese Antwort nicht.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Die Wetterprognose kommt stündlich von Open-Meteo aus dem DWD-ICON-Modell. Darauf sitzt
ein RandomForest, trainiert auf historischen Wetter- und Verbrauchsdaten aus der
InfluxDB auf dem NAS. Das Modell sagt den Folgetag stundenweise voraus und markiert die
Fenster, in denen die Erzeugung über dem erwarteten Verbrauch liegt. Erfasst sind dabei
nur die Geräte, die an Messsteckdosen hängen — Heizung, Beleuchtung und alles ohne
Zwischenstecker bleiben außen vor. Die Zahlen beschreiben also nicht den gesamten
Haushalt, sondern den gemessenen Teil davon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vereinswebsite TC Blau-Weiß</title>
      <link>https://faffi.cloud/projekte/tcbw-website/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/tcbw-website/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Die alte Vereinsseite lief auf WordPress, aber genutzt hat sie kaum noch jemand:
unübersichtlich gewachsen, mit veralteten Inhalten, und sicherheitstechnisch war das
schon lange nicht mehr zu verantworten. Im Vorstand wollte sich niemand um PHP-Versionen
und Plugin-Updates kümmern. Dazu die Anforderung, dass das Hosting nichts kostet und
nichts kaputtgeht, wenn ein halbes Jahr niemand hinschaut.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Ein Static-Site-Generator plus ein Headless-CMS, das im Browser läuft: Hugo baut die
Seite, DecapCMS gibt dem Vorstand eine Oberfläche zum Schreiben, und jede Änderung
landet als Commit im Git-Repository. Kein Server, keine Datenbank, kein PHP — und damit
auch keine Angriffsfläche, die jemand patchen müsste. Gehostet auf Cloudflare Pages,
das bei jedem Push neu baut.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Doppelkopf-Statistik</title>
      <link>https://faffi.cloud/projekte/doko-stats/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/doko-stats/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Eine Stammrunde spielt jahrelang online Doppelkopf. Am Ende steht eine lange
Zahlenkolonne auf einem Zettel, und auf die naheliegende Frage — wer spielt eigentlich
gut, und woran liegt das — gibt sie keine Antwort. Die Plattform selbst zeigt jede
Partie einzeln, aber nichts über die Jahre hinweg.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Ein Scraper holt die Partien mitsamt vollständigem Protokoll: Login, Cursor-Pagination,
Wiederaufnahme an der Abbruchstelle und ein Umgang mit dem Rate-Limit, der die Seite
nicht überrennt. Alles landet in einer DuckDB. Die eigentliche Auswertung steckt nicht
in Skripten, sondern in Datenbank-Views, und die rohen Seiten bleiben auf der Platte —
nach jeder Schema-Änderung lässt sich der gesamte Bestand daraus in Minuten neu
einlesen, ohne die Seite noch einmal anzufassen. Daraus entstehen zwei Dinge: ein
Dashboard als einzelne HTML-Datei und ein Wochenbericht, der per Pushover auf dem Handy
landet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Medenspiel-Planner</title>
      <link>https://faffi.cloud/projekte/medenspiel-planner/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/medenspiel-planner/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Die Aufstellung für ein Medenspiel entsteht traditionell in einer WhatsApp-Gruppe und
einer Doodle-Umfrage: Wer kann am Sonntag? Ein Doodle beantwortet allerdings nur die
halbe Frage. Es sagt, wer Zeit hat, aber nicht, wer spielen darf — denn die Aufstellung
muss der verbindlichen Meldeliste folgen. Der Mannschaftsführer sitzt am Ende trotzdem
da und sortiert von Hand. Und wenn ein Spieltag verlegt wird, fängt alles von vorne an.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Eine kleine Web-App ohne Login: Jeder Spieler bekommt einen Magic Link und trägt pro
Spieltag ein, ob er kann — mobil, mit zwei Klicks. Der Mannschaftsführer bekommt keinen
Umfragebalken, sondern einen fertigen Aufstellungsvorschlag, sortiert nach
Meldelistenposition, inklusive Hinweis auf Lücken und einer Reihenfolge, in der er
telefonieren sollte. Spielplan und Meldeliste werden einmal über die Team-ID aus nuLiga
importiert. Wird ein Spiel verlegt, bleiben die vorhandenen Antworten erhalten und nur
die betroffenen Spieler werden erneut gefragt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wippestoolen</title>
      <link>https://faffi.cloud/projekte/wippestoolen/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/wippestoolen/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Eine Bohrmaschine wird im Schnitt rund 13 Minuten überhaupt benutzt und steht den Rest
ihres Lebens im Keller. In derselben Straße liegt in jedem zweiten Keller dieselbe
Schlagbohrmaschine, derselbe Akku-Schrauber, derselbe Vertikutierer — und jedes dieser
Geräte kommt ein- oder zweimal im Jahr aus dem Regal.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Eine kleine, lokale Plattform, auf der Nachbarn ihr Werkzeug teilen, ausleihen und
wiederfinden. Inspiriert von Foodsharing, aber für die Stichsäge im Keller. Wer etwas
besitzt, legt es mit Fotos, Verfügbarkeit und ungefährem Standort an; wer etwas
braucht, sucht in einer Kartenansicht nach allem in Lauf-Distanz. Aus einem Treffer
wird eine Buchung mit klarem Statusverlauf, nach der Rückgabe bewerten sich beide
Seiten. Technisch bewusst klassisch geschnitten: ein FastAPI-Service gegen Postgres,
davor ein getrenntes Frontend auf Vercel, das später auch eine Mobile-App bedienen
kann.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getränkebuchung am iPad</title>
      <link>https://faffi.cloud/projekte/tcbw-getraenkebuchung/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/tcbw-getraenkebuchung/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;An der Theke im Vereinsheim hängt eine A4-Seite mit einem Kugelschreiber an einer
Schnur, daneben Striche für Bier, Wasser und Apfelschorle. In der Theorie funktioniert
das. In der Praxis ist das Ergebnis am Monatsende für den Kassenwart eher Rätselraten
als Buchhaltung: unleserliche Striche, vergessene Namen, Zettel, die feucht geworden
sind.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Eine Kiosk-App für das iPad, das ohnehin schon an der Theke steht. Kein zweiter
Bildschirm, kein PC, kein Drucker, kein Kassensystem. Mitglied auswählen oder per NFC
erkennen, Getränk antippen, fertig. Die Daten liegen lokal in SwiftData und
synchronisieren über CloudKit, sodass der Kassenwart seine Auswertung bekommt, ohne an
der Theke zu stehen.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Social-Media-Grafiken auf Knopfdruck</title>
      <link>https://faffi.cloud/projekte/tcbw-social-tools/</link>
      <pubDate>Tue, 15 Sep 2026 10:00:00 +0200</pubDate>
      <guid>https://faffi.cloud/projekte/tcbw-social-tools/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Der Instagram-Kanal eines Vereins lebt von Regelmäßigkeit, und Regelmäßigkeit scheitert
an Aufwand. Nach jedem Medenspiel müsste jemand eine Ergebnisgrafik bauen: Vereinsfarben
treffen, Logo richtig platzieren, Namen korrekt schreiben. Das macht genau eine Person,
und wenn die im Urlaub ist, passiert nichts.&lt;/p&gt;
&lt;h2 id=&#34;lösung&#34;&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Ein internes Werkzeug mit vier Vorlagen — Match-Ergebnis, Heimspiel-Ankündigung,
Saison-Übersicht und Event. Man füllt ein Formular aus und bekommt eine fertige Grafik
im Vereinsdesign heraus. Die Mannschaftsdaten kommen dabei nicht aus einer zweiten
Pflegequelle, sondern direkt aus dem Repository der Vereinswebsite: Ein Build-Schritt
liest die Mannschaftsseiten aus und erzeugt daraus die Auswahllisten. Was auf der
Website steht, steht damit automatisch auch im Werkzeug.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
