Writing

Plate Math Made Easy

Thursday. Feb 19, 2026

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:

  1. Validate the input
  2. Subtract the bar weight (45 lb)
  3. Split the remaining weight across both sides
  4. Fill each side from largest plate to smallest
  5. 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:

  • targetWeight
  • loadedWeight
  • isExact
  • unallocatedPerSide
  • plates (each with weight and countPerSide)

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.