Linebackers: Keys, Flow, Tackling, and the Hardest Job on the Field

The players between the line and the secondary: where they stand, what they look at, where they go in the first second, and why the position keeps getting smaller and faster

Show the Python (shared helpers for this chapter’s diagrams)
import logging
logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, Polygon, Rectangle, RegularPolygon
from gridiron import Play, Player, Field, offense, technique, style, routes as r
from gridiron.play import draw_marker

GREEN = "#0f7a55"         # darker step of the aqua highlight, for text on the light field
PURPLE = style.SERIES[6]  # a third colour that is neither offense blue nor defense orange
OL_KEYS = ("LT", "LG", "C", "RG", "RT")


def pdf_build():
    return os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")


def O(key, pos, d, w, label):
    return Player(key, pos, "off", d, w, label=label)


def D(key, pos, d, w, label):
    return Player(key, pos, "def", d, w, label=label)


def line(labels="full"):
    """The five offensive linemen, labelled LT..RT ("full") or with one letter, T G C G T ("short")."""
    short = {"LT": "T", "LG": "G", "C": "C", "RG": "G", "RT": "T"}
    return [p.moved(label=(p.key if labels == "full" else short[p.key])) for p in offense("singleback")
            if p.key in OL_KEYS]


def te(side=1, key=None, label=None):
    """An in-line tight end: Y on the right, U on the left."""
    key = key or ("Y" if side > 0 else "U")
    return O(key, "TE", -0.7, side * 4.8, label or key)


def T(t, side=1):
    """Width of technique t on the offense's right (side=+1) or left (side=-1)."""
    return technique(t, side)


def go_to(p, key, end, kind="path", delay=0.0, speed=None, via=()):
    """Move `key` through absolute (d, w) points `via` to `end`, as a path, run, route, block or pull."""
    start = np.array(p._cur(key))
    pts = [tuple(np.array(q) - start) for q in (*via, end)]
    if kind == "block":
        return p.block(key, pts=pts, delay=delay, speed=speed)
    if kind == "pull":
        return p.pull(key, pts, delay=delay, speed=speed)
    if kind == "route":
        return p.route(key, pts, frame="field", delay=delay, speed=speed)
    return {"path": p.path, "run": p.run}[kind](key, pts, delay=delay, speed=speed)


def path_len(pts):
    """Length in yards of a path through (d, w) points."""
    return float(sum(np.hypot(b[0] - a[0], b[1] - a[1]) for a, b in zip(pts[:-1], pts[1:])))


def _P(fld, p, d, w):
    return fld.xy(*p.to_abs(d, w))


def say(fld, p, d, w, text, color=style.INK_2, fontsize=7.2, ha="center", weight="normal"):
    """A short on-field label at (d, w)."""
    x, y = _P(fld, p, d, w)
    fld.ax.text(x, y, text, fontsize=fontsize, color=color, ha=ha, va="center", zorder=9, fontweight=weight,
                bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9))


def point_to(fld, p, text_at, target, text, color=style.INK_2, fontsize=7, shrink=7):
    """A label with a thin leader line to the player or spot it names."""
    (xt, yt), (xp, yp) = _P(fld, p, *text_at), _P(fld, p, *target)
    fld.ax.annotate(text, (float(xp), float(yp)), xytext=(float(xt), float(yt)), fontsize=fontsize,
                    color=color, ha="center", va="center", zorder=9,
                    arrowprops=dict(arrowstyle="-", color=color, lw=0.7, shrinkA=2, shrinkB=shrink),
                    bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9))


def gap_tag(fld, p, d, w, text, color=GREEN, fontsize=7.6):
    """A gap letter in a small rounded box."""
    x, y = _P(fld, p, d, w)
    fld.ax.text(x, y, text, fontsize=fontsize, color=color, ha="center", va="center", zorder=9,
                fontweight="bold", bbox=dict(boxstyle="round,pad=0.2", fc=style.SURFACE, ec=color, lw=1.0))


def spot(fld, p, d, w, color=style.DEFENSE_DARK, ms=10):
    """Mark a point (a tackle, a meeting point) with an X."""
    x, y = _P(fld, p, d, w)
    fld.ax.plot([x], [y], marker="X", ms=ms, color=color, mec="white", mew=0.8, zorder=12)


def ring(fld, p, key, color=GREEN, r=1.25, lw=1.8, ls="-"):
    """A ring around a player at his alignment."""
    q = p.players[key]
    x, y = _P(fld, p, q.d, q.w)
    fld.ax.add_patch(Circle((float(x), float(y)), r, fc="none", ec=color, lw=lw, ls=ls, zorder=7.5))


def lane(fld, p, w0, w1, d0, d1, color=style.OFFENSE, alpha=0.10, ls=(0, (3, 2))):
    """Shade a rectangle from width w0 to w1 and depth d0 to d1."""
    (x0, y0), (x1, y1) = _P(fld, p, d0, w0), _P(fld, p, d1, w1)
    fld.ax.add_patch(Rectangle((min(x0, x1), min(y0, y1)), abs(x1 - x0), abs(y1 - y0), fc=color, alpha=alpha,
                               ec=color, lw=0.9, ls=ls, zorder=0.8))


def dashed(fld, p, pts, color=style.THIRD, lw=1.5, dash=(0, (3, 2.2)), end="arrow"):
    """A dashed 'what if' or 'intent' path through absolute (d, w) points."""
    xs, ys = _P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    xs, ys = np.asarray(xs, float), np.asarray(ys, float)
    if end == "arrow":
        hx, hy = xs[-2] + 0.75 * (xs[-1] - xs[-2]), ys[-2] + 0.75 * (ys[-1] - ys[-2])
        xs = np.concatenate([xs[:-1], [hx, xs[-1]]]); ys = np.concatenate([ys[:-1], [hy, ys[-1]]])
        fld.ax.plot(xs[:-1], ys[:-1], color=color, lw=lw, ls=dash, zorder=6)
        fld.ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>",
                                         mutation_scale=10, color=color, lw=lw, zorder=6))
    else:
        fld.ax.plot(xs, ys, color=color, lw=lw, ls=dash, zorder=6)


def solid(fld, p, pts, color=style.DEFENSE, lw=1.6, z=5, head=True):
    """A solid path with an arrowhead, through absolute (d, w) points."""
    xs, ys = _P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    xs, ys = np.asarray(xs, float), np.asarray(ys, float)
    fld.ax.plot(xs, ys, color=color, lw=lw, zorder=z, solid_capstyle="round")
    if head:
        fld.ax.add_patch(FancyArrowPatch((xs[-2] + 0.7 * (xs[-1] - xs[-2]), ys[-2] + 0.7 * (ys[-1] - ys[-2])),
                                         (xs[-1], ys[-1]), arrowstyle="-|>", mutation_scale=10, color=color,
                                         lw=lw, zorder=z))


def eyes(fld, p, a, b, color=style.THIRD):
    """A dotted 'eyes' line from defender a's current spot to his key b (absolute (d, w) points)."""
    (x0, y0), (x1, y1) = _P(fld, p, *a), _P(fld, p, *b)
    fld.ax.plot([x0, x1], [y0, y1], color=color, lw=1.3, ls=(0, (1.2, 1.4)), zorder=6.5)


def ghost(fld, p, d, w, label, side="def"):
    """A faint, dotted outline where a player USED to be."""
    x, y = _P(fld, p, d, w)
    x, y = float(x), float(y)
    if side == "def":
        fld.ax.add_patch(RegularPolygon((x, y), 4, radius=0.75 * 1.25, orientation=np.pi / 4, fc="none",
                                        ec=style.DEFENSE, lw=1.0, ls=(0, (1.5, 1.2)), zorder=7))
        fld.ax.text(x, y, label, ha="center", va="center", fontsize=6.5, color=style.MUTED, zorder=7)
    else:
        fld.ax.add_patch(Circle((x, y), 0.75, fc="none", ec=style.OFFENSE, lw=1.0, ls=(0, (1.5, 1.2)), zorder=7))


def bracket(fld, p, d, w0, w1, color=style.DEFENSE_DARK, lw=1.4, tick=0.35):
    """A bar from w0 to w1 at depth d, with end ticks."""
    (xa, ya), (xb, yb) = _P(fld, p, d, w0), _P(fld, p, d, w1)
    fld.ax.plot([xa, xb], [ya, yb], color=color, lw=lw, solid_capstyle="butt", zorder=5)
    for w in (w0, w1):
        (x0, y0), (x1, y1) = _P(fld, p, d - tick, w), _P(fld, p, d + tick, w)
        fld.ax.plot([x0, x1], [y0, y1], color=color, lw=lw, zorder=5)


def clean(ax):
    """Box-zoomed diagrams: drop hash ticks and yard numbers, clip anything outside the window."""
    for ln in list(ax.lines):
        xs, ys = ln.get_data()
        if len(xs) == 2 and ln.get_linewidth() == 0.5 and np.hypot(xs[1] - xs[0], ys[1] - ys[0]) < 1.0:
            ln.remove()
    for t in list(ax.texts):
        if t.get_text().isdigit() and t.get_alpha() == 0.55:
            t.remove()
        else:
            t.set_clip_on(True)


def draw(p, width_in=5.8, ax=None, **kw):
    """Play.draw, sized for the page, cleaned for a box-sized window."""
    fld = p.draw(width_in=width_in, ax=ax, **kw)
    clean(fld.ax)
    return fld


def title(ax, text, size=8.6):
    ax.set_title(text, fontsize=size, loc="left", color=style.INK, fontweight="bold")


# --- fronts used throughout (tight end, and so the strength, on the offense's RIGHT) -------------------
def over_front(s=1, sam=True, mike_w=0.8, will_w=-2.0):
    """4-3 Over to side s (as in 05-02): weak 5, 1 shaded weak, 3 strong, strong 5; Sam off the ball
    outside the TE, Mike over the strong A gap, Will over the weak (uncovered) guard."""
    out = [D("WE", "DE", 1.0, T("5", -s), "5"), D("NT", "DT", 1.0, T("1", -s), "1"),
           D("DT", "DT", 1.0, T("3", s), "3"), D("SE", "DE", 1.0, T("5", s), "5"),
           D("MIKE", "LB", 4.5, s * mike_w, "M"), D("WILL", "LB", 4.5, s * will_w, "W")]
    if sam:
        out.append(D("SAM", "LB", 4.2, s * 6.2, "S"))
    return out


def nickel_front(mike=(4.6, 1.6), will=(4.6, -1.6), wide_ends=True):
    """A 4-2-5 nickel front against a one-tight-end offense (TE right): 5 (wide) on the left, 3 on the left
    guard, 1 shaded right of the center, 5 on the right tackle; two linebackers."""
    le = -5.0 if wide_ends else T("5", -1)
    return [D("WE", "DE", 1.0, le, "5"), D("DT", "DT", 1.0, T("3", -1), "3"),
            D("NT", "DT", 1.0, T("1", 1), "1"), D("SE", "DE", 1.0, T("5", 1), "5"),
            D("MIKE", "LB", mike[0], mike[1], "M"), D("WILL", "LB", will[0], will[1], "W")]


# --- frame strips (PDF) and video (web) for the simulated plays --------------------------------------
MARK_R = 0.62


def tracking(play):
    df = play.to_tracking()
    df["_id"] = df["displayName"].astype(str)
    return df


def panel(ax, play, df, t, lateral, window, rings=(), enter=(), ring_r=0.85):
    """One moment of a simulated play on `ax`: markers, trails of on-screen players, rings."""
    tmap = df.groupby("frameId")["time"].first()
    fid = int((tmap - t).abs().idxmin())
    ylo, yhi = sorted((play.ball_y - lateral[0], play.ball_y - lateral[1]))
    fld = Field(ax=ax, orient="vertical", los=play.los, window=window, numbers=False, hashes=False,
                lateral=(ylo, yhi), to_go=play.to_go)
    cur = df[df["frameId"] == fid]
    snap = df[df["frameId"] == int((tmap - 0.0).abs().idxmin())]
    first = snap[snap["x"].between(play.los + window[0] + 0.8, play.los + window[1] - 0.8)
                 & snap["y"].between(ylo + 0.8, yhi - 0.8)]
    ids = set(first["_id"]) | {"football"}
    inside = cur[cur["x"].between(play.los + window[0], play.los + window[1]) & cur["y"].between(ylo, yhi)]
    ids |= set(inside["_id"]) & set(enter)
    shown = cur[cur["_id"].isin(ids) | (cur["side"] == "ball")]
    trails = df[(df["frameId"] <= fid) & df["_id"].isin(ids) & (df["side"] != "ball")]
    for (_, side), g in trails.groupby(["_id", "side"]):
        xs, ys = fld.xy(g["x"].values, g["y"].values)
        ax.plot(xs, ys, color=style.OFFENSE if side == "off" else style.DEFENSE, lw=0.9, alpha=0.4, zorder=3)
    ppy = fld.pts_per_yard()
    for _, r_ in shown.iterrows():
        x, y = (float(v) for v in fld.xy(r_["x"], r_["y"]))
        if r_["side"] == "ball":
            ax.add_patch(Ellipse((x, y + 0.45), 0.7, 0.42, fc=style.BALL, ec="white", lw=0.5, zorder=9))
            continue
        lab = str(r_.get("label", "") or "")
        if r_["side"] == "off":
            ax.add_patch(Circle((x, y), MARK_R, fc=style.OFFENSE, ec="white", lw=0.6, zorder=8))
            tc = "white"
        else:
            ax.add_patch(RegularPolygon((x, y), 4, radius=MARK_R * 1.3, orientation=np.pi / 4,
                                        fc=style.DEFENSE_TINT, ec=style.DEFENSE, lw=1.0, zorder=8))
            tc = style.INK
        fs = max(4.0, min(8.0, ppy * (0.85 if len(lab) <= 1 else 0.62)))
        ax.text(x, y, lab, ha="center", va="center", fontsize=fs, color=tc, fontweight="bold", zorder=10)
    for key, col in rings:
        r_ = cur[cur["displayName"] == key].iloc[0]
        x, y = fld.xy(r_["x"], r_["y"])
        ax.add_patch(Circle((float(x), float(y)), ring_r, fc="none", ec=col, lw=1.6, zorder=7))
    for patch in ax.patches:
        patch.set_clip_on(True)
    return fld


def strip(moments, lateral, window, notes=None, rings=(), ncols=2, width_in=5.2, after=None, enter=()):
    """Numbered frame strip. `moments` is a list of (play, t, tag)."""
    cache = {}
    nrows = int(np.ceil(len(moments) / ncols))
    pw = width_in / ncols
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, axes = plt.subplots(nrows, ncols, squeeze=False,
                             figsize=(width_in, nrows * (pw * span_d / span_w + (0.62 if notes else 0.25))))
    for ax in axes.flat[len(moments):]:
        ax.axis("off")
    for i, (ax, (play, t, tag)) in enumerate(zip(axes.flat, moments)):
        if id(play) not in cache:
            cache[id(play)] = tracking(play)
        fld = panel(ax, play, cache[id(play)], t, lateral, window, rings, enter)
        if after:
            after(fld, play, t, i)
        lab = "snap" if abs(t) < 1e-6 else f"{t:+.1f} s"
        ax.set_title(f"{i + 1}.  {lab}" + (f"   {tag}" if tag else ""), fontsize=8.0, color=style.INK_2, loc="left")
        if notes:
            ax.text(0.5, -0.03, notes[i], transform=ax.transAxes, ha="center", va="top",
                    fontsize=6.9, color=style.INK)
    fig.tight_layout(h_pad=1.3 if notes else 0.6, w_pad=0.6)
    return fig


def video(segments, lateral, window, rings=(), width_in=4.6, after=None, enter=()):
    """Web version: each (play, tag, [(t, note), ...]) segment played in turn, notes as captions."""
    import shutil
    from matplotlib import animation
    from IPython.display import HTML, display
    span_w, span_d = lateral[1] - lateral[0], window[1] - window[0]
    fig, ax = plt.subplots(figsize=(width_in, width_in * span_d / span_w + 0.45))
    frames = []
    for play, tag, notes in segments:
        df = tracking(play)
        tmap = df.groupby("frameId")["time"].first()
        frames += [(play, df, float(tmap[f]), tag, notes) for f in sorted(df["frameId"].unique())]

    def update(k):
        play, df, t, tag, notes = frames[k]
        ax.clear()
        fld = panel(ax, play, df, t, lateral, window, rings, enter)
        if after:
            after(fld, play, t, -1)
        txt = ("snap" if abs(t) < 0.05 else f"{t:+.1f} s") + (f"  {tag}" if tag else "")
        cur = [n for tt, n in notes if tt <= t + 1e-6]
        ax.set_title(txt + (("\n" + cur[-1].replace("\n", " ")) if cur else ""), fontsize=8.5, color=style.INK,
                     loc="left")
        return []

    anim = animation.FuncAnimation(fig, update, frames=range(len(frames)), interval=100)
    html = (anim.to_html5_video(embed_limit=40).replace("<video ", '<video style="max-width:100%;height:auto" ')
            if shutil.which("ffmpeg") else anim.to_jshtml(default_mode="once"))
    plt.close(fig)
    display(HTML(html))


