Zum Inhalt springen
dan felser @felsr
Sport KI 15

Deine Whoop-Daten gehören dir

1 Claude Code öffnen — nicht die App, der Prompt schreibt ein Skript und führt es aus  2 Prompt reinhauen  3 den Rest fragt er dich. Voraussetzung: eine aktive Whoop-Mitgliedschaft.

Du richtest mit mir Whoops offizielle Schnittstelle für mein eigenes Konto ein,
holst meine komplette Geschichte auf meinen Rechner und baust daraus ein
Dashboard, das mir jeden Morgen eine Entscheidung abnimmt.

Du arbeitest Schritt für Schritt. Nach jedem Schritt zeigst du mir, was du
gefunden hast, und wartest, bis ich Weiter sage. Du überspringst nichts, du
baust die Seite nicht vor Schritt 7, und du erfindest keine Zahl, die du nicht
aus einer Datei gelesen hast. Wenn du eine Bestätigung für einen Befehl
brauchst, frag einfach - ich sage dann Ja.

Wenn ich an einer Stelle hängen bleibe, gib mir nicht mehr Text, sondern die
eine Sache, die ich als Nächstes anklicken oder eintippen soll.


SCHRITT 1 - DIE EINE VORAUSSETZUNG

Frag mich zuerst, ob mein Whoop gerade aktiv ist und ob ich es in den letzten
Wochen getragen habe. Die Schnittstelle gibt nur Daten aus, solange die
Mitgliedschaft läuft. Ohne aktives Band funktioniert die ganze Einrichtung
genau so, und am Ende kommt jeder Abruf leer zurück - das ist dann kein Fehler
im Code, und ich soll nicht stundenlang danach suchen.

Sag mir außerdem in einem Satz, was ich NICHT brauche: keine Website, keinen
Server, keine Domain, kein Hosting. Das ist die Hürde, an der die meisten
aufhören.


SCHRITT 2 - DIE EIGENE APP BEI WHOOP

Schick mich auf Whoops Entwicklerseite und führ mich durch die Anmeldung mit
meinem normalen Whoop-Konto.

Sag mir dazu drei Dinge, die die Seite selbst nicht sagt:

Erstens: Ich muss zuerst ein Team anlegen, bevor ich eine App anlegen darf. Der
Name ist egal.

Zweitens: Beim Anlegen der App wollen vier Felder gefüllt werden - Name,
Kontaktadresse, eine Datenschutzerklärung als Link und eine Weiterleitungs-
Adresse. Die letzten beiden sehen aus, als bräuchten sie eine Website. Tun sie
nicht.

Drittens: Alles muss ausgefüllt sein, sonst speichert die Seite nicht.

Frag mich dann, ob ich beim Formular stehe, und geh erst dann weiter.


SCHRITT 3 - DIE ZWEI FELDER, AN DENEN ALLE HÄNGEN BLEIBEN

DIE DATENSCHUTZERKLÄRUNG

Lass mich ein leeres Textdokument anlegen - ein Google Doc reicht - und gib mir
vier Zeilen zum Hineinkopieren, die ehrlich beschreiben, was hier passiert:
dass die App meine eigenen Whoop-Daten für meinen eigenen Gebrauch liest, dass
die Daten auf meinem Rechner bleiben und nicht weitergegeben werden, dass
nichts verkauft, an Dritte übertragen oder für Werbung genutzt wird, und meine
Kontaktadresse.

Dann der Punkt, der wirklich zählt: Ich soll das Dokument ÜBER DATEI, FREIGEBEN,
IM WEB VERÖFFENTLICHEN öffentlich machen und den VERÖFFENTLICHTEN Link nehmen -
nicht den normalen Teilen-Link.

Erklär mir den Unterschied in einem Satz: Ein veröffentlichter Link ist eine
öffentliche Seite und braucht kein Konto. Ein Teilen-Link kann jedem, dem Whoop
ihn vorlegt, eine Zugriffsanfrage zeigen. Eine Datenschutzerklärung, die
niemand öffnen kann, ist keine.

DIE WEITERLEITUNG

Gib mir eine Adresse auf meinem eigenen Rechner, Schema https, Port 8080, Pfad
callback. Schreib sie mir ausgeschrieben hin, damit ich sie abtippen kann.

Und sag mir dazu die Regel, die dahintersteckt: Whoop prüft das SCHEMA, nicht
die Erreichbarkeit. Eine Adresse ohne Verschlüsselung wird abgelehnt, dieselbe
Adresse mit Verschlüsselung angenommen. Es muss dort NIE etwas laufen. Warum
das reicht, sieht man in Schritt 5.


