Skip to content

v0.9.2 - Equipment Rack, Health Sync, Routine Intelligence, and Stability

Choose a tag to compare

@9thLevelSoftware 9thLevelSoftware released this 07 Jun 23:54

v0.9.2 - Equipment Rack, Health Sync, Routine Intelligence, and Stability

This release collects 33 commits after v0.9.1, from the first published v0.9.1 GitHub release tag through the current main version bump to 0.9.2.

The main themes are accessory/equipment load tracking, richer Health Connect and HealthKit behavior, better PR/1RM consistency, safer routine-start modifiers, workout audio improvements, TV remote navigation, and a large stability pass across sync, history, analytics, OAuth, BLE, backups, and release builds.

Upgrade Notes

  • No manual database action should be required. The app includes the new SQLDelight migrations for this release.
  • Health integration users may need to grant or retry permissions so Phoenix can write workouts and read scale body weight.
  • Next-set weight recommendations are suggestion-only. They do not change a saved routine unless you explicitly tap Apply for the next set.
  • Active Recovery and Heavy Deload are one-shot routine launch modifiers. They do not rewrite the saved routine.
  • Equipment Rack counterweights can reduce the machine-facing load before a set. Use that behavior only for real counterweight/retractor setups; use Added resistance or Display only for most accessories.

New and Improved Features

Equipment Rack for Accessories and External Load

PRs: #502, #519

Phoenix now has a local Equipment Rack for accessories such as weighted vests, dip belts, chains, bands, assistance/counterweight devices, attachments, and other added gear.

How to use it:

  1. Open Settings.
  2. Tap Equipment Rack.
  3. Tap Add rack item.
  4. Enter the item name, weight, category, behavior, and enabled state.
  5. Start or continue a workout.
  6. On Set Ready, select enabled rack items from the Equipment rack card, or tap Manage to edit the rack.

What to expect:

  • Added resistance items add to displayed/logged effective load without increasing the machine command.
  • Counterweight items subtract from the machine load before the set, with clamping in the workout flow.
  • Display only items are shown as context without changing effective or machine load.
  • The Set Ready screen summarizes the selected items and the active workout HUD can show rack context.
  • Rack definitions are preserved through app backup/import, and routine-start paths now seed rack context correctly for the first exercise.

Health Connect and HealthKit Improvements

PRs: #516, #515

Phoenix Health integration now does more than a basic workout write.

How to use it:

  1. Open Settings.
  2. Open Integrations.
  3. In Health Apps, enable Google Health Connect on Android or Apple Health on iOS.
  4. Grant the requested permissions.
  5. Use Retry permissions if a permission is missing.
  6. Use Sync previous to backfill eligible previous Phoenix workouts.

What to expect:

  • Android exports Phoenix workouts to Health Connect as structured strength workouts with per-set exercise segments where supported.
  • iOS continues to export aggregate strength workouts to HealthKit because Apple's public write API does not provide an equivalent per-set strength segment model.
  • Exports are deduplicated with Phoenix client record IDs so repeated syncs do not intentionally duplicate the same workout.
  • Enabling Health attempts to import the latest eligible scale body-weight sample into Phoenix.
  • Imported body weight is one-way from the platform health store into Phoenix, validated to the 20-300 kg range, and displayed in Settings > Body Weight and on the Health integration card.
  • If no eligible scale body weight exists, Phoenix reports that state instead of overwriting with junk data.

Personal Records and 1RM Parity

PRs: #486, #487, #493

The app now treats mobile 1RM and PR data as the source of truth more consistently.

What changed:

  • Phoenix uses a canonical hybrid 1RM estimator: Brzycki for 10 reps or fewer, Epley for more than 10 reps.
  • CSV export, mobile calculations, and portal sync now share the same estimated 1RM logic.
  • Mobile sync sends estimated 1RM and dedicated personal record data to the portal.
  • PR sync now carries richer PR metadata, including phase/type handling.
  • Manual 1RM values entered during cycle creation are saved immediately after confirmation, so canceling later in the flow no longer loses them.
  • Percent-of-PR routines can fall back to stored exercise 1RM when no personal record exists.
  • Exercise configuration and workout setup surfaces can show PR percentage context, including phase labels where available.

