Marek Dworecki
← All projects

PRogress

A journal of training and diet milestones: it shows what I have achieved and how close I am to the next goal.

A weight trend chart with measurements, a 7-day moving average and a weekly average, and a tooltip for the selected day.
Weight trend: measurements, moving average and weekly average

Problem

Training apps log every set and answer how much I did on Tuesday. PRogress records the moments that mean something: a new record, dropping below a target weight, the hundredth workout of the year. It is meant to answer what I have achieved and how close I am to the next goal.

What it does

  • Strength, weight, counter and yes/no milestones, with automatic detection of completion and a date forecast.
  • Records with estimated 1RM, the main-lifts total and DOTS.
  • Weight with a trend: a moving average and the rate of change with a confidence interval.
  • Diet: daily calorie and macro totals, adaptive TDEE and advice on what to change and by how much.
  • A weekly report, summaries, and JSON export and import.
  • An offline-capable PWA with hand-made SVG charts.
The dashboard: weight, rate and streak

Technical decisions

Statistics honest about small samples

I estimate the rate of weight change with the Theil–Sen estimator and a confidence interval rather than linear regression, and calorie advice goes quiet when the assumed rate falls inside the interval. Instead of a correlation coefficient, which would look scientific and mean nothing with a dozen records a year, I compare percentage changes in body weight and strength.

Measured expenditure instead of a formula

I calculate TDEE from actual intake and weight change, and use the Mifflin formula only as a starting point. Below a threshold of data coverage the figure stays visible but stops setting the target, so it does not deepen a deficit just when the data is weakest.

Do not change a target until it is being met

When weight is flat and intake is 400 kcal over target, the target is not the problem. Calorie advice stays locked while the data is incomplete or intake does not follow the plan.

SVG charts and no file storage

The charts are a dozen lines of inline SVG instead of tens of kilobytes of library, with full control over dark mode. The app stores no files, so it does without Firebase Storage: the profile photo is a 256 px image saved in the profile document.

Diet: the day’s entry and the analysis

Outcome

The app runs at progress.dworecki.dev and I use it on my own data. An audit of the calculation layer on 18 September 2026 found, among other things, macro targets of 0 g when weight was unknown and an advice engine ignoring its own uncertainty. Every item is closed.