def animation_or_strip(moments, notes, lateral, window, rings=(), after=None, enter=(), ncols=2, width_in=5.2):
    """Video on the website; a numbered, captioned frame strip in the PDF."""
    if pdf_build():
        strip(moments, lateral, window, notes=notes, rings=rings, ncols=ncols, width_in=width_in,
              after=after, enter=enter)
        plt.show()
        return
    segs = []
    for play, t, tag in moments:
        if not segs or segs[-1][0] is not play:
            segs.append((play, tag, []))
    for (play, t, tag), n in zip(moments, notes):
        for s in segs:
            if s[0] is play:
                s[2].append((t, n))
    video(segs, lateral, window, rings=rings, after=after, enter=enter)
Show the Python (the data behind this chapter’s charts and numbers, from nflverse)
import re
from gridiron.data import nfl, pbp

SEASONS_P = list(range(2016, 2026))


def n_db(s):
    """Defensive backs on the field, from nflverse participation's defense_personnel string.
    2016-2022 rows read like '4 DL, 2 LB, 5 DB'; 2023+ rows list positions ('3 CB, 1 FS, 1 SS, ...')."""
    if not isinstance(s, str):
        return np.nan
    m = re.search(r"(\d+) DB", s)
    if m and "CB" not in s:
        return int(m.group(1))
    return sum(int(k) for k, pos in re.findall(r"(\d+) ([A-Z]+)", s) if pos in ("CB", "FS", "SS", "S", "DB", "SAF"))


rows = []
for season in SEASONS_P:
    part = nfl().load_participation([season]).to_pandas()[["nflverse_game_id", "play_id", "defense_personnel"]]
    plays = pbp(season, columns=["game_id", "play_id", "season_type", "play_type", "down"])
    plays = plays[(plays.season_type == "REG") & plays.play_type.isin(["pass", "run"]) & plays.down.notna()]
    m = plays.merge(part, left_on=["game_id", "play_id"], right_on=["nflverse_game_id", "play_id"])
    k = m.defense_personnel.map(n_db).dropna()
    k = k[k > 0].clip(3, 7)
    rows.append({"season": season, "base": (k <= 4).mean() * 100, "nickel": (k == 5).mean() * 100,
                 "dime": (k >= 6).mean() * 100, "n": len(k)})
PKG = pd.DataFrame(rows).set_index("season")

# combine weights and 40 times of off-ball linebackers (2000-2018 listed ILB; 2019+ listed LB, in the years
# when edge rushers are listed separately as EDGE: the 2020 and 2021 files have no EDGE label, so their "LB"
# rows include edge rushers, and those two classes are left out)
cmb = nfl().load_combine().to_pandas()
cmb = cmb[((cmb.pos == "ILB") & (cmb.season <= 2018))
          | ((cmb.pos == "LB") & (cmb.season >= 2019) & ~cmb.season.isin([2020, 2021]))]
CMB = cmb.groupby("season").agg(wt=("wt", "mean"), forty=("forty", "mean"), n=("wt", "size"))
EARLY, LATE = CMB.loc[2000:2009], CMB.loc[2019:]

# who makes the tackle on designed runs, by how far the run got (2021-2025)
TS = [2021, 2022, 2023, 2024, 2025]
runs = pbp(TS, columns=["season", "season_type", "play_type", "qb_scramble", "rushing_yards", "penalty",
                        "touchdown", "solo_tackle_1_player_id", "tackle_with_assist_1_player_id",
                        "assist_tackle_1_player_id"])
runs = runs[(runs.season_type == "REG") & (runs.play_type == "run") & (runs.qb_scramble == 0)
            & (runs.penalty == 0) & (runs.touchdown == 0)]
runs["tackler"] = (runs.solo_tackle_1_player_id.fillna(runs.tackle_with_assist_1_player_id)
                   .fillna(runs.assist_tackle_1_player_id))
ros = nfl().load_rosters(TS).to_pandas()[["season", "gsis_id", "depth_chart_position"]]
ros = ros.drop_duplicates(["season", "gsis_id"])
# roster labels: ILB/MLB/LB are off-ball linebackers; OLB mixes 3-4 edge rushers with some off-ball 4-3
# outside linebackers, so the "Inside linebacker" share is a floor for all off-ball linebackers
GROUP = {"DE": "Defensive line", "DT": "Defensive line", "NT": "Defensive line",
         "ILB": "Inside linebacker", "MLB": "Inside linebacker", "LB": "Inside linebacker",
         "OLB": "Outside linebacker (mostly edge)", "CB": "Defensive back", "FS": "Defensive back",
         "SS": "Defensive back", "DB": "Defensive back", "S": "Defensive back"}
ros["grp"] = ros.depth_chart_position.map(GROUP)
TK = runs.merge(ros, left_on=["season", "tackler"], right_on=["season", "gsis_id"], how="inner")
TK = TK[TK.grp.notna()]
BINS = [-99, 0, 2, 4, 6, 9, 14, 99]
BIN_LABELS = ["0 or less", "1-2", "3-4", "5-6", "7-9", "10-14", "15+"]
TK["bin"] = pd.cut(TK.rushing_yards, BINS, labels=BIN_LABELS)
SHARE = pd.crosstab(TK.bin, TK.grp, normalize="index") * 100
LB_SHARE_ALL = (TK.grp == "Inside linebacker").mean() * 100
MED = TK.groupby("grp").rushing_yards.median()
DB_56 = TK[(TK.bin == "5-6") & (TK.grp == "Defensive back")].depth_chart_position.value_counts(normalize=True) * 100

# missed tackles per 100 attempts by position group: Pro Football Reference's charted advanced defensive
# stats via nflverse, 2021-2025, matched to the roster position that season
adv = nfl().load_pfr_advstats(seasons=TS, stat_type="def", summary_level="season").to_pandas()
ros_pfr = nfl().load_rosters(TS).to_pandas()[["season", "pfr_id", "depth_chart_position"]].dropna()
ros_pfr = ros_pfr.drop_duplicates(["season", "pfr_id"])
MGRP = {"DE": "DL", "DT": "DL", "NT": "DL", "ILB": "ILB", "MLB": "ILB", "LB": "ILB", "OLB": "OLB",
        "CB": "CB", "DB": "CB", "FS": "S", "SS": "S", "S": "S"}
ros_pfr["grp"] = ros_pfr.depth_chart_position.map(MGRP)
adv = adv.merge(ros_pfr, on=["season", "pfr_id"], how="left")
MISS_MATCH = adv.grp.notna().mean() * 100
mt = adv[adv.grp.notna()].groupby("grp")[["comb", "m_tkl"]].sum()
MISS = (mt.m_tkl / (mt.comb + mt.m_tkl) * 100).to_dict()

# two defensive seasons for the film room, from nflverse schedules and play-by-play
sch = nfl().load_schedules([2000, 2022]).to_pandas()
sch = sch[sch.game_type == "REG"]


def allowed(team, season):
    g = sch[(sch.season == season) & ((sch.home_team == team) | (sch.away_team == team))].copy()
    g["pa"] = np.where(g.home_team == team, g.away_score, g.home_score)
    return g


BAL00 = allowed("BAL", 2000)
r00 = pbp(2000, columns=["season_type", "defteam", "rush_attempt", "rushing_yards"])
r00 = r00[(r00.season_type == "REG") & (r00.rush_attempt == 1)]
RUSH00 = r00.groupby("defteam").rushing_yards.sum()
BAL22 = allowed("BAL", 2022)
PRE, POST = BAL22[BAL22.week <= 8], BAL22[BAL22.week >= 9]

Second-and-7, early in the first quarter. The offense hands the ball to its running back, whose first step is a jab to his left. The middle linebacker, facing him, does not step to his right, the way the back seems to be going. He goes the other way, toward the side the back is leaving, running hard just behind his own defensive line, and he arrives in the hole a step before the pulling guard who was supposed to block him. No gain. On the replay the analyst ignores the back completely and draws a circle around the offense’s left guard: “Watch the guard. He pulls, and the Mike is gone before the back even gets the ball.” What did the linebacker see, and how did he see it so fast? This chapter is about the few square yards between the offensive tackles where most runs are won or lost, and the players who live there.

You’ll be able to:

NoteYou’ll need

How to read the diagrams. Offense is blue circles, defense orange squares, and plays go up the page. Left and right always mean the offense’s left and right. LT, LG, C, RG and RT are the offensive linemen (T, G and C in the smaller pictures), Y and U tight ends, Q the quarterback, R or T the running back, F a fullback, and X, Z and H wide receivers (H in the slot). Defensive linemen are labelled with their technique number; M, W and S are the Mike, Will and Sam linebackers, $ is a nickel back, CB a cornerback and FS and SS the safeties. Dotted green lines are a defender’s eyes: who he is watching. Green letters are gaps, never players. Unless a picture says otherwise, the tight end, and so the offense’s strength, is on the right.

The hardest job on the field

A linebacker lines up behind the defensive line, about four or five yards off the ball, at what coaches call the second level of the defense: the linemen are the first level, the safeties the third. You met the three classic linebackers in The Twenty-Two: the Mike in the middle, the Sam on the strong (tight end’s) side and the Will on the weak side. In Even Fronts you saw where they stand in a 4-3, and that each front leaves one guard uncovered and puts a linebacker over him.

This chapter is about off-ball linebackers: the ones who stand off the line of scrimmage, behind the linemen. The name “outside linebacker” can mean two different players, and it is worth sorting out now. In a 4-3, the Sam and the Will are outside linebackers in the old sense: off the ball, on either side of the Mike. In a 3-4, “outside linebacker” usually means a stand-up edge (Odd and Hybrid Fronts), an edge rusher who lines up on the line and rushes the passer; that is a different job, and this chapter mostly leaves it alone. When it says inside linebackers, it means the off-ball linebackers in the box: the Mike and the Will in a 4-3, the two linebackers of a nickel defense, the two inside linebackers of a 3-4 (whom staffs name differently: Mike and Will is common).

Why call it the hardest job? Put yourself in his cleats for the first second of a play.

  • He has two jobs that point in opposite directions. Against a run he has a gap to fill, and it is in front of him: he has to go forward, fast, because the running back reaches the line about a second after the snap. Against a pass he has a zone to drop to or a man to cover, and that is behind him or beside him. Every snap, he has to choose before he can be sure.
  • He is the one who gets blocked by someone twice his size. Defensive linemen are big men fighting big men. A linebacker weighs about 225 to 245 pounds, and the man coming to block him, a guard who has climbed off a double team, weighs 315. He cannot win that collision by force. He wins by getting to the spot first, or by meeting the block on his own terms and getting off it.
  • He tackles in space. A defensive lineman makes his tackles in a crowd, with the runner barely moving. A linebacker meets the ball carrier after he has come through the line, at full speed, with room to cut both ways.
  • He covers people who are faster than he is. Running backs and tight ends run routes against him on every pass play, and offenses spend whole weeks scheming to get their best receiver matched up with a linebacker.
  • He often runs the defense. In most NFL defenses the Mike linebacker hears the call in his helmet radio, relays it to the other ten, and adjusts it to the formation, all in the 15 seconds before the snap.

The position grew out of a lineman standing up. In the early 1950s most NFL defenses played a five-man line with a middle guard over the center. The Chicago Bears’ middle guard, Bill George, kept hitting the center and then watching passes sail over his head, so during a 1954 game against the Philadelphia Eagles he started dropping back off the line at the snap, and two plays later he intercepted a pass, the first of his career. He kept doing it. A five-man line with its middle man standing up is a four-man line with a linebacker in the middle. Nobody can be sure which middle guard first stood up, but George is the usual answer, and he is often credited, by accident, with the 4-3 as well.1 Two years later Tom Landry, coaching the New York Giants’ defense, built a 4-3 around a rookie from West Virginia, Sam Huff, and in 1960 CBS wired Huff with a microphone for a half-hour special, The Violent World of Sam Huff. The middle linebacker became the most famous defensive player in football, and has stayed near the top ever since: Dick Butkus, Ray Nitschke, Mike Singletary, Ray Lewis, Brian Urlacher, Luke Kuechly.2

This chapter takes the linebacker’s job apart in the order he does it: where he stands, what he looks at, which way he goes, how he gets there, how he tackles, and what he does when it’s a pass. Then it explains why the position looks so different today from the one Sam Huff played.

Where a linebacker stands

Before the snap a linebacker picks a spot, and the spot is a decision about two things: how far he is from the blockers who will come for him, and how far he is from the receivers he may have to cover. Three alignments cover most of what you will see.

Show the Python
fig, axes = plt.subplots(1, 3, figsize=(6.6, 2.9))
WIN = (-2.6, 8.6)
# stacked: a 3-3 stack
p = Play(line("short") + [te(+1)],
         [D("LE", "DE", 1.0, T("5", -1), "5"), D("NT", "DT", 1.0, 0.0, "0"), D("RE", "DE", 1.0, T("5", 1), "5"),
          D("WILL", "LB", 4.6, T("5", -1), "W"), D("MIKE", "LB", 4.6, 0.0, "M"), D("SAM", "LB", 4.6, T("5", 1), "S")],
         los=35, to_go=None)
f = draw(p, ax=axes[0], lateral=(-9.0, 9.8), window=WIN, title=False)
dashed(f, p, [(3.7, -0.25), (2.1, -0.8)], color=style.DEFENSE_DARK, lw=1.1)
dashed(f, p, [(3.7, 0.25), (2.1, 0.8)], color=style.DEFENSE_DARK, lw=1.1)
say(f, p, 6.6, 0.0, "behind the nose:\neither A gap", color=style.DEFENSE_DARK, fontsize=6.6)
title(axes[0], "Stacked")
# open: the Will over the uncovered guard
p = Play(line("short") + [te(+1)], over_front(+1), los=35, to_go=None)
f = draw(p, ax=axes[1], lateral=(-9.0, 9.8), window=WIN, title=False)
ring(f, p, "LG", color=GREEN, r=1.0)
dashed(f, p, [(0.1, -1.6), (2.1, -1.8), (3.55, -1.95)], color=GREEN, lw=1.4)
say(f, p, 6.7, -4.6, "over a free\nguard", color=GREEN, fontsize=6.6, weight="bold")
title(axes[1], "Open (the bubble)")
# walked out: the Will at an apex over the slot
p = Play(line("short") + [te(+1), O("H", "WR", -1.5, -9.4, "H")],
         [q.moved(d=4.6, w=-6.3) if q.key == "WILL" else q for q in over_front(+1)], los=35, to_go=None)
f = draw(p, ax=axes[2], lateral=(-11.8, 7.0), window=WIN, title=False)
ghost(f, p, 4.5, -2.0, "W")
dashed(f, p, [(4.5, -2.85), (4.55, -5.4)], color=style.DEFENSE_DARK, lw=1.1)
say(f, p, 6.9, -6.3, "halfway to\nthe slot", color=style.DEFENSE_DARK, fontsize=6.6)
title(axes[2], "Walked out (apex)")
fig.tight_layout(w_pad=0.5)
plt.show()
Figure 31.1: Three places a linebacker stands. Left, stacked: each linebacker directly behind a defensive lineman (here a 3-3 stack, with a nose on the center and two 5-techniques), so a blocker coming for the linebacker has to get past the lineman first, and the pair can split the two gaps either side of the lineman any way they like. Middle, open: the Will of a 4-3 Over over the uncovered left guard (green ring), the ‘bubble’ from 05-02. He can see everything, and the guard can come straight for him (dashed). Right, walked out: the same Will moved out of the box to stand halfway between the left tackle and a slot receiver (H), an apex, ready to cover him. The dotted square is where he stood in the middle picture.

Stacked. In a stack alignment the linebacker lines up directly behind a defensive lineman, four or five yards deep. The lineman is his shield. A blocker who wants the linebacker has to go around the lineman to get to him, and by then the linebacker has seen the play. The stack also hides the defense’s intentions: a lineman and the linebacker behind him own the two gaps on either side of that lineman between them, and the offense cannot tell before the snap which man will take which. On one snap the lineman slants left and the linebacker fills right; on the next, the reverse. The left panel of Figure 31.1 is the extreme version, a 3-3 stack, with all three linebackers hidden behind all three linemen; you met it as the 3-3-5 front in Odd and Hybrid Fronts. Four-man fronts usually stack at most one linebacker (in many Under fronts, the Will behind the 3-technique) and play the others open or over a shaded lineman.

The cost of the stack is that his own lineman is in his way. To get to either gap he has to go around his own man, so he is a step slower to it than a linebacker standing over open grass, and if the lineman in front of him gets driven backward, the linebacker is caught in the pile (coaches say “in the wash”).

Open. The opposite is to stand over an uncovered offensive lineman, a guard nobody is lined up on. That is the middle panel, and it is the bubble you met in Even Fronts: every even front leaves one guard uncovered and puts a linebacker over him. The linebacker gets a clear view of the whole backfield, and nobody is in his way when he goes. The cost is that nobody is in the guard’s way either. He can climb straight up to the linebacker at the snap, so the open linebacker has to be quick enough to beat him to a spot two yards away.

NoteGo deeper

Coaches number linebacker spots the way they number linemen’s techniques, often with a zero added: a linebacker in a 30 is lined up on the guard’s outside shoulder, the spot behind a 3-technique, and one in a 10 is on the center’s shoulder, over the A gap. You won’t hear it on a broadcast, but it is how a linebacker coach talks, and it tells you that linebacker alignments are as precise as the line’s.

