Code Monkey home page Code Monkey logo

liftosaur's Introduction

🏋 Liftosaur: Open-source powerful weight lifting tracker PWA for coders.

Link: https://www.liftosaur.com/about

Liftosaur Screenshot

It's a mobile app, that's available as:

  • PWA - meaning you can open the page in a browser on your mobile phone, add it to a home screen, and it will behave exactly as a regular app.
  • Android app - thin Android app around this PWA with some native features added.
  • iOS app - thin iOS app around this PWA with some native features added.

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
}

Features

  • Built-in workout programs - 5/3/1, GZCLP, Starting Strength, etc
  • Any workout program is fully customizable - you can clone existing one and adjust it to your needs. Every single program is written using Liftoscript right in the app, so every bit of it could be changed.
  • Simple exercise editor if you don't want to mess with Liftoscript, that still allows to specify simple progression/deload logic.
  • Advanced exercise editor if you want to unleash the full power of Liftoscript.
  • Workout history
  • Offline mode, it doesn't need Internet to work (still needs though if you have an account and want to save progress).
  • Plates calculator right on the progress screen. Each weight is prefixed with plates you need to use to get to that weight, it looks like: 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.
  • All weights are rounded according to your available bars and plates, which you set up in Settings.
  • Rest Timers - configurable globally and per exercise, with a Push Notification when the timer is expired (works only on native apps though).
  • Cloud storage - if you create an account, your progress will be saved on the server.
  • Graphs - see the visual progression of your lifts, define what Graphs you need on the Graphs screen.
  • Muscle map - see what muscles get activated in your day or in the whole program relatively to each other.
  • Exercise substitution based on similar activated muscles.
  • Custom exercises.
  • Warmup sets, which you can configure as a percentage of the weight of the first set, or just as an absolute lb or kg value. Each exercise has defaults, but you can change it.
  • "Playgrounds" when editing exercises, so you could test the logic or exercises.
  • Previews of each program available, with playgrounds, e.g. Basic Beginner Routine.
  • If you did similar sets x reps for some exercise previously, it shows your last results. Same for AMRAPs.
  • Optional public profile page, e.g. this is mine.
  • Track bodyweight and other body measurements (biceps, chest, waist, etc)
  • Correlate bodyweight changes with lifts graphs
  • Web Editor to create programs
  • Shareable programs - you can build a program, generate a link, and import on another phone.

Implementation details

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:

For 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.

How to run locally

If you for some reason want to run it locally, just do the standard set of commands:

$ yarn install
$ yarn start

Then, open http://localhost:8080/. 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:

  • SecretsManagerReadWrite
  • AmazonDynamoDBFullAccess
  • AmazonEC2ContainerRegistryFullAccess
  • AmazonS3FullAccess
  • CloudFrontFullAccess
  • AmazonSESFullAccess
  • AmazonAPIGatewayAdministrator
  • AmazonSSMFullAccess
  • AmazonRoute53FullAccess
  • AWSCloudFormationFullAccess
  • AmazonElasticContainerRegistryPublicFullAccess
  • AWSLambdaFullAccess

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 yarn 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 yarn start:server, and it will start a local server.

Contributing

If you want to propose a feature, or found a bug - create an issue on Github.

liftosaur's People

Contributors

123marvin123 avatar adepssimius avatar allanbreyes avatar astashov avatar columndeeply avatar gilice avatar sampconrad avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

liftosaur's Issues

[Feature Request] Workout planner syntax for adding exercises to existing plans

First of all, thanks for creating Liftosaur! Programming with it is a breath of fresh air and so intuitive compared to all the other apps I've used. Workout Planner is so well thought out I couldn't believe it.

I've had a great experience planning my workouts with the Workout Planner page. I find this syntax for creating a workout super convenient, compared to creating each exercise using the UI which takes a lot of clicks.

As I plan my workouts one or two days at a time, I would like to be able to use the Workout Planner syntax to add new exercises to a day and/or new days to a plan. As far as I understand it, right now Workout Planner requires you to define your entire plan in one go and you can't go back and forth from Liftosaur to Workout Planner if you prefer the text-based way of planning.

Is it possible to add an alternative to Add new day and Create new exercise buttons that opens up a text input where I can input my exercises and create them in one go?

[Feature Request] Allow tracking of additional measurments

I would like to be able to track additional metrics like

