← All projects
OBJ-02Major Leaguelive · Explainer

Seam-Shifted Wake

For three centuries, a curving ball was a story about spin. Then a lab in Utah showed the seams can steer a pitch on their own.

Illustration of air streaming past a baseball, with a seam near the top, the wake tipping up toward it, and an arrow pushing the ball down
Sinker seam push
7.1 in
Story starts
1672
Interactives
4

An interactive explainer on the seam-shifted wake: how a baseball’s seams, not just its spin, can push a pitch off course. It runs from Newton’s curving tennis ball in 1672 to the Utah State lab that named the effect in 2019, then shows how it works and what Statcast says about it.

Read the explainer →

What’s in it

  • A timeline of 20 moments, each linked to its source.
  • A wind tunnel in cross-section: how air clings to a ball, where it lets go, and why a seam near the middle pushes the ball away from it.
  • A spinning ball you can turn in your hand. A ring around its middle glows where seams keep sitting through each spin. Balanced grips cancel; lopsided ones push.
  • The data: for each pitch type, how far it moves beyond what its spin explains, from every pitcher’s numbers on Baseball Savant, 2020–2026.

How it’s built

  • Data: Baseball Savant’s spin direction leaderboard, which gives each pitcher’s measured spin direction and the direction the pitch really moved. analyze.py splits the movement into the part spin explains and the part it doesn’t. The downloads stay local; the page shows only averages and a few named examples.
  • The spinning ball is a model, not a flow simulation. It counts how often a seam sits within 10 degrees of the ball’s middle, the band where Smith’s lab found seams trip the air off early. grips.py finds the grips that come closest to what Statcast measures for each pitch type.
  • The history comes from primary sources wherever they exist: the papers, Barton Smith’s own lab notes, and Alan Nathan’s analyses. The full dated list is in the project’s notes.

Status

Live. The numbers update when analyze.py is rerun after a season.