u/astashov

📄 RFC: Rethinking UI for editing programs

P.S.: Video is just a rough prototype to illustrate the idea, not a real UI :)

Current UI for editing programs doesn't work very reliably, and frankly quite confusing. Especially if it edits the programs with reusing logic, and repeating over several weeks. Then, just adding or deleting a day or an exercise may make the program invalid - for example if that exercise was reused by other exercises. And then it gets into plain text mode with a scary syntax error.

That can scare away users, especially the new ones, who's just trying the app. And generally, the current UI doesn't give a great visibility into a program.

I realized that the current UI just doesn't mirror the data model well. In Liftoscript - weeks and days are just containers for exercises. And exercises span the days when repeating - so reordering a day often doesn't make sense - a day is ephemeral, a repeated exercise shows up in a day if the day is there. But if not - it's not added.

What would be the right UI though? I thought - maybe it should be actually a calendar-like. Something similar to Google Calendar or Cal.app. You have weeks as columns. Days as cells within those columns. And exercises are like "events" you add to days. Which can span multiple days.

You cannot move weeks or days around, they're just there as containers. Instead - you move exercises. If an exercise is repeated across weeks - it spans multiple weeks. If it's a reusing one - it highlights the template it reuses if you tap it. You can drag the right edge to change repeating, and you can just drag the exercise around to move it between days and weeks.

You can multiselect few exercises by tapping on them and move them together to some week/day. Tapping on an exercise shows info at the bottom, and ability to edit it there.

Tapping on a template highlights all the exercises that use that template.

You can zoom in/out by pinching, and also use landscape mode for better visibility for many-week programs.

That should solve the whole class of issues of the current program editing UI, and it's easier to ensure the program is always structurally correct. It also maps waaay better to the Liftoscript structure, with all its Bicep Curl[1-12].

BTW, the program on the video is this 5/3/1 BBB - this is the Liftoscript - https://www.liftosaur.com/programs/the531bbb

Basically, I'm trying to find a replacement for these 2 tabs on the Program screen

What do you think? Yay or nay? Is it even more confusing? :) Would love to hear your thoughts!

u/astashov — 4 days ago

📣 Added time-based exercises support and intervals/circuits

You can now time the set itself, not just the rest after it. Great for planks, timed cardio, or any "hold for X seconds" exercise. Use the setTimer|restTimer syntax:

Plank / 3x1 0lb 60s|30s

That's 3 sets of plank, holding each for 60s, then resting 30s. Add + to count up past the target instead of stopping automatically (like 30s+|60s). Add auto to auto-advance to the next set when the rest ends - which is how you build circuits like EMOM or Tabata:

// EMOM - 5 rounds, 5 reps, 1-minute window
Power Clean / 5x5 135lb 60s|0s auto
// Tabata - 8 rounds of 20s work / 10s rest
Squat, Bodyweight / 8x1+ 0lb 20s|10s auto

In the UI (in the app, in Live Activity / Live Update, and in Apple Watch as well), you'll get a set timer modal if the current set has time.

Read more in the docs - section "Set timers (active timers) and circuits".

⚠️ You need an iOS/Android native app update (from App Store / Google Play) to get this feature.

u/astashov — 5 days ago

📄 RFC: Time-based exercises and circuits support

I'm trying to think through how to add support for the time-based exercises, and also support the circuits better. So, I'm proposing the following changes to the Liftoscript and the app, and would love your opinion on them!

Active (set) and rest timers in Liftoscript

You can now optionally specify both the active timer and the rest timer, separating by |. I.e. setTimer|restTimer. Would look like this:

Plank / 3x1 60s|30s

That'd be 3 sets of planks, you do them for 60s, and then rest for 30s.

If you want to keep the default rest timer, and only use set timer, it'd be 60s|? - question mark for the rest timer falls back to global default one.

The + modifier on the set timer would make the timer go over the threshold, so you'd need to stop it manually to record the time. E.g. Plank / 3x1 60s+|30s doesn't stop automatically, you'd need to stop it and that would record the time.

