<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Robin Winters: fitness technology</title>
    <link>https://robinwinters.github.io/review/fitness-tech.html</link>
    <description>Selected self-authored writing on fitness technology, with original dates, source links and evidence scope.</description>
    <language>en-us</language>
    <lastBuildDate>Sat, 03 Oct 2026 23:23:57 GMT</lastBuildDate>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <atom:link rel="self" href="https://robinwinters.github.io/feeds/fitness-tech.xml" type="application/rss+xml" />
    <item><title>Verify a Swift package’s minimum toolchain and CLI contract</title><link>https://robinwinters.github.io/writing/swift-package-compatibility.html</link><guid isPermaLink="true">https://robinwinters.github.io/writing/swift-package-compatibility.html</guid><description>&lt;h1&gt;Verify a Swift package’s minimum toolchain and CLI contract&lt;/h1&gt;
&lt;p&gt;Robin Winters · October 3, 2026&lt;/p&gt;
&lt;p&gt;I’m an iOS / Full Stack Engineer at ShowFlex, a shipped &lt;a href="https://apps.apple.com/us/app/showflex/id6757890910"&gt;iPhone fitness product&lt;/a&gt;. This article examines a separate, public Swift teaching package prepared with coding-assistant support. Its fixtures are synthetic; the results below are not a test report for ShowFlex.&lt;/p&gt;
&lt;p&gt;A package that passes on my current Mac has established something useful. It has not established that another person can build it on the oldest supported tools, on Linux, or with an unexpected command-line input. Those are different questions, and each needs a concrete check.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline"&gt;fitness event data pipeline&lt;/a&gt; declares Swift tools version 6.0 and provides a library plus a &lt;code&gt;normalize-events&lt;/code&gt; executable. The example turns synthetic event records into normalized events and decision receipts. Release &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/releases/tag/0.1.1"&gt;0.1.1&lt;/a&gt; adds compatibility evidence without changing the library, executable source, tests or fixtures from 0.1.0.&lt;/p&gt;
&lt;h2&gt;Record what actually ran&lt;/h2&gt;
&lt;p&gt;The manifest’s &lt;a href="https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html#about-the-swift-tools-version"&gt;Swift tools version&lt;/a&gt; specifies a minimum tools requirement. It is a declaration, rather than evidence that this package was executed with those tools.&lt;/p&gt;
&lt;p&gt;The public &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/actions/runs/37172573330"&gt;workflow run&lt;/a&gt; records three successful environments:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Environment&lt;/th&gt;&lt;th&gt;Observed compiler&lt;/th&gt;&lt;th&gt;Checks&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Linux, official Swift container&lt;/td&gt;&lt;td&gt;Swift 6.0.3&lt;/td&gt;&lt;td&gt;12 unit tests and an exact fixture-output comparison&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;macOS 15 runner&lt;/td&gt;&lt;td&gt;Apple Swift 6.1.2&lt;/td&gt;&lt;td&gt;12 unit tests and four CLI contract cases&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ubuntu 24.04 runner&lt;/td&gt;&lt;td&gt;Swift 6.4&lt;/td&gt;&lt;td&gt;12 unit tests and four CLI contract cases&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;These are the same 12 unit tests executed in three environments. They are not 36 distinct tests. Swift 6.0.3 supplies evidence for a specific compiler in the declared 6.0 line; it does not prove an execution on 6.0.0. The package’s iOS deployment declaration likewise does not establish an iPhone runtime result.&lt;/p&gt;
&lt;p&gt;Each job prints &lt;code&gt;swift --version&lt;/code&gt; before building. Runner labels alone are too imprecise for the compatibility record: the compiler observed on a hosted runner can change.&lt;/p&gt;
&lt;h2&gt;Test the executable boundary separately&lt;/h2&gt;
&lt;p&gt;Library tests can pass while the executable’s exit status, output stream or input decoding is wrong. The host-runner jobs invoke &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/blob/6533f5289666f047a3684d6f352468fff8f9bc28/Scripts/check-fixture.py"&gt;Scripts/check-fixture.py&lt;/a&gt;, which checks four cases:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;The complete synthetic fixture succeeds, writes no error, and produces the expected normalized events and receipts.&lt;/li&gt;&lt;li&gt;An empty array succeeds with empty events and receipts.&lt;/li&gt;&lt;li&gt;Malformed JSON exits with status 1, emits no success report, and writes the specified input-contract error to stderr.&lt;/li&gt;&lt;li&gt;An object in place of the expected array produces the same rejection behavior.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The fixture assertion compares the complete decoded JSON document. Checking only the event count would miss changes to identities, timestamps or conflict receipts. The rejection checks inspect stdout as well as stderr: an error message is insufficient if the process also emits an apparently successful report.&lt;/p&gt;
&lt;p&gt;The Swift 6.0.3 job runs a narrower check: it executes the valid fixture and uses &lt;code&gt;diff&lt;/code&gt; against the expected output file. It does &lt;strong&gt;not&lt;/strong&gt; run the other three CLI cases. Keeping that distinction visible makes the evidence easier to trust.&lt;/p&gt;
&lt;h2&gt;Reproduce the release checks&lt;/h2&gt;
&lt;p&gt;On a machine with Git, Swift and Python 3, check out the published tag:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sh"&gt;git clone https://github.com/RobinWinters/fitness-event-data-pipeline.git
cd fitness-event-data-pipeline
git checkout 0.1.1
swift --version
swift build
swift test
python3 Scripts/check-fixture.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Python script uses the standard library. Its four-case check expects the debug executable produced by the preceding build. The versioned &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/blob/0.1.1/compatibility.json"&gt;compatibility record&lt;/a&gt; distinguishes these host checks from the container’s narrower comparison.&lt;/p&gt;
&lt;h2&gt;State the remaining gaps&lt;/h2&gt;
&lt;p&gt;The workflow uses read-only repository permissions, a pinned checkout action and a pinned minimum-toolchain container. It needs no private application credentials. Those choices make this small public example reproducible without connecting it to a production backend.&lt;/p&gt;
&lt;p&gt;The checks establish the recorded package behavior in the recorded environments. They do not establish physical-device execution, private product behavior, performance under real event feeds, or automatic compatibility with every later compiler. A useful next compatibility check should answer one of those unresolved questions, rather than add another badge for the same run.&lt;/p&gt;
&lt;p&gt;For native product work, the habit carries over: distinguish an API declaration, a successful build, a tested boundary and an observed user interaction. Each is valuable; each supports a different claim.&lt;/p&gt;
&lt;p&gt;Robin Winters works on Swift, SwiftUI, MapKit and Firebase at ShowFlex. &lt;a href="https://robinwinters.github.io/review/ios.html"&gt;Professional reference&lt;/a&gt; · &lt;a href="https://robin.ac/"&gt;robin.ac&lt;/a&gt;. This self-authored technical account was prepared with editorial and coding-assistant support.&lt;/p&gt;</description><pubDate>Sun, 04 Oct 2026 03:45:00 GMT</pubDate><dc:creator>Robin Winters</dc:creator></item><item>
      <title>ShowFlex: event discovery connects native interaction with structured data</title>
      <link>https://github.com/RobinWinters/RobinWinters/blob/Radpository/work/showflex-event-discovery.md</link>
      <guid isPermaLink="true">https://github.com/RobinWinters/RobinWinters/blob/Radpository/work/showflex-event-discovery.md</guid>
      <description>&lt;article&gt;&lt;h1&gt;ShowFlex: event discovery connects native interaction with structured data&lt;/h1&gt;&lt;p&gt;Robin Winters — iOS/Full Stack Engineer, 2024–present&lt;/p&gt;&lt;p&gt;I’m an iOS / Full Stack Engineer at ShowFlex, a shipped iPhone fitness product available on the App Store. Since 2024, my work has spanned Swift and SwiftUI engineering, mobile architecture, MapKit event discovery, Firebase-backed data, interaction quality and release execution. Here is how native interaction and structured event data meet in that work.&lt;/p&gt;&lt;h2&gt;A map is one part of a discovery flow&lt;/h2&gt;&lt;p&gt;Event discovery connects a user&amp;#x27;s query, active filters, a set of locations and the event currently being inspected. Search results and map markers should refer to the same event identities. A detail sheet should describe the selected event even when the surrounding result order changes.&lt;/p&gt;&lt;p&gt;My work includes MapKit, search and filtering, dynamic geocoding, draggable detail sheets and persistent navigation. The product problem crosses those components: the interface needs clear state transitions as data and selection change. Accessibility, motion and efficient loading are part of the approved engineering scope.&lt;/p&gt;&lt;p&gt;The companion &lt;a href="https://github.com/RobinWinters/RobinWinters/blob/Radpository/examples/event-search/README.md"&gt;Swift search example&lt;/a&gt; demonstrates one general state-management problem: rejecting asynchronous results that belong to an older query. It is a separate educational package, not extracted ShowFlex code and not evidence of the exact implementation shipped in the app.&lt;/p&gt;&lt;h2&gt;Event information needs a usable structure&lt;/h2&gt;&lt;p&gt;The approved data work includes ingestion pipelines that normalize global event calendars, athlete metadata, registration information and media into structured JSON and Firebase-backed product data. Source information and native presentation meet at that boundary.&lt;/p&gt;&lt;p&gt;A calendar entry, location and registration link are useful only when they can be connected to the event a person is viewing. This explains why the work spans both data handling and the consumer interface. No throughput, latency, accuracy or adoption figures are claimed here.&lt;/p&gt;&lt;h2&gt;Public release evidence&lt;/h2&gt;&lt;p&gt;The &lt;a href="https://apps.apple.com/us/app/showflex/id6757890910"&gt;ShowFlex iPhone App Store listing&lt;/a&gt;, checked October 2, 2026, identifies ShowFlex Inc. as developer and seller. Version 17.0 describes an interactive IFBB events map and calendar import tools for IFBB Pro and NPC events. That is public evidence for an iPhone product and the listed map/calendar release.&lt;/p&gt;&lt;p&gt;It does not establish an Android release, individual authorship of every feature, a measured business outcome or release of the AI prototypes below. Store metadata can change; the check date matters.&lt;/p&gt;&lt;h2&gt;Applied AI remains a distinct work stream&lt;/h2&gt;&lt;p&gt;My approved scope also includes prototypes for AI-assisted physique and posing feedback and predictive competition features. These are experimental workflows. They are not described as released product capabilities or validated fitness assessments.&lt;/p&gt;&lt;p&gt;The distinction matters when assessing the portfolio: released iPhone event discovery has public product evidence; AI prototype work has a narrower professional claim and needs additional releasable demonstrations before it can become a detailed implementation case study.&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/RobinWinters/RobinWinters/blob/Radpository/work/showflex.md"&gt;Existing work account&lt;/a&gt; · &lt;a href="https://showflex.pro/"&gt;ShowFlex&lt;/a&gt; · &lt;a href="https://robin.ac/"&gt;Portfolio&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/robinwinters-sf/"&gt;Professional profile&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Updated October 2, 2026. Self-authored professional account prepared with editorial assistance.&lt;/p&gt;&lt;/article&gt;</description>
      <dc:creator>Robin Winters</dc:creator>
      <atom:link rel="related" href="https://dev.to/robinwinters/shipping-showflex-native-ios-event-discovery-with-swiftui-mapkit-and-firebase-336l" type="text/html" title="DEV edition" />
      <atom:link rel="related" href="https://medium.com/@robin_61077/showflex-event-discovery-connects-native-interaction-with-structured-data-462c47c716ca" type="text/html" title="Medium edition" />
      <atom:link rel="related" href="https://robinwinters.hashnode.dev/shipping-showflex-native-ios-event-discovery-with-swiftui-mapkit-and-firebase" type="text/html" title="Hashnode edition" />
    </item>
    <item>
      <title>Distributed Kinematic Sensing and Exercise Intelligence Across Apple Fitness+, GymKit and HealthKit</title>
      <link>https://robinwinters.github.io/writing/distributed-kinematic-sensing.html</link>
      <guid isPermaLink="false">https://www.linkedin.com/pulse/distributed-kinematic-sensing-exercise-intelligence-across-winters-ek3ec/</guid>
      <description>&lt;article class="prose republished"&gt;&lt;h1&gt;Distributed Kinematic Sensing and Exercise Intelligence Across Apple Fitness+, GymKit and HealthKit&lt;/h1&gt;&lt;p&gt;By &lt;a href="https://robin.ac/"&gt;Robin Winters&lt;/a&gt;&lt;/p&gt;&lt;p class="note"&gt;First published July 18, 2026 on &lt;a href="https://www.linkedin.com/pulse/distributed-kinematic-sensing-exercise-intelligence-across-winters-ek3ec/"&gt;LinkedIn&lt;/a&gt;. Republished October 2, 2026 with original wording, images and captions. Technical observations and opinions retain their original context.&lt;/p&gt;
