Overview
The Today tab is your command center for daily workout logging. It displays your scheduled workout for the current day and allows you to log sets, track progress in real-time, and view completion status.
The app automatically loads your workout based on the day of the week. If no workout is configured for today, you’ll see a “No Workout Scheduled” message.
Viewing Today’s Workout
When you open the Today tab, you’ll see:
Workout header - Shows the day of the week and workout focus (e.g., “Push Day”, “Pull Day”)
Progress tracker - Displays completed sets vs total sets (e.g., “Progress: 5/12 sets logged”)
Exercise cards - Each exercise shows:
Exercise name
Target sets and reps
Exercise notes
Video demonstration (if available)
Rep input field
Completion status
Gradient Header The workout card features a gradient background from cyan to blue, making it easy to spot your daily focus.
Video Demos Videos auto-play in a loop to help you maintain proper form throughout your workout.
Logging Sets
To log a completed set:
Enter reps completed
Type the number of reps you completed in the input field (1-249 reps allowed).
Submit the set
Click the Log Set button or press Enter on your keyboard to record the set.
Review your log
The set appears in a cyan-colored box below the input, showing “Set 1: X reps”.
Code Example: How Sets Are Logged
Here’s how the app handles set completion from TodayTab.jsx:106-143:
< div className = "flex items-center gap-2" >
< Input
type = "number"
min = "1"
max = "249"
inputMode = "numeric"
value = { inputValue }
onChange = { ( event ) =>
setRepInputs (( prev ) => ({
... prev ,
[exercise.id]: event . target . value ,
}))
}
onKeyDown = { ( event ) => {
if ( event . key === "Enter" ) {
const reps = Number ( inputValue );
if ( reps > 0 && reps < 250 && ! isFullyCompleted ) {
onCompleteSet ( exercise . id , reps );
setRepInputs (( prev ) => ({ ... prev , [exercise.id]: "" }));
}
}
} }
placeholder = "Reps completed"
/>
< Button
type = "button"
disabled = { isFullyCompleted || Number ( inputValue ) <= 0 || Number ( inputValue ) >= 250 }
onClick = { () => {
const reps = Number ( inputValue );
if ( reps > 0 && reps < 250 ) {
onCompleteSet ( exercise . id , reps );
setRepInputs (( prev ) => ({ ... prev , [exercise.id]: "" }));
}
} }
>
Log Set
</ Button >
</ div >
The input field automatically clears after logging a set, so you can quickly log your next set.
Tracking Progress
The app provides multiple ways to track your progress:
Per-Exercise Progress
Each exercise card displays:
✅ Green checkmark - When all sets are completed
⚪ Gray circle - When sets remain
Set counter - “Completed 2 / 3 sets”
Logged sets list - Shows reps for each completed set
Visual Completion Indicators
From TodayTab.jsx:145-162:
< div className = "flex items-center gap-2 text-sm" >
{ isFullyCompleted ? (
< CheckCircle2 className = "h-4 w-4 text-emerald-500" />
) : (
< Circle className = "h-4 w-4 text-slate-400 dark:text-zinc-500" />
) }
< span className = "text-slate-700 dark:text-zinc-200" >
Completed { logs . length } / { exercise . sets } sets
</ span >
</ div >
{ logs . length > 0 && (
< ul className = "space-y-1 rounded-xl border border-dashed border-cyan-200 bg-cyan-50/70 p-2 text-sm text-slate-700" >
{ logs . map (( log , index ) => (
< li key = { ` ${ exercise . id } - ${ index } ` } > Set { index + 1 } : { log . reps } reps </ li >
)) }
</ ul >
)}
Workout Completion
When you complete all sets for the day:
The app displays a Success Page with motivational content
Your progress is automatically saved to localStorage
The day is marked as completed in the calendar
Your streak counter updates
Complete all exercises to see the workout success page and keep your streak alive!
Watching Exercise Videos
The app includes video demonstrations for proper form:
Auto-play - Videos automatically play on loop
Muted by default - No audio to distract you
Support for GIF and MP4 - Videos are loaded from /workout/{day}/{filename}
Max height - Videos are capped at 320px for optimal viewing
From TodayTab.jsx:84-104:
{ videoPath && (
< div className = "px-6 pb-4" >
< div className = "mb-4 rounded-lg overflow-hidden bg-slate-900 shadow-md" >
{ isGif ? (
< img
src = { videoPath }
alt = { exercise . name }
className = "w-full h-auto object-cover max-h-80"
/>
) : (
< video
autoPlay
muted
loop
className = "w-full h-auto object-cover max-h-80"
src = { videoPath }
/>
) }
</ div >
</ div >
)}
Resetting Today’s Progress
If you need to restart your workout:
Scroll to bottom
Navigate to the bottom of the Today tab.
Click Reset button
Click the red Reset Today’s Progress button.
Confirm action
Confirm the reset in the dialog box. This action cannot be undone.
Resetting today’s progress will delete all logged sets for the current day. This action is permanent and cannot be undone.
From TodayTab.jsx:168-178:
< Card className = "border-0 bg-red-50 shadow-sm dark:bg-red-950/30" >
< CardContent className = "pt-6" >
< Button
onClick = { onResetToday }
variant = "outline"
className = "w-full border-red-200 text-red-600 hover:bg-red-50"
>
Reset Today's Progress
</ Button >
</ CardContent >
</ Card >
Data Storage
All workout data is stored locally in your browser:
localStorage key : completedExercises
Structure : Date-keyed object with exercise IDs and rep logs
Format : { "2026-03-07": { "exercise-id": [{ reps: 12, loggedAt: "ISO-timestamp" }] } }
View Storage Implementation
const addCompletedSet = ( exerciseId , reps ) => {
setCompletedExercises (( previous ) => {
const dayLog = previous [ dateKey ] || {};
const exerciseLog = dayLog [ exerciseId ] || [];
return {
... previous ,
[dateKey]: {
... dayLog ,
[exerciseId]: [ ... exerciseLog , { reps , loggedAt: new Date (). toISOString () }],
},
};
});
};
From App.jsx:106-119
Dark Mode Support
All workout tracking features work seamlessly in dark mode:
Cards adapt to dark backgrounds
Text remains readable with zinc color palette
Gradient headers maintain vibrancy
Video containers have appropriate contrast
Toggle dark mode using the moon/sun icon in the header to match your gym’s lighting conditions.