Trainer software
you can read.

ScopeStrength is open source personal trainer software. Trainers manage clients, build programmes and track progress. Clients log their own workouts, weight and photos, and message their trainer. One Phoenix application, one PostgreSQL database, the whole thing in the repository.

No account needed for the demo. No feature flags. No phone-home.

Weekly Volume

Direct and effective sets per muscle group

  • Chest5 direct, 2 effective
  • Triceps2 direct, 4 effective
  • Front Delts3 direct, 3 effective
  • Biceps2 direct, 2 effective
  • Lats4 direct, 2 effective
DirectEffective

Why open source

01

Your data stays yours

Self-host and client names, weights, notes and photos live in your own database and your own file storage. Nothing leaves your machine.

02

Nothing is held back

The hosted version and the repository are the same code. There is no enterprise edition, and you can check.

03

Read the whole thing

One Phoenix app, not a service mesh. The progression rules, the volume maths and the access checks are each a single readable module.

Everything a coaching practice needs

Manage clients, write programmes, judge every set and watch the numbers move, all from one place. Nothing here is gated.

Clients

Add clients, record age, height, sex and notes, and keep dated session notes per client. Invite by email and they link to you at registration.

Programmes

Build programmes from templates, each holding exercises with sets, reps or a rep range, and RIR. Duplicate a programme in one click.

Assignment

Assign a programme to a client. One active programme at a time, enforced in the database, and the client is notified either way.

Progression

Pick a method per programme and a rep range per exercise. Every logged set is judged: progress, hold or reduce.

Client progress

Per-exercise strength history, personal records, session by session comparisons, body weight charts and progress photos.

Volume tracking

Weekly or monthly set counts per muscle group, split into direct and effective volume using contributions you can tune.

Exercise library

97 seeded exercises across 20 muscle groups and 6 equipment types. Add your own, mark them unilateral, edit their muscle contributions.

Chat

Real-time messaging with each client, with file and image attachments, over a websocket with no page reloads.

Reports

Export a client's weight history and full workout log as a spreadsheet.

Standing Calf Raise

Strength progress

Personal record
135.0kg
PR reps
7.0reps
Avg reps
11.2reps
Sessions
35
Date
Trend
Set 1
Set 2
21 Aug 2026
+5.0 kg
120.0 kg x 15
125.0 kg x 12
18 Aug 2026
+1.0 reps
120.0 kg x 14
120.0 kg x 13
12 Aug 2026
same
120.0 kg x 13
120.0 kg x 12
05 Aug 2026
+3.0 reps
115.0 kg x 15
115.0 kg x 12

The part worth reading first

A programme carries a progression method. Each exercise carries a rep range. On assignment the app creates one progression row per set, and after every logged set it decides what the client sees. The method implemented today is dynamic double progression.

Reps logged
Status
At or above the maximum
The range is beaten. Add load next session.
progress
Between minimum and maximum
Stay at this load and add reps.
hold
Below the minimum
The load is too heavy. Cut it.
reduce
Read progression.ex
Judged per set, per side
Each set is judged on its own. Unilateral exercises get one judgement per side, so left and right progress independently.
A judgement, not a prescription
The app records whether the set beat, met or missed its range. The client decides what to load next session.
Ranges take effect immediately
Changing a rep range re-judges each row against its most recent set, so a tightened range never leaves stale badges behind.
Sensible fallbacks
Extra sets inherit the prescription of the ones that exist. An ad hoc exercise with no prescription falls back to a 5 to 10 range.
Adding a method

The rules live in a pure module with no database access. Adding a method means adding one clause and one list entry.

Load a day, log the sets

Clients get their own account, their own log and their own view of progress. The programme their trainer assigned is one tap away.

Workout logging
Create a workout, add exercises, and log weight, reps, RIR and RPE per set. Load a day straight from the assigned programme.
Unilateral exercises
Log left and right separately. Each side is counted and progressed on its own.
Their own programmes
Copy the assigned programme and adapt it, or build one from scratch and load days from that instead.
Progress
Strength progress per exercise, volume by muscle, a body weight log and progress photos.
Chat and notifications
Message the trainer, and get notified the moment a programme is assigned or changed.
Upper
Loaded from Strength Block III
1 set each
Smith Machine PressMachine Shoulder PressPull UpPec DeckCable RowIncline Dumbbell PressRecline Preacher Curl
7 exercises7 sets ready

Talk it through, break the plateau

Built on Phoenix LiveView. Chat, notifications and the unread badge update over a websocket with no page reloads, and attachments go along with the message.