Metabolic markers

  • VO2 max
  • Resting energy
  • Walking heart rate average

Recovery indicators

  • Resting heart rate
  • Resting respiratory rate
  • Sleep
  • Heart rate variability
  • Cardio recovery
  • Subjective scores (e.g. tiredness/soreness)

Vital signs

  • Blood pressure
  • Body temperature

Activity stats

  • Steps
  • Distance walked / run
  • Stair flights climbed

These are just a subset of many possible measurements, so it might be worth allowing custom measurements so users aren't limited to a pre-defined list.

I know this is primarily a lifting app but as long as you aren't trying to sync these stats from somewhere else like Apple Health, I'd expect it to be a simple expansion of existing functionality. If you think this request is a good idea, I'd like to try writing a PR myself.

Can't finish workout after adding new excercise

Hi! I saw the new "Add exercise" button and was testing it during today's workout but when I added the OHP I couldn't save the workout. Clicking on the "Finish the workout" didn't do anything (it might have reset the rest timer, I'm pretty sure I was resting longer than 14s before taking the pic...)

It looks like it might be suck on editing mode? I can see the "+" button but no "Finish Editing" button like I would usually see when editing an existing exercise.

Here's a screenshot:
Screenshot_20230507-155326_Liftosaur

[Feature request] Bring the notes from last exercice to the current exercice

Hi Anton,

When I add note in a specific exercise during the workout, It would be useful to retrieve it directly in the current one - like you do with the last weights.
Also, adding the last time to perform this day in the top menu could be good!

The note section I'm talking about

image

Last exercises weights/rep/... display

image

Maybe add the "last exercise comment" just below?

The last duration time could be displayed just after the "start" ?

image

Alternative Login and/or Self-Host

First, let me start by saying that such an amazingly designed FOSS app like this not getting the deserved attention is unreal.
Thank you for making this app, it looks so much promising really !

I would like to have an account so that I can use the app between devices and be sure that I do not lose my data. However, I do not use Google and as such would like to know if it is possible to add an alternative login option ?

Also, it would be really nice if in the future you added a Self Hosting option, this would attract a lot of the Self-hosting user base who is looking for fitness solutions.

Thank you for your time.

[Feature Request] Material dependent unit (Metric or imperial)

In the gyms I've seen, while barbells/dumbbells are usually in metric, cable and other machines are always in imperial (with a conversion to metric).

Would be nice to be able to specify weight increments in lbs, even though I've setup the app to use metric.

[Feature Request] Warmup presets

The program I'm following has some pre-determined types of warmups for each exercise:
image

It would be great to define this logic in one place and select using a dropdown when adding exercises.

Liftin' app has something like this:
IMG_8920ABE79005-1

image

Copy from previous program

Currently the application allows for copying from preset list of programs, it would be really helpful to copy from a previous program that you've created. If this sounds in line with what you've got planned I can do some work on it (my ts/js is a little rusty but I should be able to handle it)

Weight shown as '0' on Cable exercises

I've only tested it on GZCLP, but to replicate:

  1. Start a workout
  2. Add a new exercise, set equipment to Cable, weight to 10kg, save
  3. Weight should show as "0" on workout

Same thing happens if you add the exercise to the program before starting the workout.

[Feature Request] - Assign different rest times per exercise

Hello, I want to start by saying this is an amazing app and it's definitely helped me get back into the gym.

One feature I would love to have is the ability to assign a different rest time for each exercise. So for example, for squats I might want to rest 3 minutes between each set but for dumbbell curls only 1 minute. The existing timers for warmup/workout are good but I always have to do the manual adjustment of adding or removing 15s at a time to get the actual rest time I want.

Thanks again for all the work you've put into this app!

[Bug] Editing State of Substituted Exercise Reverts Substitution

Hey there, firstly wanted to say great work. I've never really used apps for workouts as they tend to lack cuzomizability but really been loving this app.

I've noticed an issue when modifying thestate of a substituted exercise, specifically if you're substituting one within the program.

Steps to reproduce:

  1. Substitute Exercise
  2. When clicking on edit, it will still have the old exercise name
  3. Modifying weight and clicking done will revert to the previous exercise.

If you click edit the whole exercise it seems to work as intended.

Thanks! Would love dig into this myself and help out if I get some spare time :)

[Bug] Custom Progress Block Not Copied from Template Exercise

