Vortex SC

{{ tx.welcomeBack }}

{{ tx.tagline }}

{{ tx.staffSignIn }}

{{ loginErr }}

{{ tx.guardianOnly }}

{{ tx.forgotHint }}

{{ tx.setnewHint }}

{{ tx.resetSent }}

{{ famRegisteredMsg }}

{{ famLinkLabel }}

{{ tx.confirmWord }} {{ famVerifyName }}

{{ famVerifyQuestion }}

{{ famVerifyErr }}

{{ famLinkedMsg }}
{{ p.label }}

{{ tx.termsWord }}  ·  {{ tx.privacyPolicy }}  ·  {{ tx.consentWord }}

{{ famErr }}

{{ tx.orWord }}

{{ tx.oauthNote }}

{{ tx.readOnlyNote }}

{{ tx.consentPrefix }} {{ tx.privacyPolicy }} {{ tx.andWord }} {{ tx.parentalConsent }}.

{{ tx.enterPin }}

{{ pinMsg }}

Vortex SC
{{ hubUserAvatar }}

{{ hubUserRole }}

{{ hubUserName }}

{{ clubStatLine }}

Today at a glance

Upcoming meets

{{ homeMeetsCount }}
{{ m.day }}{{ m.mon }} {{ m.name }}{{ m.sub }} {{ m.deadlineShort }}

No meets coming up yet.

{{ squadsHeading }}

Tap to coach

Club Administration

Dashboard · club-wide insights

Vortex
{{ s.value }}{{ s.label }}

Swimmers by squad

{{ b.count }}
{{ b.short }}

Attendance

{{ attendRing.pct }} this week

Club training load · this week (km)

{{ b.label }}

Move swimmers

Reassign between squads

Vortex

{{ moveCountLine }}

{{ m.initials }} {{ m.name }}Age {{ m.age }} · now in {{ m.squadName }}
Vortex

Tools & AI

Working club-wide across all {{ clubSwimmerCount }} swimmers.

Vortex

Coaches Handbook

Shared reference for the Vortex coaching team.

{{ s.h }}

{{ s.lead }}

{{ b }}
Vortex SC

{{ tx.welcome }} {{ famPortalName }}

{{ famSwInit }}{{ famGenIcon }}

{{ famSwName }}

{{ famSwMeta }}

{{ k.value }}{{ k.label }}

{{ famProgEvent }} · progression

{{ famChart.best }}
{{ famChart.caption }}{{ famChart.drop }}
{{ s.date }} {{ s.meet }} {{ s.time }}
{{ tx.noSwims }}
{{ tx.recovery }}
{{ famWearLatestLabel }}
{{ famWearRecovery }}RECOVERY
RESTING HR{{ famWearRhr }} bpm
HRV{{ famWearHrv }} ms
SLEEP{{ famWearSleep }} h
STRAIN{{ famWearStrain }}

{{ tx.logFromBand }}

{{ famWearConnLabel }}

{{ famWearMsg }}

{{ tx.dailyCheckin }}

{{ wellReadiness }} READY

{{ tx.doneToday }}

{{ m.label }}

{{ wellMsg }}

{{ tx.membership }}

{{ famMemPkg }}{{ famMemCost }} {{ famMemPaid }}

{{ famMemDates }}

{{ famMemDue }}

{{ famMemNote }}

{{ tx.qualifiedFor }}

{{ q.meet }}{{ q.events }} {{ q.count }} ✓

{{ tx.personalBests }}

{{ p.event }} {{ p.time }}{{ p.drop }}

{{ tx.fitnessTests }}

{{ f.dateLabel }}{{ f.summary }}

Threshold pace tests

{{ t.typeLabel }} · {{ t.value }}{{ t.dateLabel }} {{ t.tpace }}T-pace
{{ p.label }}{{ p.time }}

{{ tx.inbodyScans }}

{{ ib.dateLabel }} {{ ib.summary }}
{{ d.label }}{{ d.value }}

{{ tx.coachSuggestion }}

{{ tx.focusTargets }}

{{ tx.competeIn }}

{{ famAiSugg.competeEvent }}

Current best {{ famAiSugg.currentBest }} · target {{ famAiSugg.targetTime }}

{{ tx.eventTargets }}

{{ e.event }} {{ e.course }} {{ e.current }} {{ e.target }} {{ e.points }} pts
{{ e.stdLabel }} {{ e.gap }}

World Aquatics qualifying

{{ q.event }} {{ q.course }} {{ q.current }} B {{ q.bStr }} · A {{ q.aStr }} {{ q.status }}

{{ tx.doubleDownOn }}

{{ famAiSugg.focusStroke }}

{{ famAiSugg.focusReason }}

{{ tx.needsAttention }}

{{ famAiSugg.weakStroke }}

{{ famAiSugg.weakReason }}

{{ tx.considerEntering }}

{{ famAiSugg.secondaryEvent }}

{{ famAiSugg.secondaryReason }}

{{ tx.fitnessDryland }}

{{ famAiSugg.fitnessInsight }}

{{ tx.nutrition }}

{{ famAiSugg.nutritionTip }}

{{ d.label }}{{ d.fileName }} {{ d.statusLabel }}
{{ famDocMsg }}

{{ tx.docsNote }}

{{ tx.outstanding }} {{ famFeesDue }} {{ famFeesDueSub }}
{{ tx.nothingOutstanding }}
{{ fe.periodLabel }}{{ fe.what }} {{ fe.amount }}
{{ fe.statusLabel }} {{ fe.dueLabel }}

{{ tx.noInvoices }}

{{ tx.feesNote }}

{{ tx.privateMessages }}

{{ tx.noMessagesYet }}

{{ mm.name }} {{ mm.body }} {{ mm.setText }} {{ mm.videoEl }}
{{ mm.time }}

{{ famAttDayLabel }}

{{ famAttDayStatusLabel }}

Attendance recorded by the coach for this session.

{{ famAttMonthLabel }}

{{ famAttMonthPct }}Present this month
{{ w }}
Present Late Absent

{{ famAttYearLabel }}

{{ famAttYearPct }}

Yearly average

{{ famSwName }} · all results

{{ r.event }}{{ r.time }}

{{ r.meet }} · {{ r.date }} · Place {{ r.place }}

No results recorded for {{ famSwName }} yet. Your coach will add meet results as they come in.