Mike Torres
Your trainer
Bench has sat at 92.5 for three weeks now. Feels heavy on set three.
08:14
Saw the session come in. Your triceps volume is low, only 2 direct sets. Adding rope work twice a week.
08:31
Makes sense. Loaded the new upper session already.
08:36
Log Sunday's session and we will compare the block against June.
08:37
Write a message

Notifications

4 today
Alex finished Upper Power A2 min ago
Maya hit a new record on Hack Squat1 hr ago
Devin logged Lower Volume BYesterday
Priya assigned Strength Block III2 days ago

Assigning or removing a programme notifies the client. Every finished workout notifies the trainer. Nothing is polled.

Two ways to run it

Use the hosted version at scopestrength.com, or clone the repository and run it on your own machine. Both are the same application.

Hosted
Ready to use
Sign up at app.scopestrength.com and start today.
Try the demo

One button on the login page creates a trainer, three clients, two programmes and a set of logged workouts, so you can see the app with data in it before creating an account.

The same code as this repository, nothing held back
Nothing to install and no tier to upgrade to
Installable to a phone home screen, works on a flaky connection
Same code as the repository, always.
AGPL-3.0
Self-host
Your own server
Nothing to configure to run locally.
git clone https://github.com/Ebrahimgreat/scopestrength
cd scopestrength
mix setup
mix phx.server
Your database, your file storage, your SMTP server
Uploads go to local disk, email goes to /dev/mailbox
One release, one Phoenix app, no service mesh
Open http://localhost:4000
Production

Set these, then pick your email and storage adapters below. Everything is documented in .env.example.

DATABASE_URLrequired
SECRET_KEY_BASErequired
PHX_HOSTrequired
PORToptional, defaults to 4000
POOL_SIZEoptional, defaults to 2
Elixir1.14 or newer
PostgreSQL14 or newer
Nodenot required

Swap the parts you care about

Email and file storage sit behind adapters, chosen with environment variables. Point them at your own infrastructure, or change your mind later without a migration.

Email

MAILER_ADAPTER
smtpAny SMTP server
resendMAILER_API_KEY
sendgridMAILER_API_KEY
postmarkMAILER_API_KEY
mailgunAPI key + domain

Leave it unset in development and mail is kept in memory for you to read at /dev/mailbox.

File storage

S3_BUCKET
Local diskDefault, nothing to configure
AWS S3S3_BUCKET + keys
Cloudflare R2S3_HOST
Backblaze B2S3_HOST
MinIOS3_HOST
DigitalOcean SpacesS3_HOST

Files land in priv/static/uploads by default. Nothing to configure until you want more.

Keys in the database, never URLs

What gets stored is a key. Switching from local disk to object storage, or between providers, does not rewrite a single existing row.

Private buckets, presigned URLs

Progress photos and chat attachments are served through URLs that expire. The bucket stays private.

Uploads skip the server

Large files go straight from the browser to the bucket rather than through your application.

No provider account required

Any SMTP server works, so you are never forced into a relationship with a particular vendor to send a password reset.

Adding your own backend

Implementing three functions of the Scopestrength.Storage behaviour is the whole job. No fork, no patched vendor directory.

Read storage.ex

Hello.

Ebrahim Shahid Arshad
Ebrahim Shahid Arshad
Software engineer

I am Ebrahim, I write software, and ScopeStrength is the project I keep coming back to. It started because personal trainer software kept hiding the two things that matter most, the volume maths and the progression rules, behind a subscription. So I wrote my own and put the whole thing under a licence that keeps it open.

If you want to connect, I would genuinely like to hear from you. Trainers telling me what is missing, engineers who want to work on it, or anyone who has it running on their own server and hit something odd. Email me directly, or open an issue if it belongs in the code.

How it is built

I love working in Elixir, and this is the stack I reach for. Everything below is a deliberate choice rather than a default.

Elixir and Phoenix
My go-to stack. The server side logic, the contexts, the progression rules and the volume maths are all plain Elixir modules with no framework magic in the way.
LiveView over a websocket
Chat, notifications and the unread badge update without a page reload and without a separate front end to keep in sync.
PostgreSQL doing real work
Constraints where they belong. One active programme per client is enforced by the database, not by hoping the application remembers.

Free software. Read the whole thing.

ScopeStrength is licensed under the GNU Affero General Public License v3.0 or later. Run it, study it, modify it, share it. If you run a modified version as a service, offer your users the source.

Pull requests welcome. Run mix test first, add a test alongside any fix. Read the licence.