Like the title, when I create a template exercise the custom progress that I defined for it isn't used by exercises that use that template, attached below is a setup that replicates the issue. When you use this setup in the program playground or in the program itself none of the exercises that use ..base_4_15:Lateral Box Jump as the template use any progression that the template defines:

# Week 1
## Push
Overhead Press / ...base_4_15:Lateral Box Jump
Chest Dip / ...base_4_15:Lateral Box Jump
Triceps Pushdown, Cable / ...base_4_15:Lateral Box Jump
Lateral Raise, Dumbbell / 2x15, 1x15+ / ...base_4_15:Lateral Box Jump

## Day 2


## Day 3


## Day 4


## Day 5
base_4_15:Lateral Box Jump / 3x15, 1x15+ / 57.5% / used: none / progress: custom(week: 1) {~
  var.nextReps = 0
  var.nextIntensity = 0

 if (completedReps[numberOfSets] > reps[numberOfSets] + 5) {
    rm1 = rm1 * 1.03
  } else if (completedReps[numberOfSets] > reps[numberOfSets] + 4) {
    rm1 = rm1 * 1.02
  } else if (completedReps[numberOfSets] == reps[numberOfSets] + 3) {
    rm1 = rm1 * 1.015
  } else if (completedReps[numberOfSets] == reps[numberOfSets] + 2) {
    rm1 = rm1 * 1.01
  } else if (completedReps[numberOfSets] == reps[numberOfSets] + 1) {
    rm1 = rm1 * 1.005
  } else if (completedReps[numberOfSets] == reps[numberOfSets] - 2) {
    rm1 = (rm1 - (rm1 * 0.02))
  } else if (completedReps[numberOfSets] <= reps[numberOfSets] - 1) {
    rm1 = (rm1 - (rm1 * 0.05))
  }

state.week = state.week + 1
if (state.week > 6) {
  state.week = 1
}
if (state.week == 1) { var.nextIntensity = 95} 
if (state.week == 2) { var.nextIntensity = 60 }
if (state.week == 3) { var.nextIntensity = 62.5 }
if (state.week == 4) { var.nextIntensity = 65 }
if (state.week == 5) { var.nextIntensity = 67.5 }
if (state.week == 6) { var.nextIntensity = 70 }

if (var.nextIntensity > 95) { var.nextReps = 1 }
else if (var.nextIntensity > 87.5) { var.nextReps = 2 }
else if (var.nextIntensity > 85) { var.nextReps = 3 }
else if (var.nextIntensity > 82.5) { var.nextReps = 4 }
else if (var.nextIntensity > 80) { var.nextReps = 5 }
else if (var.nextIntensity > 77.5) { var.nextReps = 6 }
else if (var.nextIntensity > 75) { var.nextReps = 7 }
else if (var.nextIntensity > 72.5) { var.nextReps = 8 }
else if (var.nextIntensity > 70) { var.nextReps = 9 }
else if (var.nextIntensity > 67.5) { var.nextReps = 10 }
else if (var.nextIntensity > 65) { var.nextReps = 11 }
else if (var.nextIntensity > 62.5) { var.nextReps = 12 }
else if (var.nextIntensity > 60) { var.nextReps = 13 }
else if (var.nextIntensity > 57.5) { var.nextReps = 14 }
else if (var.nextIntensity > 55) { var.nextReps = 15 }
else { var.nextReps = 5 }

weights = rm1 * (var.nextIntensity / 100)
reps = var.nextReps
~}

Add Volume statistics

At the end of each exercise we already get the total weight lifted it would be nice if the total volume was also displayed.
This is a useful variable to log for people interested in comparing it daily with HR, HRV, hours of sleep etc.

Are progressions supposed to increase `weight` when percentages of `1rm` are used?