SCHRITT 4 - DIE BERECHTIGUNGEN

Lass mich alle Berechtigungen anhaken: Erholung, Zyklen, Schlaf, Training,
Profil, Körpermaße - und die siebte, die nicht nach Daten aussieht und offline
heißt.

Erklär mir, warum genau die entscheidend ist: Ohne sie bekomme ich einen
Zugang, der nach einer Stunde stirbt, und keinen Erneuerungsschlüssel. Ich
müsste dann jedes einzelne Mal von Hand neu autorisieren. Mit ihr erneuert sich
das Skript für immer selbst.

Danach speichere ich die App und habe zwei Werte vor mir: eine Kennung und ein
Geheimnis. Sag mir, dass ich das Geheimnis wie ein Passwort behandeln soll -
nicht posten, nicht in ein öffentliches Verzeichnis legen, nicht in einen
fremden Chat kopieren.

Frag mich, ob beide Werte da sind. Lass sie mich in eine lokale Datei schreiben,
nicht in den Chat, wenn dir das lieber ist - sag mir dann genau, wie.


SCHRITT 5 - DIE VERBINDUNG, OHNE DASS IRGENDWO ETWAS LÄUFT

Das ist der Teil, der schwer aussieht und neunzig Sekunden dauert.

Bau mir aus meiner Kennung einen Autorisierungs-Link. Er zeigt auf Whoops
Autorisierungsadresse und trägt fünf Angaben: meine Kennung, meine
Weiterleitungs-Adresse in url-kodierter Form, den Antworttyp Code, die Liste
aller sieben Berechtigungen, und einen frei gewählten Zufallstext.

Der Zufallstext braucht MINDESTENS ACHT ZEICHEN. Ist er kürzer, schlägt der
Aufruf fehl, ohne zu sagen warum. Schlag mir einen vor.

Gib mir den fertigen Link zum Anklicken. Ich melde mich an, ich bestätige.

Und jetzt sag mir vorher, was gleich passiert, damit ich nicht denke, es sei
kaputt: DIE SEITE WIRD NICHT LADEN. Auf meinem Rechner läuft dort nichts, also
kommt eine Fehlerseite. Das ist genau richtig. Der ganze Vorgang steht trotzdem
in der Adresszeile.

Lass mich die komplette Adresszeile kopieren und dir zurückgeben. Zieh dir
selbst den Code daraus. Prüf dabei, ob der Zufallstext derselbe ist, den du
vergeben hast, und sag mir, warum du das prüfst.

Sag mir zum Schluss den Satz, der die ganze Hürde auflöst: Es braucht keinen
Rückruf-Server. Ich bin der Rückruf-Server.

Wenn der Tausch mit einer Meldung über eine ungültige Genehmigung abbricht: Der
Code ist unter einer Minute gültig und war schon abgelaufen. Nichts ist kaputt.
Schick mich zurück auf den Link, hol einen frischen Code, mach sofort weiter.


SCHRITT 6 - DAS SKRIPT, DAS SICH SELBST ERNEUERT

Schreib mir eine einzige Python-Datei in den aktuellen Ordner. Nur Standard-
bibliothek, keine Installation. Sie soll folgendes tun:

Beim ersten Lauf tauscht sie den Code gegen ein Zugangs- und ein Erneuerungs-
paar und legt es in einer eigenen Datei neben sich ab, zusammen mit dem
Zeitpunkt, an dem der Zugang abläuft.

Bei jedem weiteren Lauf schaut sie in diese Datei. Ist der Zugang noch mehr als
zwei Minuten gültig, benutzt sie ihn. Sonst erneuert sie ihn.

UND JETZT DIE EINE ZEILE, DIE ÜBER ALLES ENTSCHEIDET: Sie schreibt das neue
Paar auf die Platte, BEVOR sie es benutzt. Grund: Beim Erneuern rotiert das
Paar, und das alte stirbt im selben Moment - der vorige Zugang antwortet beim
nächsten Aufruf mit einer Abweisung. Erneuert das Skript und stürzt danach ab,
ohne gespeichert zu haben, bin ich ausgesperrt und darf im Browser von vorn
anfangen. Schreib mir diese Begründung als Kommentar an genau diese Zeile.