Depth. Off-ball linebackers usually stand about four to six yards deep, a little deeper against a team that likes play-action or against a running back aligned deep behind the quarterback, a little shallower on short yardage. The trade is simple. Every yard closer to the line is a step quicker to the hole and a step closer to the blockers; every yard deeper is more time to read and less time to get there.

The apex and the walk-out

The right panel of Figure 31.1 is the third alignment, and the modern one. An apex is the spot halfway between the last man in the box (a tackle or tight end) and a slot receiver, a few yards off the ball. A First Look at Defense introduced the defender who stands there, the overhang defender, usually a nickel back. When a linebacker goes there instead, coaches call it a walk-out: he walks out of the box before the snap to stand over or near the slot receiver.

Show the Python
off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                       O("X", "WR", -0.7, -16.0, "X"), O("H", "WR", -1.5, -9.0, "H"),
                       O("Y", "TE", -1.5, 9.0, "Y"), O("Z", "WR", -0.7, 16.0, "Z")]
dfn = [D("WE", "DE", 1.0, -5.0, "5"), D("NT", "DT", 1.0, T("1", -1), "1"), D("DT", "DT", 1.0, T("3", 1), "3"),
       D("SE", "DE", 1.0, 5.0, "5"), D("MIKE", "LB", 4.8, 0.4, "M"),
       D("SAM", "LB", 5.0, 6.1, "S"), D("WILL", "LB", 5.0, -6.1, "W"),
       D("LCB", "CB", 7.0, -16.0, "CB"), D("RCB", "CB", 7.0, 16.0, "CB"),
       D("FS", "S", 12.5, -8.5, "FS"), D("SS", "S", 12.5, 8.5, "SS")]
p = Play(off, dfn, los=35, to_go=None)
p.highlight("SAM", "WILL", color=style.DEFENSE)
f = draw(p, width_in=6.4, lateral=(-19.5, 19.5), window=(-7.4, 15.6), title=False)
lane(f, p, -4.6, 4.6, -0.2, 6.6, color=style.MUTED, alpha=0.08, ls=(0, (2, 2)))
say(f, p, 2.9, -1.2, "the box: five", color=style.INK, fontsize=6.8, weight="bold")
say(f, p, 8.3, -6.1, "apex: halfway between\ntackle and slot", color=style.DEFENSE_DARK, fontsize=6.8)
dashed(f, p, [(4.1, 6.2), (1.9, 5.6)], color=style.DEFENSE_DARK, lw=1.3)
dashed(f, p, [(5.9, 6.3), (8.0, 7.3)], color=style.DEFENSE_DARK, lw=1.3)
say(f, p, 2.3, 10.4, "run: downhill,\noutside-in", color=style.DEFENSE_DARK, fontsize=6.8)
say(f, p, 9.4, 11.6, "pass: wall the slot's\ninside route, sink", color=style.DEFENSE_DARK, fontsize=6.8)
plt.show()
Figure 31.2: A base 4-3 against a 2x2 formation (two receivers on each side; the tight end, Y, is detached as the right slot). With only four defensive backs, one answer is to walk both outside linebackers out of the box (ringed) to apex alignments, halfway between each tackle and slot receiver, about five yards deep. The box (shaded) now holds five defenders: four linemen and the Mike, alone in the middle. Each walked-out linebacker has two jobs (shown for the Sam): on a run, come downhill from the outside in, keeping the ball inside him (he is usually the force or alley player on his side); on a pass, wall off the slot receiver’s inside route and sink under the curl. He cannot be early for both.

Figure 31.2 shows why a walk-out happens. The offense has spread four receivers across the field, two on each side. A base 4-3 has only four defensive backs: two cornerbacks on the wide receivers and two safeties deep. Somebody has to stand near the two slot receivers. The defense has three answers: walk the outside linebackers out, as here; rotate a safety down over one slot and keep one linebacker in the box (a single-high look); or take a linebacker off and bring in a nickel back, which the defense can only do before the snap, by substitution or a pre-planned check.

Why walk out? Because leaving him inside is worse. A linebacker left in the box against a slot receiver is eight or nine yards from a man he may have to cover, which is an easy completion every time the quarterback looks at him. From the apex, he can still come downhill at the edge of the box against a run, outside-in, keeping the ball inside him, and he can get under or in front of the slot receiver’s route against a pass. (Whether he squeezes the run or bounces it outside is the call’s decision, built in Run Fits and Box Math.)

What does it cost? Count the box. Five defenders against five offensive linemen and a running back: the box is now light, and every run defender can be blocked. And each walked-out linebacker is now the defense’s conflict defender: if he comes inside for the run, the slot receiver behind him is open; if he widens for the pass, the edge of the box is open. The offense can read him after the snap and throw or run accordingly, which is exactly what the RPOs of Part 4 are built to do.

That is the problem that pushed linebackers off the field. A defense that expects the slot receiver to run routes would rather have a defensive back at the apex, a nickel back who can cover him, and it takes a linebacker off to make room. The last section of this chapter follows that trade to its end. For now, notice the walk-out as a tell: when a linebacker walks out with a receiver, the defense has told you it is short of defensive backs for this formation, and the offense will usually try to find out whether he can cover.

Keys: what a linebacker looks at

Here is the problem with standing five yards off the ball. Things happen faster than a linebacker can see all of them. At the snap, eleven offensive players move at once; the running back has the ball, or doesn’t, half a second later; the linebacker has to be moving in the right direction by then. He cannot watch eleven people. So he watches one or two.

A key is the offensive player a defender watches at the snap to learn what the play is and where it is going. (It is the defense’s version of an idea; don’t confuse it with an option play’s read key, which is the defender a quarterback watches.) For an inside linebacker, the two classic keys are the guards and the near running back, and coaches talk about reading “through” the guard to the back: eyes on the guard’s first step, the back in the edge of the picture.

Which guard? The simplest rule is the guard nearest him, the one he is lined up on or over. Many teams have their inside linebackers read both guards, the near one first, because the far guard’s pull is the single most valuable thing a linebacker can see (the Mike in Figure 31.3, below, reads his near guard and sees the far one pull). You’ll hear the versions by name: a “guard read” or “high hat, low hat” read; a “triangle” of the near guard, the far guard (or the near tackle) and the near back (not the quarterback’s triangle read of Part 4); and a “flow” or “backfield” read, which watches the backs and trusts the linemen in front to keep the guards off.

What the guard tells him

Offensive linemen can’t hide what kind of play it is, because the physics of blocking and the rules tell them how to move (a lineman may not go downfield on a pass, a rule the play-action section below puts to work). A guard’s first step is the most honest signal on the field.

The guard’s first step What it means The linebacker’s reaction
Fires forward, pads low (“low hat”) Run, and the guard is blocking the man in front of him or doubling a lineman Downhill: attack his gap
Comes straight up at the linebacker Run, and the linebacker is the guard’s target; the ball is coming near him Beat the guard to the spot, or take him on and keep his gap
Blocks down, inside, away from the linebacker A gap-scheme run coming to the linebacker’s side; a puller, a fullback or the tackle is coming to kick out or lead Squeeze toward the down block and find the puller or the kick-out
Opens his hips and steps back and flat behind the line, either direction A pull: a gap-scheme run (power, counter, trap) going where he goes “Pull, follow”: flow with him, inside-out
Steps sideways and reaches, the whole line stepping together Zone: the run will go the way the line is stepping Flow with the line, inside-out (next section)
Steps back and sits, hands up (“high hat”) Pass protection Pass: get to his drop or his man
High hat, but the back stays square in front of the quarterback, or the linemen set softly and let the rushers by A draw or a screen Get depth slowly, eyes on the back; don’t run away from it

The “high hat, low hat” read is the same one How to Watch a Broadcast gave you for spotting run and pass from the couch. The linebacker uses it a quarter-second after the snap, from five yards away.

The last row is where reading gets hard. A draw is built to look like a pass: the linemen set, the quarterback drops, and then he hands the ball to a back who waited. A linebacker who reads “high hat, pass” and sprints to his zone is running away from it. The tells are small: the back stays square in front of the quarterback instead of stepping up to block or releasing; the guards set but don’t punch, inviting the rushers upfield; the quarterback’s drop is a little too quick. So linebackers are taught to open to their drop with their eyes still on the back for a beat. A screen shows the same high hat first, then the linemen let their rushers through and release, running sideways after a pass set, while the back slips out behind them. Linemen running flat after setting to pass is the screen’s signature.

The pull is the most valuable signal of all, because the gap-scheme runs of Gap and Power Runs need a pulling lineman to get an extra blocker to the hole, and that lineman has to run there. Wherever he is going, the ball is going too. That is the read in the chapter’s opening scene, and Figure 31.3 plays it out, jab step and all.

Show the Python
def power_vs_over():
    off = line("short") + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("FB", "FB", -4.5, 0, "F"),
                           O("RB", "RB", -7.0, 0, "T")]
    p = Play(off, over_front(+1), los=35, to_go=None)
    # play side: the right guard and tackle block the 3, Y blocks down on the end; the center blocks back,
    # the left tackle hinges
    go_to(p, "Y", (-0.3, 3.95), "block", speed=1.6); go_to(p, "SE", (1.0, 3.65), speed=0.6)
    go_to(p, "RT", (-0.35, 3.0), "block", speed=1.2); go_to(p, "RG", (-0.35, 2.0), "block", speed=1.2)
    go_to(p, "DT", (1.0, 2.45), speed=0.4)
    go_to(p, "C", (-0.35, -0.6), "block", speed=1.2); go_to(p, "NT", (1.0, -0.7), speed=0.4)
    go_to(p, "LT", (-0.9, -3.6), "block", speed=1.2); go_to(p, "WE", (0.5, -3.7), speed=1.0)
    # the left guard pulls (first step back and flat), around the double team and up into the hole;
    # the fullback kicks out the Sam
    go_to(p, "LG", HOLE_G, "pull", speed=5.5, via=[(-1.6, -1.0), (-2.2, 2.6)])
    go_to(p, "FB", (-0.2, 7.1), "block", speed=5.4, via=[(-2.4, 3.4)])
    go_to(p, "SAM", (1.2, 7.7), speed=3.0, delay=0.3)
    # the back: a jab step to his left (the lie), then the handoff and downhill behind his guard
    go_to(p, "QB", (-2.6, -0.6), speed=2.5)
    go_to(p, "RB", (-6.75, -0.6), "run", speed=2.6)
    go_to(p, "RB", (-2.7, 4.6), "run", speed=6.5, via=[(-4.6, 2.4)])
    p.handoff("RB", t=0.75)
    # the linebackers: the Mike flows on the pull, straight for the hole; the Will follows the guard
    go_to(p, "MIKE", HOLE_M, speed=6.0, delay=0.2, via=[(3.6, 2.6)])
    go_to(p, "WILL", (1.9, 3.1), speed=4.6, delay=0.3, via=[(4.0, 0.6)])
    return p


HOLE_M, HOLE_G = (0.7, 5.5), (-0.75, 5.35)


MIKE_TRIP = path_len([(4.5, 0.8), (3.6, 2.6), HOLE_M])
GUARD_TRIP = path_len([(-0.7, -1.6), (-1.6, -1.0), (-2.2, 2.6), HOLE_G])


def key_marks(fld, play, t, i):
    if t < 0.05:
        for k, g in (("MIKE", "LG"), ("MIKE", "RG"), ("WILL", "LG")):
            eyes(fld, play, play.position(k, t), play.position(g, t))
        # the race: each man's whole trip to the hole, from his snap spot
        dashed(fld, play, [(4.5, 0.8), (3.6, 2.6), HOLE_M], color=style.DEFENSE_DARK, lw=1.0)
        dashed(fld, play, [(-0.7, -1.6), (-1.6, -1.0), (-2.2, 2.6), HOLE_G], color=style.OFFENSE_DARK, lw=1.0)
        say(fld, play, 5.9, 3.3, f"Mike: {MIKE_TRIP:.0f} yd", color=style.DEFENSE_DARK, fontsize=6.4)
        say(fld, play, -3.3, -2.6, f"guard: {GUARD_TRIP:.1f} yd", color=style.OFFENSE_DARK, fontsize=6.4)


P_POWER = power_vs_over()
animation_or_strip([(P_POWER, 0.0, ""), (P_POWER, 0.5, ""), (P_POWER, 0.9, ""), (P_POWER, 1.4, "")],
                   notes=["eyes on the guards (dotted);\ndashed: the race to the hole",
                          "the left guard pulls: the Mike's\nfirst step goes with him",
                          "Mike flows over the top;\nthe back's jab step was the lie",
                          "Mike meets the puller at the\nline: hole full, back stopped"],
                   rings=(("MIKE", style.DEFENSE), ("LG", style.THIRD)), lateral=(-6.2, 9.6), window=(-7.9, 7.6),
                   after=key_marks, width_in=6.0)
Figure 31.3: The key read: the guard pulls, the Mike flows (simulated play in Big Data Bowl tracking coordinates; faint lines are each player’s path so far). Power to the right from an I-formation against a 4-3 Over, with the tailback’s jab step to the left first, as in the chapter’s opening. 1: at the snap the Mike (orange ring) reads both guards, the Will the left guard (green ring); dotted lines are their eyes, and the dashed lines show the race each man is about to run to the hole, about six yards for the Mike against nearly eight for the pulling guard, whose first step goes backward. 2: the right guard fires out (run) and the left guard pulls (where); the Mike’s first step goes with the puller, not with the back. 3: the Mike runs just behind his own linemen, inside the ball, while the Will follows the guard as the backup; the fullback kicks out the Sam. 4: the Mike reaches the hole first and meets the puller at the line instead of two yards past it, so the hole is full and the back, a step behind his guard, has nowhere to go. A Mike who had watched the back would have been a step late, and the guard would have blocked him at linebacker depth.

Notice three things about the picture. First, the Mike’s two guards told him two truths in the first quarter-second: the right guard, nearest him, fired out low (it’s a run), and the left guard pulled (it’s going right). Second, the Mike’s first step in panel 2 goes sideways, with the puller. A linebacker who reads a pull does not charge at the line; he runs with the puller, just behind his own linemen, until he sees the hole. Third, he wins the race because his trip is shorter and starts just as soon. The guard has to step back, run behind the center and around the double team, nearly eight yards; the Mike has about six, and he leaves the moment the guard does. If he waits to see where the back goes, he arrives with the guard, and the guard is there to block him. That is the case for keys in one sentence: the linemen tell the truth sooner than the ball does.

What the back tells him

The near back is the second key. His first two steps say three things: direction (left, right, or straight ahead), speed (a sprint sideways or a patient downhill track) and depth (does he get deeper, for a toss or a pitch, or come straight at the line). If he steps up to block, or swings out of the backfield to the flat, it is a pass. If there is a fullback, he is the most honest back of all: on an iso or a lead play, he runs straight at the linebacker he is going to block, which tells that linebacker where the ball is going.

Why not just read the back? Because the back can lie and the linemen mostly can’t. Offenses build whole plays on the backfield lie. The counter starts with the back stepping away from the play while the guard and tackle pull toward it; a linebacker who believes the back takes a false step and is out of position before he knows it. Play-action shows him a back who seems to have the ball. That is why most coaches teach the guards as the primary key and the back as the confirmation: if they say the same thing, go; if they disagree, believe the linemen.

Keys also depend on the defense. Linebackers in a two-gap 3-4, who sit behind big linemen and are protected from blockers, often read the guards almost exclusively. Linebackers in an attacking one-gap 4-3 (the Tampa 2 teams of the 2000s are the classic case) often read the backfield flow and trust their linemen to hold the guards. And a Sam on the line’s strong side, or a walked-out apex player, keys the tight end or tackle in front of him and the near back, because the play coming his way starts out there: a tight end who blocks down means the ball is coming outside him, one who releases means pass, and from the apex the eyes go on through to the slot receiver.

ImportantWhy it exists

Keys exist because a linebacker who waits to be sure is always late. The back reaches the line in about a second; a linebacker four or five yards away needs most of that second to get there. So he decides from the first step of one or two blockers, who have to show their intent early. The price is that the offense knows what he is looking at. Counters, traps, play-action and screens are all, in part, plays built to show a linebacker’s key a lie.

CautionCommon misconception

“Great linebackers just follow the ball.” Watch the replay of a linebacker making a tackle for no gain, and then watch his first step: almost always it came before the ball went anywhere, and it went where a lineman was going. The ball is the last thing a good linebacker looks at, not the first. Linebackers who “see the ball” are usually the ones a counter or a play-action pass catches out.

Flow: fast and slow

Keys tell a linebacker what the play is. Flow tells him how to move. In coaches’ language, flow is the direction and speed of the backfield action at the snap: where the backs (and, on zone, the whole line) are going, and how fast. Staffs use different words, but nearly all of them sort it into two kinds.

Show the Python
fig, axes = plt.subplots(1, 2, figsize=(6.6, 4.3))
LAT, WIN = (-8.6, 10.6), (-8.6, 9.2)
off = line("short") + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("RB", "RB", -7.0, 0, "R")]
# fast flow: outside zone right
p = Play(off, over_front(+1), los=35, to_go=None)
for k in OL_KEYS + ("Y",):
    q = p.players[k]
    go_to(p, k, (q.d + 0.2, q.w + 1.1), "block", speed=2.0)
