---
title: "Kinetiq"
slug: "kinetiq"
url: "https://haakony.no/posts/kinetiq"
date: "2026-06-29"
updated: "2026-07-12"
categories: ["development"]
tags: ["app", "ai", "development", "image-generation", "openai"]
reading_time_minutes: 5
ongoing: true
description: "Making a Workout app"
---

# Kinetiq

# Kinetiq

## Stage - V1 complete - V2 in development

So I have my Garmin watch and my Strava account for keeping track of sessions, but they are mainly focused on cardio sports, which is fine. 
But I wanted to track strength training the same way I track my running and biking with stats showing progress. 
Especially since I have my own garage gym with a power cage and all. 

![IMG_9656.jpg](https://haakony.no/media/27){width=25%}

So I checked out a couple of apps and what I found was just a crazy-expensive subscription service; paying 100 USD per month is crazy. 

So why not just make my own? How hard can that be?  
So I wrote down some main things I need and want from the app. 

## Needs:
1. Tracking progress per muscle, and progress per exercise. I want a graph telling me clearly if I am improving. 
2. It needs to be super simple to enter each set. 
3. I can't remember all the names for exercises, so we need some simple way of finding and adding them.

## Wants:
1. Vocal updates
2. Auto set tracking
3. Bluetooth connection for HR, Treadmill


<video src="https://haakony.no/media/29" controls width="600"></video>

## Tackling the needs and wants 

### Tracking
Tracking the exercises is just a matter of data, so that is fine. 
But doing it in an easy way, where you assume the user either doesn't know what the exercise is called or what it does, is a challenge. 
I tried a multitude of things before I settled on the current iteration. 

<video src="https://haakony.no/media/30" controls width="600"></video>

I found something called WGER and its open database of exercises that we can use. I pulled that in with the hopes of being able to use that to generate a more coherent dataset with an LLM.
So now I have the ability to generate new images and texts that are easier to understand and are more complete than what's found on WGER. 
I use the WGER data with the image if it is there, then generate two texts: 1. a text describing the exercise; 2. a prompt for making the icon and a start and end position on the exercise.
And that worked great, but there are some problems: the current models on OpenAI don't know how to make the end positions, just the start positions.

![start.png](https://haakony.no/media/32){width=25%} ![end.png](https://haakony.no/media/31){width=25%}

I noticed that using more expensive models greatly improved the situation, but I might wait a bit longer to generate the full set.
But on a positive note, I found the models were really good at explaining in text how to do the exercise and at generating icons for them. 

### Vocals
As for the vocal updates, I use a local model to generate a quick text by providing the data the user has entered. For example, if the user has entered 80kg and 10 reps, we send that as well as the name of the exercise, and it returns a text that gets passed on to Elevenlabs for generation and then back to the server and out to the user for encouragement. Adding a voice like Duke Nukem just makes things a lot more fun. 
The server saves the text and sound file so that we can reuse them, so we don't generate things all the time. 
I also added some sounds to the rest timer so you get a "Back to work" or "Get back to work". 

### Bluetooth
I still can't believe how easy this was to implement with the help of an LLM; it would have taken me months otherwise.
The app attaches to the watch or treadmill BLE connection to get the HR or machine data. It can get speed, distance and incline of the machine I have in the garage. 
The major headache I had was that there is a problem connecting to multiple BLE connections at the same time, and I am still working on a solution to that. 
But from just the watch, I can get both HR and location tracking. 

### Auto set tracking. 
I have some ideas on this and I am still thinking of how to accomplish it.
There are three things I am considering. 
1. Audio analysis from the microphone. 
2. Design an ESP32 with an accelerometer in an enclosure with a magnet. A small thing you can attach to whatever you lift and it tracks speed, time, sets, etc. It could also act as a BLE proxy.
3. Video analysis, phone camera?
We will see what I end up with.


# Progress
## 2026-07-02
I have been thinking of changing the storage solution over to some object storage and the same goes for all the apps and sites. 
I don't have much need for it at the moment because there is no particular load, so there is no need for load balancing, and the space it takes is not much at all. But it is slowly creeping up on storage on the docker hosts, so I took a quick look into what to do with it. 
It started this morning, and I found out I could set up an S3 storage solution on Unraid in a docker container. 
Its called Garage-s3. I started reading up and configuring things; nothing worked, of course, until I remembered, we have AI now...
Yeah copilot made quick work of it and I got a pool up in minutes on the local network. It still blows my mind how quickly these things can just make things work. Anyway, I made a migration plan and got S3 hooked up on Kinetiq; this would have taken weeks normally.

I then took a quick look at why Strava had stopped syncing and I found out they wanted the devs to have a paid subscription for access to the API. And I am not paying 100 kr per month for Strava; that's insane. 
I still haven't gotten back from Garmin about access to their API, so I needed a different approach. Looking online, it seems like it's a known problem of "we don't care", so some folks have written python libraries like some kind of scraping proxy where you get a REST API out of it. Amazing, but it was in python. Cursor made quick work of that, though, rewriting the entire thing and adapting it to our use case in a couple of minutes...

So in the absence of Strava, we managed to get something better, so I guess that's nice :)

## 2026-07-12
Ok so more things showed up. 
I changed around the session storage of the activities from server authoritative that don't really make sense to instead sync the sessions with the server. As there is no reason to think that the user would cheat something like distance, there is no point in sending updates for everything. 

I also added new Outdoor mode for Hikes and trailrunning etc, it has mapping, routing and even the ability to pre download areas on map incase there is no coverage where your going.
The mapping is mostly from "Norgeskart" so it should be good for Norway, with a fallback from global supplier.
