VERTEX8
HYROX TRAINING
{{ toast.msg }}
Abort Session?
Progress tidak akan disimpan. Yakin mau keluar?
Ya, Keluar
Lanjut
Admin Access
PASSWORD
ENTER
VERTEX8
⚙
VERTEX8 HYROX
FIND
ATHLETE
Search by WhatsApp number
WHATSAPP NUMBER
+62
{{ isSearching ? 'SEARCHING...' : 'SEARCH' }}
🔍
No athlete found.
Check the number and try again.
{{ m.fullname }}
{{ m.activation_status||'ACTIVE' }}
{{ m.active_package }}
{{ m.gender||'—' }}
TAP TO CONTINUE →
ATHLETE
{{ member?.fullname }}
{{ member?.activation_status||'ACTIVE' }}
{{ member?.active_package }}
CHANGE
⌚
BIND WATCH
Connect Garmin / Amazfit
ENTER ON WATCH
{{ watchPin }}
PIN expires in 5 minutes
Already entered? Verify →
🔐
VERIFY PIN
Enter the 4-digit PIN shown on your watch display
OK
{{ watchPinError }}
⌚
WATCH CONNECTED
Ready to sync training data
SELECT MODE
🏋️
TRAINING
Per-station drill tracker with countdown & countup timer. Achievement scoring.
›
🏁
SIMULATION
Full race simulation — 8 runs + 8 stations. Complete HYROX experience.
›
🏅
LEADERBOARD
Global simulation rankings by division and gender.
›
📋
MY HISTORY
Your simulation sessions — time trends, pace drop, PB tracking.
›
‹
SIMULATION
{{ member?.fullname }}
DIVISION
{{ d.l }}
GENDER
♂ MALE
♀ FEMALE
START SIMULATION
✓
R{{ Math.ceil((i+1)/2) }}
{{ Math.ceil(i/2) }}
{{ s.type==='run' ? 'RUN' : s.name.split(' ')[0] }}
{{ member?.fullname }}
{{ simDiv }} · {{ simGender==='M'?'MALE':'FEMALE' }} · {{ Object.keys(doneMap).length }}/{{ stages.length }}
{{ fmtTime(totalSecs) }}
{{ curStage.icon }}
{{ curStage.name }}
{{ curStage.spec }}
{{ fmtTimer(stageSecs) }}
.{{ String(stageMs).padStart(2,'0') }}
{{ timerOn?'RUNNING':stageSecs?'PAUSED':'READY' }}
{{ curStage.metric.label }}
−
{{ metVal }}
TARGET: {{ curStage.metric.target }} {{ curStage.metric.unit }}
+
START
PAUSE
RESUME
DONE ✓
SKIP
ABORT
✦ SESSION COMPLETE ✦
{{ fmtTime(totalSecs) }}
{{ perfGrade }}
{{ member?.fullname }} · {{ simDiv }} · {{ simGender==='M'?'Male':'Female' }}
🏆
NEW PERSONAL BEST
{{ fmtTime(totalSecs) }}
▼ {{ fmtTime(prevBest - totalSecs) }} improvement
PERSONAL BEST
{{ fmtTime(prevBest) }}
{{ totalSecs > prevBest ? '▲ +' : '▼ -' }}{{ fmtTime(Math.abs(totalSecs - prevBest)) }}
RUN SPLIT COMPARISON
{{ rb.pace }}
R{{ ri+1 }}
STAGE SPLITS
{{ sp.icon }}
{{ sp.name }}
{{ sp.met }}
{{ calcPace(sp.time, 1000) }} /km
{{ sp.skip ? 'SKIP' : fmtTime(sp.time) }}
{{ sp.benchmarkPct }}% bench
Total Time
{{ fmtTime(totalSecs) }}
Run Time
{{ fmtTime(runTotal) }} ({{ Math.round(runTotal/totalSecs*100) }}%)
Station Time
{{ fmtTime(stnTotal) }} ({{ Math.round(stnTotal/totalSecs*100) }}%)
Avg Run Pace
{{ avgRunPace }} /km
Pace Drop R1→R8
{{ paceDrop > 0 ? '+'+paceDrop+'s' : paceDrop+'s' }}
Stations Done
{{ stnDone }}/8
Performance
{{ perfGrade }}
{{ isSaving ? 'SAVING...' : 'SAVE SESSION' }}
📋 VIEW HISTORY
BACK TO HOME
‹
{{ member?.fullname?.split(' ')[0] }}
TRAINING
OPEN
PRO
LOADING MODULES...
{{ trainModules[activeStn].icon || '🏋️' }}
{{ trainModules[activeStn].name }}
{{ trainModules[activeStn].distance_label }}
{{ trainModules[activeStn].timer_type === 'countdown' ? '⬇ COUNTDOWN · INPUT RESULT' : '⬆ COUNTUP · TIME RECORDED' }}
HOW TO PERFORM
{{ trainModules[activeStn].description }}
{{ fmtTimer(trainCountdownDisplay) }}
{{ Math.round(countdownProgress * 100) }}%
{{ timerOn ? 'COUNTING DOWN' : trainSecs > 0 ? 'PAUSED' : 'READY' }}
{{ trainModules[activeStn].input_unit === 'reps' ? 'REPS COMPLETED' : 'METERS COMPLETED' }}
−
{{ trainResult }}
{{ trainModules[activeStn].input_unit?.toUpperCase() }}
+
{{ fmtTimer(trainSecs) }}
.{{ String(trainMs).padStart(2,'0') }}
{{ timerOn ? 'RUNNING' : trainSecs > 0 ? 'PAUSED' : 'READY' }}
{{ tierIcon(liveAchievement.tier) }}
{{ liveAchievement.pct.toFixed(1) }}%
{{ liveAchievement.tier.toUpperCase() }}
{{ currentTargetLabel }}
▶ START
⏸ PAUSE
▶ RESUME
💾 SAVE
▶ START
⏸ PAUSE
▶ RESUME
💾 SAVE
↺ RESET TIMER
{{ bestRecord(activeStn) }}
BEST
{{ trainRecs[activeStn].length }}
SESSIONS
{{ avgRecord(activeStn) }}
AVG 3
{{ deltaRecord(activeStn) > 0 ? '+' : '' }}{{ deltaRecord(activeStn) }}
VS PREV
HISTORY
{{ ri===0?'#1':('#'+(ri+1)) }}
{{ fmtDate(r.recorded_at) }}
{{ tierIcon(r.tier) }} {{ r.tier.toUpperCase() }} · {{ r.achievement_pct }}%
{{ fmtTime(r.result_value) }}
{{ r.result_value }} {{ trainModules[activeStn].input_unit }}
⇄ Change Station
SELECT STATION
{{ bestRecordDisplay(mi) }}
{{ m.icon || '🏋️' }}
{{ m.name }}
{{ m.distance_label }}
My History
SIMULATION SESSIONS
LOADING
📋
No sessions yet.
Complete your first simulation!
{{ fmtDate(s.session_date) }}
{{ fmtTime(s.total_time_seconds) }}
{{ s.division }} · {{ s.gender==='M'?'Male':'Female' }}
{{ s.performance_grade }}
{{ s.stations_completed }}/8 stations
{{ s.total_time_seconds < simHistory[i-1].total_time_seconds ? '▼ ' : '▲ ' }}{{ fmtTime(Math.abs(s.total_time_seconds - simHistory[i-1].total_time_seconds)) }} vs prev
← BACK
Leaderboard
SIMULATION RANKING
{{ f.l }}
LOADING
🏅
No records yet.
Complete your first simulation!
{{ i===0?'🥇':i===1?'🥈':i===2?'🥉':(i+1) }}
{{ e.athlete_name }}
{{ e.division }} · {{ e.gender==='M'?'Male':'Female' }} · {{ fmtDate(e.session_date) }}
{{ fmtTime(e.total_time_seconds) }}
← BACK