byOne
Product design + iOS
Build a training habit, not another spreadsheet.
A focused workout companion that turns a plan for your real week into a calm gym session and an honest view of progress.


The product thesis
A good workout app should reduce decisions at the moment of effort.
Fitness trackers often make people choose between a generic program, a dense logging screen, and a dashboard that says very little. byOne is designed around the moment someone needs to know exactly what to do next.
The result is a private, local-first product loop: start with a plan that fits the week, focus during the session, and return to feedback that respects the work that was actually logged.
What I owned
I carried the product from its first decision through App Store release.
My role spanned product strategy, information architecture, interaction and visual design, SwiftUI implementation, training-domain logic, local persistence, analytics, sharing, QA, testing, and release preparation.
- 01
Today first The first screen answers what to do next instead of making people decode a dashboard.
- 02
Less between sets Gym Mode keeps the next useful decision within reach, without turning training into spreadsheet work.
- 03
Progress, honestly Trends and personal records compare meaningful training data instead of overstating the result.
The complete loop
A quieter path from plan to progress.
The information architecture follows the rhythm of a training habit, so each moment carries only the context someone needs next.
- 01
Plan Build a training week around a real goal, schedule, equipment, and session length.
- 02
Today See the next useful workout, a flexible schedule, and the context to begin.
- 03
Gym Mode Log working sets one exercise at a time without losing momentum.
- 04
Progress Understand training trends, records, and the wins worth sharing.
A plan that fits
Personal enough to begin. Flexible enough to keep going.
Initial planning asks only for choices that materially change the recommendation: a goal, training days, equipment, session length, and a preferred starting point. The plan stays editable when a real week inevitably changes.


The daily surface
The Home screen responds to the person’s actual training state.
I treated Home as a state-aware decision surface rather than a calendar. A week strip supplies planning context, but the primary card changes according to what has really happened.
- 01
Scheduled workout Preview the session, see prior results, edit the exercise list, then begin.
- 02
Rest day See the next planned session or intentionally choose an optional workout.
- 03
In-progress session Resume the saved draft instead of forcing someone to begin again.
- 04
Completed session Review the result, restart if needed, or create a share card from a real milestone.
Gym Mode
One exercise at a time. One less thing to think about.
Gym Mode is a dedicated, distraction-light workout environment: one exercise per page, persistent session context, and a clear action dock. It deliberately avoids making someone navigate a dense form between sets.

- 01
Set-level logging Working sets record weight, reps, units, and optional perceived effort without obscuring the next action.
- 02
Useful session context Elapsed time, completed sets, volume, rest timing, and the active exercise stay visible at a glance.
- 03
Adaptable in the moment A person can add an exercise during the workout when the plan needs to change around available equipment.
- 04
Cautious load guidance External load only increases after two complete sessions at the top of a prescribed rep range; near-failure effort and partial sessions hold the recommendation.
- 05
Resilient by design The active workout is a durable draft. Resume or Discard makes interruption explicit while preserving sets, timer state, elapsed time, and the active exercise.
- 06
Graceful platform support Live Activity context and notifications are useful additions on supported devices, not requirements for completing a session.
Feedback worth trusting
Progress only matters when it tells the truth.
The Analysis tab turns history into a focused review across a month, three months, six months, or all time. I designed the metrics around data integrity—not around filling a dashboard with numbers.

- 01
Compare like with like Assisted and externally loaded movements are not silently merged into a single exercise trend.
- 02
Use an honest total The all-training trend shows weekly external-load work instead of implying unrelated sessions belong on one progression line.
- 03
Keep records meaningful Personal records are calculated from working sets and retain the previous best when a worthwhile comparison exists.
- 04
Respect partial work Incomplete sessions remain in a person’s history without being overstated as full completions.
Sharing
A celebration layer, not a social network.
The share composer appears only after a real milestone—completed workout, streak, personal best, or weekly progress. Someone chooses a story, can optionally add a gym photo, previews the result, and shares it.
Visuals are rendered with ImageRenderer at a final 1080 × 1920, handed to Instagram Stories when it’s installed, with the native iOS share sheet as a fallback. It is not a feed, an image editor, or another competing destination in the app.
Technical decisions
Trust is a feature, not a footnote.
I organized byOne around product domains rather than a single oversized view layer. Feature-focused SwiftUI surfaces sit on explicit training-domain models, so scheduling, logging, progression, analytics, backup, and sharing derive from the same reliable data.
- 01
Explicit domain models Plans, scheduled workouts, logged sets, completions, and metrics are distinct types—not incidental UI state—so multiple features derive from one source of truth.
- 02
Atomic, file-backed persistence Primary data is stored in Application Support as JSON. Each write is atomic and retains the previous valid version as a recovery copy before replacement.
- 03
Recoverable data handling If a saved file cannot be decoded, byOne preserves it instead of silently replacing a person’s training history with an empty state.
- 04
Versioned import and export People can export readable JSON, validate it before restore, and explicitly control whether it replaces local training data.
- 05
Permission-aware platform features ActivityKit, local notifications, and Live Activities add session context when available without becoming prerequisites for training.
Correctness
A polished screen can still produce the wrong training recommendation.
Workout data compounds over time: one logged set can influence a progression nudge, a trend, and a personal record. Swift Testing covers progression rules, scheduling behavior, calendar boundaries, and prescription parsing—not just the happy path.
- 01
Incomplete sessions remain as partial records instead of disappearing.
- 02
An interrupted session can resume without losing saved sets or the active exercise.
- 03
Automatic load increases are withheld after partial sessions or near-failure effort.
- 04
Schedule coverage extends forward without duplicating days or rewriting completed history.
- 05
Backup files are validated before any local data is replaced.
Process
From the first product decision to a shipped native app.
- 01
Defined the smallest complete loop Make a plan, know what to do today, log without friction, see evidence of progress, and return with better context.
- 02
Designed for normal interruptions Rest periods, locks, equipment changes, and schedule changes are expected gym conditions—so drafts are durable and scheduling is flexible.
- 03
Modeled the data before polishing charts Completed workouts, exercise results, working sets, units, status, and timestamps were defined so recommendations and analytics draw from the same record.
- 04
Used progressive disclosure Today before planning, one exercise before an entire form, a summary before a detailed chart.
- 05
Shipped, then extended the loop The initial release established the complete training loop. A later sharing update adds celebration without compromising the private, focused core.