&lt;img alt="Cover illustration of a dumbbell lateral raise and overlaid movement phases beside the title Distributed Kinematic Sensing and Exercise Intelligence Across Apple Fitness+, GymKit and HealthKit." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/distributed-kinematic-sensing-5.png"&gt;
&lt;figcaption&gt;
            Really need to work on the title.
          &lt;/figcaption&gt;
&lt;div class="article-body"&gt;

&lt;p&gt;
&lt;em&gt;By combining motion data from Apple Watch, AirPods, iPhone and connected gym equipment, Apple devs could make strength training as measurable as running or cycling.&lt;/em&gt;
 &lt;/p&gt;






&lt;p&gt;
I've been a professional/competitive Bodybuilder for well over a decade now, and I'm constantly amazed at how difficult it is to find a more modern way of tracking my workouts. The vast majority of the fitness tracking ecosystem is primarily geared towards activities that involve some variation of a pedometer and a heart rate monitor. This works great for running or cycling, especially when you throw in a GPS tracker. However, the "Traditional Strength Training" side of fitness tracking is still primarily done manually in some form of zhuzhed up spreadsheet.
 &lt;/p&gt;






&lt;p&gt;
Don't get me wrong, I'm a big fan of spreadsheets. The internet itself is nothing more than an array of spreadsheets connected by a series of tubes, but I think we can do better than Lotus 1-2-3 in 2026.
 &lt;/p&gt;






&lt;p&gt;
What I'm proposing is basically a form of motion sensor triangulation across AirPods, Apple Watch, and iPhone, tied into GymKit, Fitness+, and HealthKit, sprinkled with Apple Intelligence framework to track and log movements commonly associated with "traditional strength training" aka Bodybuilding, so I don't have to log sets and reps simultaneously during my already demanding workouts.
 &lt;/p&gt;






&lt;p&gt;
By coordinating Apple Watch, motion capable AirPods and iPhone, supplementing them with workout programming and connected equipment, we can construct a body area sensing system capable of recognizing exercises, detecting sets, counting repetitions and relating mechanical work to physiological response.
 &lt;/p&gt;









&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Illustration of a dumbbell squat, with earbuds, a wristwatch and a phone in a shorts pocket. Colored arcs and joint markers depict distributed motion sensing." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/distributed-kinematic-sensing-1.png"&gt;
&lt;figcaption&gt;
Dumbbell Front Squat, for the curious.
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;h2&gt;
Distributed Sensing
 &lt;/h2&gt;






&lt;p&gt;
The concept can be described as distributed kinematic sensing; several devices observe different portions of the body and contribute those observations to a shared movement model.
 &lt;/p&gt;






&lt;p&gt;
Apple Watch provides the clearest view of the hand and arm. Its accelerometer and gyroscope can measure wrist acceleration, rotation, orientation and repetition cadence. For curls, lateral raises, rows and presses, the wrist trajectory frequently contains enough information to identify repetition phases and estimate tempo.
 &lt;/p&gt;






&lt;p&gt;
The Watch also supplies physiological measurements such as heart rate and heart-rate recovery. It can therefore connect a movement with the body’s response to it.
 &lt;/p&gt;