Training plans

{{ pl.day }}{{ pl.mon }} {{ pl.title }}{{ pl.dateLabel }}{{ pl.slot }} {{ pl.totalM }}metres

{{ sec.title }}

{{ st.line }}{{ st.sub }}
No training plans shared yet. When your coach publishes a session, it appears here.

Fitness plans

{{ pl.day }}{{ pl.mon }} {{ pl.title }}{{ pl.dateLabel }}{{ pl.slot }} {{ pl.totalEx }}exercises

{{ sec.title }}

{{ st.line }}{{ st.sub }}
No fitness plans shared yet. When your coach shares a dryland session, it appears here.
No club meets posted yet — the club calendar will appear here.
{{ m.day }}{{ m.mon }} {{ m.name }} {{ m.dayLabel }} {{ m.meta }} {{ m.status }}
{{ m.deadlineLine }}
{{ d.label }} {{ d.value }}
Qualifying times {{ m.qualSummary }}
{{ q.event }} {{ q.pb }}needs {{ q.cut }} {{ q.mark }}
Event program{{ m.eventsLine }}
From the club{{ m.notes }}
{{ sg.event }}

{{ sg.line }}

{{ m.reqTitle }}
{{ m.reqMsg }}
{{ m.reqShutLine }}
No meets coming up just yet. The club posts them here as soon as the dates are confirmed.

Camps & training weeks

{{ c.day }}{{ c.mon }} {{ c.name }}{{ c.when }} {{ c.cost }}
Where{{ c.place }}
Who{{ c.who }}
Times{{ c.times }}
{{ c.notes }}
{{ famReqSentTitle }}
{{ rr.event }} · {{ rr.meetName }}{{ rr.statusLabel }}
Vortex

Academy

Trials, level ladder, schedule and fees.

Trial registration

Request received — the team will be in touch to schedule ✓

Pending trial requests

{{ tr.childName }} · Age {{ tr.age }}

{{ tr.parentName }} · {{ tr.phone }} · Suggested: {{ tr.squadHintName }} · {{ tr.submittedAt }}

{{ l.name }}Ages {{ l.ages }} · {{ l.coach }} {{ l.count }}
{{ s.name }}{{ s.when }}

Monthly packages

Same price for every squad — priced by sessions per week.

{{ fp.label }}{{ fp.sub }} {{ acadCurrency }} /mo

{{ renewTitle }}

{{ rw.name }}{{ rw.when }}

Swimmer memberships

{{ memCountLine }}

{{ mb.name }}{{ mb.sub }} {{ mb.cost }}
From To
{{ mb.dueLabel }}

Invoicing

{{ invMonthLabel }}
{{ invCollected }}Collected
{{ invOutstanding }}Outstanding
{{ invOverdue }}Overdue

{{ billMsg }}

No invoices for this month yet. "Issue invoices" bills every active swimmer who has a membership package or a squad fee — swimmers signed off as injured or travelling are left out.

{{ v.name }}{{ v.squad }} · {{ v.what }} {{ v.amount }} {{ v.statusLabel }}
{{ v.dueLabel }} {{ v.refLine }}
Vortex
{{ squad.avatar }}
Squad

{{ squad.name }}

Ages {{ squad.ages }} {{ squad.count }} swimmers {{ squad.coach }}

Roster

{{ rosterCountLine }}

Session · today

{{ planTotal }}metres
Pool length & course
Session intensity{{ rpeLabel }}
/100m gap
Finishes {{ planTimeWindow }}

{{ pdfImportMsg }}

{{ ps.roundsLabel }}{{ ps.subtotal }}m
× m {{ st.circuit }}RDS {{ st.setMetres }}m
Type
Stroke
Tools
Zone
Focus
Swimmers {{ sw.name }}
Rest On HR
{{ st.advice }}
Favourites

{{ savedPlanMsg }}

{{ shareNote }}

Training log & load

{{ savedPlanWeekM }}mThis week · {{ savedPlanWeekN }} sessions
{{ savedPlanSeasonM }}mSeason · {{ savedPlanSeasonN }} sessions

{{ planCalLabel }}

{{ w }}
MorningEvening
{{ planCalSelLabel }}{{ planCalDayKm }} km
{{ ds.slotLabel }} {{ ds.title }} {{ ds.totalM }}m

No session on this day yet — build a plan above with this date set and tap “Save session”.

No sessions saved for this view yet — build a plan above, set its date + AM/PM, and tap “Save session”.

{{ sp.totalM }}metres {{ sp.title }}{{ sp.slotLabel }}Shared · {{ sp.shareLabel }}{{ sp.dateLabel }} · Zone {{ sp.zone }}
Export range From To
{{ attendSummary.present }}Present
{{ attendSummary.late }}Late
{{ attendSummary.absent }}Absent

{{ attendDayLabel }}

{{ attendSendLine }} {{ attendSendMsg }}
{{ a.initials }} {{ a.name }}{{ a.statusText }}

{{ attendMonthLabel }}

{{ attendMonthAvgPct }}Avg attendance
{{ attendMonthSessions }}Sessions
{{ w }}

Tap a day to open it and mark or review attendance.

{{ attendYearLabel }}

{{ attendYearAvgPct }}

Yearly average

{{ selMeet.name }}

{{ selMeet.meta }}

Export one swimmer's full results

{{ r.place }} {{ r.name }}{{ r.event }} {{ r.time }}{{ r.delta }}

Tools & AI · {{ squad.name }}

VIP SPONSORED
{{ swimmer.genIcon }}

{{ swimmer.name }}

{{ swimmer.statusText }}

{{ swimmer.ageLabel }} · DOB {{ swimmer.dob }} · {{ squad.name }} · {{ swimmer.gender }}

{{ k.value }}{{ k.label }}
Swimmer details{{ profEditSubtitle }}

Full name

Date of birth

{{ profEditDobHint }}

Gender

Squad

{{ profEditErr }}

{{ profEditSaved }}

Attendance this season

{{ profileAttPct }}
{{ profileAttPresent }}Present
{{ profileAttLate }}Late
{{ profileAttAbsent }}Absent
{{ b.label }}

Personal bests

{{ p.event }}{{ p.time }}{{ p.meta }}{{ p.drop }}

Qualified for

{{ q.meet }}{{ q.events }} {{ q.count }} ✓