go_to(p, "QB", (-2.6, 1.6))
go_to(p, "RB", (-1.6, 6.2), "run", via=[(-5.7, 3.0)])
go_to(p, "MIKE", (2.9, 5.0), via=[(4.0, 2.6)])
go_to(p, "WILL", (5.5, -0.5), via=[(5.0, -1.4)])          # shuffle over the top, deeper than the Mike
go_to(p, "SAM", (1.6, 7.9))
f = draw(p, ax=axes[0], lateral=LAT, window=WIN, title=False)
dashed(f, p, [(-2.8, 4.6), (0.0, 1.6), (3.0, 0.0)], color=style.OFFENSE, lw=1.2)
say(f, p, 7.1, 4.6, "run with it,\ninside the ball", color=style.DEFENSE_DARK, fontsize=6.7)
say(f, p, 7.1, -3.6, "Will: over the top,\nbehind the Mike,\nfor the cutback", color=style.DEFENSE_DARK,
    fontsize=6.6)
say(f, p, 2.6, -3.0, "cutback lane", color=style.OFFENSE_DARK, fontsize=6.4)
title(axes[0], "Fast flow: outside zone")
# slow flow: inside zone right
p = Play(off, over_front(+1), los=35, to_go=None)
for k in OL_KEYS + ("Y",):
    q = p.players[k]
    go_to(p, k, (q.d + 0.5, q.w + 0.4), "block", speed=2.0)
go_to(p, "QB", (-2.6, 0.9))
go_to(p, "RB", (-1.4, 2.3), "run", via=[(-4.6, 1.2)])
go_to(p, "MIKE", (2.5, 1.5))
go_to(p, "WILL", (2.6, -1.4))
f = draw(p, ax=axes[1], lateral=LAT, window=WIN, title=False)
say(f, p, 7.1, 0.0, "press the gap,\nstay square", color=style.DEFENSE_DARK, fontsize=6.7)
say(f, p, -4.4, 4.6, "downhill at\nthe B gap", color=style.OFFENSE_DARK, fontsize=6.6)
title(axes[1], "Slow flow: inside zone")
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 31.4: Two kinds of flow against a 4-3 Over (the offensive line, the backfield and the linebackers move; the defensive line is left standing). Left, fast flow: outside zone to the right; the line steps sideways and the back sprints flat for the tight end’s outside leg. The Mike runs with it, just behind his line and a step behind the ball; the Will shuffles over the top, deeper than the Mike and behind the end of the cutback lane (dashed blue), so a back who cuts back runs into him; the Sam stays outside the ball to turn it back in. Right, slow flow: inside zone, the back coming straight downhill at the B gap. Both linebackers press forward into their gaps, square to the line, and wait for the back to commit. Running sideways here would open the gap they just left.

Fast flow is the ball going sideways in a hurry: outside zone, a toss, a sweep, the back sprinting flat for the edge. The linebacker’s job is to run with it, and to run with it correctly. Correctly means inside-out: a yard or so behind his own linemen and a step behind the ball, so that the ball is always a little outside him. (You will see the phrase again; it is the linebacker’s master rule.) If the back keeps going, the linebacker can keep up and fill as soon as he turns upfield. If the back stops and cuts back, which is what outside zone is designed to make him do (see Zone Running), the linebacker is still inside him and can stop. The backside linebacker, the Will in Figure 67.1, shuffles over the top: behind the Mike and a little deeper, ending up behind the spot where a cutback would come through. He is the cutback player: if both linebackers race to the sideline, the back has the whole field behind them.

Slow flow is the ball coming straight at the line, or coming slowly: inside zone, an iso, a draw, a delayed handoff, the counter’s first step. Now the linebacker presses: he steps forward into his gap, square to the line, shoulders parallel to it, and makes the back declare first. The worst thing he can do against slow flow is to run sideways, because every inside run is built around a back who reads the linebackers and cuts into the gap one of them just left.

There is a third case, and coaches have a phrase for it: split flow, the backs going in opposite directions (one back left, the other right, or a back one way and the quarterback the other). Split flow is the offense saying misdirection. A linebacker who sees it plays his gap and does not chase either one until the ball shows.

Fitting the run: fill, plug, scrape and run-through

Once a linebacker knows it’s a run and where it’s going, he has to get into the right gap. The defense’s plan for who takes which gap is the run fit, and its full arithmetic is the subject of Run Fits and Box Math. What a linebacker does to get to his gap has four common names, and you will hear all four on broadcasts and in coaches’ interviews.

Show the Python
fig, axes = plt.subplots(2, 2, figsize=(6.6, 6.4))
LAT, WIN = (-7.8, 9.4), (-8.2, 8.8)
ofb = line("short") + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("FB", "FB", -4.5, 0, "F"), O("RB", "RB", -7.0, 0, "T")]
one = line("short") + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("RB", "RB", -7.0, 0, "R")]
# fill vs iso: the hole is the strong A gap, open in the Over because the 1 is shaded the other way
p = Play(ofb, over_front(+1), los=35, to_go=None)
p.highlight("MIKE", color=style.DEFENSE)
go_to(p, "C", (-0.2, -0.45), "block"); go_to(p, "RG", (-0.2, 1.95), "block")
go_to(p, "FB", (0.4, 0.9), "run", speed=5.5)
go_to(p, "RB", (-1.4, 0.9), "run", via=[(-4.6, 0.4)])
go_to(p, "MIKE", (1.7, 0.9))
f = draw(p, ax=axes[0, 0], lateral=LAT, window=WIN, title=False)
say(f, p, 6.6, 4.4, "meet the fullback\nin the hole", color=style.DEFENSE_DARK, fontsize=6.7)
title(axes[0, 0], "Fill")
# plug: the 3-technique slants inside, the Mike plugs the B gap
p = Play(one, over_front(+1, mike_w=2.4), los=35, to_go=None)
p.highlight("MIKE", color=style.DEFENSE)
go_to(p, "DT", (1.0, 0.95))
go_to(p, "MIKE", (2.0, 2.45))
go_to(p, "RB", (-1.6, 2.3), "run", via=[(-4.6, 1.2)])
f = draw(p, ax=axes[0, 1], lateral=LAT, window=WIN, title=False)
gap_tag(f, p, 0.2, 2.45, "B", fontsize=6.6)
say(f, p, 6.6, 4.4, "straight into the\ngap the 3 left", color=style.DEFENSE_DARK, fontsize=6.7)
point_to(f, p, (2.8, -2.6), (1.25, 1.5), "the 3 slants\ninside", color=style.DEFENSE_DARK, fontsize=6.4)
title(axes[0, 1], "Plug")
# scrape: the end squeezes, the Mike scrapes outside him
p = Play(one, over_front(+1), los=35, to_go=None)
p.highlight("MIKE", color=style.DEFENSE)
go_to(p, "SE", (0.6, 2.9))
go_to(p, "RB", (-2.6, 6.1), "run", via=[(-5.8, 2.8)])
go_to(p, "MIKE", (2.0, 4.4), via=[(3.9, 2.6)])
go_to(p, "SAM", (1.8, 6.6))
f = draw(p, ax=axes[1, 0], lateral=LAT, window=WIN, title=False)
say(f, p, 6.6, 2.6, "over the top\nof his linemen", color=style.DEFENSE_DARK, fontsize=6.7)
point_to(f, p, (2.9, -2.4), (0.75, 2.75), "the end\nsqueezes", color=style.DEFENSE_DARK, fontsize=6.4)
say(f, p, 3.6, 7.6, "Sam:\nD gap", color=style.DEFENSE_DARK, fontsize=6.2)
title(axes[1, 0], "Scrape")
# run-through: the Will beats the climbing guard through the A gap
p = Play(one, over_front(+1, will_w=-2.5), los=35, to_go=None)
p.highlight("WILL", color=style.DEFENSE)
go_to(p, "WILL", (-2.0, -2.7))
go_to(p, "RB", (-3.6, -2.2), "run", via=[(-5.6, -0.8)])
f = draw(p, ax=axes[1, 1], lateral=LAT, window=WIN, title=False)
dashed(f, p, [(0.2, -1.4), (2.0, -1.6), (3.2, -1.9)], color=style.OFFENSE, lw=1.3)
spot(f, p, -2.75, -2.55, ms=8)
say(f, p, 6.6, 3.0, "through the B gap before\nthe guard gets there", color=style.DEFENSE_DARK, fontsize=6.6)
title(axes[1, 1], "Run-through")
fig.tight_layout(h_pad=0.8, w_pad=0.6)
plt.show()
Figure 31.5: Four ways a linebacker fits a run (the ringed linebacker acts in each panel). Fill: on an iso the fullback leads into the strong A gap, open in the Over because the nose is shaded the other way, while the center and right guard block the two tackles; the Mike attacks downhill and meets the fullback in the hole, as close to the line as he can. Plug: the 3-technique slants inside, and the Mike, stacked behind him, steps straight forward into the B gap the 3 left, where the back is aiming. Scrape: on an outside run the end squeezes down inside, and the Mike runs sideways behind his linemen to the C gap outside the end, while the Sam keeps the D gap outside him. Run-through: the Will, over the uncovered left guard (the bubble), attacks through the B gap outside the guard at the snap, before the guard can climb to him (dashed blue: where the guard was heading), and meets the back in the backfield (X).
  • Fill. To fill is to attack downhill into the gap the run is aimed at and meet whatever comes through it, a lead blocker or the back, as close to the line of scrimmage as possible. It is the general verb: “the Mike filled the hole.” The closer to the line he meets the play, the less room the back has to choose a different hole, so coaches measure fills in yards: a fill at the line of scrimmage is a good play even if the linebacker doesn’t make the tackle, because it forces the back to stop or bounce.
  • Plug. To plug is to step straight forward into a gap directly in front of you and close it with your body. It is the inside linebacker’s partner to the defensive line’s slant (05-01): when the 3-technique slants into the A gap, the B gap he left behind needs a body, and the linebacker stacked behind him plugs it. Plugs are short and violent, and they usually end in a collision with a lineman.
  • Scrape. To scrape is to run sideways, behind and close to your own defensive linemen (“over the top” of them), to a gap farther outside. It is how a linebacker gets to an outside gap without getting caught in the traffic at the line, and it is the move you saw in fast flow. Scraping linebackers stay square to the line, shuffling or crossing over, so that they can turn upfield and fill the instant the back commits. The defense’s answer to the zone read, below, is built on it.
  • Run-through. A run-through is the aggressive version of a fill: the linebacker attacks through his gap at the snap (or on his first key), before the blocker assigned to him can climb, and meets the play in the backfield. “Run-through linebacker” is also a compliment, for the kind of player who does it naturally. It wrecks zone schemes, whose climbing linemen need a fraction of a second to come off their double teams, and it makes tackles for loss. It is also the fit most vulnerable to misdirection: a linebacker who runs through a gap on a counter step or a play-action fake is out of the play, or out of his coverage.

The call and the front decide a lot (a defense whose linemen slant and stunt asks its linebackers to plug and scrape behind them; one that wants plays in the backfield against a zone team asks them to run through), but from the couch you can usually match the fit to what the run looks like:

What the run shows the linebacker The fit it usually calls for
A fullback or lead blocker coming straight at him (iso, lead) Fill: meet the lead blocker in the hole, at the line
His own lineman slanting away, leaving the gap in front of him empty Plug that gap
The ball going outside, or the end in front of him squeezing inside (and the zone read, below) Scrape over the top to the outside gap
Zone blocking, with linemen who need a moment to climb to him, and a call that says go Run-through before they arrive

The first step, and the block he can’t avoid. None of these starts with a lunge. A linebacker’s first step is a short read step (some coaches say “pop step”): a few inches, downhill, that keeps him moving without committing him. His second step is the one that tells you what he saw. The cardinal sin is the false step, a first step the wrong way, which is exactly what counters and play-action are built to draw. And sometimes a climbing lineman gets to him anyway. Then he does not run around the block, which would open the gap behind him (unless the call tells him to). He meets the blocker with his hands, a punch to the chest, keeps his gap-side arm free, and gets off the block toward his gap. Which shoulder he takes the blocker on with, keeping the ball inside him (box, or squeeze) or bouncing it outside (spill), is a whole-defense decision, and Run Fits and Box Math builds it.

NoteMadden vs. real life

In Madden, the linebacker you control can run anywhere and the computer fills the gap you left. On a real field, every linebacker’s gap is somebody else’s assumption. If the Mike scrapes outside when the call told him to plug, the gap he was supposed to fill is empty, and the defensive lineman next to it, who slanted away because the Mike would be there, is now on the wrong side of the ball. That is why coaches care more about a linebacker being in the right gap than about him making the tackle, and why “he was out of his gap” is one of the harshest things a linebacker coach says on film.

The scrape against the zone read

The scrape has its most famous use against the zone read. On a zone read the offense leaves the backside end unblocked and the quarterback reads him: if he stays wide, hand off; if he crashes down on the back, keep the ball and run where the end was. The defense’s answer, the scrape exchange from Option Football, has the end crash on the back on purpose and the linebacker behind him scrape around him to the spot where the quarterback will keep. The quarterback reads “keep” correctly and runs into the linebacker.

That chapter showed the trade. Here is the linebacker’s side of it, because the scrape is easy to draw and hard to time.

Show the Python
fig, axes = plt.subplots(1, 2, figsize=(6.6, 4.4))
LAT, WIN = (-13.2, 6.6), (-7.6, 8.4)
off = line("short") + [te(+1), O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.9, "R"),
                       O("H", "WR", -1.5, -10.0, "H")]
dfn = nickel_front(mike=(4.7, 1.4), will=(4.7, -2.2)) + [D("NB", "NB", 4.6, -8.0, "$")]
for ax, good in zip(axes, (True, False)):
    p = Play(off, dfn, los=35, to_go=None)
    p.highlight("WILL", color=style.DEFENSE)
    go_to(p, "WE", (-2.3, -2.4))
    go_to(p, "RB", (-3.0, 3.4), "run", via=[(-4.0, -0.4)])
    if good:
        go_to(p, "QB", (1.0, -6.6), "run", via=[(-4.3, -2.6), (-2.0, -5.2)])
        go_to(p, "WILL", (0.9, -5.6), via=[(3.3, -4.6)])
        go_to(p, "NB", (2.4, -8.0))
    else:
        go_to(p, "QB", (2.6, -4.3), "run", via=[(-4.3, -2.6), (-1.6, -5.8), (0.2, -5.3)])
        go_to(p, "WILL", (0.6, -8.4), via=[(3.0, -6.0)])
        go_to(p, "NB", (2.6, -9.2))
    f = draw(p, ax=ax, lateral=LAT, window=WIN, title=False)
    # the left tackle is uncovered (the end he would block is being read), so he climbs to the Will
    dashed(f, p, [(0.1, -3.2), (2.4, -2.9), (3.9, -2.4)], color=style.OFFENSE, lw=1.2)
    if good:
        spot(f, p, 1.25, -6.25, ms=8)
        say(f, p, 6.8, -5.4, "tight over the end,\non the QB's inside hip", color=style.DEFENSE_DARK, fontsize=6.6)
        title(ax, "On time and inside-out")
    else:
        say(f, p, 6.8, -5.4, "too wide, too fast:\nthe QB cuts inside", color=style.DEFENSE_DARK, fontsize=6.6)
        title(ax, "Overrun")
    say(f, p, -4.6, -9.4, "end crashes:\nQB keeps", color=style.INK_2, fontsize=6.4)
    say(f, p, 2.6, -0.4, "LT climbs", color=style.OFFENSE_DARK, fontsize=6.2)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 31.6: The Will’s scrape on a zone read, from the linebacker’s side (the line zones right; the quarterback reads the left end, who crashes down on the back, so the quarterback keeps). Left, a good scrape: the Will runs tight over the top of the end, a step behind him, and arrives on the quarterback’s inside hip with the nickel back ($) outside: the keeper has nowhere to go but toward the help. Right, an overrun: the Will scrapes too wide and too fast, gets outside the quarterback, and the quarterback cuts back inside him, into the space the crashing end left. In both, the left tackle (dashed blue), uncovered because the end he would block is being read, climbs toward the spot the Will left: the scrape has to beat him there.

The scraper has three things to get right. Timing: he has to leave at the snap, before the read, because a quarterback keeps the ball and is past the line in about a second and a half. Path: tight to the crashing end, so that the quarterback can’t run between them and the uncovered left tackle, climbing at the snap, can’t get to him first; coaches tell scrapers to “rub the end’s hip.” Leverage: he has to arrive inside the quarterback, on his inside hip, with a teammate (the nickel back or a safety in Figure 31.6) outside, so that the quarterback’s only way out is toward that teammate. An overrun, on the right, is the scraper’s classic mistake: he gets to the spot so eagerly that he passes it, and an athletic quarterback cuts back underneath him into the hole the end left. Offenses fight back by giving the scraper something else to worry about, like a tight end or H-back who arcs around the end to block him, which is why the scrape exchange is a call the defense mixes in, not something it can do every snap.

Getting there: pursuit angles

Most runs don’t end in the hole. The back gets through, or bounces outside, and the play becomes a footrace in which several defenders who started in different places converge on one runner. How they converge is the difference between a five-yard gain and a fifty-yard one.

A pursuit angle is the path a defender takes to a ball carrier who is already moving. The instinct, for anyone who has never been coached, is to run at the runner. That is almost always wrong.