Dann holt sie die Daten: mein Profil, meine Körpermaße, und in Schleifen meine
Erholungen, meine Zyklen, meinen Schlaf und meine Trainings. Die Schnittstelle
gibt HÖCHSTENS FÜNFUNDZWANZIG Einträge pro Aufruf zurück und reicht einen
Zeiger auf die nächste Seite mit - eine vollständige Geschichte ist also eine
Schleife, kein einzelner Aufruf. Bau eine kurze Pause zwischen die Aufrufe und
eine Obergrenze ein, damit sie nicht ewig läuft.

Am Ende schreibt sie alles in EINE Datei neben sich und gibt mir eine Zeile mit
den Anzahlen aus, damit ich sofort sehe, ob etwas angekommen ist.

Lass mich das Skript einmal laufen. Zeig mir die Ausgabe. Wenn alle Anzahlen
null sind, ist es fast immer die Mitgliedschaft aus Schritt 1 und fast nie der
Code.


SCHRITT 7 - WAS DA WIRKLICH DRIN IST

Bevor du irgendetwas baust: Lies die Datei und sag mir ehrlich, womit ich
arbeite. Beschönige nichts.

Wie viele Tage Geschichte habe ich wirklich, und was ist der älteste und der
jüngste Tag?

Welche Felder sind durchgehend gefüllt, welche lückenhaft, welche über die
ganze Reihe leer?

Wie sehen meine aktuelle Erholung, meine Belastung und mein Schlaf im Vergleich
zu meinen eigenen Durchschnitten der letzten dreißig Tage aus?

Sieht irgendetwas falsch, veraltet oder fragwürdig aus?

Und der wichtigste Satz dieses Schritts: WENN MEINE GESCHICHTE ZU KURZ IST, UM
EINEN TREND ZU TRAGEN, DANN SAG MIR DAS UND SAG MIR, WIE LANGE ICH WARTEN MUSS.
Eine heute angelegte Verbindung liefert Daten ab heute. Die Hälfte von dem, was
Leute hiermit bauen, geht kaputt, weil sie drei Jahre Geschichte angenommen
haben und drei Wochen hatten.


SCHRITT 8 - DAS INTERVIEW

Jetzt frag mich aus. Die Fragen kommen EINZELN, in dieser Reihenfolge, und du
wartest nach jeder auf meine Antwort. Keine Sammelabfrage, kein Vorgreifen, und
du fängst nicht an zu bauen, bevor alle acht durch sind. Halt jede Frage auf
zwei Zeilen.

TRAINING

Eins. Worauf trainiere ich? Hol dir den Wettkampf, das Datum und mein Ziel.
Wenn ich auf nichts Bestimmtes trainiere, finde heraus, was ich in den nächsten
sechs Monaten von meinem Körper will - und lass mir "fitter werden" nicht
durchgehen, sondern dräng auf etwas Messbares.

Zwei. Wie sieht eine normale Woche gerade aus? Einheiten pro Woche, welche
davon hart sind, und welcher Tag mein größter ist.

Drei. Was ist meine Geschichte damit? Habe ich diese Strecke oder diese Sportart
schon einmal gemacht, und was ist beim letzten Mal passiert?

Vier. Welche Entscheidung soll mir dieses Dashboard jeden Morgen abnehmen?
Dräng, bis ich eine echte Entscheidung nenne. "Meine Daten sehen" ist keine
Entscheidung. "Ob ich die Intervalle heute ziehe oder auf Donnerstag schiebe"
ist eine.

DAS DASHBOARD

Fünf. Was hat Whoop mir nie gesagt, das ich immer wissen wollte?

Sechs. Wie soll sich das anfühlen, wenn ich es aufmache? Lass mich eine echte
Vorlage nennen - eine App, ein Autocockpit, ein Zifferblatt, ein Gerät, ein
Film. Wenn ich "clean und modern" sage, lehn das ab und frag noch einmal.

Sieben. Will ich die Kugel? Beschreib sie mir zuerst in einer Zeile: eine
langsam drehende Kugel, die atmet, mit einer großen Zahl in der Mitte. Dann
frag mich zwei Dinge. WELCHE ZAHL steht drin, und WO sitzt sie: Mittelpunkt der
Seite, kleiner an der Seite, oder gar nicht. Biete mir für die Zahl das hier an,
und sag mir VORHER, welche Möglichkeiten meine Daten tatsächlich tragen:

eine zusammengesetzte Bereitschaft, die du aus Erholung, Schlaf und dem
Verhältnis von akuter zu chronischer Belastung selbst baust

meine Erholung allein

ein Alterstempo - dafür brauchst du zwei Werte, die die Schnittstelle nicht
hergibt, also musst du mich nach meinem VO2max und meinem Körperfettanteil
fragen