{{ progEvent }} · progression

Long course (LCM)

{{ lcmChart.best }}
{{ d.t }}
{{ lcmChart.caption }}{{ lcmChart.drop }}
{{ s.date }} {{ s.meet }} {{ s.time }}
No long course swims for this event.

Short course (SCM)

{{ scmChart.best }}
{{ d.t }}
{{ scmChart.caption }}{{ scmChart.drop }}
{{ s.date }} {{ s.meet }} {{ s.time }}
No short course swims for this event.

Private message to swimmer / parent

No messages yet. Send a note, a set, or a video to review — the swimmer & parents read it in their portal and can reply here.

{{ mm.name }} {{ mm.body }} {{ mm.setText }} {{ mm.videoEl }}
{{ mm.time }}

Coach notes & wellbeing

Academy membership

No package set for this swimmer yet.

{{ swMemPkg }}{{ swMemCost }} {{ swMemPaid }}

{{ swMemDates }}

{{ swMemDue }}

{{ swMemNote }}

Status · {{ swStatusLabel }}

{{ swStatusMsgText }}

From To

Identity documents · restricted

Birth certificate On file
ID / passport copy On file
Medical certificate (full check-up) On file

Doctor-issued full physical check-up, required for meet entries per federation rules.

{{ docMsg }}

InBody scans

{{ ib.weight }} · {{ ib.fat }} · {{ ib.muscle }}{{ ib.dateLabel }}{{ ib.warn }}
{{ ibd.label }} {{ ibd.value }}

Copy the rest off the printout. Anything you leave empty is simply left off the record.

Test date on the sheet
{{ ibf.label }} {{ ibf.unit }}

{{ profileIbMsg }}

Recovery & wearables

Live recovery
{{ wearLatestLabel }}
{{ wearRecovery }}RECOVERY
RESTING HR{{ wearRhr }} bpm
HRV{{ wearHrv }} ms
SLEEP{{ wearSleep }} h
STRAIN{{ wearStrain }}
{{ b.day }}

7-day recovery trend

Log today's reading

{{ wearConnLabel }}

{{ wearMsg }}

{{ w.dateLabel }}{{ w.summary }}

Training HR — log a set

From a Polar Verity Sense (temple) or a wall pulse check. Enter the set's average & max heart rate.

Avg / max HR trend90–200 bpm
{{ c.day }}

Solid = average · light = up to max. A lower bar for the same set = fitter.

{{ h.label }} · {{ h.metric }}{{ h.dateLabel }}

Fitness test

{{ f.summary }}{{ f.dateLabel }}

AI suggestion

Edit coach suggestion — shown to parents/swimmer as coach guidance

Focus reason

Needs attention

Consider entering

Fitness & dryland

Nutrition

Focus & targets for {{ swimmer.name }}

Compete in

{{ aiSugg.competeEvent }}

Current best {{ aiSugg.currentBest }} · target {{ aiSugg.targetTime }}

Double down on

{{ aiSugg.focusStroke }}

{{ aiSugg.focusReason }}

Needs attention

{{ aiSugg.weakStroke }}

{{ aiSugg.weakReason }}

Consider entering

{{ aiSugg.secondaryEvent }}

{{ aiSugg.secondaryReason }}

{{ tx.eventTargets }}

{{ e.event }} {{ e.course }} {{ e.current }} {{ e.target }} {{ e.points }} pts
{{ e.stdLabel }} {{ e.gap }}

World Aquatics qualifying

{{ q.event }} {{ q.course }} {{ q.current }} B {{ q.bStr }} · A {{ q.aStr }} {{ q.status }}

Fitness & dryland

{{ aiSugg.fitnessInsight }}

Nutrition

{{ aiSugg.nutritionTip }}

Everything above is worked out on this device from their own times, load and attendance. This asks Claude to read the same numbers — no name or date of birth is sent.

{{ swAiErr }}

{{ swAiOut.title }}

{{ sb.label }}

{{ sl }}

Log at least one race result to get targets and an AI suggestion.

Race videos

Recent results

{{ r.place }} {{ r.event }}{{ r.meet }} {{ r.time }}

Notifications

{{ notifSubtitle }}

{{ pushMsg }}

{{ n.title }}{{ n.body }}{{ n.when }}

No notifications yet.

{{ toolTitle }}

{{ toolScope }}

Vortex SC

Showing · {{ insightScopeLabel }}

Weekly training load (km)

{{ b.label }}

Energy-zone distribution

{{ z.label }} · {{ z.pct }}%
{{ insightAttend.pct }}attendance
{{ s.label }}{{ s.value }}
Swimmer agemaxHR = 220 − age → {{ zoneMaxHR }} bpm

Six-zone system

{{ z.code }} {{ z.name }}HR {{ z.hr }} · La {{ z.lac }} mmol · {{ z.wr }}

Squad → zone permission

{{ h }} {{ r.sq }} {{ c.mark }}
● trains it◐ limited○ never

T-pace & poolside HR check

maxHR = 220 − age
Pulse check: count beats for 6 sec × 10 = HR (bpm)
T-pace / 100 = 1000 m trial ÷ 10
T-pace / 100 = 400 m trial × 2.5 ÷ 10
T-pace / 100 = 1800 s ÷ (T30 metres ÷ 100)
T-pace / 100 = 1200 s ÷ (T20 metres ÷ 100)

{{ tpSelInitials }} {{ tpSelName }}

Log a new trial

{{ tpFixedHead }}

{{ tpFixedNote }}

{{ tpFixedPreview }}

{{ p.label }}{{ p.time }}

{{ tpaceErr }}

Threshold analysis

from {{ tpAnSource }} · {{ tpAnKm }}

T-pace {{ tpAnTpace }} Threshold speed {{ tpAnSpeed }}

Training zones · per 100, from threshold

{{ z.key }} {{ z.label }}{{ z.offset }} s vs T-pace {{ z.pace }}

{{ tpAnSprints }} are not on this list on purpose. Sprint zones come from the swimmer's goal pace for a target event, never from the T30 — building a sprint set off the aerobic anchor is the one thing the test must not be used for.

Race targets · freestyle, projected from threshold

{{ r.label }} {{ r.time }} {{ r.pace }}/100
{{ t.typeLabel }} · {{ t.time }}{{ t.dateLabel }} · T-pace {{ t.tpace }}/100
{{ p.label }}{{ p.time }}