I just started using the app (I'm absolutely stoked btw) and wrote down my current program (Madcow 5x5).

Current behavior

It's using percentages (of 5RM, but whatever), so I wrote it like this:

Deadlift / 1x5 62.5%, 1x5 75%, 1x5 87.5%, 1x5 100% / progress: lp(5kg)

I guess what happens when I finish the exercise is that the variable weight is increased, which then overwrites the percentage numbers in the program to:

Deadlift / 1x5 58.15kg, 1x5 68.75kg, 1x5 79.4kg, 1x5 90kg / progress: lp(5kg)
  1. This breaks the program code, so in order to be able to modify something later, I would have to keep a backup of the code somewhere (storing them in a git repo probably wouldn't be a bad idea anyway).
  2. All sets are increased by the same absolute value, breaking the relative weight structure of the plan. 50% sets are increased by the same absolute value as the 100% sets, instead of 50% of it.

As a workaround, I wrote a custom progress script, which seems to work as expected:

Deadlift / 1x5 62.5%, 1x5 75%, 1x5 87.5%, 1x5 100% / progress: custom(increment: 5kg) {~
  if (completedReps >= reps) {
    rm1 += state.increment
  }
~}

Am I overlooking something? Or is this the current behavior?

Expected behavior

If it is the current behavior, I'd suggest the following feature:

  1. Absolute numbers are increased by the progress increment.
  2. Relative numbers are not changed, but instead the variable 1rm is increased by the same progress increment.

So, e.g., this exercise

Squat / 1x5 50%, 1x5 100kg / progress: lp(5kg)

where 50% is of the 1rm 120kg, after a completed set would be changed to

Squat / 1x5 50%, 1x5 105kg / progress: lp(5kg)

where 50% is now of the 1rm 125kg.

I'm sorry if this is bullshit. As I said, it's my very first time using Liftosaur.

Notification issues

When I have an app in the foreground, the audio notification at the end of timer, pauses my podcast app.

I thought this could be a problem with my podcast app, but when testing it, I noticed that the timer notification didn't go off when the Liftosaur app is in the background.

I shared podcast app logs with the developer and they said that

Logs shows that another app asked for temporary audio focus
The playback will resume as soon as the other app releases the audio focus.
There's no trace of the focus being released in this log file

No LICENSE file

Hello!

I have noticed that this project, although it claims it's open source (and the code is available) doesn't include an open-source license (or I haven't found it).

Can you please decide on one and add it?
Eg. From https://choosealicense.com/, something like MIT or GPL are popular choices. Thanks.

Cc @astashov

Variables with the same name reset warmups on all exercises

Hi! If there's two exercises with the same variable in them, changing the value of that variable will reset the warmup sets of both exercises.

Here's an example:
https://github.com/astashov/liftosaur/assets/106948293/a4d7b02a-bc20-4462-885b-afd1e1fe4941

Changing the "rm" variable on the Bench Press resets the Squat's warmup sets. I haven't tried but I'm pretty sure it only works if the variable you're changing is set to the first working set (since that's the one that's used to calculate the warmup weights).

Here's the program I used on the video: https://www.liftosaur.com/p/e475c652

Cannot redeem code/buy subscription without GPS

Hi @astashov

I fully support the decision to monetize the app, since it is on par and many times much better than proprietary apps. The functionality and design are really amazing!

However, for users that do not have Google Play Services (GPS) on their phone, buying a subscription or redeeming a code is not possible. This is unfortunate, because coincidently, most users who do not have GPS on their phone are FOSS supporters who are actively searching for a FOSS gym app.

Therefore, I suggest to you two ways to deal with this, if I may:

  1. Make the PRO version available for FDroid, as Tasks.org (https://tasks.org/) and SimpleMobile (https://www.simplemobiletools.com/) do
  2. Let users donate/transfer money directly to you and provide a code afterwards that can be inserted into the app which activates the PRO features. This is what FairMail app does: https://email.faircode.eu/donate/

[Feature Request] Exercise defaults

Right now depending on the program, creating new exercises take a few too many clicks. I would like to set some global or per program (whatever makes sense to implement) defaults where I can set defaults for "Enable RPE", "Enable Rep Ranges", "Log RPE", "Enable Exercise Rest Timer". Right now the defaults don't match what I want and having to select all these for every exercise is time consuming.

This was also not ideal going from Workout Planner to Liftosaur because I had to go through each exercise and set to set these values.

When editing a program hitting Ctrl+Z deletes all days/excercises

Hi! I was trying out the multi-week program builder (great feature btw, it's going to simplify my current program a lot. No more having a "week" variable on each exercise lol) and I made a typo, I hit Ctrl+Z and the whole program got reset.

I'm attaching a video below but basically what happens is: if you hit Ctrl+Z at any point on the program creation screen the whole program gets reset (I think it creates a new one? Just realized that on my video once it resets the id changes...). It happens even if you have clicked "Save" when creating an exercise, it just wipes everything out.

I'm not sure if it happens on all browsers, I'm running Firefox 117. Not sure if it was happening before or if it's a new bug either.

Here's a quick video: https://github.com/astashov/liftosaur/assets/106948293/191e8678-9284-499d-b74d-16ccf8de6872

[Feature Request] Automatically Use minReps When Using Rep Ranges

Today, using Rep Ranges seems to necessitate the need to use custom progression scripts. If one is using rep ranges, they would most likely consider success to be anywhere in and above the range (i.e., >= minReps).

Automatically leveraging minReps when Rep Ranges are in use would greatly simplify the code required to be written for lifting programs.

[Feature request] iOS live activities

Live activities on iOS are the only feature that I really miss after coming from another workout app.
It would be really great to have that in Liftosaur.

[Feature request] Add a "finish later" button to workouts

Hi! I'd love to have an option to pause workouts and finish them later. Right now I can click on the "Finish workout" button and edit it later but the workout duration counter gets updated and I end up with >15h workouts lol. It's not a big problem since (afaik) that info isn't used in the stats or anything like that but it would still be cool to keep the workout duration to the real time spent working out.

Having an option to pause a workout and resume it later on without it affecting the workout duration would be great.

After the new update, closing the app with an on-going workout deletes that particular workout

Sometimes, I don't finish my workout sessions and I leave it on-going until the next day and I close the app. The next day, I would open the app with the previous session still on-going and finish the workout session.
After the new update, if I close the app with an on-going session active, it ends the session and doesn't record it.
Love the app by the way! I just have this small issue with it.

New state variables only accepted in 'if' clause

Hi,

Love the idea behind this app, thanks for making it.

I think I've found a bug in the script parsing functionality: I get an error when creating a new state variable, unless I'm in the 'true' branch of an if statement. For example, the following two code snippets (placed in the Finish Day Script) both result in Error: Unknown state variable 'someVar':

state.someVar = r[1][4] > 10 ? 15 : 10;
if (completedReps[1] > 10) {
  state.someVar = 15;
} else {
  state.someVar = 10;
}

However, the following is fine:

if (completedReps[1] > 10) {
  state.someVar = 15;
}

Is there a new way to declare state variables that I've missed?

[Feature Request] Create/remove sets programmatically

Hi! First of all: thank you so much for making this app, it's been great so far.

I've programmed the Jacked and Tan 2.0 workout and everything works fine with one exception: on the last weeks of each cycle the program adds a few more sets to a couple exercises. Right now I've added sets with 0 reps and just plan on filling them with 0s until they're needed but it would be great if there was a way to remove/hide those sets until they are required.

Here's what the program looks like on excel. The blue cells are extra sets that are only used on week 4 and 5:
maim_20230422_071633

[Feature Request] 'Global' states shared across days/weeks

5/3/1 uses a 'Training Max' for each 'main lift', and uses a percentage of that weight for a set.

For the template '5/3/1 for beginners', instead of a Training Max, the 1 Rep Max is used. While workable, a separation the testing (1RM) and training (TM) is neater.

I would like to suggest to add global states along side normal states. I.e. global.squatTM and global.benchTM. These values would be accessible by all exercises in that program, regardless of day/week.

App upgraded but features now are behind paywall

Hi @astashov !

I used your app pretty much daily from March to August of last year. I now went back to the gym and noticed your app had some updates in the Play Store. I promptly updated the app to find that it now is rocking a really beautiful and upgraded UI.
Plus, it's finally a native Android app. Congratulations on these upgrades, really.
However, to my dismay, I found that the essential features of the app that I was accustomed to use are now behind a paywall that's actually too steep for me to pay.
I did not find anything on this repo or any type of announcement regarding this paywall, so it would be nice to have been notified.

Thank you.

Run a progression on an exercise only if more than 0 sets finished in a workout

As a Liftosaur user,
I’d like the progression script to only be run on exercises with >0 sets for the workout,
so that ‘current decrease attempt’, ‘current increase attempts’, and/or weight isn’t changed when an exercise isn’t performed during a workout and I won’t have to manually update my program with the prior values after my workout is completed.

[android] Timer does not notify while in the background

Hey there,

Recently bought premium to get the notification support in the background for the timer. Not sure why but when my screen is off or I'm in another app, the timer still doesn't update in the background. I switch back to the app and it would be say 0:45/2:00 and then it updates and dings when I come back to 3:15/2:00.

Steps to repro:

  1. Open workout, start timer
  2. Sleep phone or switch to another app
  3. Wait a few mins, past the timer set
  4. Notice no timer ding.

Expected behavior:

Timer dings/notifies in the background.

Also don't know if there is supposed to be a persistent notif for the app, but I don't see it either.

Great app so far otherwise!

Missing a few staple exercises.

Noticed a handful of basic exercises missing.

  • Hip Adductor
  • Glute Kickback
  • Reverse Lunge
  • Split Squat
  • Wrist Curl
  • Reverse Wrist Curl
  • High Row

Markdown: image with link seems broken in android devices

I written a lot of exercices notes with embed image and links, like:

[![Watch the video](https://img.youtube.com/vi/r8K1Fkch5go/0.jpg)](https://youtu.be/r8K1Fkch5go)
Watch the video

The picture is well displayed in every devices, but the action is different depending the devices:

  • In Firefox, when I click, I'm redirected to the youtube video as planned
  • In Android app, it just open the image in the browser

[Feature Request] - Weekly Schedule

I love the concept of this app. The flexibility of being able to program the progression scheme for workouts is amazing.

The big major feature I feel is lacking still is the ability to create customized weekly schedules for each workout program. For example, to specify a Push/Pull/Legs routine that runs 6 days/week on Mon/Tue/Wed/Thu/Fri/Sat, with Sunday off. This would ideally couple into notifications and enable you to set reminders for specific times to start a workout.

Logged workout reps are deleted when making changes

The app is deletes the logged workout repetition when changing the last rep during workout. This can be frustrating because the user has to start over again.

Steps to Reproduce:

Log a workout rep.
Make changes to the last rep weight.

Expected Behavior:

The logged workout rep should be retained, even when the user is making changes.

Actual Behavior:

The logged workout rep is deleted.

Screen Capture:

https://share.icloud.com/photos/07azxpRyUOIJpMz8Tgi0PSvSQ

[Feature Request] Automatically Update Current 1RM When Logging AMRAP

It would be great if current 1RM was updated automatically when logging a set notated as AMRAP.

For example, the logic could work as follows:

FOR the current reps notated with a "+" for the currently assigned weight
IF there is no existing 1RM (for the above conditions) or if the calculated 1RM is > the current 1RM (for the above conditions)
THEN update current 1RM

IF weight decreases, decrease 1RM based on weight decrease
^^This would only work if you're trying to continually progress / not for planned significant deloads

Not fully fleshed, but the idea is to limit the amount of custom code required for logging 1RM and developing lifting programs

[Feature Request] -- Improve support for cardiovascular exercise

This app could also be very useful for tracking and programming progression in cardio (in addition to weight lifting) with a few small tweaks.

  • Add time (sec, min) and pace (min/mi, min/km) to units
  • Allow the user to specify time or distance instead of number of reps, and use the timer to track duration of exercises
  • Allow user to specify pace instead of weight
  • Add more common cardio exercises to built in list of exercises (cycling and rowing are already present, some other common ones include running, swimming, jump rope, etc)

Image generation

Hi,
I would like to know how you get the image that illustrates the exercices.
Is there a database somewhere or a software to make those illustrations ?

[Bug] Closing the Edit Box Saves Weight Change

Me again, another thing I noticed. When modifying the exercise weight within a workout, if you click the cross (and not done) it will still update the weight, I would expect the changes to only apply if clicking done, and not clicking cross.

Steps to reproduce:

  1. Modify weight of an exercise within a workout
  2. Modify the value
  3. Click the cross, the weight update should still commit

Cannot import data/program

Hi @astashov,

I'm testing the updated app on Android but I cannot import my data backup from the PWA into the android app.
The problem is the following: when I click either the import data from file or import program from file nothing happens. There no dialog popup or anything.

I suspect this could be a permission problem since I'm on Android 13 (GrapheneOS), but liftosaur never prompted for storage permissions.

Thank you!

Website is taking long to load

I don't know if it's just me, but in the past few weeks everytime I visit liftosaur.com it takes ages to load the website.
Doesn't happen on other sites that I visit, so it might be a problem with your website, I guess.

Thanks for creating this beautiful app, discovering it was definitely my highlight of the year!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.