The Thesis & The Problem
Logging sets and weights during a high-intensity workout is a chore. Gym-goers frequently abandon tracking apps mid-workout because typing digits and navigating nested menus while out of breath introduces heavy mental friction.
AthletIQ was built to solve this exact bottleneck: an ultra-premium SwiftUI workout logger engineered around a "2-tap logging" mechanism. By leveraging pre-predicted weight defaults, persistent workout state caches, and intelligent swipe gestures, users can register an entire set in under two seconds.
Core UX Philosophy (Dynamic States): Rest timers should not feel passive. When a user logs a set, AthletIQ launches a dynamic visual countdown bubble utilizing iOS 16+ Live Activities. The timer ticks quietly on their lock screen, pulsing gently through haptics when it is time to load the next bar.
Design Thinking: Premium Gold Glassmorphism
Prototyping a workout dashboard that inspires athletic focus:
- Tactile Physical Dialers: Instead of opening the keyboard to type numbers, AthletIQ features spring-loaded rotational dials to adjust weights, mimicking premium gym equipment selectors.
- SwiftData State Synchronization: Relational workout models (Workouts → Exercises → Sets) are structured in a clean, query-efficient SwiftData model. Database updates run on background contexts to avoid UI frame-drops.
- Intelligent Progressive Overload Guides: The interface highlights previous performance targets as ghost text behind input cells, quietly prompting the user to lift 1kg more or complete one additional rep.
Workout Database Schema (SwiftData Model)
Below is a model representation of our relational exercise database model using SwiftData schemas:
import Foundation
import SwiftData
@Model
final class WorkoutSession {
@Attribute(.unique) var id: UUID
var name: String
var startedAt: Date
var endedAt: Date?
@Relationship(deleteRule: .cascade)
var loggedExercises: [LoggedExercise] = []
init(name: String) {
self.id = UUID()
self.name = name
self.startedAt = Date()
}
}
@Model
final class LoggedExercise {
var id: UUID
var exerciseName: String
var targetMuscle: String
var sets: [ExerciseSet] = []
init(exerciseName: String, targetMuscle: String) {
self.id = UUID()
self.exerciseName = exerciseName
self.targetMuscle = targetMuscle
}
}
@Model
final class ExerciseSet {
var id: UUID
var weightKg: Double
var repsCount: Int
var isCompleted: Bool
init(weightKg: Double, repsCount: Int) {
self.id = UUID()
self.weightKg = weightKg
self.repsCount = repsCount
self.isCompleted = false
}
}
Technical Achievements
- Dynamic Set Predictions: Utilizes simple local regression algorithms to guess your target weights for the next set based on your historical volume logs, minimizing input friction.
- Non-blocking UI Rendering: All chart renderings and database queries execute asynchronously, maintaining 120Hz ProMotion animations on supported iPhones.
- Haptic Rest Signals: Uses specialized Core Haptics patterns that vibrate distinct pulses when rest intervals complete, keeping users focused without audible alarms.