{{ promoScopeLabel }}

Flags swimmers ranked top-3 in squad, at the top of their age band, or due a quarterly review.

No candidates right now — everyone's reviewed and settled.

{{ c.initials }} {{ c.name }}{{ c.sqName }} {{ c.badgeLabel }}

{{ c.reasonsStr }}

{{ meetDayTitle }}{{ meetDaySub }} {{ meetDayPct }}
{{ meetDayProgress }} {{ meetDayPbLine }}
Times are recorded on

{{ meetDayMsg }}

{{ hh.label }}{{ hh.groupLabel }}

{{ hh.doneLabel }}
{{ ln.lane }} {{ ln.name }}Seed {{ ln.pb }} {{ ln.markLabel }}{{ ln.markFull }} {{ ln.timeLabel }}{{ ln.placeLabel }} {{ ln.pbLabel }}

Results so far

{{ bd.event }}

{{ pl.place }} {{ pl.name }} {{ pl.time }}

Times saved here go straight into the swimmer's history, so their PB, their chart and their family's app are all up to date before the next heat is called. Got a lane wrong? Undo takes the swim back out again.

Swimmer / parent requests

{{ r.swName }} — {{ r.event }}

Add entry — {{ entryMeetName }}

{{ entryNewErr }}

Entering {{ entrySelName }}

Heats & lanes are seeded automatically by personal best — no manual heat/lane needed. {{ seedSummary }}.

Seeding rules

{{ seedLanesLabel }}

The pool

Boys & girls apartGirls and boys never share a heat
Age categories apartEach category gets its own heats

Age categories

{{ bd.name }} {{ bd.range }}

{{ seedMsg }}

Changing a rule does not move anybody on its own — tap Auto-seed by PB below to re-seed the meet with it.

H{{ e.heat }}·L{{ e.lane }} {{ e.name }}{{ e.event }}{{ e.who }} {{ e.pb }}seed PB

{{ clockView.section }}

{{ clockView.time }}{{ clockView.rep }}

{{ clockView.setTxt }}

Up next

{{ clockView.nextTxt }}

No sets in this squad's plan yet.
Build a session in the Plans tab, then run it here.

{{ swtStatusLabel }}

0.00

min : sec . hundredths

Strokes this lengthTallied onto the next lap you record {{ swtStrokes }}
{{ swtStatLaps }}Laps
{{ swtStatStrokes }}Strokes
{{ swtStatAvg }}Avg / lap
LapSplitTotalStrokes
{{ r.n }} {{ r.split }}{{ r.tag }} {{ r.total }} {{ r.strokes }}

Start the clock, then tap Lap at each wall to capture splits and stroke counts.

Session clock

{{ swmMasterTime }}

{{ swmSummary }}

{{ swmCountLabel }}
{{ r.label }} {{ r.statusText }}
{{ r.time }}
{{ sp.n }} {{ sp.t }}

{{ setSummary }}

{{ setRepInit }} reps

Next send-off · {{ setWhoInit }}

{{ setCountInit }}

{{ setStatus }} · {{ setTotalInit }} elapsed · {{ setMetres }}

In the lane

{{ ln.label }} +{{ ln.offLabel }} {{ ln.time }} {{ ln.rep }}

No sets in this squad's plan yet.
Write the session in the Plans tab and it will show up here.

Reps
Distance
Send-off {{ setSendLabel }}
Extra rest {{ setRestLabel }}
Swimmers {{ setSwimmersLabel }}
Gap {{ setGapLabel }}
Signal
Volume

Every send-off for the whole set is scheduled the moment you start it, so the signals stay exact even if the screen dims. Keep the phone off silent and the volume up.

{{ reviewPlanMeta }}

{{ reviewVerdict.t }}

{{ reviewVerdict.s }}

Submitted by coach {{ reviewSubmittedAgo }}

{{ c.label }}{{ c.msg }}

{{ reviewAiErr }}

{{ reviewAiOut.title }}

{{ rb.label }}

{{ rl }}

The checks above are the club's own rules for this squad — worked out on this device, always the same for the same plan. Asking Claude adds an explanation underneath; it is never allowed to change a verdict.

{{ g.h }}

{{ g.d }}

Live board

{{ boardTitle }}

{{ boardMeta }}

No results logged yet for this board.
Log a T-pace test or import meet results to populate it.

{{ r.rank }} {{ r.name }} {{ r.time }}

No clips yet. Add a race by YouTube, Vimeo, or direct .mp4 link.

{{ cm.label }}
{{ videoCalHint }}
{{ activeVideoTitle }}{{ activeVideoTag }}
Speed
All splits captured ({{ videoSplitsDone }}/{{ videoSplitsTotal }})

{{ videoMarkingLane }}

Vortex SC {{ stopwatchZeroLabel }}

Race clock

0.00
{{ videoStartFoundLabel }} {{ videoStartFoundSub }}

{{ videoStartMsg }}

The clock counts from the start signal, so it reads the swimmer's time and not the clip's. Hear the start finds the beep after "take your marks" in the recording itself — check the frame it stops on before you trust it.

Auto-split · fixed camera

BETA

Only for a still camera with the lane in frame. Mark where each split line is, then let it read the swimmer's wave crossing each one. A panning or broadcast clip moves the marker every frame — tap those by hand.

{{ videoCalPlacedLabel }}

{{ videoScanMsg }}

Swimmers in this clip

{{ videoSwBadgeText }}

From the club

Nobody in the club matches that.

From another club

Naming their club marks the lane as somebody else's swimmer. Type the name in the box above and mark their splits the same way — that is how your swimmer ends up next to the one who beat them.

{{ videoSwMsg }}

{{ videoSwHint }}

Race setup

Race type

Stroke — what the advice is about

Set once for the clip. Changing the distance clears the marks on every lane, because marks captured for a 50 mean nothing on a 200.

Lap splits (sec, from video time)

{{ l.t }}
{{ l.lap }}

Play the clip and tap Lap at each split to build the chart.

