Back to Vekta Skills

Early Warning

Early Warning

Monitoring

Built tool

Early Warning
Early Warning

Created by

Vekta

Last updated

Categories

Monitoring

Built tool

Made for

Coaches

Runs

Every day

Topics

Load

Recovery

Compliance

Share

Catch illness, overreaching, injury and stress early, before they escalate: who needs you first each morning, with a proposal ready to approve.

Catch illness, overreaching, injury and stress early, before they escalate: who needs you first each morning, with a proposal ready to approve.

Every morning at 9 it reads every athlete you coach against their own last 28 days: sleep, HRV, resting heart rate and skin temperature from their wearable, Load and Strain, sessions against the plan, the four morning check-in answers, and every comment they write after a session, tracking the words that matter, like a niggle turning sharp.

The first time, it interviews you: what to look at, when something should come to you, and what to prepare. Keep one coach's answers, change any part, or give your own, and change them whenever you like. One signal goes in a private log. Signals that build go on a watch list. Those that need you today rise to the top of one page, each with a proposal and a message drafted in your voice.

Pick the session, edit the message and approve it on the page. Nothing reaches an athlete until you do, and the private log stays on your computer. It aggregates and flags. The coaching decisions stay with you.

How to run it

1

Paste the prompt

Open Claude Code, Codex or Gemini CLI and paste it. Fill in anything in square brackets.

2

Or install the file

Unzip it into ~/.claude/skills for Claude Code, or ~/.agents/skills for Codex and Gemini CLI. Then run it as a Skill by name each time.

3

Let it run

A scheduled skill runs on your own computer, so it has to be on. Everything it reads is your data, through your key.

What it touches

Reads from Vekta

Rides, planned sessions, sleep, HRV, resting heart rate, wellness check-ins, RPE and feel, comments, notes, events, the athlete profile, streams

Writes to Vekta

Only what you approve, one athlete at a time: a rest day or a replacement session with your message, or a comment on their latest session. The private log stays on your computer unless you switch on saving it to Vekta

Works in

Claude Code, Codex, Gemini CLI

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

GET THIS SKILL

The prompt, and the file.

Unlocked on this browser for a year. Paste the prompt into Claude Code, Codex or Gemini CLI, or install the file and run it by name.

THE PROMPT AND FILE

Get the file (.zip)