How to use it:

  • Enter or confirm 1RM values during training-cycle creation when prompted.
  • Complete workouts normally; Phoenix will continue updating PRs when new performances beat existing records.
  • Use portal sync when connected to carry PR and estimated 1RM data to Phoenix Portal.
  • For percent-of-PR routines, expect weights to resolve from the best matching PR first, then stored exercise 1RM when no PR exists.

Next-Set Weight Recommendations

PR: #499

Phoenix can now suggest whether to increase, decrease, or maintain load for the next set.

How to use it:

  1. Open Settings.
  2. Enable Weight Suggestions.
  3. Complete a cable-loaded set with enough quality, biomechanics, or set data.
  4. On the next Set Ready screen, review the recommendation card.
  5. Tap Apply to update the next set weight, or Dismiss to keep the current load.

What to expect:

  • Recommendations are conservative and suggestion-only.
  • Increases require completed target reps and strong rep quality.
  • Decreases can appear when velocity loss, severe target miss, or low quality suggests the load is too high.
  • Maintain appears when the safest answer is to keep the current load.
  • Recommendations are suppressed for bodyweight exercises, missing data, invalid loads, and out-of-range changes.
  • Applying a suggestion changes the active next set, not the saved routine defaults.

Active Recovery and Heavy Deload Routine Modifiers

PR: #511

Routine cards now offer temporary deload-style starts.

How to use it:

  1. Open Routines.
  2. Find the routine you want to run.
  3. Choose Start Active Recovery or Start Heavy Deload from the routine card actions.
  4. Pick 50%, 55%, or 60%.
  5. Start the modified routine.

What to expect:

  • Active Recovery reduces working weights to the selected percentage of the best available 1RM baseline, keeps working reps, and simplifies/scales warmups.
  • Heavy Deload keeps weights but scales reps, timed durations, and warmup reps to the selected percentage.
  • Percent-of-PR weights are resolved before the modifier is applied.
  • The transformed routine is temporary for that launch. The saved routine remains unchanged.

Timed-Set Countdown Cues and Stronger Rep Sound

PRs: #505, #489

Workout audio should be easier to hear and harder to drop during fast transitions.

How to use it:

  • Keep Countdown Beeps enabled in Settings to hear countdown cues.
  • Keep Rep completion sound enabled for the stronger regular-rep cue.
  • Use timed sets as normal.

What to expect:

  • Timed sets emit audible countdown ticks during the last 10 seconds when beeps are enabled.
  • Countdown tick playback speeds up as the timer approaches zero.
  • The regular rep completion cue now uses a stronger sound on Android and iOS.
  • iOS haptic/audio collection no longer cancels in-flight sounds during rapid rep counting.
  • Final reps can play both the spoken rep number and the distinct final-rep alert when voice counting is enabled.
  • Rest-ending cues are now emitted through the same guarded audio pipeline.

Android TV and D-Pad Remote Navigation

PR: #510

Remote input is now less hostile on TV-style devices.

How to use it:

  • On Android TV or D-pad/no-touch setups, focus a slider and press Left or Right to change its value.
  • Press Up or Down to move focus instead of accidentally changing the slider.
  • Focus a text field and press OK, Enter, or the center D-pad button to enter edit mode.
  • Press Back or Escape to leave edit mode or hide the keyboard.

What to expect:

  • Phone and tablet touch behavior is unchanged.
  • TV-style slider and text-field behavior is centralized so future controls can use the same rules.

System, Light, and Dark Theme Selection

PR: #504

Theme selection now supports System, Light, and Dark explicitly.

How to use it:

  1. Open Settings.
  2. Go to Appearance.
  3. Use the Theme segmented control to choose System, Light, or Dark.

What to expect:

  • System follows the platform theme.
  • Light and Dark force the selected mode.
  • The toolbar theme toggle cycles through System, Light, and Dark.
  • iOS system theme changes no longer require destroying and recreating the Compose host, preserving app state such as navigation and active workout context.
  • New theme strings are localized in German, Spanish, French, and Dutch.

Just Lift Tagging and Better Portal Classification

PR: #483

Just Lift sessions are easier to label, and synced muscle-group data is no longer collapsed into "General" for known catalog exercises.