Vortex Swimming Club Race analysis {{ raceTotal }} {{ raceEventCap }}
The start is set after splits that were already marked, so the race time cannot be worked out. The split times below are still right. Use Hear the start again, or clear the splits and mark them from the start.
{{ h.label }} {{ h.value }} {{ h.sub }}
Speed through the race metres per second
{{ b.vel }}
{{ b.label }}
Every split tap in the strokes, the rest follows
SplitTimem/sStrKickSRDPSSI
{{ r.label }} {{ r.split }} {{ r.vel }} · {{ r.sr }} {{ r.dps }} {{ r.si }}
Breakout distance, in metres from the wall

{{ raceReadout }}

Count by tapping

{{ raceCountMark }}

Pick the mark, play the clip slowly, and tap. One tap is one stroke or one kick — no hand needed for the keyboard.

Strokes {{ raceCountStrokes }}
Dolphin kicks {{ raceCountKicks }}

{{ raceCountKickNote }}

Vortex Swimming Club {{ videoClipCompareTitle }}
{{ lc.title }} {{ lc.sub }}
{{ lr.label }} {{ lx.value }} {{ lx.gap }}
{{ videoClipCompareTotal.label }} {{ lt.value }} {{ lt.gap }}

{{ videoClipCompareFoot }}

Vortex SC {{ videoAiLane }}

Coach's read

{{ videoAiErr }}

{{ videoAiOut.title }}

{{ vb.label }}

{{ vl }}

{{ videoAiFoot }}

Notes

{{ n.text }}

{{ videoUploadMsg }}

This clip is on this device only — it will be gone when the app closes, and the splits will have nothing to point at.

{{ videoUrlErr }}

Saved analyses

{{ videoFolderCount }}

{{ videoFolderWhere }}

{{ videoFolderNoHitsMsg }}

{{ sv.total }} {{ sv.splits }} marks

{{ videoCompareMsg }}

{{ videoCompareHint }}

Vortex Swimming Club Head to head
{{ cc.title }} {{ cc.sub }}
{{ cr.label }} {{ cx.value }} {{ cx.gap }}
{{ videoCompareTotal.label }} {{ ct.value }} {{ ct.gap }}

The fastest swimmer at each mark is filled in; the small figure under the others is how far behind they were. Marks line up by distance, so two clips marked in a different order still compare.

Your sign-in has expired

Anything you save now stays on this device only — it will not reach the club calendar or the swimmers. Sign in again first, then build and save your session.

Dryland & conditioning — {{ squad.name }}

{{ fitMediaMsg }}

{{ ex.mediaEl }}

Save this session

{{ fitSavedMsg }}

{{ fitCalLabel }}

{{ fw }}
{{ fitCalSelLabel }}{{ fitCalDayEx }} ex
{{ ds.slotLabel }} {{ ds.title }} {{ ds.totalEx }} ex

No dryland saved on this day yet — set this date above and tap “Save session”.

No fitness sessions saved yet — build the blocks above, set a date + AM/PM, and tap “Save session”.

{{ sp.totalEx }}exercises {{ sp.title }}{{ sp.slotLabel }}Shared · {{ sp.shareLabel }}{{ sp.dateLabel }}

Import scan for {{ ibSelName }}

{{ inbodyPdfMsg }}

{{ inbodyQrMsg }}

Detected values

{{ d.l }}{{ d.v }}

Health analysis · {{ ibAnalysis.scanCount }} scans on file

{{ ii.l }}{{ ii.v }}

Recommended nutrition plan

{{ rec }}

VIP Sponsors Directory

{{ sponsorsScopeLabel }} · {{ sponsorsRows.length }} sponsored

Add or remove a sponsored swimmer

{{ sponsorHint }}

No sponsored swimmers yet.
Mark a swimmer as sponsored from their profile.

Birthdays

{{ bdayScopeLabel }}

{{ bdayMsg }}

Today

{{ bt.initials }} {{ bt.name }}{{ bt.squadName }} · {{ bt.turningLabel }}

Next 30 days

No birthdays in the next 30 days.

{{ bdayMissingLine }}

On the morning of a swimmer's birthday the club's message goes to them and their parents on its own — once each, however many coaches open the app — and you and Sameh get a notification so it can be said in person at the session too. Only a real date of birth counts; nobody is wished on a date the app guessed.

Race Strategy

{{ raceScopeLabel }}

{{ raceSelInitials }} {{ raceSelName }}
{{ racePbLabel }}Current PB
{{ raceTargetLabel }}Target

{{ raceTargetSource }}

{{ raceGapLabel }}

{{ raceEventLabel }} — the plan

At Target 50 · cum Swam Diff
{{ rr.label }} {{ rr.target }}{{ rr.targetCum }} {{ rr.deltaLabel }}
{{ raceActualTotalLabel }} {{ raceActualVerdict }}

The plan spreads the target across the race the way a well-swum one goes: out quick off the dive, holding through the middle, coming back on the finish. Type the 50s the swimmer actually swam and each length says whether it was on the plan.

No times on record for this swimmer yet.
A race plan needs a PB to work from — add one on their profile, or record a swim on meet day.

Load & Risk

{{ riskScopeLabel }} · {{ riskCountLine }}

Nobody is flagged.
Swimmers appear here when their training load jumps, their wellness check-ins drop, or their attendance falls away.

Built only from what the club already records: the metres in the sessions a swimmer was marked in for, their own wellness check-ins, and their register. It is a prompt to have a conversation, not a medical assessment.

Talent / Move-up Board

{{ talentScopeLabel }} · {{ talentRows.length }} ready for review

No move-up candidates right now.
Swimmers appear here once they reach the top age of their squad.

Meet Requests

Every meet · {{ reqHeadLine }}

{{ reqMsg }}

{{ reqEmptyLine }}

{{ g.meetName }}

{{ g.meetSub }}

{{ g.headLine }}

Swimmer Squad Races asked for Waiting
{{ r.event }} {{ r.whenLine }} {{ r.markLabel }}

You suggested this one — it enters them as soon as the family accepts it in their app.

Tapping a race sends it to the family to accept. It does not enter them on its own.

{{ sw.noneLine }}

{{ attDayLabel }}

{{ attDayHeadline }}

{{ attDayPct }} club attendance{{ attDayCoverLine }} TODAY

Recovery Board

{{ recoveryScopeLabel }} · lowest recovery first

{{ recoveryLowCount }} swimmer(s) in the red — consider easing their load today.

No recovery data yet.
Log readings on a swimmer's profile, or connect a WHOOP/Fitbit band.

Top Improvers

