Was keine App allein weiß.
Vier Apps erfassen meinen Tag: Hevy das Training, MyFitnessPal das Essen, die Waage das Gewicht, die Uhr den Schlaf. Milo liest sie alle und sagt mir, was sie zusammen bedeuten.
Ich habe Milo gebaut, weil ich so einen Coach nirgends kaufen konnte. Die Skizze zeigt, wie er aufgebaut ist. Beim Scrollen dockt jedes Teil an.
Ein Ort für alles.
Ich wollte nie, dass Milos Wissen in einem Chatverlauf hängt. Deshalb steht alles in Postgres: Training, Messwerte, Habits, Erinnerungen, jede Nachricht. n8n reicht es an Claude, Claude antwortet.
Der Kern hat Anschlüsse am Rand. In den nächsten Kapiteln füllen sie sich.
Acht Blöcke sagen Milo, wo ich stehe.
Statt eines Chatverlaufs bekommt Claude ein Briefing. Acht Blöcke, bei jeder Nachricht neu aus der Datenbank gerechnet und in die Persona gesetzt. Fehlt ein Wert, steht das so da. Fehlt ein Block, antwortet Milo nicht.
- DATUM
- Wochentag und Datum
- ZIELE
- Meine Ziele, aus dem Profil
- HISTORIE
- Training je Woche und Muskelgruppe, dazu Gewicht, Schlaf, Schritte, Protein und Termine
- KONTAKT
- Stand der unbeantworteten Check-ins
- EVIDENZ
- Was die Forschung zur aktuellen Frage sagt, mit Quelle
- HABITS
- Was ich diese Woche schon geschafft habe
- ERINNERUNGEN
- Erinnerungen, die zur Nachricht passen oder heute fällig sind
- GESPRAECH
- Verlauf der letzten Tage, mit Uhrzeit
Was ich sowieso schon tracke.
Ich wollte keine neue App, in die ich etwas eintippe. Die Apps, die ich schon nutze, erfassen weiter. Milo bekommt ihre Daten und muss nie nachfragen.
Hevy
Sobald ich ein Workout in Hevy speichere, meldet Hevy es Milo. Der holt die Sätze und schreibt sie in die Datenbank. Nachts prüft er die zehn neuesten Workouts noch einmal, falls eine Meldung verloren ging.
Apple Health
Ein Apple-Kurzbefehl holt Gewicht, Essen, Schlaf und Schritte aus Apple Health und schickt sie an Milo. Die Rohdaten bleiben liegen. Geht beim Verarbeiten etwas schief, verarbeite ich den Tag einfach noch einmal.
Knöpfe
Ein paar Dinge kann nur ich wissen. Dafür tippe ich einen Knopf, in Telegram oder in der Webapp. Milo speichert jeden Tipp als Ereignis und nimmt den letzten.
Will ich eine neue Quelle, baue ich einen Webhook und eine Funktion. Der Rest ist schon da: die Sicht, in der alle Messwerte zusammenlaufen, und die Habits, die darauf schauen.
Was Milo sagt, hat SQL vorgerechnet.
Ein Sprachmodell zählt Wochentage so sicher wie ich Kopfrechnen nach dem Training. Am 30.09. machte Milo aus fünf Tagen zwei. Seitdem kommt jede Zahl zu Abständen und Wochen aus SQL, und Milo übernimmt sie wörtlich.
Genauso bei Trainingszielen: Je Übung zählt der beste Arbeitssatz. Das Ziel der nächsten Einheit ist, ihn zu schlagen, mit einer Wiederholung mehr oder mit dem nächsten Gewichtsschritt.
Milo träumt, und dabei fällt ihm etwas auf.
Nachts schaut Milo sieben Tage zurück. Comeback, Pause, neues Höchstgewicht, Habit-Serie: Was er findet, speichert er einmal als Erinnerung. Fällt eine Nacht aus, holt die nächste es nach.
Auch aus Gesprächen entstehen Erinnerungen: ein Satz, der für sich allein verständlich ist, mit Art, Wichtigkeit und Vektor. Bei jeder Nachricht holt Milo die passendsten, nach Ähnlichkeit, Wichtigkeit und Alter.
Montags fasst Milo die Woche zusammen.
Montags stellt SQL die Woche zusammen, Claude schreibt daraus einen Wochenrückblick und eine neue Fassung meines Kernprofils. Keine Fassung wird überschrieben.
Milo darf sich irren, aber nicht dauerhaft. Falsche Erinnerungen lösche ich in der Webapp. Weg ist weg, und das Protokoll kennt den Wortlaut nicht.
Fachwissen nur mit Quelle.
Ich wollte nicht, dass Milo Fitness-Wissen aus dem Modell holt. Deshalb gibt es 49 Karten, jede mit Aussage, Folge, Grenzen, Belastbarkeit und einer geprüften DOI. Zu jeder Nachricht sucht Milo die passenden, höchstens drei.
Zahlen und Studienbefunde nennt Milo nur aus diesen Karten oder aus meinen Daten, und er sagt dazu, wie sicher das ist. Fehlt ihm die Grundlage, sagt er das und notiert die Frage.
Will ich Milo etwas Neues beibringen, schreibe ich eine Karte in die Seed-Datei. Nachts bekommt sie ihren Vektor, dann findet Milo sie.
Egal wo ich schreibe, Milo weiß Bescheid.
Ein Kanal ist bei Milo nur ein Webhook. Agent, Gedächtnis und Verlauf sind für alle dieselben. Was ich morgens in Telegram sage, weiß Milo abends im Web.
Telegram
Mit Telegram hat Milo angefangen. Abends kommt hier der Check-in, unter der Habit-Nachricht liegen die Knöpfe zum Abhaken. Sprachnachrichten schreibt Whisper ab.
Webapp
heymilo.de ist Milos eigene Oberfläche, privat, Anmeldung per Passkey. Der Chat startet zuerst und zeigt denselben Verlauf wie Telegram. Milos Antwort erscheint Wort für Wort, dazwischen das Logbuch mit Training, Gewicht und Habits. Antworten kommen als Push aufs Handy.
Sprache
Nach dem Training tippe ich nicht gern. Also halte ich den Knopf, rede und lasse los. Whisper schreibt ab, mit einem Wörterbuch aus der Datenbank. Gespeichert wird nur der Text, kein Ton.
Will ich Milo woanders erreichen, baue ich einen Webhook und trage einen Wert für channel ein. Vom ersten Web-Chat bis zur Sprachnachricht hat das zwei Tage gedauert.
Nebenbei
Ein Blick aufs Handy reicht: Das Widget zeigt die Woche als Raster, der Bereich Heute dasselbe mit Verlauf. Jedes Workout landet im Kalender, der Titel kommt aus den Sätzen, nicht aus Hevy.
Milo passt auf sich selbst auf.
Bricht ein Workflow ab, landet der Fehler in der Datenbank und als Telegram-Nachricht bei mir. Geheimnisse sind vorher geschwärzt, ein Warnzeichen unterscheidet die Meldung von Milo. Wiederholt sich ein Fehler, kommt er höchstens einmal pro Stunde.
Nicht jeder Fehler macht Lärm. Eine tägliche Prüfung meldet, wenn der Kurzbefehl seit 36 Stunden schweigt oder ein Wert dreimal hintereinander fehlt. Was sich nachts heilen lässt, heilt nachts.
Was eine Erweiterung kostet.
Ich habe Milo so gebaut, dass Neues meist eine Zeile in der Datenbank ist, kein Umbau. Tipp eine Erweiterung an: Auf der Bühne leuchtet auf, was sich ändert, darunter steht der echte Code.
Was als Nächstes kommt.
Was ich als Nächstes baue, steht in der Roadmap. Drei Steckplätze sind dafür schon frei, ein Datum gibt es nicht.
- Ernährung
- Statt alles zu tracken: Milo macht einen Plan, ich sage nur, wenn ich abweiche. Unbekanntes schätzt er und sagt, dass er schätzt. Die Zielwerte stammen aus den Evidenzkarten.
- Trainingsplan
- Ein Trainingsplan als Tabelle in der Datenbank, mit Moduswechsel und Deload.
- Neue Karten
- Schlafregelmäßigkeit, Kreatin, Schritte. Sie kommen erst, wenn die Quellen geprüft sind.
Was Milo nicht kann.
- Milo gibt es nur für mich. Kein Produkt, keine Konten, keine Warteliste.
- Milo stellt keine Diagnosen. Tut etwas weh, rät er zu Pause und zum Arzt. Geht es mir schlecht, hört er auf zu coachen und zeigt auf Menschen.
- Er sieht nur, was Apps erfassen und was ich ihm sage.
- Er kann sich irren, sagt aber dazu, wie sicher er ist: gut belegt, Hinweis, umstritten.
- Alles, was SQL noch nicht ausrechnet, rechnet das Modell, und das kann schiefgehen.
- Alle Werte auf dieser Seite sind Beispiele, keine echten Gesundheitsdaten.