How to use it:

  • When finishing an untagged Just Lift set with reps, use the prompt to tag the lift before continuing.
  • In History, open an old untagged Just Lift entry and use the Tag exercise action to retroactively label it.
  • Skip is still available if you do not want to tag a set.

What to expect:

  • Untagged Just Lift sessions sync as "Just Lift" instead of a null/unknown session name.
  • Known catalog exercises resolve their real muscle group during mobile portal push.
  • Retroactive tagging refreshes history through existing SQLDelight flows and creates the completed-set/PR context needed for tracking.

Project Website and Policy Refresh

PRs: #496, #497

The static docs site was rebuilt around the actually shipped app surface instead of stale early-beta plans.

What changed:

  • The site now describes the current Phoenix app, Health integrations, Phoenix Portal sync, exercise library, routines, modes, diagnostics, voice Safe Word, and release history more accurately.
  • Privacy policy copy now discloses optional microphone/voice use for Safe Word.
  • Terms of service content was added for the previously broken terms link.
  • Existing beta-signup deep links now route to the download/get-started section.
  • Ko-fi donation links were restored prominently.

Fixes and Stability Work

Workout and Routine Fixes

  • Reset stale per-set weights when changing global exercise parameters in the exercise edit dialog (#480).
  • Fixed warm-up sets inheriting working-set per-rep progression, while preserving progression for the real working set (#482).
  • Fixed a crash when rapidly deleting all workouts/rest days from a training cycle (#501).
  • Preserved routine sync timestamps so routine metadata does not churn unnecessarily (#503).
  • Gated the Home 1RM assessment action and restored the action button enabled parameter as part of the timestamp fix (#503).

Analytics, History, and Release Build Fixes

  • Prevented Analytics > History crashes when a history row contains non-finite weight values such as NaN or infinity (#484).
  • Fixed duplicate LazyColumn keys in Analytics History by prefixing standalone session keys and grouped routine keys (#485).
  • Fixed an unresolved HistoryTab reference that broke all Android and iOS release builds after #485 (#488).

Sync and Portal Fixes

  • Added mobile duplicate push payload guards for duplicate workout session, exercise, set, rep summary, and rep telemetry IDs (#491).
  • Fixed custom exercise sync so custom catalog rows are sent before routines reference them in portal payloads (#492).
  • Hardened sync profile payloads so default-scoped personal records carry matching profile metadata even when no active profile had been loaded yet (#518).
  • Added sync invariant warning checks and broader regression coverage for malformed pull/push data (#494).

Audio, Safe Word, OAuth, and Platform Fixes

  • Added iOS microphone permission handling for Safe Word listening after the v0.9.1 release tag (1b5d1fb).
  • Improved iOS sound reliability by collecting haptic events without canceling in-flight handlers (#489).
  • Increased haptic event buffering and changed overflow behavior to avoid silently dropping workout audio events during rapid transitions (#489).
  • Routed Android OAuth callbacks back into the app after browser/custom-tab completion so successful linking does not leave users stranded outside Phoenix (#509).

BLE, Backup, Security, and Diagnostics Hardening

  • Hardened BLE lifecycle/cancellation paths and shutdown cleanup (#494).
  • Added critical BLE event drop tracking and workout command validation (#494).
  • Improved backup privacy metadata handling and clarified backup versus diagnostics copy (#494).
  • Removed obsolete tutorial video import data while preserving the non-tutorial demo/example paths used elsewhere (#494).
  • Added tracked-secret guard scripts and CI hygiene checks to prevent config/secrets regressions (#494).
  • Cleaned up iOS Supabase config handling and setup docs (#494).

Maintenance and Documentation

  • Archived obsolete planning and audit artifacts that no longer reflect the shipped app state (dee0736).
  • Added standalone implementation plans for the enhancement work included in this release (510c1a5).
  • Added a detailed Pixel 6/7 GATT_ERROR(133) fix plan based on prior diagnostic builds and official-app protocol comparison (f19f0b1).
  • Bumped Android, iOS, and shared app version metadata to 0.9.2 (3a51bb5).

Change Coverage

Included app-facing PRs and commits since the first published v0.9.1 release:

Full changelog: v0.9.1...v0.9.2