{{ improverScopeLabel }} · biggest time drops

No improvements to show yet.
Add each swim with its meet date (profile → meet history) and drops appear here automatically.

Rankings — {{ rankEvent }}

{{ rankScopeLabel }} · {{ rankCount }} ranked · avg {{ rankAvgLabel }}

No swimmers have a PB in {{ rankEvent }} yet.
Pick another event above.

{{ r.label }}

Meet Standards

{{ stdMeetName }} · {{ stdEventsWithCut }} cuts · {{ stdTotalQual }} qualifications

No meets yet — add a meet first, then set its cut times here.

Type the cut time for each event (e.g. 27.50 or 1:08.40). Swimmers whose PB beats the cut are counted qualified.

{{ e.event }} {{ e.qualCount }}

✓ {{ e.qualNames }}

Relay Builder

{{ relayScopeLabel }} · fastest logged PBs

{{ grp.title }}

{{ grp.count }}

Medley relay

Predicted total{{ grp.medleyTotal }}

Freestyle relay

Predicted total{{ grp.freeTotal }}
Not enough freestyle PBs for a full team.
No PBs logged in this scope yet — relays appear once swimmers have times.
Choose:
From (Mon)
To
{{ seasonTotalWeeks }}weeks
{{ seasonPhaseCount }}phases

Macrocycle · full season

{{ seasonStartLabel }} → {{ seasonEndLabel }}

Macro dashboard

{{ seasonMacroTotalKm }}kmPlanned
{{ seasonMacroSessions }}Sessions
{{ seasonMacroAvgKm }}kmAvg / week
Season volume curve{{ seasonAnCoverLabel }} {{ seasonAnPeakValue }}{{ seasonAnPeakUnit }}{{ seasonAnPeakCap }}
{{ seasonAnPeak.t }}
{{ seasonAnCaption }} Built Intended

Where the metres went · zone mix

{{ z.label }}{{ z.km }}km · {{ z.pctLabel }}

Mesocycle volume

{{ pr.name }} {{ pr.weeksLabel }} · {{ pr.sessions }} sessions {{ pr.km }}km

{{ pr.avgKm }} km per week

Weekly load · tap a week

Mesocycles · training blocks

{{ ph.weeks }}w

Target meets · taper into these

Weeks 1–2 before each target show a taper flag on the timeline below.

Microcycles · weeks

{{ mm.name }}
Taper week — ease load into the meet
{{ w.weekKm }}kmWeek total
{{ w.sessionCount }}Sessions
{{ w.avgKm }}kmAvg / session
DaySessionZoneMetres
{{ ss.slotLabel }} {{ ss.title }} {{ ss.zone }} {{ ss.m }}

No sessions saved in this week yet — add one for the week below.

{{ composeImageEl }}

Send to

{{ reqMsg }}

{{ p.reqLabel }}
{{ p.avatar }} {{ p.author }}{{ p.role }} · {{ p.time }} {{ p.tag }}

{{ p.textEl }} · edited

{{ p.imageEl }}
{{ p.comments }}
{{ c.avatar }} {{ c.author }} · {{ c.time }}{{ c.textEl }}
{{ goalsSwLabel }}
Squad season goals · {{ goalsSquadName }}Target per event · current = squad average PB

Editing squad targets below. Search a swimmer above to set and edit their individual season goals with AI-suggested targets.

{{ goalMsg }}

{{ g.pct }}
{{ g.event }} Achieved {{ g.sourceLabel }}
Target{{ g.target }}Current PB{{ g.current }}

{{ aiErr }}

{{ aiOut.title }}

{{ bl.label }}

{{ ln }}

Answered by Claude on the server, using the club's key held there. Squad sizes and ages are sent; no swimmer's name or date of birth ever is. Treat it as a second opinion, not an instruction.

{{ adminTitle }}

{{ adminSub }}

{{ rosterSaveMsg }}

Add swimmer to {{ swSquadFilterName }}

Personal bests & meet history

Add each swim — event, course, time, meet & date — then tap +. Add as many as you like (the same event at different meets is kept). All show in the profile; fastest per event becomes the PB.

{{ pb.label }}
{{ r.initials }}{{ r.genIcon }} {{ r.name }}{{ r.ageLabel }} · {{ r.squadName }} {{ r.statusText }}

Status

From To

{{ r.statusRunsTo }}

{{ r.statusMsg }}

Personal bests & meet history

{{ pb.label }}

No swimmers match.

Paste Hy-Tek text

Or upload a PDF

{{ meetImportSummary }}

{{ calErr }}

Event program

{{ compErr }}

{{ meetsMsg }}

Coming up

{{ meetsUpcomingLabel }}
Qualifying times set
{{ d.label }} {{ d.value }}
Note from the club{{ m.notes }}
Event program{{ m.eventsLine }}
Qualifying times
{{ q.event }} {{ q.time }}

Tap events to add or remove them from this meet's program. Parents will only be able to request these events.

The time a swimmer has to have already swum to be entered. Type it as 1:02.45 or 29.80, and leave an event blank if it has no standard. Families see these against their own child's best time.

{{ q.event }}

The day this meet is swum. Times already recorded keep the day they were swum on — this is the meet's own date, and it is what a swim that never had one of its own falls back to.

This meet came in with imported results, so its day, venue and course stay as the host recorded them. Everything below is the club's own and is saved here.

What families need to know

{{ meetEdit.err }}

{{ t.name }} · {{ t.event }}{{ t.time }}

No meets on record yet. Add one to the calendar above, or import a set of results.

Qualifying times set
{{ d.label }} {{ d.value }}
Note from the club{{ dm.notes }}
Event program{{ dm.eventsLine }}
Qualifying times
{{ q.event }} {{ q.time }}

Tap events to add or remove them from this meet's program. Parents will only be able to request these events.

The time a swimmer has to have already swum to be entered. Type it as 1:02.45 or 29.80, and leave an event blank if it has no standard. Families see these against their own child's best time.

{{ q.event }}

The day this meet is swum. Times already recorded keep the day they were swum on — this is the meet's own date, and it is what a swim that never had one of its own falls back to.

This meet came in with imported results, so its day, venue and course stay as the host recorded them. Everything below is the club's own and is saved here.

What families need to know

{{ meetEdit.err }}

{{ t.name }} · {{ t.event }}{{ t.time }}

{{ campErr }}

