Weightlifting tracker app for coders
See the code
It's mobile app, that's available as:
The main idea is to make a weightlifting tracker app, that is flexible enough to implement pretty much any weightlifting routine. It would be a platform for your experiments in weightlifting, you can try any progression and deloading logic you want to see what suits you better. It automatically handles progressive overloads and deloads based on the logic you define. Any program should be possible to implement - Stronglifts 5x5, GZCLP, any 5/3/1s, any PPL, you name it.
To describe the logic, there's a built-in scripting language called Liftoscript, which is a very simple programming language with JavaScript-like syntax. It has some built-in variables and some custom number types (e.g. kg and lb), but other than that it's pretty simple. E.g. Stronglifts 5x5 logic could look like this if written in Liftoscript:
if (completedReps >= reps) {
state.weight = state.weight + 5lb
} else {
state.failures = state.failures + 1
}
if (state.failures > 2) {
state.failures = 0
state.weight = state.weight * 0.9
}
45/25/25/10 255lb meaning you need to add 1x45lb, 2x25lb and 1x10lb plates on each side of the olympic barbell to get 255lb. You define your plates inventory in Settings.It's a regular Preact/TypeScript app. State manager is custom, similar to Redux + Thunks, but using lens-shmens to avoid Redux-like boilerplate. It's a PWA, so there's a simple service worker, that caches the network calls. The setup is similar to what's described in this blog post.
I try to be efficient with the JavaScript size, and avoid heavy third-party libraries. As a result, the whole app weights ~200kb, where ~100kb are various third-party libs. The major third-party libs are:
og:image images (like this) for social mediaFor RPE multiplier calculations we use the formula from https://gitlab.com/openpowerlifting/plsource
Server-side part is AWS Lambdas + DynamoDB + S3 + a bunch of other AWS services. DynamoDB is not a great choice for this app, I'd prefer a relational database here, frankly. But AWS Lambdas + DynamoDB + S3 are pretty cheap, easily scalable, fully managed with backups, so sticking with it for now.
I deploy everything via AWS CDK, the setup is described in this blog post. I also created an AWS CDK Lambda TypeScript starter, to simplify creating similar environment for pet projects.
If you want to run liftosaur locally firstly ensure that you have Node 18 and npm installed
Then comment out the
devServer:{ }
block from the webpack.config.js file
Run
$ npm install
$ npm start
Then, open http://localhost:8080/app. That's it! But that will only give you offline-like experience, so there will be no local API server running.
Running the server is a bit trickier, and frankly still tied to liftosaur.com domain, so probably would not be easy to run, you'd need to modify a bunch of things in liftosaur-cdk/liftosaur-cdk.ts file. If you still want to try, then you need to set up AWS account, add AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION env vars, and set the necessary permission policies for your user:
Create new secrets in AWS Secrets Manager, with the names listed in secretArns variable in liftosaur-cdk.ts. Those could be pretty much any random strings.
Then, run npm cdk-deploy, that should create 2 environments - one for prod, one for dev. Again, there could be some things you want to change in lifosaur-cdk.ts to make it work. After that, run npm start:server, and it will start a local server.
If you want to propose a feature, or found a bug - create an issue on Github.
2,324 followers · starred Jun 2022
3,430 followers · starred Jul 2025
726 followers · starred Mar 2025
108 followers · starred Mar 2024
Weightlifting tracker app for coders
See the code
It's mobile app, that's available as:
The main idea is to make a weightlifting tracker app, that is flexible enough to implement pretty much any weightlifting routine. It would be a platform for your experiments in weightlifting, you can try any progression and deloading logic you want to see what suits you better. It automatically handles progressive overloads and deloads based on the logic you define. Any program should be possible to implement - Stronglifts 5x5, GZCLP, any 5/3/1s, any PPL, you name it.
To describe the logic, there's a built-in scripting language called Liftoscript, which is a very simple programming language with JavaScript-like syntax. It has some built-in variables and some custom number types (e.g. kg and lb), but other than that it's pretty simple. E.g. Stronglifts 5x5 logic could look like this if written in Liftoscript:
if (completedReps >= reps) {
state.weight = state.weight + 5lb
} else {
state.failures = state.failures + 1
}
if (state.failures > 2) {
state.failures = 0
state.weight = state.weight * 0.9
}
45/25/25/10 255lb meaning you need to add 1x45lb, 2x25lb and 1x10lb plates on each side of the olympic barbell to get 255lb. You define your plates inventory in Settings.It's a regular Preact/TypeScript app. State manager is custom, similar to Redux + Thunks, but using lens-shmens to avoid Redux-like boilerplate. It's a PWA, so there's a simple service worker, that caches the network calls. The setup is similar to what's described in this blog post.
I try to be efficient with the JavaScript size, and avoid heavy third-party libraries. As a result, the whole app weights ~200kb, where ~100kb are various third-party libs. The major third-party libs are:
og:image images (like this) for social mediaFor RPE multiplier calculations we use the formula from https://gitlab.com/openpowerlifting/plsource
Server-side part is AWS Lambdas + DynamoDB + S3 + a bunch of other AWS services. DynamoDB is not a great choice for this app, I'd prefer a relational database here, frankly. But AWS Lambdas + DynamoDB + S3 are pretty cheap, easily scalable, fully managed with backups, so sticking with it for now.
I deploy everything via AWS CDK, the setup is described in this blog post. I also created an AWS CDK Lambda TypeScript starter, to simplify creating similar environment for pet projects.
If you want to run liftosaur locally firstly ensure that you have Node 18 and npm installed
Then comment out the
devServer:{ }
block from the webpack.config.js file
Run
$ npm install
$ npm start
Then, open http://localhost:8080/app. That's it! But that will only give you offline-like experience, so there will be no local API server running.
Running the server is a bit trickier, and frankly still tied to liftosaur.com domain, so probably would not be easy to run, you'd need to modify a bunch of things in liftosaur-cdk/liftosaur-cdk.ts file. If you still want to try, then you need to set up AWS account, add AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION env vars, and set the necessary permission policies for your user:
Create new secrets in AWS Secrets Manager, with the names listed in secretArns variable in liftosaur-cdk.ts. Those could be pretty much any random strings.
Then, run npm cdk-deploy, that should create 2 environments - one for prod, one for dev. Again, there could be some things you want to change in lifosaur-cdk.ts to make it work. After that, run npm start:server, and it will start a local server.
If you want to propose a feature, or found a bug - create an issue on Github.
2,324 followers · starred Jun 2022
3,430 followers · starred Jul 2025
726 followers · starred Mar 2025
108 followers · starred Mar 2024