Show the Python
def intercept(R0, vR, L0, sL):
    """Earliest time t at which a defender from L0 at speed sL can reach the runner R0 + vR t."""
    d = np.asarray(R0, float) - np.asarray(L0, float)
    a = vR @ vR - sL ** 2
    b = 2 * d @ vR
    c = d @ d
    if abs(a) < 1e-9:
        return -c / b
    disc = b * b - 4 * a * c
    ts = [(-b - np.sqrt(disc)) / (2 * a), (-b + np.sqrt(disc)) / (2 * a)]
    return min(t for t in ts if t > 0)


R0, L0 = np.array([0.5, 6.0]), np.array([2.0, 1.5])
uR = np.array([1.0, 0.45]) / np.hypot(1.0, 0.45)
vR, sL = 7.0 * uR, 7.5
inside = np.array([-0.45, -0.9])                     # meet him a step inside, not on his outside hip
t_meet = intercept(R0 + inside, vR, L0, sL)
MEET = R0 + vR * t_meet + inside
# the chase: always aimed at the runner's current spot
dt, chase = 0.01, [L0.copy()]
for k in range(int(1.9 / dt)):
    tgt = R0 + vR * (k * dt)
    v = tgt - chase[-1]
    chase.append(chase[-1] + sL * dt * v / np.linalg.norm(v))
chase = np.array(chase)
# keep chasing (off the picture) until he is within arm's reach (1 yard): when, and how far downfield?
c_, t_ = chase[-1].copy(), len(chase) * dt
while np.linalg.norm(R0 + vR * t_ - c_) > 1.0:
    v = R0 + vR * t_ - c_
    c_ += sL * dt * v / np.linalg.norm(v)
    t_ += dt
CATCH_T, CATCH_D = t_, (R0 + vR * t_)[0]
GAP = {t: float(np.linalg.norm(R0 + vR * t - chase[int(round(t / dt))])) for t in (0.5, 1.0, 1.5)}
# the overrun: aimed too far ahead, so that he arrives outside the back
over_end = R0 + vR * t_meet + np.array([-0.6, 3.4])
fig, ax = plt.subplots(figsize=(5.4, 4.9))
p = Play([O("RB", "RB", R0[0], R0[1], "R")],
         [D("MIKE", "LB", L0[0], L0[1], "M"), D("CB", "CB", 8.0, 15.5, "CB")], los=35, to_go=None)
f = draw(p, ax=ax, lateral=(-3.0, 19.0), window=(-2.4, 15.0), title=False)
P = lambda q: _P(f, p, q[0], q[1])  # noqa: E731
rb_end = R0 + vR * 1.8
solid(f, p, [tuple(R0), tuple(rb_end)], color=style.OFFENSE_DARK, lw=2.4)
xs, ys = _P(f, p, chase[:, 0], chase[:, 1])
ax.plot(xs, ys, color=style.MUTED, lw=1.6, zorder=4)
solid(f, p, [tuple(L0), tuple(MEET)], color=style.DEFENSE, lw=1.8)
dashed(f, p, [tuple(L0), tuple(over_end)], color=style.DEFENSE_DARK, lw=1.3)
cut0 = R0 + vR * (t_meet + 0.05)
dashed(f, p, [tuple(cut0), tuple(cut0 + np.array([3.6, -2.6]))], color=style.OFFENSE, lw=1.3)
for k in range(1, 4):                       # half-second ticks
    t = 0.5 * k
    for q, col in ((R0 + vR * t, style.OFFENSE_DARK), (chase[min(int(t / dt), len(chase) - 1)], style.MUTED)):
        x, y = P(q)
        ax.plot([x], [y], marker="o", ms=3.2, color=col, zorder=6)
    if t < t_meet:
        x, y = P(L0 + (MEET - L0) * t / t_meet)
        ax.plot([x], [y], marker="o", ms=3.2, color=style.DEFENSE, zorder=6)
for t in (0.5, 1.0, 1.5):                   # same moment, two men: how far apart the chaser still is
    (x0, y0), (x1, y1) = P(R0 + vR * t), P(chase[int(round(t / dt))])
    ax.plot([x0, x1], [y0, y1], color=style.INK_2, lw=0.8, ls=(0, (1, 1.2)), zorder=5.5)
    xr, yr = P(R0 + vR * t + np.array([0.0, 0.9]))
    ax.text(xr, yr, f"{t:.1f} s: {GAP[t]:.1f} yd", fontsize=6.0, color=style.INK_2, ha="left", va="center",
            zorder=9, bbox=dict(boxstyle="round,pad=0.12", fc=style.SURFACE, ec="none", alpha=0.85))
spot(f, p, MEET[0], MEET[1], ms=9)
solid(f, p, [(8.0, 14.6), (MEET[0] + 1.6, MEET[1] + 2.2)], color=style.DEFENSE, lw=1.4)
point_to(f, p, (2.0, 11.4), tuple(chase[45]), "chase (grey):\naimed at the man", color=style.INK_2, fontsize=6.8)
say(f, p, MEET[0] - 0.4, MEET[1] - 4.6, "angle: aimed where\nhe will be, a step inside", color=style.DEFENSE_DARK,
    fontsize=6.8)
say(f, p, over_end[0] - 1.9, over_end[1] + 1.2, "overrun", color=style.DEFENSE_DARK, fontsize=6.8)
say(f, p, cut0[0] + 4.4, cut0[1] - 2.8, "cutback", color=style.OFFENSE_DARK, fontsize=6.8)
say(f, p, 12.7, 15.6, "leverage player:\nstays outside", color=style.DEFENSE_DARK, fontsize=6.8)
say(f, p, -0.9, 9.4, "the back bounces\noutside", color=style.OFFENSE_DARK, fontsize=6.8)
plt.show()
Figure 31.7: Pursuit angles (geometry computed for a back running 7 yards a second as he comes out of his cut and a linebacker running 7.5; dots on each path mark every 0.5 seconds). The back has bounced outside to the right and turned upfield; the Mike starts inside him and a little downfield. Grey, the chase: aimed at where the back is at every instant. The dotted ties join where the two men are at the same moment, labelled with the time and the gap: he is still two yards behind after a second and a half. (The grey path crosses the back’s, but later, after the back has gone.) He doesn’t get within reach until well past 20 yards downfield. Orange, the angle: aimed at where the back will be, a step inside him, he meets him at the X after about a second and a quarter. Dashed orange, the overrun: aimed too flat and too far outside, he gets outside the ball, and the back cuts back inside him (dashed blue) into open field. The cornerback (CB) is the leverage player: he stays outside the back and squeezes him inside, toward the Mike.

Figure 31.7 makes the point with real geometry. A linebacker who runs at the back (the grey path) is always aiming at a spot the back has already left. In this example the linebacker is the faster man, and he is still two yards behind after a second and a half; he gets within arm’s reach only after 3.6 seconds, 23 yards downfield. Against a back who is as fast as he is, or faster, which in the open field is most backs, he never catches him at all. A linebacker who aims at where the back will be (orange) cuts the distance he has to run and meets the back in about a second and a quarter. That is a pursuit angle. The catch is the dashed path: aim too far ahead, and the linebacker gets outside the back, who simply plants his foot and cuts back behind him. Every defender who has been run past has done one of those two things: chased, or overrun.

The rule coaches give for it is inside-out again: take the angle that keeps the ball carrier a step outside you, never inside. If you are inside him, he can only go one way, outside, and outside is where the next defender is.

That next defender is the leverage player: the man on the outside whose job is to keep the ball inside, turning the runner back toward the pursuit. In Figure 31.7 it is the cornerback; on other plays it is the end who set the edge, an outside linebacker, a safety who came down. (The defense names him in advance, as its force player, in Run Fits and Box Math.) Put the two together and you have the shape of good team pursuit: one defender outside the ball, squeezing it in, and everyone else inside-out on it, each a little deeper and farther inside than the man in front, so that whichever way the runner cuts, someone is already there. Coaches drill it constantly, and it is one of the clearest things you can see on the end-zone replay: on a good defense, the arrows all converge.

Tackling, and why tackles get missed at the second level

Then the linebacker has to bring the man down. Tackling has changed more in the last decade than in the fifty years before it, for two reasons: safety, and the realization that the old way missed too many tackles.

The old way, the one a lot of fans still picture, was a head-on collision: eyes up, head across the runner’s body (“head across the bow”), drive through him. It produces highlight hits. It also uses the head as the first point of contact, and it fails whenever the runner moves at the last moment, because a tackler who commits his whole body to one spot can’t adjust.

The modern approach is leverage tackling, and its most influential teachers were Pete Carroll’s Seattle Seahawks. In 2014 they made a 20-minute instructional video of their shoulder tackling, borrowed from rugby, and that August the league sent it, with a letter from Carroll, to coaches and parents at every level of the game; a second video in 2015 named its basic tackle the hawk tackle.3 The ideas fit together:

  • Leverage first. The tackler approaches with the runner on one side of him, usually inside-out, so the runner’s only escape is toward the sideline and the next defender. The pursuit angle in Figure 31.7 is the start of the tackle, not something separate from it.
  • The near shoulder to the near thigh. The target is the runner’s thighs (“eyes through the thighs,” in Seattle’s coaching points), not his chest; the shoulder makes contact and the head goes to the side, behind the runner on a tackle from an angle, out of the line of contact. The legs are what carry the ball, and they can’t dodge as easily as a torso can.
  • Wrap and roll. Arms around the thighs, keep the feet moving, and roll the runner to the ground, taking him toward the help rather than trying to drive him backward.
  • Breakdown in space. Within a couple of yards of the runner, the tackler shortens his steps and lowers his hips, so he can move either way with the runner’s last cut.

The rules have pushed in the same direction. In March 2024 the league banned the hip-drop tackle, in which a tackler grabs a runner from behind and swings his hips and weight down onto the runner’s legs, with a 15-yard penalty; the details are in Contact Rules and Penalties.4 For the 2026 season the league and the players’ union added a three-strike system: a player called for three of five fouls (hip-drop, horse-collar, launching, hits on a defenseless player and blindside blocks) in a season is suspended for a game.5 Most of those fouls are committed by defenders tackling in pursuit, which is the linebacker’s daily life.

Why the second level is where tackles are made, and missed

Where on the field do linebackers actually tackle people? nflverse’s play-by-play records who made the tackle on every play, so we can ask the data. Figure 31.8 sorts every designed run from 2021 to 2025 by how far the runner got before he was brought down, and shows who made the tackle.

Show the Python
style.apply()
fig, ax = plt.subplots(figsize=(6.2, 3.6))
ax.axvspan(1.5, 4.5, color=style.GRID, alpha=0.55, lw=0, zorder=0)
order = ["Defensive line", "Outside linebacker (mostly edge)", "Inside linebacker", "Defensive back"]
cols = {"Defensive line": style.SERIES[3], "Outside linebacker (mostly edge)": style.SERIES[4],
        "Inside linebacker": style.SERIES[1], "Defensive back": style.SERIES[0]}
xs = np.arange(len(BIN_LABELS))
LABEL_Y = {"Defensive line": SHARE["Defensive line"].values[-1] - 2.5,
           "Outside linebacker (mostly edge)": SHARE["Outside linebacker (mostly edge)"].values[-1] + 1.0,
           "Inside linebacker": SHARE["Inside linebacker"].values[-1] + 2.5}
for g in order:
    lw = 2.6 if g == "Inside linebacker" else 1.6
    ax.plot(xs, SHARE[g].values, marker="o", ms=3.5, lw=lw, color=cols[g], zorder=3)
    ax.text(xs[-1] + 0.15, LABEL_Y.get(g, SHARE[g].values[-1]), g, va="center", fontsize=7.4, color=style.INK_2)
ax.set_xticks(xs, BIN_LABELS)
ax.set_xlabel("Yards gained on the run")
ax.set_ylabel("Share of tackles (%)")
ax.set_xlim(-0.3, len(BIN_LABELS) + 1.6)
ax.set_ylim(0, 85)
ax.grid(axis="x", visible=False)
ax.text(3.0, 80, "the second level (3-9 yards)", ha="center", fontsize=7.6, color=style.INK_2)
ax.spines["left"].set_visible(False)
fig.tight_layout()
plt.show()
Figure 31.8: Who makes the tackle, by how far the run got. Every regular-season designed run from 2021 to 2025 that ended in a tackle (no scrambles, touchdowns or penalties), grouped by the yards gained, with the share of tackles made by each position group (the first tackler listed in nflverse play-by-play, matched to the team’s roster position that season). Inside linebackers are those listed ILB, MLB or LB; outside linebackers are those listed OLB, mostly 3-4 edge rushers but also some off-ball 4-3 outside linebackers, so the inside-linebacker line is a floor for off-ball linebackers. The defensive line makes most of the tackles at or near the line. The inside linebackers’ share holds at a fifth to a quarter out to 9 yards and peaks on runs of 5 to 9, as the line’s share collapses. Past 10 yards it is the defensive backs’ tackle.

Read the chart from left to right and you can watch the three levels hand the runner along. Runs stopped at or near the line are the defensive line’s: about two in five of those tackles. The inside linebackers’ share barely moves, a fifth to a quarter of the tackles on every run up to 9 yards, and it peaks, at about a quarter, on runs of 5 to 9 yards, just where the line’s share collapses. They never top the chart, because they share the second level with everyone else who flows to the ball, and because the roster labels undercount them. Past 10 yards the run has beaten them, and it is a defensive back’s tackle. Across all runs, inside linebackers made 22% of the tackles; their median tackle came on a run of 3 yards, against 2 for linemen and 5 for defensive backs.6

One thing in the chart deserves a second look: defensive backs already make 31% of the tackles on runs of only 5 or 6 yards. Those tackles split almost evenly among cornerbacks (39%), free safeties (31%) and strong safeties (30%). The corners are the leverage players on outside runs, turning the ball back in, as in Figure 31.7; the safeties are the eighth man in the box when a single-high defense rotates one down, or the “big nickel” safety playing linebacker. The second level isn’t only linebackers any more, which is where the end of this chapter is heading.

The chart is also a warning about the statistic fans quote most. A linebacker’s tackle total counts every tackle the same, but a tackle five yards downfield is a run that beat the defense first, and the best fill of the game, the one that meets the fullback at the line and makes the back bounce into a teammate, often goes in the box score under someone else’s name. Coaches grade linebackers on whether they were in their gap on time; the tackle is a by-product.

Missed tackles are not in the play-by-play, but Pro Football Reference charts them for every defender, and nflverse carries the numbers. Per hundred tackle attempts from 2021 to 2025 (runs and passes together), defensive linemen missed 7.2, inside linebackers 7.5, outside linebackers 8.4, safeties 8.5 and cornerbacks 9.9.7 The farther from the line a defender usually tackles, the more often he misses. A lineman tackles a back who is still in a crowd, barely moving, with nowhere to go. Past the line the runner is moving at full speed, with room to cut both ways, and the tackler is often coming off a block, from an angle, alone. The runner chooses his cut after seeing the tackler commit; the tackler has to commit first.

Two things stand out. Inside linebackers make their tackles in far more space than linemen do and miss barely more often: that is what leverage tackling, and all the drilling behind it, buys. (Take away one direction with your angle, and you only have to win the other.) And the misses that hurt are the ones past the line, because the cost of a miss grows with the space behind it: a lineman who misses leaves the back a crowd, a linebacker who misses leaves him a safety ten yards away.

For a play-by-play look, the 2024 Big Data Bowl was about tackling, and its data marks every missed tackle on nine weeks of 2022 plays. This chapter’s source includes code (not run here, because the data isn’t downloaded) that counts missed-tackle rates by position from it.

Show the Python (missed tackles by position, Big Data Bowl 2024 data; not run here)
# Data: https://www.kaggle.com/competitions/nfl-big-data-bowl-2024/data (tackles.csv, players.csv).
# Check the year's data dictionary; column names below are from the 2024 release.
import pandas as pd
tackles = pd.read_csv("data/bdb2024/tackles.csv")      # gameId, playId, nflId, tackle, assist, forcedFumble, pff_missedTackle
players = pd.read_csv("data/bdb2024/players.csv")      # nflId, position, ...
t = tackles.merge(players[["nflId", "position"]], on="nflId")
by_pos = t.groupby("position").agg(made=("tackle", "sum"), assists=("assist", "sum"),
                                   missed=("pff_missedTackle", "sum"))
by_pos["miss_rate"] = by_pos.missed / (by_pos.made + by_pos.assists + by_pos.missed)
print(by_pos.sort_values("miss_rate", ascending=False))

# To watch one of them: gridiron.bdb.prepare(tracking, plays, game_id, play_id) and show_animation().

Linebackers in coverage

Half the snaps in a game are passes, and on most of them the linebackers are in coverage. Their jobs fall into three families.

Zone: the hook/curl defender

In zone coverage, the linebacker drops to an area. The most common linebacker zone is the one between the offensive tackle and the numbers, about 8 to 12 yards deep, which combines the hook zone over the tackles and the curl zone outside it (both defined in Coverage Fundamentals). A linebacker who drops there is a hook / curl defender.

Show the Python
off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                       O("X", "WR", -0.7, -16.0, "X"), O("H", "WR", -1.5, -9.0, "H"),
                       O("Y", "TE", -1.5, 9.0, "Y"), O("Z", "WR", -0.7, 16.0, "Z")]
dfn = nickel_front(mike=(4.6, 1.4), will=(4.6, -1.8)) + [
    D("NB", "NB", 5.0, -7.6, "$"), D("SS", "S", 6.5, 10.6, "SS"), D("FS", "S", 14.0, 0.0, "FS"),
    D("LCB", "CB", 7.0, -16.0, "CB"), D("RCB", "CB", 7.0, 16.0, "CB")]