Camps coming up

{{ campsUpcomingLabel }}
{{ c.day }}{{ c.mon }} {{ c.name }}{{ c.when }}
{{ c.meta }} {{ c.cost }} {{ c.notes }}
{{ dc.name }}{{ dc.when }}
Squad colour

{{ squadMsg }}

{{ sq.short }} {{ sq.name }}{{ sq.meta }}
Squad colour
{{ sq.deleteHint }}
Renaming a squad changes only what is shown. Everything filed under it — attendance, plans, invoices, meet entries, coaches' access — stays attached. A squad with swimmers in it cannot be deleted; move them out first.
The password is shown as you type it so you can pass it on — write it down before you press Create. They can sign in with the email or the username.
Position — tap one or more
Squads they can see
{{ staffAccessNote }}

{{ staffAddMsg }}

Staff now sign in with a password, checked by the server. Set one for each coach below — they cannot sign in until you do.
{{ s.signInText }}

{{ s.pwMsg }}

{{ s.avatar }} {{ s.name }}{{ s.sub }}
{{ s.editPhotoAvatar }}
Position — tap one or more
Squads they can see
{{ s.editAccessNote }}
A login can only ever see the children listed here. Remove anything that isn’t theirs.

{{ famAdminAuditLine }}

✓ Every account looks correct.

{{ famAdminMsg }}

No family accounts match.

{{ fa.name }}

{{ fa.email }}

{{ fa.phone }} · {{ fa.kidCount }}

{{ fa.roleLabel }}
{{ fk.label }}{{ fk.sub }}

{{ fa.addHint }}

Club name

Training zone method

Current ruleset: {{ brandView.ruleset }} · {{ brandView.squadCount }} squads

Locale

Text direction

Currency

Payment link

Paste the club's own payment page (Tap, MyFatoorah, Stripe — whatever you already use). Families get a "Pay now" button on their Fees tab that opens it. Leave it empty and they simply pay you the way they do today.

{{ settingsMsg }}

These settings drive Vortex SC's white-label configuration — the same app can be re-branded and re-ruled per club without code changes.

Every sign-in and every change, with the time the server recorded it. Nothing here can be edited or deleted from the app — that is what makes it worth reading.

{{ auditCount }}

{{ auditTestMsg }}

{{ auditErr }}

{{ auditBlank }}
{{ al.action }} {{ al.when }}

{{ al.target }}

{{ al.who }} · {{ al.whoSub }} · {{ al.device }}

{{ al.facts }}

AI reader

The key lives on the server, set once in Vercel as ANTHROPIC_API_KEY. There is nothing to enter here, and nothing to enter on any phone — a key kept on a device can be read off it.

{{ settingsMsg }}

Database sync

Push everything on this device to the shared Supabase database now. Use this once from the device that has your data, then it stays in sync automatically.

{{ dbTestMsg }}

{{ syncMsg }}

About this club

Vortex SC · 9 squads · {{ swimmerTotal }} swimmers · {{ meetTotal }} meets on record

App build {{ appBuild }} on this device

{{ appBuildNote }}

Fetches the newest version and clears the copy saved on this device. Nothing on the record is affected — everything lives in the database.

Roster copy

The roster is one shared document, so the last device to change anything replaces every other device's copy. If the swimmer count is wrong, compare the two and choose.

{{ rosterFixMsg }}

How the roster is stored

{{ rosterModeLine }}

One row per swimmer means two coaches editing two swimmers cannot overwrite each other. Nothing is written until the app has checked, swimmer by swimmer, that the rows say exactly what the roster says — and the single document goes on being saved behind them, so this can be undone and every recovery still works.

Dates of birth

Every night's copy of the roster is kept. This reads the best one, says how many dates it would put back, and puts them back — writing nothing but a date, and only where there is none now. It never adds, removes or moves a swimmer, and it saves what is here first, so it can be undone.

{{ dobMsg }}

Put the roster back to a night

When the swimmer count itself is wrong, this replaces the whole roster with a night's copy — swimmers, dates and all. It says what the result will be before it does anything, and keeps a copy of today first, so it can be undone from here. It will not offer a night's copy holding fewer dates of birth than the roster holds now, and it names every swimmer and date that would go before it asks. Everything else on this screen deliberately cannot change the count; this can, which is why it asks twice.

{{ rbMsg }}

Reset local data

Clears saved plans, family logins and roster edits on this device. Cannot be undone.

Print preview

Review before printing or saving as PDF

Vortex SC
{{ printSheet.clubName }}
Session plan
{{ printSheet.squadName }}
{{ printSheet.printDate }}
Session · {{ printSheet.zoneLabel }}
{{ printSheet.title }}
{{ printSheet.coach }}
{{ printSheet.timeWindow }}
{{ printSheet.total }}
metres
{{ pvsec.title }}· {{ pvsec.subtotal }}m{{ pvsec.startLabel }}
{{ pvsec.roundsLabel }}
{{ pvset.dist }}m
{{ pvset.distSend }}

{{ pvset.zoneCode }}
{{ pvset.txt }}
Stroke: {{ pvset.strokesStr }} Type: {{ pvset.typesStr }} Focus: {{ pvset.labelsStr }} Groups: {{ pvset.groupsStr }} Swimmers: {{ pvset.swimmersStr }} Tools: {{ pvset.equipStr }} Rest: {{ pvset.restStr }} {{ pvset.hrStr }}
{{ pvset.timeLabel }}{{ pvset.setMetres }}m
Vortex SC
{{ printProgram.clubName }}
Meet program
{{ printProgram.squadName }}
{{ printProgram.printDate }}

{{ printProgram.meetName }}

{{ hh.label }}

Ln {{ rr.lane }} {{ rr.name }} {{ rr.pb }}
Vortex SC
{{ printResults.clubName }}
Results
{{ printResults.squadName }}
{{ printResults.printDate }}

{{ printResults.meetName }}

{{ printResults.meta }}

{{ printResults.summary }}

{{ re.event }}

{{ rr.place }} {{ rr.name }}{{ rr.squad }} {{ rr.time }}{{ rr.note }}
{{ rm.mark }}{{ rm.name }} — {{ rm.markFull }}
Generated from the Vortex SC coaching app VORTEX SWIMMING CLUB

{{ clockView.section }}

{{ clockView.time }}

