{{ pgTrialText }} Choose a plan before it ends and nothing pauses. Choose a plan
{{ dateLine() }}
{{ say('today.loading') }} {{ say('today.loadingHint') }}
{{ say('today.signedOut') }} {{ say('today.signedOutHint') }}
{{ say('today.unavailable') }} {{ say('today.unavailableHint') }}
{{ say('today.training') }}
{{ say('today.restDay') }} {{ say('today.restDayHint') }}
Mindful recovery
{{ say('today.recoveryReview') }} {{ say('today.recoveryUnchanged') }}
{{ say('today.recoveryReviewing') }} {{ recoverySummary }}
{{ recoverySuggestion.card.title }} {{ say('today.recoveryOriginal', { duration: recoverySuggestion.before }) }} {{ line }} {{ recoverySuggestion.proposal.reason }} {{ say('today.recoveryRevised') }} {{ recoverySuggestion.card.exercises }} {{ recoverySuggestion.card.steps }} {{ say('today.recoveryStale') }}
{{ st('assistant.feedback.help') }}
{{ st('assistant.feedback.saved') + ': ' + [recoverySuggestion.decision_feedback.reason ? st('assistant.feedback.reasons.' + recoverySuggestion.decision_feedback.reason) : '', recoverySuggestion.decision_feedback.note || ''].filter(Boolean).join(' · ') }} {{ say('today.recoveryApplied') }}
{{ recoveryFailure }} {{ recoveryError }}
{{ say('today.coachSection') }}
{{ say('today.comingUp') }}
{{ day.label }}
{{ say('today.oura.title') }} {{ data.oura ? say('today.oura.subtitle', { date: healthDate(data.oura.date, locale()) }) : say('today.oura.waiting') }}
{{ mobileCount(locale(), 'today.oura.days', data.oura.days) }} {{ say('today.oura.sync') }}
{{ say('today.oura.connectionTitle') }} {{ (data.ouraConnection && data.ouraConnection.sync_error) || data.ouraError }} {{ say('today.oura.savedHint') }}
{{ st('habits.today.title') }}
{{ st('habits.today.empty') }}
{{ habitProgress(habitsDay().habits, locale()) }}
{{ habitError() }} {{ st('habits.nutrition.title') }}
{{ say('today.emptyPicture') }} {{ say('today.emptyPictureHint') }}
{{ say('today.recovery') }} {{ error }}

{{ greeting }}

{{ dateLabel }}

  • {{ goal }}

New: a one-minute tour

What Last Soul Ultra can do for you, and a few questions to set it up.

Take the tour

This week

{{ weekDone }}{{ t('home.week.done', { total: weekTotal }) }}

Volume

{{ week ? week.totalDuration : '0h 0m' }}

Done and still planned

Distance

{{ formatNumber(distanceIn(week ? week.totalDistanceKm : 0), { maximumFractionDigits: 1 }) }}{{ distanceUnit() }}

{{ t('home.week.tssHint', { tss: week ? week.totalTss : 0 }) }}

Form

{{ form.tsb }}{{ form.label }}

{{ t('home.week.formHint', { ctl: form.ctl, atl: form.atl }) }}

—

Builds as you log workouts

Loading...

Loading your training…

{{ workout && workout.sessions && workout.sessions.filter(item => !isMindfulWorkout(item)).length > 1 ? t('home.today.titleMany') : t('home.today.titleOne') }}

{{ !workout ? t('home.today.nothing') : workout.sessions && workout.sessions.filter(item => !isMindfulWorkout(item)).length > 1 ? tc('home.today.inOrder', workout.sessions.filter(item => !isMindfulWorkout(item)).length) : workout.completed ? t('home.today.done') : t('home.today.onPlan') }} · synced from TrainingPeaks

Completed

Rest day

Plan a session or sync a device to see it here.

Plan a workout

{{ workout.name || workout.title }}

{{ zoneLabel(workout.zone, t) }}

{{ [workout.duration_label || workout.duration, workout.distance ? formatNumber(distanceIn(workout.distance), { maximumFractionDigits: 2 }) + ' ' + distanceUnit() : '', workout.strength ? tc('home.today.sets', workout.strength.sets) + ' · ' + tc('home.today.exercises', workout.strength.exercises) : '', workout.tss ? Number(workout.tss) + ' TSS' : ''].filter(Boolean).join(' · ') }}

From your coach: {{ workout.coach_note }}

{{ completeError }}

{{ fitError }}

{{ t('home.today.planned', { what: workout.strength ? [workout.duration_label, tc('home.today.sets', workout.strength.sets)].filter(Boolean).join(' · ') : (workout.duration_label || workout.planned.duration) }) }} · {{ Number(workout.planned.tss) }} TSS · IF {{ formatNumber(Number(workout.planned.if), { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }} Calendar

Mindful recovery

{{ item.title }}{{ item.summary }}

Your classes

{{ upcomingBookings.length ? t('home.classes.booked', { count: upcomingBookings.length }) : t('home.classes.nothingBooked') }}

Full schedule
{{ gymNotice }}

{{ booking.session_name }}

{{ prettyDate(booking.session_date) }} · {{ prettyTime(booking.start_time) }}

{{ booking.status === 'waitlisted' ? t('home.classes.waitlist') : t('home.classes.bookedChip') }}

Open spots

{{ session.name }}

{{ prettyDate(session.session_date) }} · {{ prettyTime(session.start_time) }}

No classes on the timetable for the next two weeks.

Your athletes are in the coach workspace

This page shows your own training and classes. Add an athlete profile in Settings if you train here too.

Welcome to Last Soul Ultra

Join a gym or connect with a coach and your classes and training land here.