&lt;p&gt;
AirPods provide a second anatomical reference point. Their motion sensors observe head orientation and movement, helping establish whether the user is standing, seated, hinged forward or lying down. This may help distinguish a standing shoulder press from a bench press, a seated curl from a standing curl or deliberate exercise from unrelated wrist movement.
 &lt;/p&gt;






&lt;p&gt;
AirPods Pro 3 make this role more interesting. Apple now sends AirPods heartrate and motion data to the iPhone during workouts. When AirPods Pro 3 and Apple Watch are worn together, Apple uses multiple heartrate streams and automatically selects the source with the highest confidence at that moment. &lt;a href="https://support.apple.com/en-gb/123184"&gt;Apple’s AirPods workout documentation&lt;/a&gt;
 &lt;/p&gt;






&lt;blockquote&gt;
Collect overlapping measurements, estimate confidence and use the most reliable source for the current moment.
 &lt;/blockquote&gt;






&lt;p&gt;
The iPhone could contribute in two distinct modes. When carried securely in a pocket, it becomes a sensor near the pelvis, making it useful for squats, lunges, deadlifts and step-ups. When positioned to observe the user, its camera could provide whole-body pose estimation, range-of-motion analysis and basic symmetry feedback.
 &lt;/p&gt;






&lt;p&gt;
An iPhone resting in a gym bag would contribute nothing. The system would need to determine whether the phone was operating in pocket mode, camera coach mode or not participating.
 &lt;/p&gt;






&lt;p&gt;
Apple already exposes much of the necessary plumbing through &lt;a href="https://developer.apple.com/documentation/coremotion/"&gt;Core Motion&lt;/a&gt;, &lt;a href="https://developer.apple.com/documentation/coremotion/cmheadphonemotionmanager"&gt;AirPods motion APIs&lt;/a&gt; and &lt;a href="https://developer.apple.com/documentation/HealthKit/building-a-multidevice-workout-app"&gt;mirrored Watch–iPhone workout sessions&lt;/a&gt;.
 &lt;/p&gt;









&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Collage of two people performing dumbbell lateral raises, with earbuds, a wristwatch, joint markers and colored movement traces." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/distributed-kinematic-sensing-2.png"&gt;
&lt;figcaption&gt;
When I move you move, just like that?
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;h2&gt;
Fitness+ has an enormous advantage
 &lt;/h2&gt;






&lt;p&gt;
Automatic exercise recognition in an open gym is difficult because many movements look similar when observed from one point on the body. Reaching for a water bottle can resemble part of a curl. A front raise can resemble a shoulder press. A barbell squat may produce very little wrist movement.
 &lt;/p&gt;






&lt;p&gt;
Fitness+ changes the problem because the workout already has a script. During a Fitness+ session, Apple knows which exercise the trainer is demonstrating, when the interval begins, how long it should last and approximately how many repetitions are expected. It also knows whether the user should be standing, seated, supine or hinged.
 &lt;/p&gt;






&lt;p&gt;
The system no longer needs to ask, “Which of hundreds of exercises is this?” It can ask, “Is the user currently performing the expected squat, and where are the repetition boundaries?”
 &lt;/p&gt;






&lt;p&gt;
This prior knowledge should make recognition substantially more reliable. It could support live observations such as:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;“Rep 8 of 12”&lt;/li&gt;&lt;li&gt;“Two repetitions behind the trainer”&lt;/li&gt;&lt;li&gt;“Your range of motion shortened during the last three reps”&lt;/li&gt;&lt;li&gt;“Your eccentric phase is faster than the previous set”&lt;/li&gt;&lt;li&gt;“Your heart rate recovered 18 beats during this rest period”&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
The experience should remain confidence aware. A low confidence estimate should not be presented as indisputable fact. Fitness+ could display a tentative count or defer confirmation until the rest period.
 &lt;/p&gt;






&lt;h3&gt;
The Open Gym version
 &lt;/h3&gt;






&lt;p&gt;
Outside Fitness+, the system could use a progressively assisted workflow.
 &lt;/p&gt;






&lt;p&gt;
A user might begin by selecting a saved routine or naming an exercise with Siri. Once the exercise is known, Apple Watch could detect the beginning and end of each set, count repetitions and measure tempo automatically.
 &lt;/p&gt;






&lt;p&gt;
If no exercise was selected, the system could propose one after observing the movement:
 &lt;/p&gt;






&lt;blockquote&gt;
“Looks like 10 incline dumbbell curls. Correct?”
 &lt;/blockquote&gt;






&lt;p&gt;
High confidence sets could be committed automatically. Low confidence detections could remain suggestions. Correcting an exercise would provide an individualized calibration signal, allowing the system to learn the user’s preferred movements, wrist placement and equipment.
 &lt;/p&gt;






&lt;p&gt;
A practical processing pipeline would contain several stages:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Activity segmentation:&lt;/strong&gt; Separate exercise from walking, equipment setup and rest.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Posture inference:&lt;/strong&gt; Use head, wrist and pelvis orientation to estimate body position.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Exercise classification:&lt;/strong&gt; Compare the observed movement with the routine, Fitness+ timeline and trained exercise library.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rep phase detection:&lt;/strong&gt; Identify concentric, transition and eccentric phases.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Confidence estimation:&lt;/strong&gt; Decide whether to save, suggest or request confirmation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Physiological association:&lt;/strong&gt; Relate each set to heart rate, recovery and perceived effort.&lt;/li&gt;&lt;/ol&gt;







&lt;p&gt;
On device processing would allow raw motion and camera data to remain local. Only the derived workout record would need to enter HealthKit.
 &lt;/p&gt;






&lt;h3&gt;
This is already an active product category
 &lt;/h3&gt;






&lt;p&gt;
Automatic strength tracking is not an untouched field. Several companies already offer parts of the proposed experience.
 &lt;/p&gt;






&lt;p&gt;
&lt;a href="https://apps.apple.com/us/app/sonar-fit/id6740939129"&gt;Sonar Fit&lt;/a&gt; uses Apple Watch or AirPods Pro motion sensors to count repetitions, detect sets and begin rest timers. It specifically describes using AirPods for head motion tracking and permits users to train with the Watch, AirPods or both.
 &lt;/p&gt;






&lt;p&gt;
&lt;a href="https://gethealthbuddy.com/"&gt;HealthBuddy&lt;/a&gt; also uses an on device movement model that reads accelerometer and gyroscope data from AirPods and Apple Watch. It performs live rep counting and connects with Apple Health.
 &lt;/p&gt;






&lt;p&gt;
Neither product publicly explains whether Watch and AirPods data are combined into one confidence weighted movement model or primarily operate as alternative input sources. Neither presents the wider Fitness+, GymKit, standardized strength data and Vitals architecture proposed here.
 &lt;/p&gt;






&lt;p&gt;
&lt;a href="https://www.trainfitness.ai/"&gt;Train Fitness&lt;/a&gt; demonstrates how far wrist only recognition has progressed. The company claims automatic detection of more than 470 exercises, along with rep, acceleration, velocity and tempo tracking using smartwatch movement.
 &lt;/p&gt;






&lt;p&gt;
Garmin has offered automatic rep counting, set detection and exercise identification in its Strength profile for years. Its own documentation acknowledges the need for users to correct counts when necessary. &lt;a href="https://support.garmin.com/en-SG/?faq=xEPSpxE3j27gpEsiq8K9o8"&gt;Garmin’s rep-counting documentation&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
WHOOP has approached the problem from another direction. Its Strength Trainer uses inertial motion, biomechanics and cardiovascular data to estimate muscular load and incorporate it into Strain and Recovery. For the most precise calculation, users enter exercises, sets, repetitions and weight; its hands-off mode estimates muscular demand from movement profiles and heart rate. &lt;a href="https://www.whoop.com/us/en/thelocker/the-research-and-development-behind-strength-trainer/"&gt;WHOOP’s Strength Trainer research&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
Connected gyms such as Tonal and Tempo solve the sensing problem by controlling the environment. Tonal measures cable displacement and resistance while tracking pace, range, symmetry and repetitions; Tonal 2 adds camera-based analysis. Tempo uses iPhone based computer vision and recognizable weights to provide rep counting and guidance. These systems can produce richer measurements, but only within their respective equipment ecosystems. &lt;a href="https://knowledge.tonal.com/kb/guide/en/coaching-cues-9XTywueFNJ/Steps/3954702"&gt;Tonal’s coaching system&lt;/a&gt;, &lt;a href="https://tempo.fit/blog/introducing-the-tempo-move"&gt;Tempo’s iPhone-based system&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
The market has therefore produced many of the pieces. What it has not produced is a shared platform that makes those pieces interoperable.
 &lt;/p&gt;