p = Play(off, dfn, los=35, to_go=None)
p.dropback(2.0)
p.route("X", r.go(16)); p.route("Z", r.go(16))
go_to(p, "H", (17.0, -8.2), "route", via=[(4.0, -8.9)])        # the seam
go_to(p, "Y", (6.4, 4.4), "route", via=[(2.4, 9.0)])           # the slant
p.drop("WILL", (8.2, -5.8), zone=(6.0, 7.0), label="hook/curl")
p.drop("MIKE", (7.6, 5.0), zone=(6.0, 7.0), label="hook/curl")
p.drop("FS", (17.5, 0.0)); p.drop("LCB", (16.0, -15.0)); p.drop("RCB", (16.0, 15.0))
p.drop("NB", (6.0, -12.0)); p.drop("SS", (6.0, 13.0))
p.highlight("MIKE", "WILL", color=style.DEFENSE)
f = draw(p, width_in=6.3, lateral=(-19.4, 19.4), window=(-7.4, 20.2), title=False)
dashed(f, p, [(8.4, -6.1), (11.0, -7.0), (13.4, -7.3)], color=style.DEFENSE_DARK, lw=1.4)
say(f, p, 14.4, -4.4, "Will: carry the\nseam to ~12 yd", color=style.DEFENSE_DARK, fontsize=6.8)
say(f, p, 12.4, 8.4, "Mike: wall the slant,\nthen sink, eyes on the QB", color=style.DEFENSE_DARK, fontsize=6.8)
plt.show()
Figure 31.9: Two linebackers as hook/curl defenders in Cover 3 against a 2x2 formation. Cover 3 has three deep defenders, each taking a third of the field (here the two cornerbacks and the free safety, drawn without zones), and four underneath. On the pass read the Mike and the Will drop to their zones (shaded), about 8 to 10 yards deep, from just outside the offensive tackles toward the slot receivers, opening their hips toward the slot on their side and reading the quarterback. The Mike walls Y’s slant: he gets into its path, so the throw has to go around him. The Will’s slot receiver, H, runs straight up the seam, so the Will carries him (dashed) to about 12 yards, until the free safety can take over. Then both sink under the curls, eyes on the quarterback.

The hook/curl defender’s job is a sequence. First, wall: get in the path of the slot receiver’s inside route, so the slant or the dig has to go around him. If the slot runs straight up the seam instead, carry him: run with him, inside and underneath, until a deep defender can take over, about 10 to 12 yards downfield. Four receivers running deep against Cover 3’s three deep thirds is the classic way to beat it, and the hook/curl linebacker’s seam carry is what stops it. Then, sink: as the outside receivers push deep, back up under the curls and comebacks. All the while, eyes on the quarterback, because a zone defender breaks on the throw, not on the receiver. Linebackers in modern NFL defenses rarely drop to a fixed spot and wait; most play some version of pattern matching, zone that turns into man coverage on whichever receiver enters his area. The Cover 3 and Tampa 2 chapters show the most demanding linebacker drops: in Tampa 2, the Mike runs straight down the middle of the field to take away the seam, 15 or 20 yards deep.

The model hook defender of the last decade was Seattle’s Bobby Wagner, the Mike in the 2013 Seahawks’ Cover 3, behind the Under front of Even Fronts and in front of a secondary nicknamed the “Legion of Boom.” Watch his early-down drops in Super Bowl XLVIII, a 43–8 win over Denver in which he made ten tackles: how fast he gets depth, how he walls the crossing routes, and then how his run fills come square and downhill. He went on to six first-team All-Pro selections, more than two thousand career tackles, and the 2025 Walter Payton Man of the Year award, playing for Washington.8

Man: the back and the tight end, and the hole

In man coverage the linebacker is usually assigned the running back or a tight end. This is where a linebacker is most exposed. Running backs are quicker than he is and have the whole width of the field; tight ends are often as fast as he is and bigger. Offenses build plays specifically to get the back in a route against a linebacker in space, like the angle route (a fake to the outside and a break back inside), and to put a fast tight end on a slow linebacker.

Show the Python
off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                       O("X", "WR", -0.7, -16.0, "X"), O("H", "WR", -1.5, -9.0, "H"),
                       te(+1), O("Z", "WR", -1.5, 15.0, "Z")]
dfn = nickel_front(mike=(4.6, 1.2), will=(4.6, -2.0)) + [
    D("NB", "NB", 2.0, -9.0, "$"), D("SS", "S", 6.0, 6.2, "SS"), D("FS", "S", 14.0, 0.0, "FS"),
    D("LCB", "CB", 2.0, -16.0, "CB"), D("RCB", "CB", 2.0, 15.0, "CB")]
p = Play(off, dfn, los=35, to_go=None)
for d_, rec in (("LCB", "X"), ("NB", "H"), ("SS", "Y"), ("RCB", "Z"), ("WILL", "RB")):
    p.man(d_, rec)
p.drop("MIKE", (10.0, 0.0), zone=(6.0, 9.0), label="hole")
p.highlight("MIKE", "WILL", color=style.DEFENSE)
f = draw(p, width_in=6.3, lateral=(-19.4, 19.4), window=(-7.4, 17.6), title=False)
say(f, p, 7.4, -7.0, "Will: man\non the back", color=style.DEFENSE_DARK, fontsize=6.8)
say(f, p, 12.4, 8.8, "Mike: rob the\nmiddle, read the QB", color=style.DEFENSE_DARK, fontsize=6.8)
plt.show()
Figure 31.10: Two linebacker jobs in man coverage (Cover 1: one deep safety, everyone else in man). The Will has the running back (dotted line): if the back runs a route, the Will covers him; if the back stays in to block, many defenses let the Will add himself to the rush (a ‘green dog’ or ‘hug’). The Mike has no receiver. He drops to the hole, the middle of the field about 8 to 15 yards deep, reads the quarterback and drives on anything thrown in front of him: the crossing route or the dig that beats man coverage underneath.

The third family is the job in Figure 31.10: the linebacker with nobody to cover. In man coverage with one deep safety, the defense often has a spare man, and it can put him in the hole zone, the middle of the field 8 to 15 yards deep, as a robber (also called the rat). Staffs use the two words loosely, but many say rat for a low hole player, about 5 to 8 yards deep, sitting on crossers, usually a linebacker, and robber for a deeper one, 10 to 12 yards deep, jumping digs and in-cuts, usually a safety. Crossing routes and digs are how offenses beat man coverage, and they arrive right there. A linebacker who reads the quarterback well can make a career out of that spot; Luke Kuechly made a good part of his there.

Play-action, revisited

Play-Action, Boots, and Screens showed play-action from the offense’s side: a fake run that pulls the linebackers forward, and a throw into the space behind them. Now that you know what a linebacker looks at, you can see why it works, and what the good ones do about it.

The fake is aimed at his keys, his run-fit triggers. The linemen fire out low, like a run. The back runs his run path. The quarterback reaches the ball toward him. Every key says run. But one key can’t say it completely, because of a rule: on a pass, an offensive lineman may not be more than a yard downfield when the ball is thrown. So on play-action, the linemen who would climb to the linebackers on the real run can’t. They block at the line and stay there. A linebacker who keys the back sees a run. A linebacker who keys the uncovered guard, the man who should be coming for him on a run, sees a guard who fires out and then doesn’t come. That is the tell.

Show the Python
def pa_play(keys_guard):
    off = line("short") + [te(+1), O("QB", "QB", -1.9, 0.0, "Q"), O("RB", "RB", -7.0, 0.0, "R")]
    dfn = nickel_front(mike=(4.5, 1.8), will=(4.5, -1.0), wide_ends=False)
    p = Play(off, dfn, los=35, to_go=None)
    for k in OL_KEYS:                                         # run-action: low first step, then hold
        q = p.players[k]
        go_to(p, k, (q.d + 0.4, q.w + 0.35), "block", speed=1.8)
    for k, end in (("WE", (1.1, -4.0)), ("DT", (1.1, -2.1)), ("NT", (1.1, 1.0)), ("SE", (1.1, 4.1))):
        go_to(p, k, end, speed=0.8)
    go_to(p, "QB", (-2.7, 1.0), speed=3.0)
    go_to(p, "QB", (-7.0, 0.3), speed=4.6)
    go_to(p, "RB", (-1.2, 3.4), "run", speed=5.5, via=[(-4.2, 2.2)])
    go_to(p, "Y", (12.2, -7.5), "route", speed=7.0, via=[(4.6, 4.7), (11.6, 0.0)])
    go_to(p, "WILL", (9.4, -4.4), delay=0.45, speed=4.8)
    if keys_guard:
        go_to(p, "MIKE", (4.3, 1.9), speed=0.8, delay=0.1)
        go_to(p, "MIKE", (10.0, 0.4), speed=5.0, delay=0.1)
    else:
        go_to(p, "MIKE", (3.0, 2.6), speed=3.2, delay=0.2)
        go_to(p, "MIKE", (5.9, 0.6), speed=4.0, delay=0.3)
    p.pass_to("Y", t=2.0)
    return p


P_PA_BACK, P_PA_GUARD = pa_play(False), pa_play(True)


def pa_marks(fld, play, t, i):
    if t < 0.05:
        key = "RG" if play is P_PA_GUARD else "RB"
        eyes(fld, play, play.position("MIKE", t), play.position(key, t))
    if play is P_PA_GUARD:                    # the key: the right guard, ringed; he never gets past the line
        d, w = play.position("RG", t)
        x, y = _P(fld, play, d, w)
        fld.ax.add_patch(Circle((float(x), float(y)), 0.95, fc="none", ec=GREEN, lw=1.6, zorder=7.5))
        if t > 0.5:
            point_to(fld, play, (2.9, w + 0.6), (d + 0.6, w), "no climb", color=GREEN, fontsize=6.4, shrink=2)
    if t >= 2.0:                              # the throw
        q, y_ = play.position("QB", 2.0), play.position("Y", t + 0.3)
        dashed(fld, play, [tuple(q), tuple(y_)], color=style.BALL, lw=1.2)


animation_or_strip(
    [(P_PA_BACK, 0.0, "keys the back"), (P_PA_BACK, 0.9, ""), (P_PA_BACK, 2.3, ""),
     (P_PA_GUARD, 0.0, "keys the guard"), (P_PA_GUARD, 0.9, ""), (P_PA_GUARD, 2.3, "")],
    notes=["eyes on the back", "the back fakes zone:\nthe Mike steps up", "five yards deep: Y is\nbehind him",
           "eyes on the right guard", "guard fires out, but no\nclimb: not a run", "ten yards deep, in the\ncrosser's path"],
    rings=(("MIKE", style.DEFENSE),), lateral=(-9.0, 7.6), window=(-7.9, 15.4), after=pa_marks,
    ncols=3, width_in=6.2)
Figure 31.11: Play-action from the linebacker’s side (simulated, BDB-format tracking). The same play twice: an inside-zone fake to the right and a tight end (Y) running a deep crossing route behind the linebackers, against a 4-2-5 whose Mike (ringed) is over the uncovered right guard. Top row: this Mike keys the back. 1: eyes on the back. 2: the back takes the fake, so the Mike steps up to fill. 3: when the ball is thrown he is five or six yards deep, and Y is behind him. Bottom row: this Mike keys the right guard (green ring). 1: eyes on the guard. 2: the guard fires out but stays at the line instead of climbing to him (a lineman may not go downfield on a pass): no climb, so not a run, and the Mike gets depth. 3: he is about ten yards deep, in the crossing route’s path, as the ball is thrown (dashed brown: the throw). The Will drops the same way in both rows; the text says why.

Two things in Figure 31.11 are worth remembering. First, the linebacker who keys the back is not a bad linebacker; he is doing exactly what he is trained to do against the run, and on most snaps it is the right call. That is why, as 04-05 showed, play-action works about as well for teams that run the ball badly as for teams that run it well: the linebacker is reacting to action, not to statistics. Second, the cure is in the keys, and it costs something. A linebacker who waits for the guard to climb is a fraction of a second slower on every real run. Defenses decide, sometimes play by play, which mistake they would rather make: in obvious running situations the linebackers trigger fast, and in play-action situations (first down and second-and-short, the shot zones near midfield, against a team that loves the fake) they read a beat longer.

The Will in Figure 31.11 is drawn the same way in both rows, for a reason: the fake goes away from him, and a backside linebacker’s run job is to shuffle over the top and wait for the cutback, so a fake to the other side moves him less. The test, and the cost, fall on the Mike.

Linebackers as pressure players

The last job is going forward on a pass play. Linebackers have traditionally been the most common extra rushers, the blitzers, because they start close to the line and in the middle, where a rusher reaches the quarterback fastest (modern defenses send their nickel backs and safeties too). Their pressure roles, all built in Part 7, come in a few recognizable shapes:

  • The A-gap blitz. Both inside linebackers walk up into the gaps on either side of the center before the snap, the double A-gap mug, threatening the quickest path to the quarterback. The offense has to account for both; the defense may send both, one, or neither and drop them into coverage at the snap (Blitz and Man Pressure).
  • The green dog (or hug, or add-on). A linebacker assigned to cover the running back who, when the back stays in to block, rushes instead: there is nobody left for him to cover.
  • The simulated pressure. A linebacker rushes while a defensive lineman drops into coverage, so the offense sees five threats but gets four rushers from unexpected places: simulated pressure, in Zone Blitz and Simulated Pressure.
  • The spy. Against a quarterback who runs, a linebacker is assigned to mirror him, staying at linebacker depth and following him wherever he goes: a spy, covered in Third Down. Against the fastest quarterbacks, teams often spy with a safety or the nickel back instead, for the same speed reason the Sam lost his job.

Every one of these trades coverage for pressure, or pressure for coverage, and the linebacker is the piece the defense moves to make the trade.

The part-time Sam and the safety-sized linebacker

Put the jobs together, the run fits, the zone drops, the man coverage on backs and tight ends, the blitzes, and you can see the problem the modern NFL created for linebackers. Offenses spread out. The more snaps an offense plays with three wide receivers, the more snaps one of those receivers is in the slot, and the more often the defense has to choose between a linebacker who walks out over him (Figure 31.2) and a defensive back who replaces that linebacker.

For most of the last two decades, defenses chose the defensive back. By Pro Football Focus’s count, base defense (four defensive backs, three linebackers) was on the field for 54% of plays in 2008 and 45% in 2011, and by 2014 defenses had five or more defensive backs out for more than 60% of plays.9 The linebacker they removed was usually the Sam, the strong-side linebacker built to take on tight ends and fullbacks, because the 11-personnel offenses that spread the field had one tight end and no fullback for him to take on. The nickel package, five defensive backs and two linebackers, became the real base defense of the NFL, as A First Look at Defense showed.

Show the Python
style.apply()
fig, axes = plt.subplots(1, 2, figsize=(6.6, 3.3), gridspec_kw={"width_ratios": [1.15, 1]})
ax = axes[0]
for k, lab, c in (("nickel", "5 DBs (nickel)", style.SERIES[0]), ("base", "4 or fewer (base)", style.SERIES[1]),
                  ("dime", "6 or more (dime)", style.SERIES[2])):
    ax.plot(PKG.index, PKG[k], marker="o", ms=3, lw=2.2 if k == "base" else 1.6, color=c)
    ax.text(2025.3, PKG[k].iloc[-1], lab, fontsize=7.0, va="center", color=style.INK_2)
ax.axvline(2022.5, color=style.MUTED, lw=0.9, ls=(0, (3, 2)))
ax.set_xlim(2015.6, 2029.6); ax.set_ylim(0, 85)
ax.set_xticks([2016, 2019, 2022, 2025])
ax.text(2016.0, 83, "for scale: base was on 54% of\nplays in 2008, 45% in 2011 (PFF)", fontsize=6.6,
        color=style.INK_2, va="top")
ax.set_ylabel("Share of defensive snaps (%)")
ax.set_title("Defensive backs on the field, 2016-2025", fontsize=9)
ax = axes[1]
ax.plot(CMB.loc[:2018].index, CMB.loc[:2018, "wt"], marker="o", ms=3, lw=1.8, color=style.SERIES[1])
ax.plot(CMB.loc[2019:2019].index, CMB.loc[2019:2019, "wt"], marker="o", ms=3, lw=0, color=style.SERIES[1])
ax.plot(CMB.loc[2022:].index, CMB.loc[2022:, "wt"], marker="o", ms=3, lw=1.8, color=style.SERIES[1])
ax.axvline(2018.5, color=style.MUTED, lw=0.9, ls=(0, (3, 2)))
ax.set_ylim(225, 250)
ax.text(2001, 247.6, "listed ILB", fontsize=7.2, color=style.INK_2)
ax.text(2019.4, 242.4, "listed LB", fontsize=7.2, color=style.INK_2)
ax.set_xticks([2000, 2008, 2016, 2024])
ax.set_ylabel("Pounds")
ax.set_title("Off-ball linebackers at the Combine", fontsize=9)
fig.tight_layout(w_pad=1.2)
plt.show()
Figure 31.12: Two trends. Left: how many defensive backs NFL defenses had on the field, as a share of regular-season snaps (nflverse participation data; 2016-2022 from NFL Next Gen Stats personnel labels, 2023-2025 counted from FTN’s position lists, so the dashed line marks a change of source). Base defense, four defensive backs and so three linebackers, fell to about a fifth of snaps by 2023 and came back to about 30% in 2025, as offenses returned to two-tight-end sets. Right: the average NFL Combine weight of off-ball linebackers by draft class (2000-2018: players listed as inside linebackers; 2019 on: players listed as linebackers, with edge rushers listed separately; the 2020 and 2021 classes are left out because their data lumps edge rushers in with linebackers). The labels changed in 2019 too, so read the trend, not the step.