Early Warning Run this now, then every morning at 9am. Read every athlete I coach against their own last 28 days, and catch the early signs of illness, overreaching, injury and stress before they cost training time. Show me who needs me first and why, on one page, with a proposal for each that I can edit and approve on the page. Nothing is written to Vekta until I approve it: no change to a plan, no message, no note. My key: read the Vekta API with the environment variable VEKTA_API_KEY. If it is not set, ask me to add it. Never print it, log it or write it into a file. The files This skill comes with four files: vekta.py (the client every read and write goes through, paced to the API limits), render.py (draws the page), serve.py (shows the page on this computer and carries out my approvals) and PAGE.md (the exact data the page needs). Copy them into a folder named early-warning and work there. If they are not beside this prompt, download them from https://framerusercontent.com/assets/z6BlKiFee8ngrTW0g6PXqse4F3A.zip. Never change render.py, serve.py or vekta.py: the layout and the approvals are fixed, the analysis is yours. Read PAGE.md once before the first page. Before the first run: interview me Ask me these three questions, one at a time. Under each, show my default answer below and ask: "Keep this, change any part, or give me your own?" Wait for my answer each time. The defaults are one coach's own rules, not Vekta's. 1. "What should I look at for each athlete?" Default: four layers, each against the athlete's own last 28 days. - Physiological: HRV, resting heart rate, skin temperature and sleep from their wearable; Load and Strain; heart rate against power, and whether intervals hit target; CP, W′ and durability after 20 kJ per kilo; weight; left-right balance and cadence on climbs. - Physical: fatigue and soreness in the morning check-in; RPE and feeling after every session; keywords in the comments they write after sessions: any part of the body they keep mentioning, which side, on or off the bike, after how long, on climbs or the flat, after a change of shoes, cleats, saddle or position, the words getting stronger (niggle, tight, sore, sharp), and anything that sounds like illness, overreaching or under-fuelling. - Emotional: stress and sleep in the morning check-in; keywords in comments and notes: "want to" turning into "have to", always and never, fixating on the numbers, comparing themselves to others, worrying about letting me down, confidence dropping, exhaustion, pulling away from the group. - Engagement: missed sessions and late uploads, check-ins stopping, comments getting shorter, RPE left blank, training late at night, doing the bare minimum, nothing planned after a goal event. 2. "When should something come to you, rather than just being logged?" Default: one signal on its own goes in their private log; two layers, or one signal that keeps getting worse, goes on my watch list; three or more layers, or a hard flag, is Act now. Hard flags: signs of illness before a hard session, and pain described as sharp. Physiology counts after two nights outside the athlete's normal range. A check-in counts at 5 or worse on Vekta's 1 to 7 scale (Fatigued, Sore, Bad sleep or Anxious, or worse) three days running, or when it gets worse each day. Session numbers (Load, Strain, RPE, CP, W′, durability, weight, heart rate against power) count when they are outside the athlete's normal range. 3. "When it does, what should I prepare for you?" Default: illness or overreaching before a hard session, an easy session from my library or a rest day, depending on the signal, with a message in my voice; an injury building, a message asking the athlete for more detail, the next steps for me (a physio where it fits), and a swap for any session that would make it worse; fuelling, stress or motivation, no plan change and a message inviting them to talk. Save my answers to early-warning/early-warning-rules.json, in my words, and use them every morning. Never add a rule of your own. If my answers leave a signal without a level that makes it count (for example Load, Strain, RPE, CP, W′ or weight), do not set one yourself: list those signals in the plan, ask me what counts for each, and offer the athlete's own normal range (their 28-day mean plus or minus one standard deviation) as the starting point. Save what I decide with my rules. The four layers and the four tiers are the shape of the page: I can change what goes in each, not how many there are. Then show me the plan in five parts (Trigger, Data, Rules, Human in the loop, Action) and wait for my go-ahead. Whenever I say "change my rules", show me my saved rules, ask the same three questions with my current answers as the defaults, save, and use the new rules from the next run. 1. Data to pull, through vekta.py, for every athlete from GET /users - GET /users/{id}: the profile and latest metrics. - GET /users/{id}/sleeps for the last 31 nights: averageHrv, restingHeartRate, totalDuration, deepDuration, awakeDuration and skinBodyTemperatureDeviation. An empty list means no wearable: skip the wearable checks, never flag it. - GET /users/{id}/wellness-answers for the last 28 days: Fatigue, Soreness, Sleep and Stress ("How are you feeling?"), each 1 (best) to 7 (worst). Always show an answer as Vekta's word with the number, such as "Very fatigued (6/7)". - GET /users/{id}/activities from 56 days before the 28-day window to today: startedAtLocal, effectiveDuration, volume, intensity, averagePower, averageHeartRate (0 means no heart rate: leave it out), rpe (1 to 10), feeling (1 to 5), the laps (intensity, averagePower, maxHeartRate, averageCadence, averageTorque, workBefore), the climbs, and the comments the athlete wrote (leave out Vekta's own summaries, fromVekta, and any automated write-up another app posted from their account). Sessions with no local start date are left out. - GET /activities/{id}/best-efforts for sessions over two hours in the last six weeks: the best 20-minute power fresh (afterWorkPerKg 0) and after 20 kJ/kg. - GET /activities/{id}/streams for leftRightBalance and cadence, only on rides in the last three weeks with climbs, and only when a comment mentions a part of the body. A 404 means that ride has no stream. - GET /users/{id}/training-prescriptions from 14 days back to 3 days ahead: what was planned, whether it was done (activityId), the targets, and what is planned next. - GET /users/{id}/metrics for the last six weeks: critical power, w prime and weight. - GET /users/{id}/notes and GET /users/{id}/events: life context, and whether anything is planned after their last goal event. - GET /training-collections: my library, for any session you propose. An athlete whose activities return 404 has no active subscription or has left my workspace: list them on the page with that note. 2. Windows and definitions - Normal range: the athlete's own 28 days (or nights) before the last three, mean plus or minus one standard deviation. - Load-8 and Load-2 are the 8-week and 2-week exponentially weighted averages of daily Vekta volume (alpha 2/57 and 2/15), and Strain is the 2-week exponentially weighted average of daily Vekta intensity (alpha 2/15). Each series starts from zero 56 days before the first day of the window and counts only sessions from that day on, which is how the Vekta apps compute them. Read them at the end of yesterday. - Durability: the best 20-minute power after 20 kJ/kg as a share of the fresh value, now against six weeks ago. - Every flag rests on the athlete's own data and on my rules. Never present a number as Vekta's when you calculated it. 3. The scan, the tiers and the private log - Write the analysis as a script, early-warning/out/scan.py, so every morning runs the same analysis. It reads through vekta.py, applies my rules and writes early-warning/out/scan.json in exactly the shape PAGE.md describes, with my saved rules in "rules" and the definitions in plain words in "definitions". - Place each athlete in Act now, Watching, Logged or Clear, and rank inside each tier by how many layers fired and how fast it is building. - For each athlete: a verdict of two to four words ("Likely getting ill", "Knee injury building"); one plain sentence of at most 20 words saying why, the two or three strongest signals only; up to four key numbers, each with its arrow and its change against the athlete's usual; every signal that fired, by layer, with its value, the athlete's usual and the source; their comments after sessions with the keywords marked; one or two charts, the last 28 nights of HRV against the normal range first, then the one trend that tells their story. - The private log stays on this computer: append each run's lines for each athlete to early-warning/log/<id>.json, as PAGE.md describes. On the first run, backfill the last six weeks, so I can see how each signal built up. The page shows the last ten lines. - Write nothing to Vekta for the log, unless early-warning/settings.json has logToVekta true. I switch that on or off at the bottom of the page, or by saying "turn on the Vekta log" or "turn off the Vekta log" (run python3 serve.py log-to-vekta on or off). Only when it is on, each run also writes one note per athlete: POST /users/{id}/notes with type medical, mental or other, title "Early Warning · <date>" and hideUntil 9999-12-31, so only I can see it. 4. The proposal for each athlete in Act now or Watching - The steps in plain words: what changes and what is sent. Never mention drafts, ids or the API. - A session change: write nothing to Vekta. Propose one option from my library or a rest day, list the sensible alternatives, and always end with keeping the planned session. - A message in my voice: their first name, short sentences, 50 words at most. Never diagnose: say "signs consistent with" and point to the right person (physio, doctor, nutritionist) where it fits. - One line saying exactly where the message goes when I approve: with a rest day, inside the rest-day note on that date; with a replacement session, on that workout as my comment, and the planned session comes off; keeping the plan, as a comment on their most recent session, which notifies them. 5. The page, approving and delivery - Run python3 render.py out/scan.json. It writes early-warning/out/early-warning.html and a dated copy beside it. - Then run python3 serve.py start, from the early-warning folder, and open http://localhost:8787. It starts the helper in the background, or confirms it is already running, and it keeps running after the chat ends. It listens on this computer only. It stops when the computer restarts, so every morning run starts it again the same way. - On the page I choose the session, edit the message and press "Approve and send". serve.py writes exactly what I chose, with my message, removes the session it replaces, and marks the athlete approved on the page, also after a reload. When I say "Approve <name>" in the chat instead, run python3 serve.py approve <id>, adding --choice <option key> if I picked a different session and --message "<text>" if I changed the message. Confirm in one line what was written. - Once approved, the athlete's box shows an Undo button. Undo, or "undo <name>" in the chat (python3 serve.py undo <id>), removes what the approval wrote and puts the planned session back. A message the athlete was notified about is deleted, but the notification cannot be taken back: say so. - Each approval writes for one athlete only. Never write for several athletes at once, and never approve on my behalf. - If the helper cannot run, the button copies my approval, and I paste it into the chat. - Then tell me in a few lines what the page shows. After the first page, offer to schedule the morning run at 9:00. - Each scheduled morning, rerun scan.py, render the page, check the helper, and leave a short briefing in the chat: "Good morning. <N> athletes need you today.", one line per athlete with the verdict, two or three figures against their usual and the proposal, then Watching, Logged and Clear, ending with "Open http://localhost:8787 to approve." - The page carries athlete names, health and wellbeing data: keep the files on this computer and treat them as private. If you only have this prompt and cannot get the files, build the same page by hand: a dark page (near-black #0c0f13, cards #151920 with hairline borders and a 14px radius, one system font, tabular figures), colour only for status (red #ff6b5e Act now, amber #ffc542 Watching, blue #6aa8ff Logged, green #46cf86 Clear) with a line icon for each tier. Top to bottom: "Early Warning · <coach> · <date> · 09:00", the headline "<N> athletes need you today." with the number in red, the window and sources, a count per tier, and a map of tiles, one per athlete, coloured by tier with four small bars for the layers that fired; Act now and Watching cards two to a row (name, bold verdict, the sentence, three numbers with arrows, the four layers as pills, "Proposed" and the action, an "Approve?" badge); Logged as small cards; Clear as names; the full roster table (HRV and resting heart rate against usual, sleep, this morning's four check-in answers with 5 or worse highlighted, Load-2 and Strain, the latest comment); the private log switch, then my rules and the definitions in the footer. Clicking an athlete fills the screen: tier, the verdict at 40px, the sentence, four large number tiles, the proposal box (steps, session picker, editable message sized to its text, "Approve and send"), the evidence in four layer columns with empty layers dimmed, the charts with every line labelled, their comments with keywords highlighted, and the log. You aggregate and flag. The coaching decisions are mine. Docs: api.joinvekta.com/openapi.json

Next step

Run Early Warning on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Early Warning on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Early Warning on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Early Warning across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Next step

Run Early Warning across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Next step

Run Early Warning across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Dream Big

Dream Big

Dream Big

The API is free with every Vekta subscription. One prompt connects it.

The API is free with every Vekta subscription. One prompt connects it.