The target and completed set timer would be available in progress and update blocks as setTime and completedSetTime.

Auto

There's also a new keyword auto - if presented, it'll automatically goes to next set after the rest timer. This lets you to do circuits, e.g. EMOM or Tabata:

// EMOM - 5 rounds, 5 reps, 1-min window
emom: Power Clean / 5x5 135lb 60s|0s auto

// Tabata - 8 times do 20s work / 10s rest, record reps
tabata: Squat, Bodyweight / 8x1+ 20s|10s auto

Active set timer during workout

During workout, while the set timer is active, it'll show the timer in a modal with big numbers, going up, and will show a threshold. It would have 2 buttons:

  • record time and continue (so it'd switch to the rest timer when it hits the threshold)
  • and record time and stop (so it'd switch to rest timer immediately).

Set time in the set row

Probably will show it where the RPE is right now. If it's both RPE and time - it'd be 2 lines - RPE on top, and time underneath. Tapping on time would let you to edit it.

So, what do you think? Some use case I'm missing here that is important for you? Let me know in the comments!

reddit.com
u/astashov — 18 days ago

📣 Added API / MCP for the equipment and exercise data

Now you can manage your gyms and equipment through API and MCP, as well as managing the exercise data:

  • 1RM value
  • Muscle overrides
  • Equipment assigned to exercises
  • Default rounding
  • Whether the exercise is unilateral
  • Exercise persistent notes
reddit.com
u/astashov — 21 days ago

📣 Improved importing workouts

Import history although a pretty rarely used feature - is one of the most dangerous. With slightly wrong CSV file, you can massively mess up your workout history, and cleaning it up or restoring the account may be hard and painful.

Now that functionality is way less destructive. When you import Liftosaur CSV or Hevy CSV, it'll show you a preview screen, where it will display:

  • The workout history preview - the way you'd see it on the Home screen
  • Warnings - like if some weights or reps look suspicious, if there are duplicated workouts, if dates look wrong, etc
  • Summary stats - like how many workouts, exercises, sets, etc would be imported
  • The list of custom exercises that would be created by the import

And after your import it - there's still a way to "undo" the import - you can go to Me -> Recent Imports, and there you'll see the list of 5 last imports, with the option to undo each of them. Undoing the import would remove all workouts that were imported in that import, as well as custom exercises that were created in that import (unless they already used in other workouts or programs).

u/astashov — 28 days ago

📣 Liftosaur on React Native

Aaaand it's finally out! Update the app from App Store or Google Play, and enjoy this new experience.

The main difference would be in screen navigation (with pushing animation when you e.g. go from workout to exercise stats screen), modals should look different, you can swipe them away with a gesture. Mostly, the app would look the same though.

reddit.com
u/astashov — 1 month ago

🚧 Liftosaur on React Native - Beta version

You can try the new React Native Beta version of Liftosaur now. This is how:

Android

Join this Google Group - https://groups.google.com/g/liftosaur-beta

And then if you go to - https://play.google.com/store/apps/details?id=com.liftosaur.www.twa, at the bottom there should be a way to join the beta program. When you tap it, in a few minutes you should be able to download the beta version of the app (version 110).

If it doesn't work - try this URL: https://play.google.com/apps/testing/com.liftosaur.www.twa

iOS

Go there: https://testflight.apple.com/join/89juheb9, and join the beta, and install the app.

After that

Make sure to kill/restart the app a couple times, to get the latest updates over the air too.

Check for the bugs, or any performance issues. Please report here, or on Discord.

The main difference probably would be in screen navigation (with pushing animation when you e.g. go from workout to exercise stats screen), modals should look different, you can swipe them away with a gesture. All that stuff.

I really appreciate your feedback! Check it out!

reddit.com
u/astashov — 1 month ago

In preparation for migrating the app from a webapp (like it is right now) to a native (React Native) app, I had to do a massive rewrite of the whole codebase. But the functionality stays the same. The only difference is graphs look slightly different (had to rewrite the graphs engine from the scratch).

I could introduce new bugs though! So, if you notice something broken/weird - please let me know!

u/astashov — 2 months ago