The left half of Figure 31.12 picks the story up in 2016, after that big drop, and its most recent chapter is a partial rebound. In 2016 base defense was on the field for 31% of snaps; by 2023 it was down to 22%. Then it came back: 31% in 2025, close to the 29.7% Next Gen Stats measured, because offenses returned to two-tight-end and fullback sets and defenses answered with bigger personnel.10 The Sam didn’t disappear; he became a part-time player.

The other half of the story is the linebackers who stayed. If two linebackers are going to be on the field for most snaps, and those two have to cover running backs and tight ends in space as well as fill gaps, teams want them faster, and faster usually means lighter. The right half of Figure 31.12 shows the trend at the NFL Combine. Off-ball linebackers in the 2000–2009 draft classes averaged 242 pounds and ran the 40-yard dash in 4.75 seconds; the classes since 2019 have averaged 233 pounds and 4.60 seconds.11 Nine or ten pounds and a tenth and a half of a second doesn’t sound like much. At the second level it is the difference between running with a running back and watching him.

The clearest sign of the shift is where some linebackers come from. In 2015 the Arizona Cardinals moved Deone Bucannon, a safety they had drafted in the first round a year earlier, to inside linebacker, at about 211 pounds. Their depth chart listed him as “$ILB,” and the coaches called him the moneybacker: a safety’s speed and coverage in a linebacker’s spot, playing the run by beating blockers to the hole rather than taking them on.12 Other teams followed with safety-sized linebackers and linebacker-sized safeties, until in some defenses the line between the two positions is mostly a matter of which word is on the depth chart. The big nickel of A First Look at Defense, with a third safety in the box, is the same idea from the other direction.

What the safety-sized linebacker gives up is the thing the Sam was built for: taking on a fullback or a pulling guard in the hole and holding his ground. A 215-pound linebacker who has to stand still and absorb a 315-pound guard loses. So the modern linebacker is coached to not stand still: to beat the blocker to the spot, or run through the gap before he arrives, the fits from earlier in this chapter. The best of today’s linebackers combine both. San Francisco’s Fred Warner, a third-round pick in 2018 and first-team All-Pro in 2020, 2022, 2023 and 2024, is about 6-foot-3 and 230 pounds: the coverage linebacker teams hoped the safety-sized linebacker would be, in a full-sized body. Watch him carry a tight end up the seam in his zone drops, the hook/curl seam carry of Figure 31.9, and then fill against the run.13 And when offenses go heavy, with two tight ends and a fullback, as many did again in 2025, defenses bring back a third linebacker, or a bigger one. The Sam isn’t extinct. He is a specialist who comes in when the offense does.

CautionCommon misconception

“Linebackers are the defense’s run-stoppers; the defensive backs cover.” In the modern NFL the two off-ball linebackers are on the field for most passing snaps and are in coverage on most of them, against running backs, tight ends and slot receivers. A linebacker who cannot cover cannot stay on the field, however well he tackles. That, more than anything, is what has changed about the position.

The green dot: the defense’s quarterback

One linebacker usually has one more job, and it starts before anyone moves. Since 2008 NFL rules have allowed one defensive player on the field to have a radio speaker in his helmet, the way quarterbacks have since 1994; the owners approved it by a single vote over the required majority.14 That player wears the green dot sticker you met in What a Play Really Is, and the radio cuts off with 15 seconds on the play clock. On most teams, he is the Mike.

Show the Python
fig = plt.figure(figsize=(6.6, 3.9))
axf = fig.add_axes([0.0, 0.0, 0.56, 1.0])
off = line("short") + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"), te(+1),
                       O("H", "WR", -1.5, 10.0, "H"), O("Z", "WR", -0.7, 15.0, "Z"), O("X", "WR", -0.7, -15.0, "X")]
dfn = nickel_front(mike=(4.7, 1.4), will=(4.7, -1.8)) + [
    D("NB", "NB", 4.8, 7.8, "$"), D("SS", "S", 8.0, 5.0, "SS"), D("FS", "S", 13.0, -2.0, "FS"),
    D("LCB", "CB", 6.5, -15.0, "CB"), D("RCB", "CB", 6.5, 15.0, "CB")]
p = Play(off, dfn, los=35, to_go=None)
p.highlight("MIKE", color=GREEN)
f = draw(p, ax=axf, width_in=3.7, lateral=(-17.6, 17.6), window=(-7.4, 16.4), title=False)
point_to(f, p, (9.6, -6.0), (5.0, 1.0), "green dot:\n\"Strength right! Under!\"", color=GREEN, fontsize=7.0, shrink=8)
say(f, p, -3.6, 9.6, "TE and trips: strong side", color=style.OFFENSE_DARK, fontsize=6.6)
axt = fig.add_axes([0.58, 0.04, 0.41, 0.92]); axt.axis("off")
steps = [("The call", "Hears it from the coordinator,\nrelays it in the huddle or by signal."),
         ("Strength", "\"Strength right!\" Where is the\nTE? The trips? Sets every rule."),
         ("Front", "\"Under!\" The line sets off the\nstrength: the 3-technique goes away."),
         ("Coverage", "Who has whom: the trips, the\nback, the tight end."),
         ("Adjust and alert", "Motion or shift: re-set it.\n\"Watch the screen!\" \"Boot!\"")]
for i, (h, b) in enumerate(steps):
    y = 0.95 - i * 0.195
    axt.text(0.0, y, str(i + 1), fontsize=8, color="white", fontweight="bold", va="top",
             bbox=dict(boxstyle="circle,pad=0.25", fc=GREEN, ec="none"))
    axt.text(0.11, y + 0.005, h, fontsize=8.4, fontweight="bold", color=style.INK, va="top")
    axt.text(0.11, y - 0.055, b, fontsize=7.3, color=style.INK_2, va="top", linespacing=1.25)
plt.show()
Figure 31.13: What the green-dot linebacker does before a snap (an illustrative sequence; the words differ from team to team). Against a trips formation with the tight end attached on the right, the Mike (green ring) hears the call in his helmet and relays it, then sets the defense to the formation he sees: the strength, the front, the coverage, then any adjustment to a motion or shift, and the alerts from the week’s film study.

What does he actually do with it?

  1. He relays the call. The defensive coordinator calls the front, the coverage and any pressure into one helmet. The green dot passes it to the other ten, in a huddle or with hand signals, before the radio goes dead.
  2. He sets the strength. Every rule in the call depends on which side is “strong,” and the strength depends on what the offense shows: the tight end, the trips side, the running back, or the wide side of the field. The green dot decides and shouts it, and the front sets off his word, the way Even Fronts showed. The hard part is that many defenses set the front to the tight end (or the back) and the coverage to the receivers. In Figure 31.13 they agree; against trips with the tight end on the other side they don’t, and he has to call both: “Front left, coverage right.”
  3. He adjusts to what the offense does. When the offense shifts or sends a man in motion, the strength may change, and with it the front and the coverage rules. With the radio already off, the green dot is the one who re-sets everyone, in a second or two, with a word. (If the offense substitutes after the radio has cut out, a new call comes from the sideline by hand signal, and he passes it on.)
  4. He makes the alerts. Linebackers study opponents’ tendencies all week. The green dot is the one who sees a formation and yells “Watch the screen!” or “Boot! Boot!” before the snap, from a list built in film study.
  5. He plays a game with the protection. The offense’s center identifies a defender as the “Mike” for its blocking count, the Mike identification of Pass Protection. The defense knows it. Linebackers walk up, back out and swap spots before the snap to make that identification wrong.

It is a lot to ask of one player, and it is why teams prize linebackers who are, in the clichéd but accurate phrase, coaches on the field. It is also why the green dot has started to move. A linebacker who comes off the field in some packages takes the radio with him, and the backup green dot has to take over. More and more teams have given the radio to a safety or another defensive back who never leaves the field: six teams did in 2021, according to one count.15 The Mike’s job doesn’t vanish when he loses the dot; he still sets the front and the run fits in the box, while the safety with the radio runs the coverage.

Film room

NoteFilm room: Baltimore Ravens 2000

The season: Ray Lewis’s Ravens allowed 165 points in 16 games, the fewest in a 16-game season, and 970 rushing yards, also a 16-game record, then beat the Giants 34–7 in Super Bowl XXXV; Lewis was the game’s MVP and the league’s Defensive Player of the Year.16

Where to look: Super Bowl XXXV, against the Giants. What to notice: the two big defensive tackles in front of him, Tony Siragusa and Sam Adams. Their job was to occupy both guards so that nobody could climb to Lewis: watch the guards at the snap, then watch how often Lewis gets to the ball without anyone touching him. This is the protected linebacker at his best (the opposite of the open linebacker over a free guard): two big tackles who keep the guards off him, and a linebacker fast enough to his keys to make that pay.

NoteFilm room: Carolina Panthers 2015

The season: the Panthers went 15–1 and reached Super Bowl 50 with Luke Kuechly at middle linebacker, three seasons after he was the Defensive Rookie of the Year and two after he became the youngest Defensive Player of the Year. In the playoffs that January he returned interceptions for touchdowns in both of Carolina’s NFC games, the first in the opening minutes against Seattle and the second in the 49–15 NFC Championship win over Arizona.17

Where to look: the NFC Championship Game against Arizona. What to notice: Kuechly’s first step. He was famous for moving before the play had declared itself, and on the replay you can usually see why: his eyes are on a guard or the back, and he goes where they tell him. On passing downs, watch him in the hole, reading the quarterback and driving on throws in front of him. He retired in January 2020, at 28.

NoteFilm room: Baltimore Ravens 2022

The trade: On October 31, 2022, Chicago traded Roquan Smith, the eighth pick of the 2018 draft, to Baltimore for a second-round pick, a fifth-round pick and a linebacker; in January 2023 the Ravens signed him to a five-year, $100 million extension, the first for an off-ball linebacker at $20 million a year.18 In the eight games before he arrived, the Ravens allowed 22.9 points a game; in the nine after, 14.7. (Not all of that was Smith: other starters returned from injuries, and the schedule changed. But the timing was hard to miss.)19

Where to look: his first game for Baltimore, a 27–13 win at New Orleans on Monday night, November 7. What to notice: a modern run-through linebacker. Watch Smith’s fills against zone runs: he is through the gap before the climbing lineman gets there, which is how a 235-pound linebacker beats a guard who outweighs him by 80 pounds. Then watch him and Patrick Queen, the other inside linebacker that season, talk before the snap, and how often they swap responsibilities after the offense shifts.

Watch for it on Sunday

TipWatch for it

Mirror the Mike. For ten snaps, watch only the middle linebacker. Ignore the ball.

  • Before the snap: Where is he standing: stacked behind a lineman, open over a guard, or walked out over a receiver? Is he pointing and shouting? (That’s the green dot setting the strength.) Does anyone walk up into the A gaps?
  • At the snap: first steps forward or back? His very first step is a short read step; the second one tells you what he saw. Forward, it’s a run, or he thinks it is. Back, it’s a pass. Sideways means he has read a pull or zone flow; see which way he goes and where the ball goes.
  • On runs: Did he fill, plug, scrape or run through? Did a guard get to him? Was he inside the ball as he pursued, or did the back cut back behind him?
  • On passes: Did he drop to a spot, run with a back or a tight end, or rush? On play-action, count his steps forward before he turned around.
  • On the replay: Watch the guards and the back, his keys. Did they tell the truth?

For your prediction log (How to Watch a Broadcast): write F or B for the Mike’s first real step, then run or pass. After a half, check how often his first step was right, and which plays fooled him.

Predict the play

TipPredict the play

Drill 1. The back says one thing, the linemen another. First-and-10, shotgun, the back to the quarterback’s right. In the first quarter-second after the snap the back takes a step to his right, while the right guard and right tackle pull to the left. You are the Mike. Which way do you go, and what is the play?

Show the Python
off = line("full") + [te(+1), O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, 2.2, "R")]
p = Play(off, nickel_front(mike=(4.7, 0.2), will=(4.7, -2.2)), los=35, to_go=10,
         title="Drill 1: the back steps right, two linemen pull left")
go_to(p, "RB", (-4.5, 3.6), "run")
go_to(p, "RG", (-1.5, -0.8), via=[(-1.5, 1.0)])
go_to(p, "RT", (-1.9, 1.0), via=[(-1.8, 2.8)])
for k in ("LT", "LG", "C"):
    q = p.players[k]
    go_to(p, k, (q.d + 0.4, q.w + 0.9), "block")
go_to(p, "Y", (-1.6, 5.0), "block")              # hinge: step back and wall off the backside end
p.highlight("MIKE", color=style.DEFENSE)
p.read("RB", key="MIKE"); p.read("RG", key="MIKE")
f = draw(p, width_in=5.4, lateral=(-9.0, 9.6), window=(-7.6, 7.6))
plt.show()
Figure 31.14: Drill 1: the first quarter-second. The back steps right (short arrow); the right guard and right tackle step flat to the left behind the line (their pulls); the left side of the line blocks down to the right, and the tight end steps back. The Mike (ringed) is reading the back and the right guard (dotted).

Go left, with the guard and tackle. It’s counter. The back’s step to the right is the counter step, the lie the play is built on (Gap and Power Runs); the two pullers are the truth, because two linemen can’t run to the left unless the ball is going there. The guard will kick out the end man on the left, and the tackle will wrap through the hole looking for the play-side linebacker, the Will. (On the right, the tight end steps back to wall off the end the pulling tackle left: a hinge.)

You are the backside linebacker. Your guard has just pulled, so you follow him: sideways toward the offense’s left (your right), flat and inside-out, while the center or left guard tries to climb to you, and you fill the hole the tackle leads through. It is the read in Figure 31.3, from the other side. A Mike who believes the back takes a false step toward him, and by the time he recovers the hole has opened behind his back. This is the textbook case for “if your keys disagree, believe the linemen.”

TipPredict the play

Drill 2. The walk-out that gives it away. Third-and-6. The offense is in 11 personnel with the back beside the quarterback. Before the snap the back motions out of the backfield and lines up wide on the left. The Will linebacker walks out with him and stands over him. What did the defense just tell you, and what is the offense likely to do?

Show the Python
off = line("short") + [te(+1), O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                       O("X", "WR", -0.7, -17.0, "X"), O("H", "WR", -1.5, -8.6, "H"), O("Z", "WR", -1.5, 15.0, "Z")]
dfn = nickel_front(mike=(4.7, 1.0), will=(4.7, -2.0)) + [
    D("NB", "NB", 3.0, -8.6, "$"), D("SS", "S", 7.6, 6.0, "SS"), D("FS", "S", 13.5, 0.0, "FS"),
    D("LCB", "CB", 3.0, -17.0, "CB"), D("RCB", "CB", 3.0, 15.0, "CB")]
p = Play(off, dfn, los=40, to_go=6, title="Drill 2: the back goes out, the Will goes with him")
p.motion("RB", to=(-1.5, -12.8))
p.highlight("WILL", color=style.DEFENSE)
f = draw(p, width_in=6.0, lateral=(-20.4, 18.4), window=(-7.6, 16.4))
dashed(f, p, [(4.6, -2.9), (4.4, -8.0), (4.0, -12.0)], color=style.DEFENSE_DARK, lw=1.3)
ghost(f, p, 4.0, -12.8, "W")
say(f, p, 9.2, -12.8, "the Will\nends up here", color=style.DEFENSE_DARK, fontsize=6.8)
plt.show()
Figure 31.15: Drill 2: the back (R) motions out to the left, between the slot receiver (H) and the split end (X); the Will (ringed) walks out of the box and follows him (dashed). One deep safety; the cornerbacks and the nickel back are tight on their receivers.

The defense told you it is in man coverage, and it told you which matchup the offense now has: a running back against a linebacker, in space, on third down. A zone defense would have let the back go and simply re-set its zones; a defense that sends a specific defender with a man who moves is matching him (the motion-as-indicator idea from Motion and Shifts). With one deep safety, the coverage is probably Cover 1.

The offense will usually go to that matchup: a quick route for the back, a slant, a quick out or an option route, where his quickness against a linebacker who has never covered him from out there is worth six yards. It is the case for linebackers who can cover, and for the safety-sized linebackers who replaced the Sam. Two smaller points: the box has lost a defender, leaving five (four linemen and the Mike) against six blockers, so a quarterback draw is suddenly attractive; and a well-coached defense may answer the motion by swapping assignments (“banjo,” or switching the nickel back onto the back) so that the linebacker never ends up out there at all. A banjo is the general version: two defenders trade who covers whom depending on where the receivers go.

TipPredict the play

Drill 3. Both linebackers flow. First-and-10. Outside zone to the right: the line steps right together, and the back sprints for the tight end’s outside leg. The picture is frozen 0.8 seconds after the snap; compare it with the fast-flow half of Figure 67.1. Both linebackers have flowed hard to the right. Where does the back go, and who made the mistake?

