Plate Math Made Easy
Plate Math: A Simple Way to Load a Barbell Faster
If you lift regularly, you’ve probably done this: stand next to a bar, do the plate math in your head, feel confident… and still end up re-racking because the total is off.
I built Plate Math to remove that friction.
Plate Math is a small React app: type a target weight and it tells you exactly what to put on the bar—fast. You get:
- A per-side plate breakdown
- The actual loaded weight
- A visual barbell layout
- A “closest possible” fallback when an exact loadout isn’t possible
Update: Kg Support + Interactive Loading + 1RM Mode
Since the first version, I expanded Plate Math beyond “enter a target weight” into something closer to a small training companion.
Kg support (and configurable bars)
Plate Math now supports kilograms, so you can work in either unit system without doing conversions. This also opens the door to different bar standards and training contexts.
Interactive loading mode
Instead of only calculating plates from a target number, you can now load the bar visually:
- Click/tap to add or remove plates
- The barbell graphic updates in real time
- The app continuously shows the current total weight
This mode is great for quick “what am I actually lifting right now?” moments, or when you’re working with a limited plate inventory and want to build the load manually.
One-rep max (1RM) percentage mode
I also added a 1RM mode: enter your one-rep max and the app generates common training percentages (with visuals), so it’s easy to load:
- 60%, 70%, 75%, 80%, 85%, 90% (and more)
- Each percentage includes a plate breakdown and barbell graphic
It turns Plate Math into a fast way to plan working sets—especially on days where you’re following percentage-based programming.
The Problem
Barbell loading has two constraints that make quick mental math weirdly error-prone:
- A standard Olympic bar starts at 45 lb
- Plates must be loaded symmetrically
That means not every number you can type is actually achievable with a typical plate set. For example, 233 lb often can’t be loaded exactly. You either need an exact solution or the nearest valid one.
The Approach
The app uses a simple greedy strategy over common plate sizes:
[45, 35, 25, 10, 5, 2.5]
Workflow:
- Validate the input
- Subtract the bar weight (45 lb)
- Split the remaining weight across both sides
- Fill each side from largest plate to smallest
- Return an exact match, or the closest loadout available
This matches how lifters load a bar in real life: start heavy, then fine-tune.
Implementation Highlights
Input handling and validation
The main UI (frontend/src/App.jsx) owns the form state and blocks invalid inputs (empty, non-numeric, or non-positive values). If it’s not a usable number, the app doesn’t pretend it is.
Plate calculation logic
The core logic lives in frontend/src/utils/calculatePlates.js.
It returns a structured result that includes:
targetWeightloadedWeightisExactunallocatedPerSideplates(each withweightandcountPerSide)
That shape keeps the UI simple and leaves room for extensions later (API output, shareable/printable “load cards,” saved workouts, etc.).
Visual barbell rendering
frontend/src/components/BarbellGraphic.jsx turns the plate counts into mirrored left/right sleeves. Plate widths, heights, and colors vary by plate type so the result is readable at a glance—less thinking, fewer mistakes.
Why This Works Well
- Fast: instant results after entering a target
- Practical: shows the closest loadable weight when exact math is impossible
- Readable: “per side” + a visual layout reduces misloads
- Maintainable: calculation and rendering are cleanly separated
Plate Math is intentionally small, but it solves a real gym workflow problem with a clean UI and predictable logic.