&lt;h3&gt;
Google has patented the earbud-plus-watch concept
 &lt;/h3&gt;






&lt;p&gt;
Google’s patent portfolio contains a particularly relevant example.
 &lt;/p&gt;






&lt;p&gt;
Its system receives motion data from two wearable devices, explicitly suggesting that the first may be an earbud and the second a smartwatch. Multiple inertial streams are processed to determine exercise types and repetitions. The European patent was granted in March 2025 and is currently listed as active. &lt;a href="https://patents.google.com/patent/EP3973448A1/en"&gt;Google’s exercise-recognition patent&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
This is strong evidence that distributed ear/wrist exercise recognition has been considered at a serious engineering level.
 &lt;/p&gt;






&lt;p&gt;
It also means that combining earbud and smartwatch IMUs should not be characterized as an entirely new invention. The more differentiated question is how Apple could turn distributed sensing into a coherent platform experience.
 &lt;/p&gt;






&lt;h3&gt;
Apple has contemplated much of the larger system
 &lt;/h3&gt;






&lt;p&gt;
Apple’s own pending patent application, &lt;strong&gt;“Detecting and Tracking a Workout Using Sensors,”&lt;/strong&gt; was published in March 2025.
 &lt;/p&gt;






&lt;p&gt;
It describes a system capable of:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Identifying specific strength exercises&lt;/li&gt;&lt;li&gt;Counting repetitions and sets&lt;/li&gt;&lt;li&gt;Detecting incomplete repetitions&lt;/li&gt;&lt;li&gt;Combining computer vision with smartwatch IMU data&lt;/li&gt;&lt;li&gt;Receiving data from smartphones, heart-rate monitors and external sensors&lt;/li&gt;&lt;li&gt;Detecting work and rest periods&lt;/li&gt;&lt;li&gt;Adjusting rest guidance using heart rate or respiration&lt;/li&gt;&lt;li&gt;Identifying weights through computer vision and OCR&lt;/li&gt;&lt;li&gt;Receiving equipment data through RFID, NFC, Bluetooth or Wi-Fi&lt;/li&gt;&lt;li&gt;Detecting selector-pin positions and calculating barbell plate loads&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
The application is heavily oriented toward a head mounted spatial computing device (can't image what that might be /s) but its supporting sensor network closely resembles the broader architecture considered here. &lt;a href="https://patents.google.com/patent/US20250099814A1/en"&gt;Apple’s workout-tracking patent&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
A patent does not guarantee that a product will ship. It does, however, demonstrate that Apple has considered automatic strength recognition, rep counting, weight identification and cross-device sensing in a unified system.
 &lt;/p&gt;









&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Illustration of a person curling a dumbbell while wearing earbuds, a wristwatch and a phone at the hip, alongside signal traces, an anatomical sketch and a sequence of squat positions." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/distributed-kinematic-sensing-3.png"&gt;
&lt;figcaption&gt;
How is the phone staying connected to her hip?
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;h2&gt;
What the research says
 &lt;/h2&gt;






&lt;p&gt;
Researchers have studied exercise recognition and repetition counting from wearable inertial sensors for more than a decade. Results can be impressive for movements that produce distinct trajectories, but accuracy varies significantly by exercise and sensor location.
 &lt;/p&gt;






&lt;p&gt;
One study evaluated sensors worn at the chest, upper arm, wrist and ear. The chest-mounted sensor performed best, while the ear-mounted sensor performed worst by itself. &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7795271/"&gt;ExerSense study&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
That supports a "Division of responsibility". AirPods should normally serve as contextual evidence rather than the universal primary rep counter. Their value lies in helping the system understand posture and body motion when Apple Watch sees only the wrist.
 &lt;/p&gt;






&lt;p&gt;
Other Apple Watch research has achieved promising exercise recognition and repetition counting results, although bench press has proven more difficult than squats or deadlifts in some evaluations. &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8471343/"&gt;Smartwatch strength-training validation study&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
No individual sensor should be expected to understand every exercise. The benefit of distributed sensing is that the system can degrade gracefully:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A curl may be counted primarily by the Watch.&lt;/li&gt;&lt;li&gt;A squat may rely more heavily on the pocketed iPhone.&lt;/li&gt;&lt;li&gt;A bench press may combine Watch motion with AirPods posture.&lt;/li&gt;&lt;li&gt;A camera-enabled session may override uncertain inertial estimates with pose information.&lt;/li&gt;&lt;li&gt;A connected machine may directly report movement and resistance.&lt;/li&gt;&lt;/ul&gt;







&lt;h3&gt;
The resistance problem
 &lt;/h3&gt;






&lt;p&gt;
One measurement remains difficult to infer from body motion alone: the actual weight being lifted.
 &lt;/p&gt;






&lt;p&gt;
A slow repetition could indicate a heavy load, intentional tempo, accumulated fatigue or an inexperienced lifter. None of those possibilities can be distinguished reliably from rep velocity alone.
 &lt;/p&gt;






&lt;p&gt;
Resistance must therefore come from another source:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;User input&lt;/li&gt;&lt;li&gt;A remembered previous load with quick confirmation&lt;/li&gt;&lt;li&gt;Computer vision reading a dumbbell, plate or selector stack&lt;/li&gt;&lt;li&gt;NFC or QR identification&lt;/li&gt;&lt;li&gt;A connected cable machine, rack or smart weight&lt;/li&gt;&lt;li&gt;A strength-oriented extension of GymKit&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
Apple’s patent explicitly discusses visual weight recognition, selector pins, RFID, NFC and wireless equipment communication. That validates the importance of the equipment layer. I personally think that NFC and QR/RFID weights would be a huge step in the right direction, and would be fairly trivial to implement; NFC stickers applied to free weights or plate loaded machines, etc etc.
 &lt;/p&gt;






&lt;p&gt;
A future GymKit for strength equipment could communicate:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Equipment and exercise identity&lt;/li&gt;&lt;li&gt;Selected resistance&lt;/li&gt;&lt;li&gt;Cable or lever displacement&lt;/li&gt;&lt;li&gt;Rep velocity&lt;/li&gt;&lt;li&gt;Range of motion&lt;/li&gt;&lt;li&gt;Left/right force or displacement&lt;/li&gt;&lt;li&gt;Seat and handle configuration&lt;/li&gt;&lt;li&gt;Weight changes during drop sets&lt;/li&gt;&lt;/ul&gt;







&lt;h3&gt;
HealthKit needs a strength training data model
 &lt;/h3&gt;






&lt;p&gt;
HealthKit recognizes traditionalStrengthTraining as an activity type for machine and free-weight exercise. It also permits custom metadata to be associated with workouts. But it does not currently offer a standardized, interoperable schema for strength training structure.
 &lt;/p&gt;






&lt;p&gt;
An application can record sets and reps through custom metadata, but another application may not understand what those fields mean. &lt;a href="https://developer.apple.com/documentation/healthkit/workout-metadata-keys"&gt;HealthKit workout metadata&lt;/a&gt; demonstrates both the available foundation and the limitation.
 &lt;/p&gt;






&lt;p&gt;
A native strength representation should be hierarchical:
 &lt;/p&gt;






&lt;blockquote&gt;
Workout → Exercise → Set → Repetition
 &lt;/blockquote&gt;






&lt;p&gt;
An exercise record could contain:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Exercise identity and variation&lt;/li&gt;&lt;li&gt;Equipment&lt;/li&gt;&lt;li&gt;Primary movement pattern&lt;/li&gt;&lt;li&gt;Targeted muscle groups&lt;/li&gt;&lt;li&gt;Confidence and provenance&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
A set could contain:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Resistance&lt;/li&gt;&lt;li&gt;Repetitions&lt;/li&gt;&lt;li&gt;Set type&lt;/li&gt;&lt;li&gt;Duration&lt;/li&gt;&lt;li&gt;Rest interval&lt;/li&gt;&lt;li&gt;Perceived effort&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
Individual repetitions could optionally include:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Concentric and eccentric duration&lt;/li&gt;&lt;li&gt;Range of motion&lt;/li&gt;&lt;li&gt;Velocity&lt;/li&gt;&lt;li&gt;Completion quality&lt;/li&gt;&lt;li&gt;Sensor confidence&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
This would allow Fitness+, third party workout apps, connected gym equipment and coaching platforms to exchange strength data rather than reducing an entire session to duration and calories.
 &lt;/p&gt;






&lt;h3&gt;
Connecting mechanical work to Vitals
 &lt;/h3&gt;






&lt;p&gt;
The Vitals app is primarily based on overnight measurements such as heart rate, respiratory rate, wrist temperature and sleep duration. Those signals should not be used to detect repetitions. Their value is as recovery context. &lt;a href="https://support.apple.com/en-in/guide/watch/apd15aa7ed96/watchos"&gt;Apple’s Vitals documentation&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
The more useful relationship is:
 &lt;/p&gt;






&lt;blockquote&gt;
Overnight baseline → planned workout → measured sets and resistance → effort score → recovery trend
 &lt;/blockquote&gt;






&lt;p&gt;
HealthKit already supports perceived and estimated workout effort, while Apple’s training-load system compares recent workout intensity and duration with longer term activity. &lt;a href="https://developer.apple.com/documentation/Updates/HealthKit"&gt;HealthKit effort support&lt;/a&gt;
 &lt;/p&gt;






&lt;p&gt;
Duration alone is an incomplete description of strength training. Fortyfive minutes might contain a light circuit, a heavy squat session or more conversation than lifting.
 &lt;/p&gt;






&lt;p&gt;
A record of 14 working sets, 8,200 pounds of total volume and declining concentric velocity provides much richer context. It would help training load reflect the work performed rather than merely how long the workout app remained active.
 &lt;/p&gt;






&lt;p&gt;
WHOOP’s muscular load model demonstrates demand for precisely this connection. Apple could go further by combining mechanical records, workout effort and overnight trends within HealthKit.
 &lt;/p&gt;






&lt;h3&gt;
A realistic product roadmap
 &lt;/h3&gt;






&lt;p&gt;
The strongest first gen product would begin with Apple Watch and a known workout plan. Fitness+ sessions, saved routines and user-selected exercises would provide the expected movement. The Watch would detect repetition timing. AirPods would help establish posture. The iPhone could optionally contribute pelvis motion or camera pose.
 &lt;/p&gt;






&lt;p&gt;
The progression might look like this:
 &lt;/p&gt;






&lt;h3&gt;
Phase one: Fitness+ intelligence
 &lt;/h3&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Known exercise and interval&lt;/li&gt;&lt;li&gt;Watch based rep counting&lt;/li&gt;&lt;li&gt;Automatic set timing&lt;/li&gt;&lt;li&gt;AirPods posture confirmation&lt;/li&gt;&lt;li&gt;Live tempo and range consistency&lt;/li&gt;&lt;/ul&gt;







&lt;h3&gt;
Phase two: Structured open gym workouts
 &lt;/h3&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;User selected routines&lt;/li&gt;&lt;li&gt;Automatic set detection&lt;/li&gt;&lt;li&gt;Suggested exercise corrections&lt;/li&gt;&lt;li&gt;Remembered resistance&lt;/li&gt;&lt;li&gt;Training volume and effort summaries&lt;/li&gt;&lt;/ul&gt;







&lt;h3&gt;
Phase three: Freeform recognition
 &lt;/h3&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Automatic exercise classification&lt;/li&gt;&lt;li&gt;Personalized movement calibration&lt;/li&gt;&lt;li&gt;Confidence aware confirmations&lt;/li&gt;&lt;li&gt;Pocket and camera modes for iPhone&lt;/li&gt;&lt;/ul&gt;







&lt;h3&gt;
Phase four: Connected strength equipment
 &lt;/h3&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;GymKit resistance and equipment identity&lt;/li&gt;&lt;li&gt;Machine configuration&lt;/li&gt;&lt;li&gt;Cable or bar velocity&lt;/li&gt;&lt;li&gt;Standardized HealthKit set and rep record&lt;/li&gt;&lt;/ul&gt;










&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Collage of a barbell deadlift, a wristwatch, earbuds and a phone, connected by colored joint markers to gym equipment, signal traces and an anatomical sketch." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/distributed-kinematic-sensing-4.png"&gt;
&lt;figcaption&gt;
Straight Leg Deadlifts with about a buck'80 in plates is no joke
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;p&gt;
Smartwatches already count repetitions. AirPods based apps already estimate strength movement. WHOOP models muscular load. Tonal measures resistance and cable displacement. Tempo uses iPhone computer vision. Google has patented earbud + watch exercise recognition. Apple has patented a wider system involving computer vision, smartwatch motion, automatic rep counting and equipment identification.
 &lt;/p&gt;






&lt;p&gt;
Apple owns the Watch, AirPods, iPhone, Fitness+, Workout, HealthKit and GymKit. It also controls the privacy, synchronization and on device processing layers required to unify exercise recognition, distributed sensing, equipment telemetry and physiological recovery into a single first party platform.
 &lt;/p&gt;






&lt;p&gt;
This could transform Traditional Strength Training from a timer with a heartrate graph into a computational record of what the athlete actually did and give strength training the same depth of measurement Apple already brings to running and cycling.
 &lt;/p&gt;






&lt;p&gt;
🤘Robin
 &lt;/p&gt;







&lt;/div&gt;&lt;p&gt;&lt;a href="https://robinwinters.github.io/writing/"&gt;All writing&lt;/a&gt; · &lt;a href="https://www.linkedin.com/pulse/distributed-kinematic-sensing-exercise-intelligence-across-winters-ek3ec/"&gt;Original LinkedIn edition&lt;/a&gt;&lt;/p&gt;&lt;/article&gt;</description>
      <dc:creator>Robin Winters</dc:creator>
      <dc:date>2026-07-18</dc:date>
      <atom:link rel="related" href="https://dev.to/robinwinters/distributed-kinematic-sensing-and-exercise-intelligence-across-apple-fitness-gymkit-and-healthkit-1bl" type="text/html" title="DEV edition" />
      <atom:link rel="related" href="https://medium.com/@robin_61077/distributed-kinematic-sensing-and-exercise-intelligence-across-apple-fitness-gymkit-and-healthkit-f3f12c59497b" type="text/html" title="Medium edition" />
      <atom:link rel="related" href="https://robinwinters.hashnode.dev/distributed-kinematic-sensing-and-exercise-intelligence-across-apple-fitness-gymkit-and-healthkit" type="text/html" title="Hashnode edition" />
    </item>
    <item>
      <title>Kinematics Lab Part II: You Don't Need Another...</title>
      <link>https://robinwinters.github.io/writing/kinematics-lab-part-ii.html</link>
      <guid isPermaLink="false">https://www.linkedin.com/pulse/kinematics-lab-part-ii-you-dont-need-another-robin-winters-lrybc/</guid>
      <description>&lt;article class="prose republished"&gt;&lt;h1&gt;Kinematics Lab Part II: You Don't Need Another...&lt;/h1&gt;&lt;p&gt;By &lt;a href="https://robin.ac/"&gt;Robin Winters&lt;/a&gt;&lt;/p&gt;&lt;p class="note"&gt;First published July 30, 2026 on &lt;a href="https://www.linkedin.com/pulse/kinematics-lab-part-ii-you-dont-need-another-robin-winters-lrybc/"&gt;LinkedIn&lt;/a&gt;. Republished October 2, 2026 with original wording, images and captions. Technical observations and opinions retain their original context.&lt;/p&gt;
&lt;img alt="Pink cover collage with the words You Don't Need Another, a watch, wireless earbuds and a phone displaying activity graphics, surrounded by fitness symbols and crossed-out accessories." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/kinematics-lab-part-ii-3.png"&gt;
&lt;figcaption&gt;
            FitTech Has a Junk Drawer Problem
          &lt;/figcaption&gt;
&lt;div class="article-body"&gt;

&lt;p&gt;
As stated in the previous article, the premise behind my Kinematics project is proving that Apple may already have enough sensors in the right places to make strength training more legible.
 &lt;/p&gt;






&lt;p&gt;
In most cases the answer to the question of how best to automagically capture and log Traditional Strength Training data is not another device, but rather better coordination between the devices already in the room. For millions of people that means Apple Watch, AirPods, and iPhone.
 &lt;/p&gt;






&lt;p&gt;
Treadmills and ellipticals, like most cardio training, generate machine readable workouts because the movement is repetitive and/or already instrumented. Strength Training is...messier. A set of alternating dumbbell curls may contain 16 separate arm events, only half of which happen on the arm/wrist wearing a device capable of capturing fitness data. A squat may be dominated by hips, knees, glute position, and load, while the wrist contributes stability but are otherwise static and nearly invisible to a fitness app. In Apple Fitness+ most of this mechanical work collapses into Traditional Strength Training, but users/athletes still have to manually log sets, reps and gauge difficulty based on how sweaty they are at the end of a workout.
 &lt;/p&gt;






&lt;p&gt;
I think I can build something better that doesn't require buying any new equipment or FitTech gadgetry.
 &lt;/p&gt;









&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Chart labeled 3 devices, 3,737 samples and approximately 50 Hz compares watch, earbuds and phone traces with six marked lateral raises. Highlighted windows show shared movement; the graphic labels watch-to-AirPods alignment and corroboration results." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/kinematics-lab-part-ii-1.jpg"&gt;
&lt;figcaption&gt;
Waves, y'all. Waves.
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;h3&gt;
The Useful Sets &amp;amp; The Not So Useful Sets
 &lt;/h3&gt;






&lt;p&gt;
My first useful physical capture was a normal set of dumbbell lateral raises where the exported session contained 3,737 sensor samples from the cross device application I've built for utilizing the metrics captured from primarily the gyroscopes/motion sensing on Apple Watch, iPhone, and AirPods.
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Apple Watch: 916 samples&lt;/li&gt;&lt;li&gt;AirPods: 1,406 samples&lt;/li&gt;&lt;li&gt;iPhone: 1,415 samples&lt;/li&gt;&lt;/ul&gt;







&lt;p&gt;
The Watch stream was complete and close to the requested 50 Hz capture rate. A deterministic Apple Watch first detector found reps from the dominant wrist rotation signal pretty easily. The interesting bit was that the AirPods trace overlapped with the Watch trace, which is what I was aiming for. The zero lag correlation was roughly 0.58, and the best alignment improved slightly when AirPods lagged by about 80 milliseconds.
 &lt;/p&gt;






&lt;p&gt;
The next set of tests were alternating dumbbell curls that broke the demo. It &lt;em&gt;should&lt;/em&gt; have been the better demo, however the alternating curls expose the weakness of a single wrist sensor. If the watch is on the left wrist it obviously observes the left arm better than the right. The other arm has to be inferred through rhythm, torso response, AirPods motion, timing, or user correction, which is what I'm trying to avoid. The exported file contained 4,752 samples overall, but only 239 Watch samples. The sequence range suggested thousands of missing positions. In practical terms, Watch capture was around 8% complete. Before the prototype could become smarter it had to become better about capture quality.
 &lt;/p&gt;






&lt;p&gt;
So the Apple Watch capture path was rebuilt around batch acknowledgement. Watch motion samples are buffered into batches. Each batch receives a stable ID, the iPhone acknowledges receipt and the Apple Watch keeps pending batches until they are acknowledged. If live delivery fails, the Watch queues a recovery transfer. If the same batch arrives twice, the iPhone deduplicates it. The CSV export, that I'm pulling off the iPhone app after each set to avoid cross exercise data contamination, now includes integrity rows for each sensor source:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;quality&lt;/li&gt;&lt;li&gt;coverage&lt;/li&gt;&lt;li&gt;expected sample count&lt;/li&gt;&lt;li&gt;received sample count&lt;/li&gt;&lt;li&gt;missing sample count&lt;/li&gt;&lt;li&gt;duplicate or disordered sample count&lt;/li&gt;&lt;li&gt;maximum device time gap&lt;/li&gt;&lt;/ul&gt;










&lt;hr&gt;


&lt;figure&gt;


 &lt;img alt="Illustrated drawer filled with wearable sensors, rings, watches and cables. Pink crosses mark several devices, surrounding an empty outlined space in the center." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/kinematics-lab-part-ii-2.png"&gt;
&lt;figcaption&gt;
The Kitchen Junk Drawer. Everyone has one.
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;p&gt;
The Market &amp;amp; AI
 &lt;/p&gt;






&lt;p&gt;
There are already quite a number of rep counters out there. Add to that connected strength machines, camera based systems, and Apple Watch apps that attempt automatic exercise recognition. Garmin is also in on it and has offered watch strength rep counting for years, with the predictable limitations of a single wrist worn sensor. Similar products attack the problem through proprietary hardware that ultimately end up adding to the mountain of e-waste from FitTech trying to reinvent the wheel every fiscal quarter. My version is anti-gadget and built around the premise that Fitness+ has an orchestration advantage. The workout UI and health database plus developer frameworks, now including Apple Intelligence on capable devices, can turn raw workout data into useful summaries that can aggregate even imperfect readings and present the result in the same visual language users already understand.
 &lt;/p&gt;






&lt;p&gt;
The biggest product issue, imo, is adoption. Users and consumers loathe shoehorning hardware and software alike into their already functioning systems. To make a product that easily integrates into preexisting structures is the most difficult part of the development process, and adding features also adds complexity. Most people want &lt;em&gt;less &lt;/em&gt;complexity and &lt;em&gt;more&lt;/em&gt; reliability. Reliability, specifically, is one of the biggest challenges facing tech at the moment. AI's Achilles’ Heel is a combination of cost and reliability both of which seem to be moving in the right direction with Apple Intelligence.
 &lt;/p&gt;






&lt;p&gt;
How's that for a segue?
 &lt;/p&gt;









&lt;hr&gt;


&lt;p&gt;
Apple Intelligence &amp;amp; Foundation Models Framework adds new, powerful on device intelligence for interpreting data, however, throwing IMU streams directly into a language model would be brittle and would blur the line between measurement and explanation. There's a balance that needs to be struck between straight up Math and the subjective narratives surrounding the interpretation of data sets from health and fitness readings and/or user outcomes.
 &lt;/p&gt;






&lt;p&gt;
A better architecture is layered:
 &lt;/p&gt;






&lt;p&gt;
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;collect motion and workout context&lt;/li&gt;&lt;li&gt;score data integrity&lt;/li&gt;&lt;li&gt;segment sets&lt;/li&gt;&lt;li&gt;detect candidate reps&lt;/li&gt;&lt;li&gt;fuse Watch, AirPods, iPhone, and equipment evidence&lt;/li&gt;&lt;li&gt;generate a structured set summary&lt;/li&gt;&lt;li&gt;use Apple Intelligence to explain what happened&lt;/li&gt;&lt;li&gt;rinse and repeat&lt;/li&gt;&lt;/ol&gt;







&lt;p&gt;
The model should receive structured facts from signal processing and statistical models, then translate those facts into useful coaching language where Apple Intelligence acts as an interpreter of sorts.
 &lt;/p&gt;






&lt;p&gt;
The iPhone and Apple Watch apps build and the app can collect Watch/AirPods/iPhone sensor data. It can start a traditional strength training workout session on Apple Watch and then export CSV files with raw samples, events, and sensor integrity. It doesn't provide live rep counting in the UI yet and has a rough time attributing alternating curls by side. It's also a bit off when trying to resample all the streams onto a shared 50 Hz timeline. It can generate post set Foundation Model summaries, but can't write rich set level semantics into HealthKit...yet.
 &lt;/p&gt;









&lt;hr&gt;


&lt;h3&gt;
What's Next?
 &lt;/h3&gt;






&lt;p&gt;
Ultimately I want to do away with manually inputting exercise data altogether and dissuade users from new devices whose main job is to compensate for the fact that the Apple devices already present are not being coordinated well enough for logging weight lifting and strength training, all while being local on device and available offline. That's not to say that &lt;em&gt;all&lt;/em&gt; device innovation is a waste, but in this one niche area of health and fitness we're sorely lacking the modern data logging tools available to other athletics.
 &lt;/p&gt;






&lt;p&gt;
If developers, namely me, want Fitness+, HealthKit, GymKit, AirPods, Apple Watch, and Apple Intelligence to feel like one fitness platform rather than several adjacent products, the weight room is the obvious place to prove it because lifting is still mostly invisible.
 &lt;/p&gt;






&lt;p&gt;
The next great strength training device might not be a single device at all, but rather Apple Watch, AirPods, and iPhone acting in concert in the same workout.
 &lt;/p&gt;






&lt;p&gt;
Okay, back to the gym.
 &lt;/p&gt;






&lt;p&gt;
🤘Robin
 &lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;






&lt;p&gt;

&lt;br&gt;
&lt;/p&gt;







&lt;/div&gt;&lt;p&gt;&lt;a href="https://robinwinters.github.io/writing/"&gt;All writing&lt;/a&gt; · &lt;a href="https://www.linkedin.com/pulse/kinematics-lab-part-ii-you-dont-need-another-robin-winters-lrybc/"&gt;Original LinkedIn edition&lt;/a&gt;&lt;/p&gt;&lt;/article&gt;</description>
      <dc:creator>Robin Winters</dc:creator>
      <dc:date>2026-07-30</dc:date>
      <atom:link rel="related" href="https://dev.to/robinwinters/kinematics-lab-part-ii-you-dont-need-another-o9e" type="text/html" title="DEV edition" />
      <atom:link rel="related" href="https://medium.com/@robin_61077/kinematics-lab-part-ii-you-dont-need-another-7804ee06b4bf" type="text/html" title="Medium edition" />
    </item>
    <item>
      <title>Fitness event feeds: explicit dates, stable identity and visible conflicts</title>
      <link>https://robinwinters.github.io/writing/fitness-event-data-contracts.html</link>
      <guid isPermaLink="false">https://robinwinters.github.io/writing/fitness-event-data-contracts.html</guid>
      <description>&lt;article class="prose"&gt;&lt;h1&gt;Fitness event feeds: explicit dates, stable identity and visible conflicts&lt;/h1&gt;
&lt;p&gt;Robin Winters · October 2, 2026 · &lt;a href="https://robin.ac/"&gt;robin.ac&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A map can look polished while the events behind it are ambiguous. Two feeds may repeat a record, supply different start times for the same event, or omit the timezone. Guessing produces a neat interface at the cost of hiding uncertainty. A better starting point is a small contract that makes each decision inspectable.&lt;/p&gt;
&lt;p&gt;This article accompanies a &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline"&gt;standalone Swift teaching package&lt;/a&gt;, prepared with coding-assistant support. Its fixtures are synthetic. It is separate from private ShowFlex code and does not claim a customer deployment, an implemented product integration or measured performance improvements.&lt;/p&gt;
&lt;h2&gt;Start with the fields you can actually defend&lt;/h2&gt;
&lt;p&gt;The example accepts a provider ID, a feed ID, a title, a start timestamp, an optional end timestamp and an HTTPS source URL. The combination of feed ID and provider ID becomes the stable identity. Titles are display text; a matching title does not justify merging records. Different feeds can describe related real-world events, but cross-feed entity resolution requires evidence that this package deliberately does not invent.&lt;/p&gt;
&lt;p&gt;The package normalizes the feed slug to lowercase and trims provider IDs while preserving their case. Neither ID may contain the colon used to join them. That keeps &lt;code&gt;feed-a:event-17&lt;/code&gt; unambiguous within the stated contract. A real service would also need to establish whether each provider guarantees stable IDs across updates and deletions.&lt;/p&gt;
&lt;h2&gt;Timezone ambiguity is a data state&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;2027-03-14T10:00:00-07:00&lt;/code&gt; has an explicit offset and can be represented as &lt;code&gt;2027-03-14T17:00:00Z&lt;/code&gt;. A timestamp without an offset does not establish that instant. The example rejects it instead of using the machine's local timezone. It also rejects invalid calendar dates rather than allowing them to roll into a different day.&lt;/p&gt;
&lt;p&gt;An unknown end time remains absent. Adding a guessed two-hour duration would manufacture information. If an end is supplied, it must be later than the start. Date-only events, recurring schedules, named timezones and fractional seconds need their own policies; unsupported timestamp forms are rejected here.&lt;/p&gt;
&lt;p&gt;UTC output makes the normalization reproducible. A calendar or mobile interface would still need a deliberate display-timezone policy. That interface work is outside this package's execution evidence.&lt;/p&gt;
&lt;h2&gt;A duplicate and a conflict deserve different treatment&lt;/h2&gt;
&lt;p&gt;Two valid rows with the same identity and the same normalized payload are retransmissions. Keep one event and issue a duplicate receipt for the other row. Equivalent explicit-offset timestamps and collapsed title whitespace can produce an identical normalized payload.&lt;/p&gt;
&lt;p&gt;Two different valid payloads with the same identity are a conflict. The example removes that event from accepted output and marks every related valid row as conflicted, including a duplicate already seen earlier. No row wins simply because it arrived first. Permuting the input order therefore cannot choose a different accepted version of that conflicting identity.&lt;/p&gt;
&lt;p&gt;This is a teaching policy, not the only useful production policy. A provider revision number, authenticated correction or trusted snapshot might establish a winner. Without that evidence, a quarantine is easier to explain than a silent overwrite.&lt;/p&gt;
&lt;h2&gt;Return a receipt for every row&lt;/h2&gt;
&lt;p&gt;The output includes sorted accepted events and one receipt per input row: accepted, duplicate, conflict or rejected. Each receipt records the input index and a reason. A rejected row can therefore be traced to the input rather than disappearing into an apparently successful empty array.&lt;/p&gt;
&lt;p&gt;The supplied five-row fixture produces one accepted event, one duplicate receipt, two conflict receipts and one invalid-date rejection. Invalid JSON exits with status 1 and produces no successful JSON report. That distinction matters when a command-line tool is used in a larger workflow: malformed input and a valid feed containing no accepted events are different outcomes.&lt;/p&gt;
&lt;h2&gt;Keep provenance narrower than proof&lt;/h2&gt;
&lt;p&gt;The source URL is retained as a retrieval pointer. The package rejects non-HTTPS URLs, embedded credentials and fragments. It does not fetch those URLs, authenticate a provider or establish that a claimed event exists. Every fixture URL uses the reserved example.org domain.&lt;/p&gt;
&lt;p&gt;Storing provenance is a useful first step toward investigating a record. It should not be described as verification of that record. A production ingestion system needs provider authorization, versioned snapshots, update and deletion rules, observability and retry behavior alongside its field validation.&lt;/p&gt;
&lt;h2&gt;Evidence a reviewer can inspect&lt;/h2&gt;
&lt;p&gt;On October 2, 2026, the package passed 12 Swift Testing checks on macOS with Swift 6.4. The checks cover timezone equivalence, retransmissions, conflict propagation and ordering, source-scoped identity, malformed dates, missing offsets, end-time rules, URL restrictions, unknown ends and sorted output. The command-line fixture and malformed-JSON failure path were also exercised. The repository includes &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/tree/Radpository/Fixtures"&gt;fixtures&lt;/a&gt; and &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline/blob/Radpository/verification.json"&gt;verification details&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These results describe this educational package. They do not establish iPhone-device execution, Linux execution, an App Store release or an improvement to an existing product. The value of the example is that its contracts and failure decisions are small enough to inspect and reproduce.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/RobinWinters/RobinWinters/blob/Radpository/professional/README.md"&gt;Professional work and evidence&lt;/a&gt; · &lt;a href="https://robinwinters.github.io/writing/"&gt;Full writing index&lt;/a&gt; · &lt;a href="https://github.com/RobinWinters/fitness-event-data-pipeline"&gt;Source package&lt;/a&gt;&lt;/p&gt;&lt;/article&gt;</description>
      <dc:creator>Robin Winters</dc:creator>
      <dc:date>2026-10-02</dc:date>
      <atom:link rel="related" href="https://dev.to/robinwinters/fitness-event-feeds-explicit-dates-stable-identity-and-visible-conflicts-161p" type="text/html" title="DEV edition" />
      <atom:link rel="related" href="https://medium.com/@robin_61077/fitness-event-feeds-explicit-dates-stable-identity-and-visible-conflicts-deaff1e6be83" type="text/html" title="Medium edition" />
      <atom:link rel="related" href="https://robinwinters.hashnode.dev/fitness-event-feeds-explicit-dates-stable-identity-and-visible-conflicts" type="text/html" title="Hashnode edition" />
    </item>
    <item>
      <title>What if Myspace Had It Right?</title>
      <link>https://robinwinters.github.io/writing/what-if-myspace-had-it-right.html</link>
      <guid isPermaLink="false">https://www.linkedin.com/pulse/what-myspace-had-right-robin-winters-ykksc/</guid>
      <description>&lt;article class="prose republished"&gt;&lt;h1&gt;What if Myspace Had It Right?&lt;/h1&gt;&lt;p&gt;By &lt;a href="https://robin.ac/"&gt;Robin Winters&lt;/a&gt;&lt;/p&gt;&lt;p class="note"&gt;First published April 1, 2026 on &lt;a href="https://www.linkedin.com/pulse/what-myspace-had-right-robin-winters-ykksc/"&gt;LinkedIn&lt;/a&gt;. Republished October 2, 2026 with original wording, images and captions. Technical observations and opinions retain their original context.&lt;/p&gt;
&lt;img alt="Photo montage of two people wearing white gloves holding an ornate gold frame around a familiar Myspace profile portrait." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/what-if-myspace-had-it-right-2.jpg"&gt;
&lt;figcaption&gt;
            Tom. Friend to all.
          &lt;/figcaption&gt;
&lt;div class="article-body"&gt;

&lt;p&gt;
Let's talk about feeds.
 &lt;/p&gt;






&lt;p&gt;
How sticky are feeds? How personalized are feeds? How fast can feeds learn you? How well can feeds keep serving you content you didn’t ask for?
 &lt;/p&gt;






&lt;p&gt;
In terms of the Enshittification of UX across pretty much all modern social media maybe Feeds in general are part of the problem. But what would Social Media look like without a Feed? How would that even work?
 &lt;/p&gt;






&lt;p&gt;
Take a hike, Friendster, we're bringing it back to the real OG; Myspace.
 &lt;/p&gt;






&lt;p&gt;
To preface this, Myspace was far from perfect. It was ugly, launched the proliferation of up angle selfies, and fell out of vogue basically overnight.
 &lt;/p&gt;






&lt;p&gt;
However, Myspace centered UX around the User Profile instead of an Algorithmic Feed.
 &lt;/p&gt;









&lt;hr&gt;


&lt;p&gt;
When Feeds became the center of Social Media UX user profiles became secondary and everything started bending toward whatever content keeps attention the longest and/or triggers the most repeat engagement (read as enragement). Once you do that, you start drifting toward rage bait and Boomer meme slop.
 &lt;/p&gt;






&lt;p&gt;
Shrimp Jesus, people. Shrimp Jesus.
 &lt;/p&gt;






&lt;p&gt;
I think Myspace, weirdly enough, had it right.
 &lt;/p&gt;






&lt;p&gt;
When you landed on someone’s page, you were entering their space. Their aesthetic, their vibe, their weird HTML decisions. It was messy, sometimes hideous, but it felt like a &lt;em&gt;person&lt;/em&gt;.
 &lt;/p&gt;






&lt;p&gt;
That is wildly different from the experience most platforms train people into now, where interactions get routed through an opaque engagement engine.
 &lt;/p&gt;






&lt;p&gt;
That idea has been on my mind while building the social layer for ShowFlex.
 &lt;/p&gt;






&lt;p&gt;
ShowFlex isn't trying to become another generic social app with a bodybuilding skin wrapped around it - which sounds way grosser than I intended it to, but I'm leaving it in.
 &lt;/p&gt;






&lt;p&gt;
I’m more interested in building a social layer that feels tied to the person and their place inside the sport.
 &lt;/p&gt;






&lt;p&gt;
I don't want the center of gravity to be some endless feed, shoveling algorithmic sludge at people because being "Big mad" converts. I want the center of gravity to be the profile, which in a sport like bodybuilding  makes total sense. People care what your presence in the sport looks like, all of which being inherently profile native.
 &lt;/p&gt;






&lt;figure&gt;


 &lt;img alt="Stacked browser windows showing a customized Myspace profile with skull-and-heart wallpaper, a profile photo, music player, video and personal panels." decoding="async" loading="lazy" src="https://robinwinters.github.io/writing/images/what-if-myspace-had-it-right-1.jpg"&gt;
&lt;figcaption&gt;
Avril Lavigne vibes. So complicated. So frustrated
&lt;/figcaption&gt;
&lt;/figure&gt;





&lt;p&gt;
A profile centric social layer also has a healthier shape to it.
 &lt;/p&gt;






&lt;p&gt;
It gives users somewhere to build from. It makes social interaction more legible and creates a stronger sense of place. It can make discovery feel more intentional instead of just reactive, and most importantly it reduces the amount of power handed to a hidden ranking engine that optimizes for emotional volatility.
 &lt;/p&gt;






&lt;p&gt;
So when I say I'm building a social media layer more like Myspace, I don't mean I'm are trying to cosplay 2006 internet aesthetics for nostalgia points - though I did find out Neo Y2K Futurism Aesthetic is making a come back. It's Rad. Look it up.
 &lt;/p&gt;






&lt;p&gt;
What I mean is that I'm taking seriously the idea that social products work better when people feel like they have a space and a visible relationship to a community, not just a stream.
 &lt;/p&gt;






&lt;p&gt;
So, maybe Myspace had something right. Not everything, but enough that it is worth revisiting the good parts and leaving the rest in the glitter gif covered tomb where it belongs.
 &lt;/p&gt;






&lt;p&gt;
Cue the Ooga chaka baby. Everything old is new again.
 &lt;/p&gt;






&lt;p&gt;
Build accordingly, and as always:
 &lt;/p&gt;






&lt;p&gt;
May the Force be with you.
 &lt;/p&gt;






&lt;p&gt;
🤘 Robin Winters
 &lt;/p&gt;







&lt;/div&gt;&lt;p&gt;&lt;a href="https://robinwinters.github.io/writing/"&gt;All writing&lt;/a&gt; · &lt;a href="https://www.linkedin.com/pulse/what-myspace-had-right-robin-winters-ykksc/"&gt;Original LinkedIn edition&lt;/a&gt;&lt;/p&gt;&lt;/article&gt;</description>
      <dc:creator>Robin Winters</dc:creator>
      <dc:date>2026-04-01</dc:date>
      <atom:link rel="related" href="https://dev.to/robinwinters/what-if-myspace-had-it-right-30oh" type="text/html" title="DEV edition" />
      <atom:link rel="related" href="https://medium.com/@robin_61077/what-if-myspace-had-it-right-f60f1a9fa31c" type="text/html" title="Medium edition" />
    </item>
  </channel>
</rss>