Show the Python
off = line("short") + [te(+1), O("QB", "QB", -1.9, 0, "Q"), O("RB", "RB", -7.0, 0, "R")]
p = Play(off, over_front(+1), los=40, to_go=10)
T_FREEZE = 0.8


def by(key, end, via=(), kind="path"):
    """Move `key` so that he arrives at `end` exactly at T_FREEZE."""
    pts = [tuple(p._cur(key)), *via, end]
    go_to(p, key, end, kind, speed=max(path_len(pts) / T_FREEZE, 0.1), via=via)


for k in OL_KEYS + ("Y",):
    q = p.players[k]
    by(k, (q.d + 0.3, q.w + 1.2), kind="block")
by("QB", (-2.6, 1.6))
by("RB", (-3.6, 4.6), via=[(-5.9, 2.6)], kind="run")
p.handoff("RB", t=0.6)
by("MIKE", (3.6, 5.3), via=[(4.2, 2.8)])
by("WILL", (3.6, 3.3), via=[(4.3, 0.2)])
by("SAM", (2.0, 7.8))
by("NT", (1.2, 0.3)); by("WE", (1.0, -3.4)); by("DT", (1.2, 2.9)); by("SE", (1.2, 4.6))
fig, ax = plt.subplots(figsize=(5.4, 4.6))
LAT3, WIN3 = (-8.6, 10.6), (-8.8, 8.2)
fld = panel(ax, p, tracking(p), T_FREEZE, LAT3, WIN3, rings=(("MIKE", style.DEFENSE), ("WILL", style.DEFENSE)))
lane(fld, p, -3.6, 0.4, 1.9, 6.4, color=style.OFFENSE, alpha=0.10)
say(fld, p, 5.0, -1.6, "backside:\nnobody home", color=style.OFFENSE_DARK, fontsize=6.8)
ax.set_title(f"Drill 3: outside zone, {T_FREEZE:.1f} s after the snap", fontsize=8.6, loc="left", color=style.INK,
             fontweight="bold")
plt.show()
Figure 31.16: Drill 3: outside zone right, 0.8 seconds after the snap (simulated; every player is drawn where he is at that moment, and the faint lines are where he has been). The line has stepped right and is cutting off the backside linemen; the back is pressing the edge; the Mike and the Will (ringed) have both run hard to the right, the Will level with the Mike. The shaded area behind the backside of the line is empty.

The back cuts back, behind the Will, into the backside A or B gap, and the Will made the mistake. Outside zone is built to make the defense run sideways and then to cut against the flow (Zone Running). The play-side linebacker, the Mike, is right to run with it, inside-out. But the Will is the backside linebacker, and his job against fast flow is to follow a step behind the Mike and a little deeper, over the top, as the cutback player (Figure 67.1). Here he is level with the Mike and nearly as far over as the ball, so the shaded area behind the line’s flow is empty except for linemen who are being cut off. The back plants his foot and goes there, and the next defender is a safety.

A good Will gives up a yard or two to the outside to keep the cutback: if the back keeps going, the Mike and the Sam are there, and the Will arrives late but in the right place. He doesn’t hold the cutback alone; the backside end has to squeeze or chase so the back can’t bend it all the way back. The cutback runs you see go for 20 yards are usually a backside player out of place: a linebacker who ran too fast, an end who got reached or cut, or a safety who flowed too early.

Back to the huddle

The chapter opened with a middle linebacker who went the “wrong” way, away from the back’s jab step, and stopped the run for no gain, while the analyst circled the left guard. Now you can see what he saw. The guard nearest him fired out (a run), and the left guard opened his hips and ran flat behind the line (a pull, so a gap-scheme run going where he went). The back’s jab step was window dressing. The Mike went with the puller, had the shorter trip, and met him at the line, where the hole was supposed to be. The back never had a chance to choose.

Takeaways

  • Where a linebacker stands is a trade. Stacked behind a lineman, he is shielded and hard to read but a step slower to the gaps; open over an uncovered guard, he sees everything and is easy to block; walked out to an apex over a slot receiver, he can cover but he has left the box light and become the offense’s conflict defender.
  • Linebackers read keys, not the ball. The guards’ first steps (fire out, down block, pull, zone step, pass set) and the near back’s direction tell him run or pass and where, early enough to get there. The offense knows it, which is why counters, traps and play-action are built to make his keys lie.
  • Flow tells him how to move; the fit tells him where. Fast flow: run with it, inside-out, with the backside linebacker a step behind for the cutback. Slow flow: press the gap and stay square. The fit is a fill, a plug, a scrape or a run-through, and the scrape is also the defense’s answer to the zone read.
  • The second level is where runs are decided. Pursuit angles aim where the runner will be, a step inside him, with a leverage player outside; leverage tackling takes away one direction and wraps the legs. Inside linebackers make a fifth to a quarter of the tackles on runs up to 9 yards; misses rise with the space around the tackle, and a run that beats the linebackers is a defensive back’s tackle.
  • On passes, linebackers are hook/curl defenders, man defenders on backs and tight ends, robbers in the hole and blitzers. Play-action targets their keys; the uncovered guard who doesn’t climb is the tell.
  • The position has shrunk. Spread offenses made the Sam a part-time player, replaced by a nickel back, and made the remaining linebackers lighter and faster, down to safety-sized “moneybackers.” The green-dot linebacker, who sets the strength and adjusts the defense before every snap, is the job that hasn’t changed.

Connections

Builds on: Even Fronts (the uncovered guard each front leaves and the linebacker over it), Play-Action, Boots, and Screens (the linebacker’s run-fit triggers), The Language of the Run Game (gaps, climbing and pulling), Zone Running and Gap and Power Runs (what the keys are telling him), and A First Look at Defense (the box and the apex).

Sets up:

See also (case study): The Ravens and Lamar Jackson’s Run Game, an offense built to put linebackers in conflict on every snap, and the linebackers who had to defend it.

If you want to go deeper: the Seattle Seahawks’ tackling videos (2014 and later), still the clearest explanation of leverage tackling; Chris B. Brown’s The Art of Smart Football on linebacker reads and the zone read; and the linebacker clinic talks that circulate as video from college and NFL coaches, which teach keys and fits in the language of this chapter.


  1. Pro Football Hall of Fame, “Bill George” (inducted 1974): a 1951 draft pick who began as a middle guard in the five-man line and, in a 1954 game against the Eagles, dropped back off the line and intercepted a pass: https://www.profootballhof.com/players/bill-george/. The Hall’s own wording is careful: “no one can swear which middle guard in a five-man line first dropped back,” but George “is the most popular choice” and “was the first to star at the middle linebacker position.” The Hall dates the Eagles game to his third season, 1954.↩︎

  2. ESPN (AP), “Sam Huff, hard-hitting Hall of Fame linebacker, dies at 87” (November 2021), on the October 1960 CBS special The Violent World of Sam Huff, hosted by Walter Cronkite, with Huff “mic’ed up” in training camp and preseason, and his place at middle linebacker “in a 4-3 scheme developed for him by” Tom Landry, “his defensive coordinator with New York,” after Huff took over the job as a rookie in October 1956: https://www.espn.com/nfl/story/_/id/32623149. The special aired on October 31, 1960, in CBS’s The Twentieth Century: “Sam Huff,” Wikipedia, https://en.wikipedia.org/wiki/Sam_Huff.↩︎

  3. ESPN, “NFL and Carroll promote proper tackling” (August 4, 2014), on the 20-minute Seahawks film of rugby-style “shoulder tackling” and the league’s mailing of it, with Carroll’s letter, to coaches and parents: https://www.espn.com/blog/seattle-seahawks/post/_/id/7563/nfl-and-carroll-promote-proper-tackling. The 2014 video itself: https://seahawks.com/video/2014-seahawks-tackling-70386. Seattle Seahawks, “Seahawks tackling video to change the game” (June 11, 2015), on the second video by Carroll and Rocky Seto and the “Hawk Tackle”: https://www.seahawks.com/news/seahawks-tackling-video-to-change-the-game-124566. The hawk tackle’s coaching points (“eyes through the thighs,” “wrap and squeeze”) are from FootballScoop, “Pete Carroll teaches the tackling philosophy of the Seahawks (including drills)” (July 2015): https://www.footballscoop.com/pete-carroll-teaches-the-tackling-philosophy-of-the-seahawks-including-drills.↩︎

  4. NFL.com, “NFL owners vote to ban hip-drop tackle at annual league meeting” (March 2024): a 15-yard penalty and an automatic first down: https://www.nfl.com/news/nfl-owners-vote-to-ban-hip-drop-tackle-at-annual-league-meeting.↩︎

  5. NBC Sports (ProFootballTalk), “NFL’s new three-strike system doesn’t apply until the 2026 regular season” (August 2026): https://www.nbcsports.com/nfl/profootballtalk/rumor-mill/news/nfls-new-three-strike-system-doesnt-apply-until-the-2026-regular-season.↩︎

  6. Course calculation from nflverse play-by-play and weekly rosters via nflreadpy, regular seasons 2021–2025: designed runs (play_type == "run", scrambles excluded) without a penalty or a touchdown, with the tackler taken as the first of solo_tackle_1_player_id, tackle_with_assist_1_player_id and assist_tackle_1_player_id, and his group from the roster’s depth_chart_position that season (ILB, MLB and LB as inside linebackers; OLB, mostly 3-4 edge rushers but also some off-ball 4-3 outside linebackers such as Cleveland’s Jeremiah Owusu-Koramoah in 2023, separately, so the inside-linebacker share understates what all off-ball linebackers do). The code is in this chapter’s source.↩︎

  7. Course calculation from Pro Football Reference’s charted advanced defensive statistics, via nflverse (nflreadpy.load_pfr_advstats(stat_type="def")), seasons 2021–2025: missed tackles divided by combined tackles plus missed tackles, summed over each group, with the group taken from the nflverse roster’s depth_chart_position that season (78% of player-seasons match a roster entry; “DB” is counted with the cornerbacks). The code is in this chapter’s source.↩︎

  8. “Bobby Wagner,” Wikipedia (2nd round, 47th pick, 2012; first-team All-Pro 2014 and 2016–2020; ten tackles in Super Bowl XLVIII; Washington 2024–2025; 2,000 career tackles in January 2026): https://en.wikipedia.org/wiki/Bobby_Wagner. The 2025 Walter Payton Man of the Year award (announced February 5, 2026): Washington Commanders, “Bobby Wagner named 2025 Walter Payton Man of the Year,” https://www.commanders.com/news/bobby-wagner-named-2025-walter-payton-man-of-the-year.↩︎

  9. Mike Clay, Pro Football Focus, “Defensive personnel packages, part 1” (April 11, 2012): “A base defense was in place on 54% of all plays back in 2008, but that figure fell to 52% in 2009, 48% in 2010, and 45% in 2011”: https://www.pff.com/fantasy-defensive-personnel-packages-%25e2%2580%2593-part-1/. The 2014 figure (five or more defensive backs on 60.3% of plays) is PFF data reported by Peter King (The MMQB), as quoted in CBS Sports, “Here’s why the nickel defense is the new base defense in the NFL” (April 4, 2016): https://www.cbssports.com/nfl/news/heres-why-the-nickel-defense-is-the-new-base-defense-in-the-nfl.↩︎

  10. James Reber (Next Gen Stats), “NFL trend watch: heavy personnel could shape Super Bowl LX showdown between Patriots and Seahawks,” NFL.com (base defense on 29.7% of snaps in 2025, up from 20.5% in 2023): https://www.nfl.com/news/nfl-trend-watch-heavy-personnel-could-shape-super-bowl-lx-showdown-between-patriots-and-seahawks. The chart is a course calculation from nflverse participation data (defense_personnel), regular-season runs and passes, which differs slightly from NGS’s own figures.↩︎

  11. Course calculation from nflverse NFL Combine data (load_combine): players listed “ILB” for the 2000–2018 draft classes and “LB” from 2019, when the data lists most edge rushers separately as “EDGE.” The 2020 and 2021 files have no “EDGE” label (their “LB” rows include edge rushers such as Darrell Taylor, 267 pounds), so those two classes are left out. Forty-yard times are averaged over the players who ran. Because the labels changed in 2019, part of the drop between the two periods may be a change in who is counted.↩︎

  12. NFL.com, “‘Moneybacker’ Deone Bucannon key to Cardinals’ D” (2015), with Bucannon at 6-foot-1 and 211 pounds, moved from safety to inside linebacker and listed as “$ILB,” and coordinator James Bettcher’s “He is where he plays”: https://www.nfl.com/news/moneybacker-deone-bucannon-key-to-cardinals-d-0ap3000000597969. The move came in 2015 training camp, after inside linebacker Sean Weatherspoon was hurt; Bucannon had started at strong safety as a 2014 rookie (27th pick): “Deone Bucannon,” Wikipedia, https://en.wikipedia.org/wiki/Deone_Bucannon.↩︎

  13. “Fred Warner (American football),” Wikipedia (3rd round, 70th pick, 2018, from BYU; listed at 6-foot-3, 230 pounds; first-team All-Pro 2020, 2022, 2023 and 2024; a broken and dislocated ankle in Week 6 of 2025 ended his season): https://en.wikipedia.org/wiki/Fred_Warner_(American_football). Warner as the green dot: ESPN, “Fred Warner’s cerebral approach at the heart of 49ers defense” (December 4, 2019), https://www.espn.com/blog/san-francisco-49ers/post/_/id/34989/fred-warners-cerebral-approach-at-the-heart-of-49ers-defense, and, for 2023, Fox Sports, “49ers DC Steve Wilks will move from the press box to the field” (November 8, 2023), on Wilks relaying “the playcalls … directly to linebacker Fred Warner,” https://www.foxsports.com/stories/nfl/san-francisco-49ers-dc-steve-wilks-will-move-from-the-press-box-to-the-field.↩︎

  14. Patriots.com, “Adoption of defensive communication passes by one vote” (2008), and NFL.com, “Niners give good reviews to headsets for defenders” (2008): the owners approved a radio in one defender’s helmet, marked with a green dot, by 25–7, where 24 votes were needed: https://www.patriots.com/news/adoption-of-defensive-communication-passes-by-one-vote-103411, https://www.nfl.com/news/niners-give-good-reviews-to-headsets-for-defenders-09000d5d80822daa. Quarterbacks have had helmet radios since 1994.↩︎

  15. Kaelen Jones, “The Future of NFL Defenses Lies in a Lime-Green Dot,” The Ringer (March 7, 2022): the green dot has traditionally gone to a linebacker, but by The Ringer’s film count six teams (the Rams, Browns, Chargers, Cowboys, Patriots and Ravens) gave it to a defensive back in 2021: https://www.theringer.com/nfl/2022/3/7/22960318/green-dot-defenses-secondary-defensive-backs.↩︎

  16. Points and rushing yards allowed are a course calculation from nflverse schedules and play-by-play (regular season, all rushing attempts). The records for a 16-game season and Super Bowl XXXV (January 28, 2001, Ravens 34, Giants 7, Lewis MVP): ESPN, “Best Ravens team ever: 2000,” https://www.espn.com/blog/afcnorth/post/_/id/13896/best-ravens-team-ever-2000, and “Super Bowl XXXV,” Wikipedia, https://en.wikipedia.org/wiki/Super_Bowl_XXXV. Lewis as the AP Defensive Player of the Year, and Sam Adams and Tony Siragusa, “combining for nearly 700 pounds,” as the defensive tackles: “2000 Baltimore Ravens season,” Wikipedia, https://en.wikipedia.org/wiki/2000_Baltimore_Ravens_season.↩︎

  17. “Luke Kuechly,” Wikipedia (9th pick in 2012; Defensive Rookie of the Year 2012; Defensive Player of the Year 2013, the youngest winner; pick-sixes against Seattle in the divisional round and Arizona in the 49–15 NFC Championship in January 2016; retired January 14, 2020, at 28): https://en.wikipedia.org/wiki/Luke_Kuechly. The Panthers’ 15–1 record: https://en.wikipedia.org/wiki/2015_Carolina_Panthers_season.↩︎

  18. “Roquan Smith,” Wikipedia (8th pick in 2018; traded October 31, 2022, for a 2023 second-round pick, a 2023 fifth-round pick and linebacker A.J. Klein; five-year, $100 million extension on January 10, 2023, negotiated without an agent): https://en.wikipedia.org/wiki/Roquan_Smith. The off-ball record ($20 million a year, past Shaquille Leonard’s $19.7 million; edge rushers such as T.J. Watt were already paid more): CBS Sports, “Ravens making Roquan Smith highest-paid linebacker in NFL history” (January 2023), https://www.cbssports.com/nfl/news/ravens-making-roquan-smith-highest-paid-linebacker-in-nfl-history-with-five-year-100m-deal-per-report.↩︎

  19. Course calculation from nflverse schedules: Baltimore’s 2022 regular season, weeks 1–8 against weeks 9–18 (Smith’s first game was in week 9, at New Orleans on November 7). Week 18 was played with several regulars inactive, and injured starters returned during the second half of the season: Sports Illustrated (Ravens On SI), “Ravens-Bengals inactive players for Week 18,” https://www.si.com/nfl/ravens/onsi/news/ravens-bengals-inactive-players-for-week-18; Baltimore Ravens, “Ravens activate J.K. Dobbins, Marcus Williams,” https://baltimoreravens.com/news/ravens-activate-jk-dobbins-marcus-williams-steelers-injured-reserve-mike-davis.↩︎