{{ clockView.rep }}

{{ clockView.setTxt }}

{{ swtStatusLabel }}

0.00

{{ swtFsSub }}

Settings

Appearance

Language · اللغة

Arabic switches the app to right-to-left. Names, squads and times stay as entered.

Notifications

Get a push alert on this device for new coach messages{{ pushRoleNote }}.

{{ pushMsg }}

Send a notification

Sent

{{ a.body }}{{ a.audienceLabel }} · {{ a.when }}

Data check · owner only

Live counts pulled straight from the database, so you can confirm everything really is saved — on every device, not just this one.

{{ authDbg }}

{{ dataCheckMsg }}

{{ d.label }} {{ d.value }}

My profile

{{ setPhoto }}

Your squad and access level are set by an admin. Changing your email changes the address you sign in with.

{{ profileMsg }}

Password

Choose your own password — it is stored securely and checked by the server, never on this device.

{{ pwMsg }}

WhatsApp share contacts

Save a coach's number (with country code) or a WhatsApp group invite link. Sharing a plan opens that chat/group with the PDF ready to attach.

{{ w.label }}{{ w.sub }}
OR GROUP LINK

Reported content

{{ modOpenCount }} open

Every report is answered within 24 hours. "Remove" deletes the post or comment and closes the report.

Nothing reported.

{{ m.reasonLabel }} {{ m.meta }}

{{ m.author }}

{{ m.excerpt }}

{{ m.detail }}

{{ m.closedLabel }}

{{ tx.yourAccount }}

{{ accountEmail }}

{{ tx.deleteAccountTitle }}

{{ tx.deleteAccountBody }}

{{ delMsg }}

{{ settingsMsg }}

Privacy Policy  ·  Parental Consent

{{ tx.reportTitle }}{{ reportSubject }}

{{ tx.reportBlurb }}

{{ reportMsg }}

{{ tx.reportFooter }}

Share plan as PDF

Builds a PDF of the current session on your device. Use your phone's share sheet to send the PDF file straight into any WhatsApp chat or group, or pick a saved contact.

Tip: add your groups' admin numbers in Settings → WhatsApp share contacts for one-tap sending.

{{ shrTitle }}

Choose who can see this session in their portal. Pick the whole squad, or tick only certain swimmers — their parents see it too.

Or pick swimmers

Edit target · {{ tgtEditEvent }}

Set the target time this swimmer is chasing in {{ tgtEditEvent }}. Coaches and the swimmer's family both see it. Leave it and it falls back to the age-group standard.

World Aquatics standards

Age-group standard

Single-year benchmark · short course (25m) · by age at 31 Dec

Event13141516
{{ r.event }}{{ r.c13 }}{{ r.c14 }}{{ r.c15 }}{{ r.c16 }}

Senior Worlds qualifying

{{ waqCourseLabel }} · A = standard entry · B = A + 3.5%

EventAB
{{ r.event }}{{ r.a }}{{ r.b }}
Vortex ID
VIP
Vortex SC Member Card
{{ vortexIdCard.avatarEl }}{{ vortexIdCard.genIcon }}
Name{{ vortexIdCard.name }}
Date of birth{{ vortexIdCard.dob }}
Squad{{ vortexIdCard.squadName }}
ID Number{{ vortexIdCard.idNumber }}
Season{{ vortexIdCard.season }}
Vortex SC
{{ vortexIdMsg }}
Add Ladder / Pyramid

Shape

Rungshow many swims {{ ladderRungsVal }}
Start distancethe first rung {{ ladderStartVal }}m
Step sizeadded each rung {{ ladderStepVal }}m
Repeats eachswims per rung {{ ladderRepsVal }}
Send-off / 50pace clock per 50m {{ ladderPaceStr }}

Build a rung

{{ manRepsVal }} × {{ manDistVal }}m {{ manPaceStr }}
Stroke

Your ladder · {{ manCount }} rungs

{{ r.num }} {{ r.label }}
{{ ladderTotal }} m≈ {{ ladderTimeMin }} mins

{{ ladderText }}

Notes

{{ relayPickerTitle }}

{{ relayPickerSub }}

No swimmers in this group have a PB for this stroke.

Swimmers for this set

Tap to include · leave empty for the whole squad

No swimmers match — this squad's roster will appear here.

Switch squad

STAGING · TEST COPY — NOT THE REAL CLUB APP
A newer version of the app is readyThis device is still on {{ updateHave }}. The live one is {{ updateLatest }}.
{{ saveFailTitle }}{{ saveFailDetail }}
{{ blockedTitle }}{{ blockedDetail }}
Vortex SC
{{ printSheet.clubName }}
Session plan
{{ printSheet.squadName }}
{{ printSheet.printDate }}
Session · {{ printSheet.zoneLabel }}
{{ printSheet.title }}
{{ printSheet.coach }}
{{ printSheet.timeWindow }}
{{ printSheet.total }}
metres
{{ psec.title }}· {{ psec.subtotal }}m{{ psec.startLabel }}
{{ psec.roundsLabel }}
{{ pset.dist }}m
{{ pset.distSend }}

{{ pset.zoneCode }}
{{ pset.txt }}
Stroke: {{ pset.strokesStr }} Type: {{ pset.typesStr }} Focus: {{ pset.labelsStr }} Groups: {{ pset.groupsStr }} Swimmers: {{ pset.swimmersStr }} Tools: {{ pset.equipStr }} Rest: {{ pset.restStr }} {{ pset.hrStr }}
{{ pset.timeLabel }}{{ pset.setMetres }}m
Vortex SC
{{ printProgram.clubName }}
Meet program
{{ printProgram.squadName }}
{{ printProgram.printDate }}

{{ printProgram.meetName }}

{{ hh2.label }}

Ln {{ rr2.lane }} {{ rr2.name }} {{ rr2.pb }}
Vortex SC
{{ printResults.clubName }}
Results
{{ printResults.squadName }}
{{ printResults.printDate }}

{{ printResults.meetName }}

{{ printResults.meta }}

{{ printResults.summary }}

{{ re.event }}

{{ rr.place }} {{ rr.name }}{{ rr.squad }} {{ rr.time }}{{ rr.note }}
{{ rm.mark }}{{ rm.name }} — {{ rm.markFull }}
Generated from the Vortex SC coaching app VORTEX SWIMMING CLUB