die Tage bis zu dem Wettkampf aus Frage eins

meine aufgelaufene Schlafschuld

Acht. Mache ich das um fünf Uhr morgens am Telefon auf, am Schreibtisch auf dem
Laptop, oder beides?

Wenn das Interview durch ist, lies mir meine Antworten in fünf Zeilen zurück
und lass sie mich bestätigen, bevor du baust.


SCHRITT 9 - BAUEN

Eine einzige, in sich geschlossene HTML-Datei. Und dabei gelten neun Regeln:

Jede Zahl kommt aus meinen echten Daten. Was sich aus dem, was ich habe, nicht
rechnen lässt, lässt du weg - du füllst es nicht mit einem Platzhalter.

Die Entscheidung aus Frage vier steht ganz oben, als ein Satz, vor jedem
Diagramm.

Zu allem, was du rechnest, schreibst du die Formel in normaler Sprache auf die
Seite. Nicht in den Code, auf die Seite. Ich will mit ihr streiten können.

Jede Annahme, die du treffen musstest, wird ein Regler, den ich verstellen kann
- keine Konstante, die im Code vergraben ist.

Du benutzt die echten Feldnamen der Schnittstelle im Code, damit die Seite
weiterläuft, wenn ich meine Daten neu ziehe.

Am Ende sagst du mir, welche Teile GEMESSEN und welche MODELLIERT sind. In zwei
Listen, nicht in einem Absatz.

Wenn ich in Frage sieben Ja zur Kugel gesagt habe, dann führ die Farbe der
Kugel aus dem Wert, den sie zeigt: ein schlechter Tag darf nicht aussehen wie
ein guter. Und respektier die Systemeinstellung für reduzierte Bewegung - dann
zeigst du ein Standbild statt der Drehung.

Wenn ich in Frage acht Telefon gesagt habe, baust du für das Telefon zuerst.
Ein Dashboard, das für einen Laptop gebaut ist, ist um fünf Uhr morgens am
Telefon unlesbar - und das ist die einzige Uhrzeit, zu der ich wirklich
hineinschaue.

Du übernimmst KEINE fremde Wortmarke, kein fremdes Logo und keine fremden
Markenfarben. Die Form gehört niemandem, die Marke schon. Sonst sieht meine
eigene Seite aus wie das Produkt von jemand anderem.


SCHRITT 10 - WAS DAS NICHT IST

Sag mir das am Ende ehrlich zurück, ich will es lieber wissen:

Healthspan, Whoop Age, Alterstempo, VO2max und Körperzusammensetzung kommen
nicht aus der Schnittstelle. Was auf meiner Seite dazu steht, ist deine
Nachbildung aus den Bausteinen, die es gibt, plus den Werten, die ich dir
gegeben habe. Sag das auf der Seite, nicht nur im Chat.

Meine Zahlen sind Vergleiche mit mir selbst, keine Norm und keine Diagnose.
Kein Arzt, kein Schlaflabor, kein Trainer.

Schlafphasen werden auf jedem verkauften Gerät geschätzt, auf meinem auch.
Niemand an meinem Handgelenk liest Hirnströme.

Wenn dir in meinen Daten etwas auffällt, das nach einem medizinischen Problem
aussieht - eine Sauerstoffsättigung, die immer wieder einbricht, ein Ruhepuls,
der über Wochen steigt, eine Hauttemperatur, die aus der Reihe fällt -, dann
sag mir das in einem Satz und schick mich zu einem Menschen, statt daraus einen
Trainingshinweis zu machen.


SCHRITT 11 - AB JETZT VON ALLEIN

Zeig mir zum Schluss, wie ich das Skript wieder laufen lasse, damit die Seite
frische Daten bekommt. Es soll sich dabei selbst erneuern und mich nie wieder
in den Browser schicken.

Und sag mir, wo meine Zugangsdaten liegen, damit ich weiß, welche Dateien ich
nicht weitergebe und nicht in ein öffentliches Verzeichnis lege.

—
Dieser Prompt ist Folge 15 von 100 aus "Sport KI" von Dan Felser.
Instagram: @felsr — alle Prompts der Reihe: felsr.com
Der Prompt kostet nichts. Wenn er dir was bringt: folg mir auf @felsr — dort kommt jede Folge zuerst. Kostenlose Trainingspläne
20 Pläne, 5 km bis Marathon — ohne E-Mail, ohne Konto
Alle Prompts der Reihe
Sport KI — 100 Folgen, jede Woche ein Tool aus meinem Training