Man Coverage: Cover 0, Cover 1, Robbers, and Brackets

What it means to give every defender a receiver, why the defense keeps one man free, and how it handles stacks, stars and the receiver it fears most.

Show the Python (shared drawing helpers for this chapter)
import os
import logging
import shutil

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import animation
from matplotlib.patches import Ellipse, FancyArrowPatch, Patch
from matplotlib.lines import Line2D

from gridiron import Play, Player, Field, routes as r, style, draw_marker

logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
style.apply()
PDF = os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")
READ_GREEN = "#0f7a55"          # darker step of the aqua highlight, for text and read lines
OD, DD = style.OFFENSE_DARK, style.DEFENSE_DARK
LINE_D, OFF_BALL, GUN = -0.7, -1.5, -5.0
LOS = 40                        # the offense's own 30: room for deep routes in the window
FW = 160 / 3


# ---------------------------------------------------------------- players and alignments
def O(key, pos, d, w, label=None):
    return Player(key, pos, "off", d, w, label=key if label is None else label)


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


def line5():
    """Five offensive linemen, 1.6 yards apart (only the center is lettered)."""
    return [O(k, k, LINE_D, w, "C" if k == "C" else "") for k, w in
            (("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2))]


def spread(rb_w=2.0, x_w=-15.0, h_w=-9.0, y_w=9.0, z_w=15.0):
    """11 personnel, shotgun 2x2: X and Z on the line (with the five linemen, seven on the line);
    H in the left slot and Y, a tight end split out, in the right slot, both a step off the ball."""
    return line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("RB", "RB", GUN, rb_w, "R"),
                      O("X", "WR", LINE_D, x_w), O("H", "WR", OFF_BALL, h_w),
                      O("Y", "TE", OFF_BALL, y_w), O("Z", "WR", LINE_D, z_w)]


def dline():
    """Four down linemen (a four-man rush), strength to the offense's right."""
    return [D("WDE", "DE", 1.0, -5.4, "E"), D("WDT", "DT", 1.0, -0.8, "T"),
            D("SDT", "DT", 1.0, 2.4, "T"), D("SDE", "DE", 1.0, 5.4, "E")]


def moved(players, extra=None):
    extra = extra or {}
    return [q.moved(d=extra[q.key][0], w=extra[q.key][1]) if q.key in extra else q for q in players]


def cover1_def(extra=None):
    """Nickel Cover 1 against 2x2: corners pressed with a slight outside shade (their help is
    inside), the nickel ($) on H, the strong safety on the tight end, the Will on the back, the
    Mike free, the free safety alone in the deep middle."""
    return moved(dline() + [D("MIKE", "MIKE", 4.5, -1.8, "M"), D("WILL", "WILL", 4.5, 2.4, "W"),
                            D("NB", "NB", 4.0, -9.8, "$"), D("SS", "SS", 5.0, 9.8, "SS"),
                            D("LCB", "CB", 1.2, -15.9, "CB"), D("RCB", "CB", 1.2, 15.9, "CB"),
                            D("FS", "FS", 14.0, 0.0, "FS")], extra)


def zero_front():
    """Six at the line for an all-out pressure: four linemen widened a little, and both linebackers
    walked up into the A gaps beside the center (a 'double A-gap mug')."""
    return [D("WDE", "DE", 1.0, -5.8, "E"), D("WDT", "DT", 1.0, -3.0, "T"), D("SDT", "DT", 1.0, 3.0, "T"),
            D("SDE", "DE", 1.0, 5.8, "E"), D("MIKE", "MIKE", 1.4, -0.95, "M"), D("WILL", "WILL", 1.4, 0.95, "W")]


def protect(p, rushers=("WDE", "WDT", "SDT", "SDE"), linemen=("LT", "LG", "C", "RG", "RT")):
    """Linemen set, rushers engage them: enough to say 'pass', no more."""
    for k in linemen:
        p.block(k, pts=[(-1.2, 0.0)])
    for k in rushers:
        p.rush(k, pts=[(-1.6, 0.0)], speed=2.0)


def route_to(p, key, *pts, delay=0.0, speed=None):
    """A route through absolute (d, w) points."""
    start = np.array(p._cur(key))
    return p.route(key, [tuple(np.array(q) - start) for q in pts], frame="field", delay=delay, speed=speed)


# ---------------------------------------------------------------- drawing helpers
def P(fld, p, d, w):
    return fld.xy(*p.to_abs(d, w))


def clean(ax):
    """Drop the painted yard numbers (they sit where receivers stand); clip all text to the window."""
    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 ruler(fld, p, fs=6.0, step=5, top=30):
    """Depth labels (yards past the line of scrimmage) just inside the left edge of the window."""
    xl = FW - fld.y1 + 0.4
    for d in range(step, top + 1, step):
        y = p.los + d
        if fld.x0 + 1.5 <= y <= fld.x1 - 1.5:
            fld.ax.text(xl, y, f"{d}" + (" yd" if d == step else ""), fontsize=fs, color=style.INK_2,
                        ha="left", va="center", zorder=12,
                        bbox=dict(boxstyle="round,pad=0.12", fc=style.SURFACE, ec="none", alpha=0.85))


def draw(p, width_in=8.3, ax=None, show_ruler=True, **kw):
    fld = p.draw(width_in=width_in, ax=ax, title=False, **kw)
    clean(fld.ax)
    if show_ruler:
        ruler(fld, p)
    return fld


def say(fld, p, d, w, text, color=style.INK_2, fontsize=7.0, ha="center", weight="normal", box=True):
    x, y = P(fld, p, d, w)
    fld.ax.text(float(x), float(y), text, fontsize=fontsize, color=color, ha=ha, va="center", zorder=13,
                fontweight=weight, linespacing=1.15,
                bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9) if box else None)


def point_to(fld, p, text_at, target, text, color=style.INK_2, fontsize=7.0, ha="center"):
    (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=ha, va="center", zorder=13, linespacing=1.15,
                    arrowprops=dict(arrowstyle="-", color=color, lw=0.7, shrinkA=2, shrinkB=7),
                    bbox=dict(boxstyle="round,pad=0.18", fc=style.SURFACE, ec="none", alpha=0.9))


def branch(fld, p, pts, color=style.DEFENSE, lw=1.5, dash=(0, (3, 2.2)), end="arrow", z=5):
    """A path through absolute (d, w) points: by default a defender's reaction (orange dashes)."""
    xs, ys = P(fld, p, np.array([q[0] for q in pts]), np.array([q[1] for q in pts]))
    fld.ax.plot(xs, ys, color=color, lw=lw, ls=dash, zorder=z, solid_capstyle="round")
    if end == "arrow":
        fld.ax.add_patch(FancyArrowPatch((xs[-2], ys[-2]), (xs[-1], ys[-1]), arrowstyle="-|>",
                                         mutation_scale=10, color=color, lw=lw, zorder=z))


def oval(fld, p, center, size, color=style.DEFENSE, label=None, alpha=0.13, fs=7.0, ls=(0, (3, 2))):
    """A shaded area (depth, width) with an optional italic label at its centre."""
    x, y = P(fld, p, *center)
    fld.ax.add_patch(Ellipse((float(x), float(y)), size[1], size[0], fc=color, alpha=alpha, ec=color, lw=0.9,
                             ls=ls, zorder=1.6))
    if label:
        fld.ax.text(float(x), float(y), label, ha="center", va="center", fontsize=fs, color=style.INK_2,
                    style="italic", zorder=3)


def vdim(fld, p, w, d0, d1, text, fs=6.5, side=1):
    """A vertical dimension line at width w from depth d0 to d1, labelled beside it."""
    (x0, y0), (x1, y1) = P(fld, p, d0, w), P(fld, p, d1, w)
    fld.ax.annotate("", (float(x1), float(y1)), xytext=(float(x0), float(y0)),
                    arrowprops=dict(arrowstyle="<->", color=style.INK_2, lw=0.8), zorder=6)
    say(fld, p, (d0 + d1) / 2, w + side * 2.4, text, fontsize=fs)


def hline(fld, p, d, w0, w1, color=style.INK_2, lw=0.9, ls=(0, (4, 3))):
    (x0, y0), (x1, y1) = P(fld, p, d, w0), P(fld, p, d, w1)
    fld.ax.plot([float(x0), float(x1)], [float(y0), float(y1)], color=color, lw=lw, ls=ls, zorder=2.5)


def number(fld, p, keys_texts, dd=-2.9):
    """Receiver numbers (#1, #2 ...) under the named receivers."""
    for key, txt in keys_texts:
        q = p.players[key]
        say(fld, p, q.d + dd, q.w, txt, color=OD, fontsize=6.8, weight="bold")


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


def under_note(ax, text, fs=6.9):
    ax.text(0.5, -0.02, text, transform=ax.transAxes, ha="center", va="top", fontsize=fs, color=style.INK,
            linespacing=1.2)


LEGEND = {
    "route": Line2D([], [], color=style.OFFENSE, lw=1.8, label="route"),
    "man": Line2D([], [], color=style.DEFENSE, lw=0.9, ls=(0, (1, 2)), label="man assignment"),
    "drop": Line2D([], [], color=style.DEFENSE, lw=1.3, ls=(0, (3, 2)), label="defender's drop / path"),
    "motion": Line2D([], [], color=style.OFFENSE, lw=1.3, ls=(0, (3, 2.2)), label="pre-snap motion"),
    "react": Line2D([], [], color=style.DEFENSE, lw=1.4, ls=(0, (3, 2.2)), label="defender's reaction"),
    "rush": Line2D([], [], color=style.DEFENSE, lw=1.8, label="rusher"),
    "ring": Line2D([], [], marker="o", ls="", ms=11, mfc="none", mec=style.THIRD, mew=2, label="player to watch"),
    "area": Patch(fc=style.DEFENSE, alpha=0.2, ec=style.DEFENSE, label="area a defender guards"),
    "ltg": Line2D([], [], color=style.LINE_TO_GAIN, lw=2.2, label="line to gain"),
    "pass": Line2D([], [], color=style.BALL, lw=1.3, ls=(0, (2, 2)), label="the throw"),
}


def field_legend(ax, keys, fs=7.0, ncol=None):
    hs = [LEGEND[k] for k in keys]
    ax.legend(handles=hs, loc="upper center", bbox_to_anchor=(0.5, 0.0), ncol=ncol or min(len(hs), 4),
              fontsize=fs, frameon=False, handlelength=2.0, columnspacing=1.2, borderaxespad=0.2)


# ---------------------------------------------------------------- motion: keyframes, frame strips, video
def set_tracks(p, tracks, t_end=None):
    """Hand-made keyframes {key: [(t, d, w), ...]} for some players, after all routes are added.
    gridiron's man() keeps a shrinking cushion that ends on top of the receiver (which hides him in
    print) and cannot switch receivers, so man defenders here are keyframed by hand."""
    kf, t0, t1 = p._compile()
    kf = dict(kf)
    for key, rows in tracks.items():
        q = p.players[key]
        rows = [(min(t0, -1.0), q.d, q.w), (0.0, q.d, q.w)] + [tuple(r_) for r_ in rows]
        kf[key] = np.array(rows, dtype=float)
    p._compiled = (kf, t0, max(t1, t_end or 0.0, *[rows[-1][0] for rows in tracks.values()]))


def chase(p, key, target, off, lag=0.25, t_on=0.7, t_end=3.6, t_start=0.1):
    """Keyframes for a man defender who settles `off` = (down, toward the offense's right) yards
    from where his receiver was `lag` seconds earlier."""
    q = p.players[key]
    rows = []
    for tt in np.round(np.arange(t_start, t_end, 0.05), 3):
        f = min(1.0, max(0.0, (tt - t_start) / (t_on - t_start)))
        f = f * f * (3 - 2 * f)
        tgt = p.position(target, max(0.0, tt - lag)) + np.array(off)
        rows.append((tt, *(np.array([q.d, q.w]) * (1 - f) + tgt * f)))
    return rows


def ease(points, step=0.05):
    """Smooth keyframes through (t, d, w) waypoints (ease in and out on each leg)."""
    rows = []
    for (ta, da, wa), (tb, db, wb) in zip(points[:-1], points[1:]):
        for tt in np.arange(ta, tb, step):
            f = (tt - ta) / (tb - ta)
            f = f * f * (3 - 2 * f)
            rows.append((round(float(tt), 3), da + (db - da) * f, wa + (wb - wa) * f))
    rows.append(tuple(points[-1]))
    return rows


def frame(ax, p, t, lateral, window, rings=(), ltg=True):
    """Everyone at time t, with faint trails of where they have been and the ball's flight so far."""
    ylo, yhi = sorted((p.ball_y - lateral[0], p.ball_y - lateral[1]))
    fld = Field(ax=ax, orient="vertical", los=p.los, window=window, numbers=False, lateral=(ylo, yhi),
                to_go=p.to_go if ltg else None)
    ppy = fld.pts_per_yard()
    wl, wr = sorted(lateral)
    ring = dict(rings)
    for k, q in p.players.items():
        d, w = p.position(k, t)
        if not (window[0] + 0.4 < d < window[1] - 0.4 and wl + 0.4 < w < wr - 0.4):
            continue
        if t > 0:
            pts = np.array([p.position(k, tt) for tt in np.linspace(0.0, t, 40)])
            if np.ptp(pts[:, 0]) + np.ptp(pts[:, 1]) > 0.3:
                xs, ys = P(fld, p, pts[:, 0], pts[:, 1])
                ax.plot(xs, ys, color=style.OFFENSE if q.side == "off" else style.DEFENSE, lw=1.0,
                        alpha=0.5, zorder=3)
        x, y = P(fld, p, d, w)
        draw_marker(ax, float(x), float(y), q.side, q.label, ppy, ring=ring.get(k))
    for kind, to, te in p.ball_events:
        if kind == "pass" and t > te:
            ts = np.linspace(te, t, 20)
            b = np.array([p.ball_position(tt) for tt in ts])
            xs, ys = P(fld, p, b[:, 0], b[:, 1])
            ax.plot(xs, ys, color=style.BALL, lw=1.4, ls=(0, (2, 1.5)), zorder=9)
            ax.add_patch(Ellipse((float(xs[-1]) - 0.9, float(ys[-1])), 1.0, 0.62, fc=style.BALL, ec="white",
                                 lw=0.5, zorder=11))
    clean(ax)
    return fld


def strip_grid(p, times, notes, lateral, window, rings=(), ncols=2, width_in=6.5, deco=None, fs=6.9):
    """Print stand-in for an animation: numbered panels, each with a sentence underneath."""
    nrows = int(np.ceil(len(times) / ncols))
    pw = width_in / ncols
    ph = pw * (window[1] - window[0]) / abs(lateral[1] - lateral[0])
    fig, axes = plt.subplots(nrows, ncols, squeeze=False, figsize=(width_in, nrows * (ph + 0.75)))
    for ax in axes.flat[len(times):]:
        ax.axis("off")
    for i, (ax, t) in enumerate(zip(axes.flat, times)):
        fld = frame(ax, p, t, lateral, window, rings)
        if deco:
            deco(i, fld, p)
        panel_title(ax, f"{i + 1}.  " + ("snap" if abs(t) < 1e-6 else f"+{t:.1f} s"))
        under_note(ax, notes[i], fs=fs)
    fig.tight_layout(h_pad=3.2, w_pad=0.8)
    return fig


def strip_rows(plays, names, times, notes, lateral, window, rings=(), width_in=6.5, fs=6.6, deco=None):
    """One row per play, one column per moment: two versions of a play on the same clock."""
    nc = len(times)
    pw = width_in / nc
    ph = pw * (window[1] - window[0]) / abs(lateral[1] - lateral[0])
    fig, axes = plt.subplots(len(plays), nc, squeeze=False, figsize=(width_in, len(plays) * (ph + 0.8)))
    for i, (p, nm) in enumerate(zip(plays, names)):
        for j, t in enumerate(times):
            fld = frame(axes[i, j], p, t, lateral, window, rings)
            if deco:
                deco(i, j, fld, p)
            panel_title(axes[i, j], f"{nm}: " + ("snap" if abs(t) < 1e-6 else f"+{t:.1f} s"), fs=8)
            under_note(axes[i, j], notes[i][j], fs=fs)
    fig.tight_layout(h_pad=3.0, w_pad=0.6)
    return fig


def video(plays, names, lateral, window, t_end, rings=(), width_in=6.0, t_start=-0.4):
    """Web version: the plays side by side, on one clock."""
    from IPython.display import HTML, display
    n = len(plays)
    span_w, span_d = abs(lateral[1] - lateral[0]), window[1] - window[0]
    fig, axes = plt.subplots(1, n, figsize=(width_in, width_in / n * span_d / span_w + 0.5), squeeze=False)
    ts = np.round(np.arange(t_start, t_end + 1e-9, 0.1), 2)

    def update(i):
        for ax, p, nm in zip(axes[0], plays, names):
            ax.clear()
            frame(ax, p, max(0.0, float(ts[i])), lateral, window, rings)
            panel_title(ax, (nm + ": " if nm else "") + ("snap" if ts[i] <= 0 else f"+{ts[i]:.1f} s"), fs=9)
        return []

    fig.tight_layout()
    anim = animation.FuncAnimation(fig, update, frames=len(ts), interval=100, blit=False)
    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))
Show the Python (nflverse coverage labels joined to play-by-play, 2018–2025)
from gridiron.data import nfl, pbp

SEASONS = list(range(2018, 2026))
PB_COLS = ["season", "season_type", "game_id", "play_id", "down", "ydstogo", "yardline_100", "defteam",
           "qb_dropback", "sack", "yards_gained"]
_pb = pbp(SEASONS, columns=PB_COLS)
_pb = _pb[_pb["season_type"] == "REG"]
_part = (nfl().load_participation(SEASONS).to_pandas()
         .rename(columns={"nflverse_game_id": "game_id"})
         [["game_id", "play_id", "defense_coverage_type", "number_of_pass_rushers", "time_to_throw"]])
CV = _pb.merge(_part, on=["game_id", "play_id"])
# charted dropbacks; blown coverages, 'combo' and prevent left out
CV = CV[(CV["qb_dropback"] == 1) & CV["defense_coverage_type"].notna()
        & ~CV["defense_coverage_type"].isin(["BLOWN", "COMBO", "PREVENT"])].copy()
CV["man"] = CV["defense_coverage_type"].isin(["COVER_0", "COVER_1", "2_MAN"])
CV["c0"] = CV["defense_coverage_type"].eq("COVER_0")
CV["era"] = np.where(CV["season"] <= 2022, "2018–2022 (NGS charting)", "2023–2025 (FTN charting)")
CV["explosive"] = CV["yards_gained"] >= 20
CV["rush5"] = CV["number_of_pass_rushers"] >= 5


def _dd(row):
    if row.down == 1:
        return "1st down"
    if row.down == 2:
        return "2nd down"
    for hi, lab in ((2, "3rd/4th & 1–2"), (6, "3rd/4th & 3–6"), (10, "3rd/4th & 7–10")):
        if row.ydstogo <= hi:
            return lab
    return "3rd/4th & 11+"


CV["dd"] = CV.apply(_dd, axis=1)
CV["zone_fp"] = pd.cut(CV["yardline_100"], [0, 5, 10, 20, 40, 80, 100],
                       labels=["1–5", "6–10", "11–20", "21–40", "41–80", "81–99"])
SEASON_MAN = CV.groupby("season")["man"].mean() * 100
TEAM = CV.groupby(["season", "defteam"])[["man", "c0"]].mean().reset_index()
TEAM["man_rank"] = TEAM.groupby("season")["man"].rank(ascending=False, method="min")
TEAM["c0_rank"] = TEAM.groupby("season")["c0"].rank(ascending=False, method="min")

Third-and-5 in the red zone. The offense comes out with two receivers on each side, and as the quarterback starts his cadence the broadcast’s camera catches something it rarely shows on first down: both cornerbacks walk up until they are standing a yard from the receivers’ faces, squared up, eyes on the receivers’ belts rather than on the quarterback. The slot receiver motions across the formation, and a defender jogs across with him, mirroring every step. One safety drifts back to the middle of the field, 14 yards deep, all alone. The analyst says, “They’re in man.” The ball is snapped, the quarterback looks to his favourite target running a crossing route, and a linebacker who had been standing in the middle covering nobody steps into the lane and knocks the ball down. Who was that linebacker covering? Nobody, and that was the point. This chapter is about the coverages in which defenders cover people: what each defender is asked to do, the one or two defenders the system deliberately leaves free, and the tricks defenses use when one-on-one isn’t enough.

You’ll be able to…

NoteYou’ll need
  • Zones, technique words and the shell (Coverage Fundamentals): press is a defender lined up within a yard or two of a receiver to jam him; off coverage starts 5 to 10 yards away; the cushion is that gap. Trail technique is running just behind and underneath a receiver, trusting a safety over the top. The middle of the field is closed (MOFC) when a safety stands deep in it and open (MOFO) when no one does. The hole is the middle of the field about 8 to 15 yards deep, in front of the deep safety. The 5-yard contact rule, and the “Mel Blount” and “Ty Law” rules behind it, are there too. Coverage numbers (Cover 0 to Cover 9) mostly count the deep defenders.
  • Man and zone, one-high and two-high (A First Look at Defense): in man coverage each defender follows one receiver; in zone each guards an area. A one-high shell has one deep safety, a two-high shell two. A blitz sends five or more rushers. The nickel package has five defensive backs; the fifth, the nickel back, is drawn as $.
  • Leverage and press from the receiver’s side (The Quick Game): a defender’s leverage is the side of the receiver he lines up on; a receiver beats press with his release; a double move fakes one route and runs another. Within five yards of the line an NFL defender may jam a receiver; beyond that, contact before the throw is illegal contact.
  • Man-beaters (Dropback Concepts): mesh crosses two receivers over the middle; a rub route makes a chasing defender go around a teammate; the angle route puts a running back on a linebacker.
  • Motion (Motion and Shifts as Weapons): a defender who travels across the formation with a man in motion suggests man coverage; an exchange is a man defense swapping receivers instead.
  • Formations (Spread Formations): 2x2 is two receivers on each side, 3x1 three and one, empty has no back in the backfield. In a stack one receiver lines up directly behind another; a bunch is three in a tight cluster. Receivers are numbered from the sideline in: #1 is the widest on his side.

Reading the diagrams: offense is blue circles (X, Y, Z, H receivers; Q quarterback; R running back; C center). Defense is outlined squares: E and T the defensive ends and tackles, M the Mike (middle) linebacker, W the Will, $ the nickel back, CB a cornerback, FS and SS the free and strong safety. Dotted orange lines join a man defender to the receiver he covers; dashed orange arrows are defenders’ movements; shaded ovals are areas a defender guards. A green ring marks the player to watch. The small numbers down the left edge give the depth in yards past the line of scrimmage (the darker blue line); the orange line is the line to gain.

What man coverage asks of a defender

Every pass defense has to answer one question before the snap: when the receivers start running, how does each defender know what to do? Zone coverage answers with places: you have the deep third, you have the flat, guard it and take whoever comes. Man coverage answers with people: you have number 11, go where he goes. Everything in this chapter grows from that one choice, so it is worth slowing down on what it buys and what it costs.

What it buys is tightness and certainty. A zone defender guards grass, so a receiver can sit down in the soft spot between two zones and catch the ball with nobody within three yards of him. A man defender guards a body. If he is good enough, there is no soft spot, because the soft spot moves with the receiver and so does the defender. There is also no confusion about who takes the receiver who wanders between two areas, which is where zone coverages break down. And man coverage lets a defense choose its matchups: its best cornerback on their best receiver, its fastest linebacker on their running back.

What it costs comes from where the man defender is looking. A zone defender watches the quarterback and can break on the ball the moment it’s thrown. A man defender watches his receiver, usually his hips and belt, because that is where a route’s direction shows first. So he often has his back to the quarterback. He doesn’t see the ball leave the hand; he reacts to the receiver’s hands and eyes going up. He can’t help a teammate, because his own man would be left alone. If the quarterback escapes the pocket and runs, half the defense is running away from him, following receivers downfield. And if a receiver beats his defender, by a quick release, a sharp break, or a route that drags the defender into traffic, there is nobody nearby to fix it.

That last problem is the one man coverages are built around. The pure version, every defender on a receiver and nobody else, is all risk: one lost footrace is a touchdown. So almost every man coverage keeps one or two defenders free, with no receiver of their own, to help the others. Where the free defenders stand, how many there are, and what they do give us the family names: Cover 1, Cover 0, the robber and rat versions, brackets. The free defender is the whole game.

ImportantWhy it exists

Man coverage exists because a defender who covers a person never has to decide whose person he is. Against short, precise throws (the slant, the stick, the quick out) a zone defender is often a step too far away, because he started in the middle of an area. A man defender starts on the receiver and stays there, and that tightness is worth most where throws are short and timing is everything: third-and-short, the red zone, any down where the defense is also sending extra rushers. The price is eyes: man defenders watch receivers, not the ball, and need help somewhere behind them.

A little history: the bump-and-run, and the rules that answered it

Man coverage is as old as the forward pass, but the modern, aggressive form grew up in the 1960s American Football League. Willie Brown, a cornerback who had been a linebacker in college, began jamming receivers right at the line in 1963, and with Al Davis’s Raiders he became the face of bump-and-run: line up in the receiver’s face, hit him at the snap, then run with him. (Davis modelled the Raiders’ version on the full-court press of John Wooden’s UCLA basketball teams.) Brown played 12 seasons in Oakland and is in the Hall of Fame.1

The rules answered twice (the 1978 “Mel Blount rule” and the 2004 “Ty Law rule”, both told in Coverage Fundamentals; the Ty Law game is in this chapter’s film room). For man coverage the result is the shape of the modern craft. Inside five yards it is a fight of hands and feet; beyond five yards, until the ball is thrown, the defender may not initiate contact that impedes the receiver, so everything depends on position: being on the right side of the receiver, at the right distance, before he breaks.2 Physical man coverage followed by a rules response is a pattern you’ll see again in Contact Rules and Penalties.

Cover 1: man-free

The most common man coverage in football is Cover 1, which coaches also call man-free. The name is the coverage: man coverage on every eligible receiver, plus one free safety who has no man at all and plays the deep middle of the field. The “1” is the one deep defender.

Show the Python
p = Play(spread(), cover1_def(), los=LOS, to_go=7)
for d_, t_ in (("LCB", "X"), ("RCB", "Z"), ("NB", "H"), ("SS", "Y"), ("WILL", "RB")):
    p.man(d_, t_)
p.drop("MIKE", (8.0, -0.5), zone=(3.6, 9.0), label="hole")
p.zone((17.5, 0.0), (6.5, 26.0), label="deep middle")
protect(p)
p.highlight("FS", "MIKE")
fld = draw(p, lateral="full", window=(-8.5, 22.5))
say(fld, p, 14.0, 7.8, "FS: no man.\nHelp for everyone", fontsize=6.8)
say(fld, p, 10.6, -10.0, "the spare defender: sits,\nrushes or spies", fontsize=6.8)
say(fld, p, -3.8, -19.6, "outside shade:\nhelp is inside", fontsize=6.8)
say(fld, p, -3.8, 19.6, "outside shade:\nhelp is inside", fontsize=6.8)
field_legend(fld.ax, ["man", "drop", "area", "ltg"])
plt.show()
Figure 34.1: Cover 1 against a 2x2 formation (11 personnel: one back, one tight end, three wide receivers), third-and-7. Every eligible receiver has a man defender (dotted lines): the cornerbacks (CB) on the outside receivers X and Z, the nickel back ($) on the slot H, the strong safety (SS) on the tight end Y, the Will (W) on the running back. The free safety (FS, ringed) has nobody: he guards the deep middle for all of them. That still leaves one defender over, the Mike (M, ringed), who here drops into the hole, the middle of the field underneath, as a spare helper (a job with its own names, coming up below). The corners line up a step outside their receivers, because their help is inside.

Count the defenders in the picture. Four rush. The offense has five eligible receivers, so five defenders have a man. That is nine. The tenth is the free safety, alone in the middle 13 to 15 yards deep, and the eleventh, here the Mike linebacker, is free too. Cover 1 against five receivers and a four-man rush always leaves that eleventh man over, and the defense gets to decide what to do with him. He can rush, making it a five-man pressure; he can sit in the middle as a helper; or he can mirror a running quarterback (a spy, covered in Third Down). The section on the free defender below is about that choice.

The free safety’s own job sounds impossible at first: one man “helping” on five receivers. He doesn’t try to cover them all. He starts in the middle, 13 to 15 yards deep, reads the quarterback’s eyes and shoulders, and works toward the deepest route breaking inside or straight up the middle, the throws a corner with outside leverage can’t reach. Routes to the sideline are the corners’ problem. Two deep routes into the middle at once (two posts, or a post and a seam) are his nightmare, for the same reason a high-low is the robber’s below: one man, two targets. How common is all this? In the public charting, Cover 1 was the label on roughly a quarter to a third of charted NFL dropbacks in every season from 2018 to 2025, by far the most of any man coverage.3

Who takes whom

A man coverage is only as good as its matching rules, because the offense chooses the formation and the defense has to sort itself out in the 15 or so seconds before the snap. A typical set of rules, which varies by team:

  • Corners take the widest receiver on each side (#1). They are the best man-to-man athletes on the field and the outside receivers are usually the fastest.
  • The nickel takes the slot receiver (#2 to his side); in a base defense, with no nickel back, that job goes to a safety or a linebacker.
  • A safety or linebacker takes the tight end, matched for size.
  • A linebacker takes the running back, and if the back stays in to block, that linebacker is free to rush the quarterback (a “hug” or “green-dog” rule) or drop into the middle.
  • The free safety takes nobody and plays the deep middle.

These are starting rules, and the call can rearrange them. If the plan is for the strong safety to come down and rob (the next big section), he can’t also cover the tight end, so a linebacker takes the tight end instead, and the spare defender moves up from the linebacker level to the safety level. The count never changes: five receivers need five men, and whoever is left over is the free defender.

The rules have to cope with whatever the offense shows. When a receiver motions across the formation, his defender either travels with him, the classic tell you met in Motion and Shifts as Weapons, or the defenders exchange, each sliding over a spot and swapping receivers. When the offense shows three receivers to one side, someone from the other side has to be matched across. When the offense lines up in a formation the defense didn’t prepare for, the defense has a short list of simple “checks” to fall back on. Much of what looks like a cornerback getting “beat” on a broadcast is actually two defenders who disagreed about a rule.

The help is inside, so the leverage is outside

Look again at the cornerbacks in the figure: each is a step outside his receiver. That isn’t a style choice; it follows from where the help is. In Cover 1 the free safety lives in the deep middle, and often a second free defender sits underneath in the middle too. That help is inside help: defenders positioned toward the middle of the field from the man defender, who can get to routes that break inside (posts, digs, slants) faster than they can get to the sideline.

So the man defender takes away the side where help can’t reach him. A cornerback with inside help plays outside leverage: he protects the sideline routes (the fade, the out, the comeback) and, in coaches’ language, funnels the receiver inside, toward the help. If the receiver runs a post, the corner chases and the free safety arrives from the middle. If he runs a slant or a dig, the corner trails and the help underneath is waiting. The general rule, which works for every man coverage in this chapter: play away from your help. Where there is help, you can give ground; where there isn’t, you can’t.

That is the starting rule, not a law, and coaches bend it in three common ways:

  • Split. A receiver who lines up close to the sideline has very little room outside him, so the sideline itself is a kind of help, and his defender often plays inside leverage instead. A receiver with a tight split, near the formation, has room both ways and gets the outside shade.
  • Down and distance. On third-and-short many Cover 1 teams press head-up or with an inside shade to take away the slant, the fastest way to the sticks, and accept the fade, a slower, harder throw the free safety couldn’t reach anyway.
  • The slot. A slot receiver has room to break either way (a “two-way go”), and his defender often shades inside: the inside break is the quick throw, while a break outside means a longer throw toward the sideline that gives him time to recover.
ImportantWhy it exists: Cover 1

Cover 1 is the compromise that makes man coverage affordable. Pure man everywhere leaves every defender alone against a deep route. One deep safety turns every one-on-one into a one-on-one with help on the deep, inside throw, and the coverage still has a defender left over to rush or to rob. It keeps the box strong, too. Only one safety lives deep; the other plays close to the line of scrimmage, on the tight end or as the spare, so with the linebackers the defense still has seven or eight players near the line to stop the run. (Against a run, a man defender whose receiver blocks him becomes a run defender; who takes what in the run game is the subject of Run Fits and Box Math.) What it gives up: the middle of the field underneath (unless the extra defender sits there), the receiver who simply wins his matchup to the outside, where there is no help, and the throws that make man defenders run through traffic.

Press, off and trail: the man defender’s techniques

“Man coverage” says who; technique says how. The same Cover 1 call can be played with every cornerback in the receivers’ faces or with every cornerback seven yards off, and the difference changes which throws are open. There are three basic ways to cover a man.

Show the Python
LAT_T, WIN_T = (-23.5, -6.5), (-3.5, 20.0)


def tech_panel(ax, kind):
    off = [O("X", "WR", LINE_D, -15.0)]
    dfn = []
    if kind == "press":
        dfn = [D("CB", "CB", 1.0, -14.4, "CB")]
    elif kind == "off":
        dfn = [D("CB", "CB", 7.0, -14.0, "CB")]
    else:
        dfn = [D("CB", "CB", 1.0, -15.8, "CB"), D("FS", "FS", 16.5, -8.6, "FS")]
    p = Play(off, dfn, los=LOS, to_go=None)
    if kind == "press":
        route_to(p, "X", (18.5, -15.3))
    elif kind == "off":
        route_to(p, "X", (12.6, -15.0), (11.2, -13.7))
    else:
        route_to(p, "X", (9.5, -15.0), (17.0, -10.8))
    p.highlight("CB")
    fld = p.draw(ax=ax, lateral=LAT_T, window=WIN_T, title=False)
    clean(ax)
    ruler(fld, p, fs=5.5)
    if kind == "press":
        hline(fld, p, 5.0, -19.8, -8.0, color=style.DEFENSE_DARK)
        say(fld, p, 5.9, -10.3, "5 yd: contact\nmust stop", fontsize=6.0)
        branch(fld, p, [(1.0, -14.4), (2.4, -14.5), (5.0, -14.4), (17.0, -14.3)])
        say(fld, p, 2.4, -11.9, "jam", fontsize=6.4, color=DD, weight="bold")
    elif kind == "off":
        # backpedal while X pushes upfield, then drive downhill on the curl from above it
        branch(fld, p, [(7.0, -14.0), (10.8, -14.1), (12.4, -13.3), (11.8, -13.0)])
        vdim(fld, p, -11.0, 0.0, 6.6, "cushion\n~7 yd", fs=6.0)
        say(fld, p, 15.5, -14.0, "sees the break,\narrives late", fontsize=6.0)
    else:
        branch(fld, p, [(1.0, -15.8), (3.0, -15.9), (8.4, -15.9), (14.6, -12.2)])
        say(fld, p, 12.0, -8.9, "help over\nthe top", fontsize=6.0)
        say(fld, p, 12.5, -19.6, "a step behind,\nunderneath", fontsize=6.0)
    return fld


fig, axes = plt.subplots(1, 3, figsize=(6.6, 3.45))
for ax, kind, ttl in zip(axes, ("press", "off", "trail"), ("1. Press-man", "2. Off-man", "3. Trail")):
    tech_panel(ax, kind)
    panel_title(ax, ttl)
fig.legend(handles=[LEGEND["route"], LEGEND["react"], LEGEND["ring"]], loc="upper center",
           bbox_to_anchor=(0.5, 0.04), ncol=3, fontsize=7, frameon=False)
fig.tight_layout(w_pad=0.8, rect=(0, 0.05, 1, 1))
plt.show()
Figure 34.2: Three ways to play man on the same receiver (X, on the offense’s left; simulated). Blue is the route, orange dashes the cornerback’s movement. 1. Press-man: the corner starts a yard away, jams X inside the five-yard limit (dashed line), then runs on his hip on a go route. 2. Off-man: the corner starts about seven yards off with a cushion, backpedals while X pushes upfield, and drives on the curl when X stops; he can see the break coming but arrives a step late, conceding the short throw. 3. Trail: the corner presses, then runs a step behind and underneath X on a post, protecting the low throw, because a safety (FS) is over the top to take the high one.

Press-man is the bump-and-run’s descendant. The defender lines up within a yard or two of the receiver, gets his hands on him at the snap (legal inside five yards), and tries to knock him off his path and onto the defender’s terms. If the jam lands, the route is late, and a late route in a timing offense is a dead route: the quarterback’s feet have finished their drop and the receiver isn’t where he’s supposed to be. If the jam misses, the defender has to turn and run with a receiver who now has a step on him. Press-man is the purest test of athletes in football, and the reason teams pay elite cornerbacks: hips that turn fast, long arms, and the recovery speed to survive a miss. You met the receiver’s side of this fight in The Quick Game.

Off-man gives the receiver room. The defender starts 5 to 8 yards away, often with his weight back, and backpedals or shuffles as the receiver comes toward him, keeping that cushion while he reads the route. Off-man trades the jam for vision: he sees the break coming and is rarely beaten deep. The cost is the short throw. A receiver who turns around at six yards against a defender who started at seven is open, and good quarterbacks take that throw all day. Off-man is common against very fast receivers, against receivers in the slot (where a jam is harder because the receiver can release either way), and on long-yardage downs where a six-yard catch doesn’t hurt.

Trail technique is what man defenders do when they have help over the top. The defender runs a step behind the receiver and slightly underneath him, on his hip, taking away anything thrown low or short, and trusts a safety to take the ball thrown high and deep. It is the technique of 2-Man, two deep safeties with man underneath (Cover 2 and Tampa 2), and of any Cover 1 defender whose man runs into the free safety’s area. Trailing looks like losing on a broadcast (the receiver is ahead), but the trailing defender is exactly where he wants to be: under the throw. To tell trailing from being beaten on a replay, look for the safety. If one is arriving over the top, the corner is trailing on purpose; if nobody is coming, he has simply been beaten.

Whatever the technique, everything ends at the catch point, and there the key idea is phase. A defender who is in phase is on the receiver’s hip, stride for stride, close enough to turn his head, find the ball and play it as if he were the receiver. A defender who is out of phase, a step or more behind, can’t afford to turn and look, because he’d lose more ground. So he watches the receiver instead and plays his hands: when the receiver’s eyes widen and his hands come up, the ball is arriving, and the defender rips through the hands as they close. That is what “he reacts to the receiver’s hands” meant earlier. It is also where pass interference lives. Once the ball is thrown, a defender who contacts a receiver more than a yard past the line and significantly hinders his chance to catch it commits pass interference, unless he is playing the ball himself. Not turning around is not a foul in itself, but a defender who isn’t looking for the ball is not “playing the ball”, so any contact before it arrives is likely to draw the flag.4 The details are in Contact Rules and Penalties.

Teams rarely pick one technique for a whole game. They pick per matchup and per call: press on a slow receiver, off on a fast one; press on third-and-2, off on third-and-14. The quarterback’s pre-snap read is partly a read of these techniques, which is why defenses mix them and sometimes show press and bail out at the snap.

CautionCommon misconception

“Press means man, off means zone.” As Coverage Fundamentals warned, alignment alone doesn’t tell you; plenty of man calls are played off, and plenty of zone corners press and bail. The man-coverage tell to add is the defender’s stance and angle before the snap: a man defender is usually squared up to his receiver and slightly turned toward the sideline; a zone corner is usually turned in so he can see the quarterback.

The free defender: rat, robber and lurk

Back to the eleventh man. In Cover 1 with a four-man rush, one defender has no receiver and no deep responsibility. Defenses can turn him into a fifth rusher (Cover 1 pressure, in Blitzing) or keep him in coverage as a helper. As a helper he has three common names, and coaches don’t use them identically, so learn the jobs rather than the words. On broadcasts you’ll hear the whole call named after him: “Cover 1 Robber,” “Cover 1 Rat,” “Cover 1 Hole.” The figure shows the choices one at a time, and notice that each one changes who covers the tight end and the back.

Show the Python
LAT_F, WIN_F = (-13.5, 13.5), (-7.0, 17.5)


def free_panel(ax, kind):
    extra, keys = {}, [("NB", "H"), ("SS", "Y"), ("WILL", "RB")]
    if kind == "robber":
        extra = {"FS": (13.0, -7.0), "SS": (13.0, 7.0), "MIKE": (4.5, 6.0), "WILL": (4.5, 1.2)}
        keys = [("NB", "H"), ("MIKE", "Y"), ("WILL", "RB")]
    elif kind == "lurk":
        extra = {"WILL": (1.3, -7.6), "MIKE": (4.5, 1.6)}
        keys = [("NB", "H"), ("SS", "Y"), ("MIKE", "RB")]
    p = Play(spread(), cover1_def(extra=extra), los=LOS, to_go=None)
    for d_, t_ in keys:
        p.man(d_, t_)
    free = {"rat": "MIKE", "robber": "SS", "lurk": "WILL", "rush": "MIKE"}[kind]
    p.highlight(free)
    if kind == "rush":
        p.rush("MIKE", pts=[(-3.5, 2.6), (-8.0, 2.4)])
    fld = p.draw(ax=ax, lateral=LAT_F, window=WIN_F, title=False)
    clean(ax)
    ruler(fld, p, fs=5.5)
    if kind == "rat":
        oval(fld, p, (6.6, -0.6), (3.0, 6.5), label="hole", fs=6.0)
        branch(fld, p, [(4.5, -1.8), (6.0, -0.9)], lw=1.3)
        say(fld, p, 10.2, -7.6, "M has no man:\nsits low, eyes on Q", fontsize=6.0)
    elif kind == "robber":
        oval(fld, p, (10.3, 0.4), (3.0, 7.0), fs=6.0)
        branch(fld, p, [(13.0, 7.0), (11.4, 3.6), (10.6, 1.4)], lw=1.3)
        branch(fld, p, [(13.0, -7.0), (14.6, -3.6), (15.2, -0.8)], lw=1.3)
        say(fld, p, 15.4, 7.6, "SS comes\ndown to rob", fontsize=6.0)
        say(fld, p, 15.4, -8.4, "FS spins\nto the middle", fontsize=6.0)
    elif kind == "lurk":
        oval(fld, p, (5.6, -2.6), (3.0, 6.0), fs=6.0)
        branch(fld, p, [(1.3, -7.6), (3.4, -6.2), (5.2, -3.6)], lw=1.3)
        say(fld, p, 9.6, -7.0, "W shows blitz,\ndrops out", fontsize=6.0)
    else:
        say(fld, p, 8.6, -6.2, "M blitzes:\nfive rushers", fontsize=6.0)
    return fld


fig, axes = plt.subplots(2, 2, figsize=(6.6, 7.2))
ttl = {"rat": "1. Rat (hole player)", "robber": "2. Robber", "lurk": "3. Lurk", "rush": "4. Fifth rusher"}
for ax, kind in zip(axes.flat, ("rat", "robber", "lurk", "rush")):
    free_panel(ax, kind)
    panel_title(ax, ttl[kind])
fig.legend(handles=[LEGEND["man"], LEGEND["drop"], LEGEND["rush"], LEGEND["area"], LEGEND["ring"]],
           loc="upper center", bbox_to_anchor=(0.5, 0.03), ncol=5, fontsize=6.8, frameon=False)
fig.tight_layout(h_pad=1.4, w_pad=0.8, rect=(0, 0.04, 1, 1))
plt.show()
Figure 34.3: Four ways to use the spare defender in Cover 1, one per panel (a defense picks one per snap; the corners on X and Z, wide of the frame, are the same in all four). 1. Rat: the Mike (M), with no man, drops into the low hole, about 5 to 8 yards deep, under crossing routes. 2. Robber: the safeties start two-high; at the snap the free safety spins to the deep middle and the strong safety (SS) comes down to 8 to 12 yards to drive on digs and deep crossers, so the Mike has to take the tight end Y. 3. Lurk: the Will (W) walks up as if to blitz and drops out at the snap into the shallow middle, where the quarterback’s hot throw is supposed to go; the Mike takes the back. 4. Or the spare man rushes: Cover 1 pressure, with five rushers. Each version changes who covers Y and the back, but the count is the same: five receivers, five men.
  • The robber is the free defender sitting in the middle of the field, usually 8 to 12 yards deep, driving on in-breaking throws: digs, deep crossers, the slant that gets past its man. He doesn’t just stare at the quarterback. In most teaching he keys a receiver, usually #2 or #3 to the passing strength, and “robs the first in-breaker”, while feeling the quarterback’s eyes to know when to go. Classically he is a safety who lines up deep (often disguised as half of a two-high shell, the subject of Disguise, Rotation, and Split-Field Coverage) and comes down at the snap. His name says what he is for: he steals the throws man coverage is worst at defending, the ones where receivers run away from their defenders across the field. When the ball goes outside instead, he becomes a pursuit player: the first tackler coming from the inside.
  • The rat is, in many playbooks, simply another name for the same job. When coaches distinguish them, the rat is lower and usually a linebacker, the man left over when the back he would have covered stays in to block, or the Mike in the figure above, sitting 5 to 8 yards deep, low in the hole. (That is why the hole is sometimes called the rat zone, and the rat a hole player.) His prey is the shallow cross and the quarterback scramble up the middle.
  • Lurk describes the same idea with disguise built in. The lurker lines up somewhere that says something else, often walked up to the line as if blitzing, sometimes deep as a safety, and drops at the snap into the shallow middle. Pressure defenses love it, because the quarterback who sees a blitz coming throws the quick hot route to the middle, and the lurker is standing in it. Some staffs use “lurk” only for a player who drops into the hole off a pressure look, sometimes even a defensive lineman.

Whatever it’s called, the free underneath defender changes the math of Cover 1. Against pure man, a receiver who wins inside is open. Against Cover 1 with a robber, a receiver who wins inside runs into a second defender who has been watching the quarterback the whole time and is moving before the ball is. Here it is in motion.

Show the Python
p = Play(spread(rb_w=-2.0), cover1_def(extra={"SS": (9.0, 8.0), "MIKE": (4.5, 5.6), "WILL": (4.5, -1.6)}),
         los=LOS, to_go=8)
protect(p)
p.dropback(2.0)
route_to(p, "X", (24.0, -15.4))
route_to(p, "H", (22.0, -8.6))
route_to(p, "Y", (2.6, 10.5), (3.8, 16.5))
route_to(p, "Z", (12.0, 15.0), (12.0, 2.0), (12.4, -4.0))
p.block("RB", pts=[(0.4, -1.6)])          # the back stays in to protect
p.rush("WILL", pts=[(-3.5, -1.0), (-8.5, -1.8)], delay=0.45)   # ... so his linebacker rushes, through the B gap
T_THROW = 2.15
kf, _, _ = p._compile()
# where Z will be when a firm throw arrives, and a spot just in front of him in the lane
qb = np.array(p.position("QB", T_THROW))
t_c = T_THROW + 0.9
for _ in range(4):
    z = p.position("Z", t_c)
    t_c = T_THROW + float(np.linalg.norm(z - qb)) / 18.0
z = p.position("Z", t_c)
lane = z + (qb - z) / np.linalg.norm(qb - z) * 2.7
T_CATCH = round(t_c, 2)
# the Mike carries Y to the flat from a yard above and inside him (never dipping toward the line)
mike = [(t_, max(d_, 3.8), w_) for t_, d_, w_ in chase(p, "MIKE", "Y", off=(0.9, -1.0), lag=0.2, t_on=0.8)]
tracks = {
    "LCB": chase(p, "LCB", "X", off=(-1.0, -0.9)),
    "NB": chase(p, "NB", "H", off=(-1.0, -0.9)),
    "MIKE": mike,
    "RCB": chase(p, "RCB", "Z", off=(-1.2, 1.1), lag=0.3),
    "SS": ease([(0.0, 9.0, 8.0), (0.9, 10.2, 3.4), (T_THROW, 10.6, 2.4), (T_CATCH, *lane), (3.6, *lane)]),
    "FS": ease([(0.0, 14.0, 0.0), (1.2, 16.0, 0.6), (3.6, 16.5, 2.5)]),
}
p.pass_to("SS", t=T_THROW)      # the ball goes where the robber will be: in the lane, in front of Z
set_tracks(p, tracks, t_end=3.6)
RAT_LAT, RAT_WIN = (-11.0, 19.5), (-8.0, 19.0)
notes = ["Cover 1: a man on each receiver, FS deep.\nSS 9 yards deep over Y, as if he had him.",
         "M carries Y to the flat. SS slides to the\nmiddle, eyes on Q. Z's corner trails him.",
         "Z breaks inside on the dig and Q starts\nto throw. SS is already moving.",
         "The robber arrives in the lane in front of Z\nas the ball does: broken up or intercepted."]
if PDF:
    strip_grid(p, [0.0, 1.0, T_THROW, T_CATCH], notes, RAT_LAT, RAT_WIN, rings=[("SS", style.THIRD)],
               deco=lambda i, f, q: ruler(f, q, fs=5.5))
    plt.show()
else:
    video([p], [""], RAT_LAT, RAT_WIN, t_end=T_CATCH + 0.4, rings=[("SS", style.THIRD)], width_in=5.6)
Figure 34.4: Cover 1 robber against a dig, second-and-8, simulated (BDB-format tracking, generated by gridiron rather than recorded). Z runs a dig, a square break inside at about 12 yards, from the right; his cornerback, playing outside leverage, trails him across the field, as Cover 1 corners do, because the help is inside. The strong safety (SS, ringed) is the robber. Before the snap he stands 9 yards deep over the tight end Y, as if he had him in man; at the snap the Mike (M) takes Y into the flat, and the robber slides to the middle at 10 to 11 yards. Y has gone outside, so the robber looks for the next receiver coming inside: Z. When the quarterback takes his hitch step to throw the dig, the robber drives on it and arrives in the throwing lane, in front of Z, as the ball does. The free safety stays deep; the other receivers are carried by their man defenders, and because the back stays in to block, the Will (W), who had him in man, rushes through the B gap to meet him. X and his cornerback, far to the left, are out of frame. In the web version this is a video.

The animation is simulated. If you download the 2025 Big Data Bowl files, which include the pre-snap frames and a charted coverage for every pass play, you can watch real Cover 1 snaps the same way; the folded code below shows how (the files are not part of this book’s build).

Show the Python (real Cover 1 snaps from the Big Data Bowl 2025 files)
import pandas as pd
from gridiron import bdb, show_animation

plays = pd.read_csv("data/bdb/plays.csv")                        # BDB 2025: 2022 season, weeks 1-9
trk = bdb.load_tracking("data/bdb/tracking_week_*.csv")
# PFF's charted coverage; passResult "IN" = intercepted
cover1_picks = plays[plays["pff_passCoverage"].eq("Cover-1") & plays["passResult"].eq("IN")]
g, pl = cover1_picks.iloc[0][["gameId", "playId"]]
show_animation(bdb.prepare(trk, plays, game_id=g, play_id=pl), times=[-1.0, 0.0, 1.2, 2.4])

What makes the robber work is that the dig is a man-beater by design. The receiver runs straight at his defender, then breaks flat across the field, away from a corner who was protecting the outside. Against pure man that corner is chasing, and a dig thrown on time is a completion with room to run. The robber doesn’t need to cover Z. He only needs to be in the lane when the ball comes, which he can do because he is free to read the whole play (his key receiver and the quarterback) instead of chasing one man. That is the key idea of modern man coverage: man coverage on the receivers, zone eyes on the quarterback from the one defender who can afford them.

The robber has his own weakness, and offenses know it. He is one man in the middle guarding a lane, so put two receivers in his area at different depths, a shallow cross under a dig, and he can only take one. That is a high-low on the robber, exactly the read Dropback Concepts built the drive and shallow-cross concepts around. And a quarterback who looks the robber off, staring at the middle to pull him in before throwing outside, turns the robber’s best habit against him.

NoteMadden vs. real life

In Madden, “Cover 1” is a play on a menu, and the game decides who covers whom. On a real field the call is a family of rules, and the most important ones are about the defender with no man. The same Cover 1 call might have the leftover linebacker rushing if the back stays in to block, sitting in the hole if the back releases, or spying a mobile quarterback; the safety might show two-high and rob, or line up in the middle and stay there. The defensive coordinator also decides technique and leverage player by player and receiver by receiver, often on the sideline between series. Two Cover 1 calls can look nothing alike.

Cover 0: everybody’s man, nobody’s deep

Now remove the safety. Cover 0 is man coverage on every eligible receiver with no deep defender at all. The “0” is the number of deep safeties. Do the count again. The two defenders who were free in Cover 1 (the deep safety and the spare man) have no receiver and no deep job, so they become two more rushers. Usually that doesn’t mean the safeties themselves rush: the safeties come down to cover the tight end and the back, and the linebackers who used to cover them rush instead. So Cover 0 usually travels with a big blitz, six or seven rushers. It is the all-out blitz, the “house call,” the coverage behind the moment when the defense decides that the quarterback won’t have time to find the open man. (Not always, though: some zero calls rush only four or five and keep one spare defender sitting low in the middle, a “zero hole” or “zero lurk,” especially near the goal line.)

Show the Python
off = line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("X", "WR", LINE_D, -16.0), O("H", "WR", OFF_BALL, -9.5),
                 O("RB", "RB", OFF_BALL, 7.6, "R"), O("Y", "TE", OFF_BALL, 11.5), O("Z", "WR", LINE_D, 16.5)]
dfn = zero_front() + [D("LCB", "CB", 1.2, -15.3, "CB"), D("NB", "NB", 1.5, -8.8, "$"),
                      D("RCB", "CB", 1.2, 15.8, "CB"), D("SS", "SS", 2.5, 10.9, "SS"), D("FS", "FS", 3.8, 7.0, "FS")]
p = Play(off, dfn, los=LOS, to_go=7)
for d_, t_ in (("LCB", "X"), ("NB", "H"), ("RCB", "Z"), ("SS", "Y"), ("FS", "RB")):
    p.man(d_, t_)
for k in ("LT", "LG", "C", "RG", "RT"):
    p.block(k, pts=[(-1.4, 0.0)])
for k in ("WDE", "MIKE", "WDT", "SDT", "SDE"):
    p.rush(k, pts=[(-1.7, 0.0)], speed=2.0)
p.rush("WILL", pts=[(-4.0, -0.5), (-5.0, -0.8)])
p.highlight("WILL")
fld = draw(p, lateral="full", window=(-9.5, 21.5))
oval(fld, p, (15.5, 0.0), (7.0, 30.0), color=style.MUTED, label="nobody deep", alpha=0.10)
say(fld, p, -7.6, 9.0, "6 rush, 5 block:\none comes free", fontsize=6.8)
say(fld, p, -3.8, -19.6, "inside shade:\nno help anywhere", fontsize=6.8)
field_legend(fld.ax, ["man", "rush", "ring", "ltg"])
plt.show()
Figure 34.5: Cover 0 against an empty formation (five receivers, nobody in the backfield), third-and-7. All five receivers have a man defender, each tight and shaded inside, and no one is deep: the middle of the field is open all the way to the end zone. The other six defenders rush, including both linebackers (M and W) walked up into the A gaps beside the center. Five linemen can block only five of them, so one rusher (ringed) comes free, and the quarterback has to throw before he arrives, usually in about two seconds.

The logic is arithmetic. The offense has five linemen. If the running back and tight end go out on routes, the five linemen are the only blockers, and six rushers beat five blockers: one is free. If the offense keeps a back in to block, his man defender has nobody to cover. In most zero calls he joins the rush (the “hug” rule again), so it’s seven against six, still one free; in some he just sits, as the safety does in the Corn Dog figure in Motion and Shifts as Weapons. Cover 0 is built so that someone comes unblocked, and the quarterback has to get rid of the ball before he arrives. In the charted seasons, Cover 0 was played with five or more rushers about three times in four, and the median throw against it came out about three tenths of a second sooner than against any other coverage.5 Three tenths is roughly the difference between throwing on the last step of the drop and taking one more hitch step to wait for a route to come open.

Because no one is behind them, Cover 0 defenders play inside leverage, the mirror of Cover 1. With the linebackers rushing, nobody is left in the middle of the field, so a slant caught there has open grass in front of it and nobody to tackle the receiver but the man chasing him. So they take the inside throw away and dare the quarterback to throw outside, a longer, slower throw with the sideline as an extra defender. Some teams play it off instead of pressed, five to seven yards deep and inside (“zero off”), so the defenders can see the quick throw, break on it and tackle, without the risk of being beaten clean at the line. The other danger is obvious from the picture: a receiver who beats his man on a deep route has nothing in front of him but grass. That is the bargain.

Show the Python
mid = CV[(CV["yardline_100"] > 20) & (CV["yardline_100"] < 80) & (CV["season"] >= 2023)]
order = ["COVER_0", "COVER_1", "2_MAN", "COVER_3", "COVER_2", "COVER_4", "COVER_6"]
names = {"COVER_0": "Cover 0", "COVER_1": "Cover 1", "2_MAN": "2-Man", "COVER_3": "Cover 3",
         "COVER_2": "Cover 2", "COVER_4": "Quarters (Cover 4)", "COVER_6": "Cover 6"}
g = mid.groupby("defense_coverage_type")
ttt = g["time_to_throw"].median().reindex(order)
expl = (g["explosive"].mean() * 100).reindex(order)
cols = [style.SERIES[1] if c == "COVER_0" else (style.SERIES[0] if c in ("COVER_1", "2_MAN") else style.MUTED)
        for c in order]
fig, axes = plt.subplots(1, 2, figsize=(6.5, 3.1), sharey=True)
ys = np.arange(len(order))[::-1]
for ax, vals, lab, fmt in ((axes[0], ttt, "Median time to throw (seconds)", "{:.2f} s"),
                           (axes[1], expl, "Dropbacks gaining 20+ yards (%)", "{:.1f}%")):
    ax.barh(ys, vals.values, color=cols, height=0.62)
    for y_, v in zip(ys, vals.values):
        ax.text(v + vals.max() * 0.015, y_, fmt.format(v), va="center", fontsize=7.5, color=style.INK)
    ax.set_xlabel(lab, fontsize=8)
    ax.set_xlim(0, vals.max() * 1.22)
    ax.grid(axis="y", visible=False)
    ax.tick_params(labelsize=7.5)
axes[0].set_yticks(ys)
axes[0].set_yticklabels([names[c] for c in order], fontsize=8)
fig.legend(handles=[Patch(color=style.SERIES[1], label="man, no deep help (Cover 0)"),
                    Patch(color=style.SERIES[0], label="other man coverages"), Patch(color=style.MUTED, label="zone")],
           fontsize=7.2, loc="upper center", ncol=3, frameon=False, bbox_to_anchor=(0.5, 1.0))
fig.tight_layout(w_pad=1.2, rect=(0, 0, 1, 0.92))
plt.show()
Figure 34.6: The Cover 0 bargain, in charted NFL dropbacks between the 20s (2023–2025 regular seasons, FTN charting). Left: the median time from snap to throw against each coverage; the Cover 0 blitz gets the ball out fastest. Right: the share of dropbacks that gained 20 yards or more; Cover 0 also gives up the most big plays, because nobody is deep. The 2018–2022 seasons (NGS charting) show the same order. Source: nflverse participation data joined to play-by-play; sacks count as dropbacks with no throw, so they are left out of the time-to-throw medians.

The chart puts numbers on the trade. Between the 20-yard lines in 2023–2025, Cover 0 got the ball out fastest (a median of about 2.0 seconds), and it also gave up a gain of 20 yards or more on about one dropback in seven, the highest rate of any coverage and nearly twice the rate of the two-high zones. Cover 1, with its deep safety, sits in between. The defense is trading a higher chance of a quick incompletion or a sack for a higher chance of a long touchdown. That is a good bet when the offense needs a few yards and has to throw quickly anyway; it is a bad bet when one long completion decides the game. (The full blitz menu, and how offenses protect against it, is in Blitzing.)

ImportantWhy it exists: Cover 0

Cover 0 exists to win a race. Every rusher it can spare is sent, so the quarterback must throw now, often before his receivers have finished their routes, and every receiver has a man on him so there is no easy hot throw. It shines where the field is short and the throw has to be quick anyway: third-and-short, fourth down, inside the 10. What it gives up: any help at all. One missed tackle, one blown assignment or one receiver who beats his man deep is a touchdown, and a quarterback who escapes the free rusher finds a field full of defenders with their backs to him.

A handful of modern coordinators have leaned on the call harder than anyone. In nflverse charting the league leader in Cover 0 rate was Wink Martindale’s Baltimore defense in 2019 and his Giants in 2022 and 2023, and Brian Flores’s Miami Dolphins in 2020 and 2021.6 The most famous is Steve Spagnuolo. His 2007 Giants beat the 18–0 Patriots in Super Bowl XLII mostly by rushing four and blitzing only now and then, so his Cover 0 reputation comes from Kansas City, where he has been defensive coordinator since 2019: the Chiefs ranked in the top five in Cover 0 rate in every season from 2019 to 2025, and first in 2025.7 He is known less for how often he calls it than for when: at the moments offenses least expect it, which is part of what makes it work, because a quarterback who knows Cover 0 is coming can call a protection and a route to beat it.

Stacks and bunches: banjo and combo coverage

Man coverage has a structural weak point, and offenses found it long ago: receivers who line up close together. When two receivers stand a yard apart, or one directly behind the other in a stack, their defenders are close together too, and the receivers can release in directions that make the defenders cross. A defender chasing his man has to go around the other receiver, or around his own teammate, and loses a step. That is the rub from Dropback Concepts, and stacks and bunches are formations built to create it. (A rub has to look like an accident. A receiver more than a yard past the line who deliberately blocks a defender before the pass is thrown commits offensive pass interference, so offenses design the two paths to cross close by, not to collide.8)

The defense’s answer is to stop deciding before the snap. In a banjo, two defenders take two receivers together, and decide who has whom by how the routes declare: the outside defender takes the first receiver who breaks outside, the inside defender the first who breaks inside. Nobody has to cross anybody. (Don’t confuse it with the in-out bracket later in this chapter, which puts two defenders on one receiver, or with the exchange on motion from Motion and Shifts as Weapons, which swaps receivers before the snap.)

Show the Python
BJ_LAT, BJ_WIN = (4.0, 28.2), (-4.0, 12.0)


def stack_play():
    off = line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("Z", "WR", LINE_D, 13.0), O("H", "WR", -2.6, 13.6)]
    dfn = [D("RCB", "CB", 4.8, 15.8, "CB"), D("NB", "NB", 4.8, 10.4, "$")]
    p = Play(off, dfn, los=LOS, to_go=None)
    route_to(p, "Z", (2.0, 13.0), (6.0, 8.5), (7.6, 6.4))
    route_to(p, "H", (2.4, 14.1), (4.4, 19.6), (4.7, 21.2))
    return p


lock, banjo = stack_play(), stack_play()
set_tracks(lock, {   # each has to cross the other and H's release: both lose ground in the traffic
    "RCB": ease([(0.0, 4.8, 15.8), (0.6, 3.0, 14.9), (1.0, 3.7, 13.2), (1.45, 5.2, 10.6), (2.0, 6.2, 8.2)]),
    "NB": ease([(0.0, 4.8, 10.4), (0.6, 5.4, 12.4), (1.0, 4.6, 14.4), (1.45, 4.6, 16.6), (2.0, 4.8, 18.6)]),
}, t_end=2.0)
set_tracks(banjo, {  # they wait for the routes to declare, then take the receiver who comes to their side
    "RCB": ease([(0.0, 4.8, 15.8), (0.6, 4.6, 16.0), (1.0, 4.6, 17.4), (1.45, 5.1, 20.3), (2.0, 5.3, 21.6)]),
    "NB": ease([(0.0, 4.8, 10.4), (0.6, 5.1, 9.8), (1.07, 5.8, 7.8), (1.45, 7.8, 6.0), (2.0, 8.0, 5.6)]),
}, t_end=2.0)
BJ_T = [0.0, 0.6, 1.45]
PAIRS = {0: (("RCB", "Z"), ("NB", "H")), 1: (("RCB", "H"), ("NB", "Z"))}


def banjo_deco(i, j, fld, p):
    """Sideline cue in every panel; each receiver's separation from his defender in the last column."""
    say(fld, p, -2.4, 22.6, "outside →", fontsize=6.0)
    if j == len(BJ_T) - 1:
        for dk, rk in PAIRS[i]:
            sep = float(np.linalg.norm(np.array(p.position(dk, BJ_T[j])) - np.array(p.position(rk, BJ_T[j]))))
            rd, rw = p.position(rk, BJ_T[j])
            txt = f"{sep:.0f} yd: open" if sep >= 1.6 else f"{max(sep, 1.0):.0f} yd: covered"
            say(fld, p, rd + 1.9, rw, txt, fontsize=5.8, color=OD if sep >= 1.6 else DD, weight="bold")


if PDF:
    strip_rows([lock, banjo], ["Locked man", "Banjo"], BJ_T,
               [["CB has Z, $ has H.", "They must cross: traffic.", "Both receivers open."],
                ["They wait for the routes.", "Z breaks in, H out.", "CB takes H, $ takes Z."]],
               BJ_LAT, BJ_WIN, deco=banjo_deco)
    plt.show()
else:
    video([lock, banjo], ["Locked man", "Banjo"], BJ_LAT, BJ_WIN, t_end=1.8, width_in=6.4)
Figure 34.7: The same stack release against two ways of covering it (the offense’s right side, with the sideline at the right edge; simulated). Z is on the line, H directly behind him. Z runs a slant inside, H a quick out. Top row, locked man: the cornerback (CB) has Z and the nickel ($) has H, so they have to cross each other and H’s release; both lose ground in the traffic and both receivers come open (the yards are each receiver’s separation from his defender). Bottom row, banjo: the same two defenders wait for the routes to declare; the cornerback, outside, takes the receiver who breaks out (H) and the nickel, inside, takes the one who breaks in (Z). Nobody crosses, and both receivers are covered. In the web version this is a video.

Notice where the banjo defenders stand: about five yards off, not pressed. They need a moment to see which way each receiver is going, and from the line of scrimmage they would have no time to read before having to commit. The in/out split is the most common; some teams split them low/high instead, so the first receiver to break short goes to one defender and the first to go deep to the other. Every banjo also needs a rule for the release that doesn’t declare neatly, both receivers going the same way or both running straight upfield; usually the defenders fall back on their pre-snap match, or the outside man takes #1.

The banjo solves the rub by trading a little of man coverage’s certainty for zone-like flexibility. It is a small zone rule inside a man call: for the first yard or two, each defender guards a side rather than a person, then locks on to whoever comes to that side. (It runs the opposite way from the pattern matching you met in Coverage Fundamentals, which is a zone call whose defenders become man defenders once the routes declare. A banjo starts from man and borrows a moment of zone.) That makes it the simplest example of a combo coverage, the general name for coverages in which two or more defenders share receivers and decide who takes whom by how the routes declare. Against a three-receiver bunch, a common version is a “point” call: one defender presses the receiver at the point of the bunch (the one nearest the line), and the other two play first-out and first-in on the other two. Bigger combos play man on one side of the formation and zone on the other.

The price is communication and a new weakness. Both defenders must call it, both must read the same release, and both must commit at the same instant. Offenses go after banjos with routes that make the release ambiguous. The clearest is to send both receivers the same way, one a beat after the other.

Show the Python
p = Play(line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("Z", "WR", LINE_D, 13.0), O("H", "WR", -2.6, 13.6)],
         [D("RCB", "CB", 4.8, 15.8, "CB"), D("NB", "NB", 4.8, 10.4, "$")], los=LOS, to_go=None)
route_to(p, "Z", (1.6, 13.0), (4.4, 9.0), (5.0, 7.2))          # first inside: quick slant
route_to(p, "H", (2.4, 14.0), (7.8, 14.3), (8.0, 5.6))         # second inside, a beat later
fld = draw(p, width_in=6.2, lateral=(-4.8, 28.2), window=(-6.8, 12.5))
branch(fld, p, [(4.8, 10.4), (4.7, 9.3), (5.6, 7.9)])                  # $ takes the first in-breaker
branch(fld, p, [(4.8, 15.8), (5.8, 15.7), (7.2, 13.6), (7.4, 11.4)])   # CB chases the second, from behind
say(fld, p, 2.0, 6.0, "1. Z in first:\n$ takes him", fontsize=6.6)
say(fld, p, 10.6, 10.6, "2. H in, a beat later: the CB\nmust chase him across, behind", fontsize=6.6)
say(fld, p, -2.4, 22.6, "outside →", fontsize=6.4)
field_legend(fld.ax, ["route", "react"])
plt.show()
Figure 34.8: How an offense beats a banjo (the same stack and the same two defenders; illustrative). Both receivers break inside, one a beat after the other. Z runs a quick slant (1), the first receiver inside, so the nickel ($), the inside defender, takes him. H pushes upfield and breaks inside a beat later (2) on a short in-cut. Nobody has broken outside, so the cornerback’s man is H, but H is now running away from him across the field with a two-to-three-yard head start, the very traffic problem the banjo was meant to avoid.

Other counters work the same way: a receiver who fakes in and breaks back out after the defenders have committed (the whip from Passing Fundamentals), or a third receiver arriving in the space the two defenders vacated. That is why bunch formations are a red-zone staple, and the red zone, as the numbers later in this chapter show, is where man coverage is most common. Bunches stress whatever rule the defense has.

The charters who label coverages for the NFL’s public data see these mixtures too. From 2023 on, the charting used by nflverse includes a label, COMBO, for plays that don’t fit a single coverage name. The data dictionary lists COMBO without defining it, so it is safest to read it as “a mixture the charter didn’t force into one box”; this chapter’s counts leave those plays out.

Brackets: two on one

Sometimes the problem isn’t the formation; it’s one receiver. The offense has a player the defense cannot cover one-on-one, and leaving him in man coverage, even with a deep safety somewhere, is asking for a long afternoon. The answer is a bracket: two defenders on one receiver, one on each side of him, so whichever way he breaks, somebody is already there.

Show the Python
off = line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("RB", "RB", GUN, -2.0, "R"),
                 O("X", "WR", LINE_D, -15.0), O("Y", "TE", OFF_BALL, 7.5),
                 O("H", "WR", OFF_BALL, 12.0), O("Z", "WR", LINE_D, 17.0)]
dfn = dline() + [D("MIKE", "MIKE", 5.0, 6.8, "M"), D("WILL", "WILL", 4.5, -2.4, "W"),
                 D("LCB", "CB", 1.2, -14.4, "CB"), D("FS", "FS", 12.0, -11.0, "FS"),
                 D("NB", "NB", 3.5, 11.3, "$"), D("RCB", "CB", 1.2, 17.6, "CB"),
                 D("SS", "SS", 14.0, 6.0, "SS")]
p = Play(off, dfn, los=LOS, to_go=8)
for d_, t_ in (("LCB", "X"), ("FS", "X"), ("NB", "H"), ("RCB", "Z"), ("MIKE", "Y"), ("WILL", "RB")):
    p.man(d_, t_)
protect(p)
p.zone((17.5, 9.0), (6.0, 22.0), label="deep, trips side")
p.highlight("X")
fld = draw(p, lateral="full", window=(-8.5, 22.5))
number(fld, p, [("X", "#1"), ("Z", "#1"), ("H", "#2"), ("Y", "#3")])
say(fld, p, 12.0, -7.2, "over: FS", fontsize=6.8, color=DD, weight="bold")
say(fld, p, 2.6, -20.6, "under: CB", fontsize=6.8, color=DD, weight="bold")
oval(fld, p, (9.5, 0.5), (4.0, 8.0), color=style.MUTED, label="empty hole", alpha=0.10)
field_legend(fld.ax, ["man", "area", "ring", "ltg"])
plt.show()
Figure 34.9: A bracket on the isolated receiver in a 3x1 formation. The offense puts its best receiver, X (ringed), alone on the left as #1, with three receivers to the right. The defense brackets him: the left cornerback presses a step inside X and plays underneath, in trail technique, and the free safety (FS) plays over the top, 12 yards deep and only about 4 yards inside X, far from the middle of the field. The trips side is man coverage, with the strong safety (SS) as the single deep defender over it. The cost shows in the middle: the safety who would have been the robber is spent on X, so nobody sits in the hole, and the trips side’s man defenders have only one safety behind them.

Brackets come in two shapes, named for where the two defenders stand.

Show the Python
LAT_B, WIN_B = (-25.0, -3.0), (-3.5, 21.0)
BRACKET2 = style.SERIES[6]   # the second defender in the bracket


def bracket_panel(ax, kind):
    off = [O("X", "WR", LINE_D, -15.0)]
    if kind == "under":
        dfn = [D("CB", "CB", 1.2, -14.4, "CB"), D("FS", "FS", 13.0, -10.5, "FS")]
    else:
        dfn = [D("CB", "CB", 1.2, -16.0, "CB"), D("SS", "SS", 8.0, -7.6, "SS")]
    p = Play(off, dfn, los=LOS, to_go=None)
    p.highlight("X")
    fld = p.draw(ax=ax, lateral=LAT_B, window=WIN_B, title=False)
    clean(ax)
    ruler(fld, p, fs=5.5)
    opt = dict(color=style.OFFENSE, lw=1.2, dash="-", z=3.8)
    if kind == "under":
        oval(fld, p, (7.5, -13.5), (9.0, 8.5))
        say(fld, p, 7.2, -20.4, "CB: under\n(short,\nmiddle)", fontsize=6.0)
        oval(fld, p, (17.2, -12.5), (5.0, 14.0), color=BRACKET2, alpha=0.2)
        say(fld, p, 17.2, -8.8, "FS: over\n(deep)", fontsize=6.0)
        branch(fld, p, [(0.0, -15.0), (8.0, -15.4), (19.5, -17.0)], **opt)    # go / fade: the safety's
        branch(fld, p, [(0.0, -15.0), (9.0, -15.0), (9.0, -9.0)], **opt)      # dig: the corner's
    else:
        oval(fld, p, (8.5, -19.6), (13.0, 5.4), label="CB:\nout", fs=6.0)
        oval(fld, p, (11.5, -10.4), (7.5, 7.5), color=BRACKET2, label="SS: in", fs=6.0, alpha=0.2)
        branch(fld, p, [(0.0, -15.0), (10.0, -15.0), (10.0, -20.5)], **opt)   # out: the corner's
        branch(fld, p, [(0.0, -15.0), (2.0, -15.0), (8.0, -9.5)], **opt)      # slant: the inside man's
    return fld


fig, axes = plt.subplots(1, 2, figsize=(6.4, 3.9))
for ax, kind, ttl in zip(axes, ("under", "inout"), ("Under-over", "In-out")):
    bracket_panel(ax, kind)
    panel_title(ax, ttl)
fig.tight_layout(w_pad=1.2)
plt.show()
Figure 34.10: The two shapes of bracket, on the same isolated receiver (X, offense’s left). Left, under-over: the cornerback, pressed a step inside, takes everything short and intermediate (orange area), trailing underneath, so a dig runs into him; the safety (purple area) takes everything deep, so a go route runs into him. Right, in-out: the cornerback plays outside leverage and takes routes to the sideline (out, comeback, fade), so the out runs into him; a second defender inside, here a safety at 8 yards (a robber or linebacker also works), takes everything that breaks in, so the slant runs into him. Either way X has a defender on both sides of every route he can run. Blue lines are sample routes.
  • Under-over (top-bottom). The cornerback presses head-up or a step inside and plays underneath, in trail technique, taking away anything short or intermediate (the slant and the dig are his); a safety plays over the top, taking away anything deep, the fade included. The receiver can’t run past the safety and can’t break in front of the corner. It is the classic way to take a deep threat out of a game.
  • In-out. The cornerback plays outside leverage and owns the sideline; a second defender (a robber, a linebacker, a nickel) sits inside and owns everything that breaks toward the middle. It suits a receiver who wins on slants and digs more than on go routes. (Same “in” and “out” words as a banjo, different job: the banjo is two defenders on two receivers, the bracket two on one.)

In today’s NFL the receiver being bracketed is often a tight end: a linebacker or the nickel underneath him, a safety over the top.

Before the snap, an under-over bracket can look like a two-high shell, two safeties deep, which Coverage Fundamentals taught you to read as Cover 2, quarters or 2-Man. The tell is where the safety stands. A two-high safety has to cover half the field, from the middle to the sideline, so he lines up roughly halfway between them. A bracket safety has one man to cover, so he cheats out over that man: only a few yards inside the receiver, far from the middle, while the other safety sits over the rest of the formation.

Brackets are expensive, and the bill always arrives somewhere else. Eleven defenders minus four rushers leaves seven for five receivers. Spend two on one receiver and the other four have five defenders between them: one is still free, but now he is usually the only deep player, or there is no robber, or one man defender has no help at all. In the 3x1 picture, the bracket on X is paid for by an empty hole in the middle of the field. Bracket the star and the offense’s job becomes simple: throw to the others, especially the receiver now covered by a linebacker.

That is a perfectly good outcome for many defenses. The idea is associated above all with Bill Belichick, whose game plans often started from one question: what does this offense most need to do, and how do we take it away? If the answer was a receiver, the answer was often a bracket, and the offense’s second and third options were invited to beat the Patriots instead. (How that habit became a philosophy is the story of Case Study: Belichick and Game-Plan Football.) A defense can also bracket only on some downs, or only in certain areas of the field, so the quarterback can’t assume where the second defender will be.

Shadow corners

There is a cheaper way to deal with a great receiver, if you have the player for it: give him your own great player, everywhere. A shadow corner is a cornerback assigned to one receiver for the whole game. Wherever that receiver lines up (left, right, in the slot, in motion) the corner goes with him.

Show the Python
def shadow_snap(ax, snap):
    if snap == 1:
        off = spread()
        dfn = cover1_def(extra={"LCB": (1.2, -15.9)})
        keys = (("LCB", "X"), ("RCB", "Z"), ("NB", "H"), ("SS", "Y"), ("WILL", "RB"))
        star = "LCB"
    else:
        off = line5() + [O("QB", "QB", GUN, 0.0, "Q"), O("RB", "RB", GUN, -2.0, "R"),
                         O("H", "WR", LINE_D, -15.0), O("Y", "TE", OFF_BALL, 6.5),
                         O("X", "WR", OFF_BALL, 11.0), O("Z", "WR", LINE_D, 16.5)]
        dfn = cover1_def(extra={"LCB": (1.6, 11.6), "NB": (1.6, -15.9), "RCB": (1.2, 17.1),
                                "SS": (5.0, 7.1), "WILL": (4.5, -2.6), "MIKE": (4.5, 2.4)})
        keys = (("LCB", "X"), ("RCB", "Z"), ("NB", "H"), ("SS", "Y"), ("WILL", "RB"))
        star = "LCB"
    p = Play(off, dfn, los=LOS, to_go=None)
    for d_, t_ in keys:
        p.man(d_, t_)
    p.highlight(star)
    fld = p.draw(ax=ax, lateral="full", window=(-7.0, 16.0), title=False)
    clean(ax)
    return fld, p


fig, axes = plt.subplots(2, 1, figsize=(6.5, 5.6))
fld, p = shadow_snap(axes[0], 1)
panel_title(axes[0], "Snap 1: X wide left. The shadow corner is on him.")
say(fld, p, 1.4, -21.6, "shadow\ncorner", fontsize=6.8, color=style.INK, weight="bold")
fld, p = shadow_snap(axes[1], 2)
panel_title(axes[1], "Snap 2: X moves into the right slot. The shadow corner goes with him.")
say(fld, p, 6.0, 13.6, "same corner,\nnow in the slot", fontsize=6.8, color=style.INK, weight="bold")
say(fld, p, 5.6, -15.8, "the nickel ($)\nslides out to H", fontsize=6.6)
fig.tight_layout(h_pad=1.2)
plt.show()
Figure 34.11: A shadow corner on two snaps. Top: X lines up wide on the left, and the shadow corner (ringed CB) presses him there. Bottom: the offense moves X into the right slot of a 3x1 formation to get him away from that corner, and the corner goes with him into the slot, and the nickel back ($), normally the slot defender, slides out to take whoever is wide on the left (here H). A defense that keeps its corners on fixed sides (left corner, right corner) would let the offense pick the matchup by choosing where X lines up.

The reason most teams don’t do this is that it’s harder than it looks, for the corner and for the defense. A cornerback who has played the left side his whole career has to learn the right side, where his footwork is reversed, and the slot, where a receiver can release in either direction and the help is in different places. The rest of the defense has to adjust every snap around wherever the shadow went. And the corner has to be good enough that the defense can treat one receiver as solved, which is the whole point: a true shadow corner turns a bracket’s two defenders into one, and gives the defense its extra defender back. That is also why even man-heavy defenses with a great corner often don’t travel him every snap: a corner who is superb on the outside may be ordinary in the slot, and keeping him on one side and bracketing when needed is simpler for everyone else.

The modern archetype is Darrelle Revis. With Rex Ryan’s 2009 Jets he followed the opponent’s best receiver week after week, and the list of receivers he held quiet that season reads like an All-Pro team: Randy Moss twice, Andre Johnson, Terrell Owens twice, Reggie Wayne, Chad Ochocinco (no catches at all in their regular-season meeting). The press called it “Revis Island,” the place where receivers went to disappear, and the Jets allowed the fewest points in the NFL that year. Revis went into the Hall of Fame in his first year of eligibility, in 2023.9 More recently, Denver’s Patrick Surtain II, the 2024 Defensive Player of the Year, played the role for Vance Joseph’s defense: in the 2024 opener he lined up across from Seattle’s DK Metcalf on 24 of Metcalf’s 25 routes, by Next Gen Stats’ count.10 By this book’s count from nflverse charting, the Broncos played man coverage on a larger share of dropbacks than any other defense in both 2024 and 2025 (details in the section on when defenses choose man), a reminder that teams play the coverage their best players are built for.

The contrast is instructive. Richard Sherman, one of the best cornerbacks of the 2010s, mostly did not shadow. Seattle’s defense was built on single-high coverage, mostly Cover 3 (a zone) with plenty of Cover 1, and in both Sherman usually lined up on the defense’s left side and stayed there, letting the offense decide who would face him. Seattle sometimes moved him to follow a particular receiver, as against Atlanta’s Julio Jones in October 2016, but it was the exception.11 Revis was a travelling corner in a defense built around his matchup; Sherman was a fixed-side corner in a defense built around its structure. Both were great; the system decided which kind of great it needed.

When defenses choose man

Every defense plays both man and zone, and how often depends on scheme, on personnel and on the situation. You can see the situational part clearly in the public charting data.

Show the Python
dd_order = ["1st down", "2nd down", "3rd/4th & 1–2", "3rd/4th & 3–6", "3rd/4th & 7–10", "3rd/4th & 11+"]
fp_order = ["81–99", "41–80", "21–40", "11–20", "6–10", "1–5"]
eras = ["2018–2022 (NGS charting)", "2023–2025 (FTN charting)"]
ecol = {eras[0]: style.SERIES[0], eras[1]: style.SERIES[1]}
fig, axes = plt.subplots(1, 2, figsize=(6.6, 3.4))
a = (CV.groupby(["dd", "era"])["man"].mean() * 100).unstack().reindex(dd_order)
b = (CV.groupby(["zone_fp", "era"], observed=True)["c0"].mean() * 100).unstack().reindex(fp_order)
xs = np.arange(len(dd_order))
for e in eras:
    axes[0].plot(xs, a[e].values, marker="o", ms=4.5, color=ecol[e], lw=1.8, label=e)
    axes[1].plot(np.arange(len(fp_order)), b[e].values, marker="o", ms=4.5, color=ecol[e], lw=1.8, label=e)
axes[0].set_xticks(xs)
axes[0].set_xticklabels(["1st", "2nd", "3rd/4th\n& 1–2", "& 3–6", "& 7–10", "& 11+"], fontsize=7)
axes[0].set_ylabel("Man coverage, % of dropbacks", fontsize=8)
axes[0].set_ylim(0, 75)
axes[0].set_title("Man coverage by down and distance", fontsize=9)
axes[1].set_xticks(np.arange(len(fp_order)))
axes[1].set_xticklabels(["81–99", "41–80", "21–40", "11–20", "6–10", "1–5"], fontsize=7)
axes[1].set_xlabel("Yards from the goal line being defended", fontsize=7.5)
axes[1].set_ylabel("Cover 0, % of dropbacks", fontsize=8)
axes[1].set_ylim(0, 70)
axes[1].set_title("Cover 0 by field position", fontsize=9)
for ax in axes:
    ax.tick_params(labelsize=7)
axes[0].legend(fontsize=6.8, loc="upper left", frameon=False)
fig.tight_layout(w_pad=1.5)
plt.show()
Figure 34.12: When NFL defenses play man. Left: share of charted dropbacks played in a man coverage (Cover 0, Cover 1 or 2-Man), by down and distance. Right: share played in Cover 0, by how far the ball is from the goal line the defense is protecting. Each line is one charting source: NGS for 2018–2022 and FTN for 2023–2025. The two sources label man coverage at different rates, so compare the shapes, not the levels: in both, man coverage is most common on third (and fourth) and short or medium, least common on third-and-long, and Cover 0 takes over near the goal line (where ‘Cover 0’ often means nobody deep because there is no deep, not always six rushers). Regular seasons; blown coverages and plays charted as mixed are left out.

Three situations stand out, and each has a reason.

Third down, short and medium. On third-and-3 to third-and-6, defenses played man on about 60% of charted dropbacks in both charting eras, far more than on first down (about 25 to 36%).12 The defense knows where the ball has to go: just past the line to gain. Man coverage contests the throw at the sticks instead of rallying to tackle after a catch short of them. It also pairs naturally with a blitz, and third down invites one: the offense almost has to throw, so the defense can send extra rushers without much fear of a run, and a quick incompletion ends the drive. Notice what happens on third-and-11 or more: man coverage drops to its lowest rate of any situation. With that much to go, the defense is happy to let the receiver catch the ball in front of it and tackle him short, which is a zone’s job. Third-and-long is the zone defense’s down; third-and-medium is man’s. And first down leans zone for the opposite reason: the offense might run, or fake a run and throw, and man defenders with their backs to the backfield are the worst-placed players on the field against both. Zone defenders face the ball and can come up to tackle a runner.

The red zone and the goal line. As the field shrinks, man coverage takes over. Inside the defense’s 5-yard line, charters labelled 78 to 88% of dropbacks as man coverage, and Cover 0 on 41 to 62% of them, depending on the source. Near the goal line the biggest weakness of man coverage nearly disappears. A receiver who beats his man deep runs out of field: the back line of the end zone, the end line, acts like a safety that never misses. Zones, meanwhile, lose their main tool: there is no depth to drop into, so zone defenders end up standing on the end line while quick, sharp-breaking routes are completed in front of them. Man coverage contests the catch itself. So defenses spend their deep defenders on the rush or on more man coverage. Read the goal-line Cover 0 numbers with care, though: near the goal line “Cover 0” often means “nobody deep, because there is no deep,” not necessarily an all-out blitz. Of charted Cover 0 dropbacks inside the 5, only about 60 to 70% had five or more rushers.13 (The red zone gets its own chapter: Red Zone, Goal Line, and Short Yardage.)

Talent. Man coverage is only as good as the worst matchup in it, so teams with great cornerbacks play more of it. In nflverse charting, the Patriots played man on a larger share of dropbacks than any other defense in 2018 and 2019 (about 61% and 68%), the seasons around Stephon Gilmore’s Defensive Player of the Year award; Miami, coached from 2019 to 2021 by Brian Flores, a long-time Belichick assistant, led the league in 2020 and 2021; Denver, with Surtain, led it in 2024 and 2025.14 The reverse is true too. A defense with a weak link in the secondary, or facing a quarterback who punishes defenders with their backs turned by running, leans toward zone, where everyone faces the ball.

CautionCommon misconception

“NFL defenses are playing more and more man coverage.” You may see charts that say so. Be careful. The public coverage labels come from two different charting sources (NGS through 2022, FTN from 2023), and the man share jumps from about 29% of charted dropbacks in 2022 to about 44% in 2023 and 50% in 2024, then falls back to 31% in 2025. Defenses didn’t change that much that fast; the labelling did. Comparisons within a source (one season, or one era, as in the chart above) are safe; trend lines across the 2022/2023 break are not. (The season-by-season figures are in the note to the third-down paragraph above.)

How offenses attack man, and how the defense answers

Every offense has a list of plays it calls when it expects man coverage. You met most of them from the offense’s side in Part 4; here they are from the defense’s side, paired with the counter each one provokes. Notice that most of the defense’s counters are things we’ve already met in this chapter: the free defender, the banjo, the bracket.

The offense’s man-beater Why it works against man The defense’s counter
Crossers and mesh (Dropback Concepts) A crossing receiver runs away from a trailing defender, through traffic. A robber or rat sitting in the middle; defenders who pass crossers on to each other in combos.
Rubs, stacks and bunches Defenders must go around receivers or teammates (the contact has to look incidental, or it is offensive pass interference). Banjo and combo rules; pressing the front receiver of a stack to wreck the timing.
The slant (The Quick Game) Beats an outside-leveraged defender inside, quickly. Inside help: a rat or lurker under the slant; inside leverage in Cover 0.
Double moves Punish a man defender who jumps the first break. A deep safety over the top (Cover 1, a bracket); patient technique.
Motion, especially at the snap (Motion and Shifts as Weapons) Gives the receiver a running start and forces the defender to chase across the formation; it also reveals man. Exchanges instead of travelling, so motion reveals less; zone calls disguised to look like man (and man calls disguised as zone).
The running back on a linebacker (the angle route) The slowest cover man on the field is often matched on a quick back. Putting a safety or a fast linebacker on the back; a free defender who helps on him.
The scrambling quarterback Man defenders have their backs to him; nobody is left to tackle. A spy, or a rat who keeps his eyes on the quarterback; more zone.
The back-shoulder and the fade Against press, the ball is thrown where only the receiver can reach it. A safety over the top; a cornerback who plays the receiver’s hands (the out-of-phase technique above).

The Chiefs’ “Corn Dog” touchdowns in Super Bowl LVII, which you met in Motion and Shifts as Weapons, are the textbook case of the motion line in that table: the man defender went with the first move, the receiver came back the other way, and nobody was there. The general lesson is the one you started the chapter with. Man coverage asks each defender to stay with a person, and every man-beater is a way of making that harder: run away, run through traffic, change direction twice, or start already moving.

Film room

NoteFilm room: Patriots 2003 and 2019 — Ty Law, Stephon Gilmore and the man-coverage habit

Two Patriots seasons, sixteen years apart, bookend Belichick’s man-coverage defenses. In the 2003 AFC Championship Game against Indianapolis, Ty Law intercepted Peyton Manning three times in a 24–14 win, playing press-man against the Colts’ receivers and, in his words afterward, the simplest game plan imaginable: “Just beat them up.” The rules response that followed, the 2004 crackdown on illegal contact, became known as the “Ty Law Rule.”15

In 2019 the Patriots led the NFL in points allowed (14.1 per game) and total defense, and Stephon Gilmore became the first Patriot to be named Defensive Player of the Year, tying for the league lead with six interceptions and returning two of them for touchdowns.16 That was the season New England led the league in man coverage (the talent paragraph above has the number), and the habit around Gilmore was the Belichick one: man coverage on most of the field, and the spare defenders spent on whatever the opponent most wanted to do, often its best receiver or tight end.

What to notice: on a 2019 Patriots third down, find the free defenders first: usually a safety deep in the middle and a second defender in the hole or bracketing the offense’s best receiver. The pattern repeats from 2003 to 2019 with different players: man coverage on the people the defense trusts, and the free defenders spent on the player or the area it fears.

NoteFilm room: Chiefs, Super Bowl LVIII (February 11, 2024) — Spagnuolo brings the house

Overtime, 49ers ball, third-and-4 at the Kansas City 9. San Francisco called what looked like a well-designed play-action pass for Jauan Jennings, and the replays later showed receivers coming open. It didn’t matter. Steve Spagnuolo sent six rushers in Cover 0, Chris Jones came through untouched, and Brock Purdy had to let the ball go early; it sailed over Jennings’s head. San Francisco settled for a field goal, and Patrick Mahomes answered with the game-winning touchdown drive. “On third down,” linebacker Nick Bolton said afterward, “we brought the house.” “They brought Zero,” Purdy said.17

What to notice: an all-out pressure on a third down inside the 10 is the Cover 0 bargain at its most favourable for the defense. The field is short, so the deep ball that punishes Cover 0 everywhere else barely exists; the throw has to be quick anyway; and one free rusher is enough to end the play. Watch for the same ingredients on any Chiefs third down near the goal line: the safeties walking down, everyone pressed, and a count of rushers that exceeds the count of blockers.

NoteFilm room: Jets at Raiders, December 6, 2020 — the bargain lost

The other side of the bargain. The winless Jets led the Raiders 28–24 with seconds left, and Las Vegas was near midfield. Defensive coordinator Gregg Williams called an all-out blitz with Cover 0 behind it. Derek Carr stood in and threw deep, and Henry Ruggs ran past his rookie cornerback, one-on-one with nobody behind him, for a 46-yard touchdown with 5 seconds left: Raiders 31, Jets 28. The Jets fired Williams the next day.18

What to notice: everything that makes Cover 0 a good bet at the goal line makes it a bad one here. The field was long, so the deep ball existed; the offense needed a big play, not a few yards; and one lost footrace decided the game. Compare it with the Super Bowl LVIII snap above: same call, opposite situation.

NoteFilm room: Jets 2009 — the shadow

Watch any 2009 Jets game against a team with a star receiver and follow Darrelle Revis before the snap. When the star moves from one side to the other, Revis moves with him, and the other Jets defenders reshuffle around that one fixed matchup. (Denver’s 2024 opener at Seattle, with Surtain on Metcalf, shows the same thing in the modern game.)

What to notice: the shadow corner’s matchup frees the rest of the defense. Against Revis’s receiver the Jets often needed no help at all, so the safety who would have bracketed him was available to rob, blitz or double someone else. That is what a shadow corner is really worth: one player doing the job of two.

TipWatch for it on Sunday

Who’s facing the quarterback? It is the fastest man-or-zone test there is.

  • Before the snap: the corners. Squared up to the receiver, close, weight forward, eyes on the receiver’s belt: lean man. Turned inside, deeper, eyes on the quarterback: lean zone.
  • Before the snap: motion. Does somebody run across the formation with the man in motion? That is man. Do the defenders shift over and swap? Could be either: watch the next clue.
  • Before the snap: the safeties. One deep safety in the middle and corners pressed: think Cover 1. Nobody deep and six or seven players on or near the line on third down or near the goal line: think Cover 0 and expect a quick throw.
  • At the snap: the eyes. One second after the snap, look at the defenders underneath. Backs turned to the quarterback, running with receivers: man. Facing the quarterback, settling into areas: zone. The one defender in the middle facing the quarterback when everyone else is running with someone is the rat or robber. Find him and you’ll know where not to throw.
  • Close formations. When receivers stack or bunch, watch the two or three defenders over them at the release. Do they cross each other (locked man) or trade (banjo)?
  • The star. Where is the offense’s best receiver, and who is on him? The same corner every snap, on both sides of the field, is a shadow. A safety 10 to 12 yards deep and only a few yards inside him, far from the middle, is a bracket.

Predict the play

TipPredict the play 1: the man in the middle
Show the Python
off = spread(rb_w=-2.0)
off = [q.moved(w=7.0) if q.key == "H" else q for q in off]
off = [q.moved(w=11.5) if q.key == "Y" else q for q in off]
dfn = cover1_def(extra={"NB": (3.5, 7.6), "SS": (10.6, 3.4), "MIKE": (4.8, 11.0), "WILL": (4.5, -1.6),
                        "LCB": (1.2, -15.9), "RCB": (1.2, 15.9)})
p = Play(off, dfn, los=LOS, to_go=8)
p.highlight("SS")
fld = draw(p, lateral="full", window=(-8.5, 19.0))
branch(fld, p, [(-1.5, -9.0), (-2.8, -6.0), (-2.8, 4.5), (-1.6, 6.0)], color=style.OFFENSE, lw=1.3)
branch(fld, p, [(4.0, -9.8), (3.0, -6.0), (3.0, 4.6), (3.4, 6.4)], lw=1.3)
say(fld, p, 6.4, -6.5, "$ followed H across", fontsize=6.6)
number(fld, p, [("Z", "#1"), ("Y", "#2"), ("H", "#3")])
field_legend(fld.ax, ["motion", "react", "ring", "ltg"])
plt.show()
Figure 34.13: Second-and-8, ball in the middle of the field. Before the snap, H motioned from the left slot across to the right (blue dashes) and the nickel ($) ran across with him (orange dashes); both are shown where they finished, so the offense is now 3x1 to the right (Z, the tight end Y, and H, who is now #3). The corners are pressed, a step outside. One safety (FS) is 14 yards deep in the middle; the other (SS, ringed) stands 10 yards deep, just off the middle.

What coverage is this most likely to be, and which throw should the quarterback avoid? What would you call to beat it?

Cover 1 with a robber. The tells stack up: the nickel travelled with H’s motion all the way across the formation, which is man coverage; the corners are pressed and squared up; and there is exactly one safety deep in the middle, so the middle of the field is closed. Now count. Five receivers need five men: two corners, the nickel on H, the Mike on the tight end, the Will on the back. That leaves the second safety, 10 yards deep near the middle, with nobody to cover. He is the free defender, a robber, and his job is to read the trips side and the quarterback and jump the first route that breaks into the middle.

Avoid the single in-breaking route into his area: a lone dig or crosser at 8 to 12 yards is exactly the throw he is there to steal, as in the robber animation earlier in the chapter. Attack him with a high-low: a shallow crosser underneath and a dig behind it (the drive concept), so he can’t take both, or look him off to the middle and throw outside. You could also attack the corners one-on-one away from the robber with a back-shoulder fade or a double move, since the free safety must cover the whole deep middle, or put the running back on a linebacker with an angle route.

TipPredict the play 2: who has the back?
Show the Python
off = spread(rb_w=2.0)
dfn = zero_front() + [D("LCB", "CB", 1.2, -15.6, "CB"), D("NB", "NB", 1.4, -9.6, "$"),
                      D("RCB", "CB", 1.2, 15.6, "CB"), D("SS", "SS", 4.0, 8.6, "SS"), D("FS", "FS", 10.0, 1.2, "FS")]
p = Play(off, dfn, los=80, to_go=6)
p.highlight("FS")
fld = draw(p, lateral="full", window=(-8.5, 19.0))
branch(fld, p, [(9.2, 1.2), (7.8, 1.2)], lw=1.2)
say(fld, p, 11.6, 7.4, "creeping\nforward", fontsize=6.4)
field_legend(fld.ax, ["react", "ring", "ltg"])
plt.show()
Figure 34.14: Third-and-6 at the defense’s 30. The offense has 11 personnel in a 2x2: four receivers spread out and the running back (R) beside the quarterback. The corners and the nickel are pressed on X, Z and H, and the strong safety is 4 yards off the tight end Y. Six defenders are on the line, including both linebackers in the A gaps beside the center. The only other defender is the free safety (FS, ringed), 10 yards deep in the middle of the field, creeping forward as the quarterback calls the signals.

Count it. If all six defenders on the line rush, who covers the running back? So what coverage is coming, and what should the offense do about it?

Cover 0, with a six-man rush. Five receivers need five men. Four of them are already standing on their receivers: two corners, the nickel, and the strong safety on Y. The fifth man is the only one left, the free safety, and he is the only possible cover man for the running back. That is why he is at 10 yards and creeping rather than at 13 to 15: he isn’t guarding the deep middle, he is getting closer to his man. So nobody will be deep, and six rush. (Compare Predict the play 1, where there were two players beyond the linebackers and the arithmetic left one free.)

Could it still be Cover 1? Only if one of the six on the line drops out to take the back and the free safety stays deep; a defense can also show this and drop players out at the snap (the “simulated” pressures of Zone Blitzes, Fire Zones, and Simulated Pressure). But a lone safety at 10 yards, creeping, on third down, is the classic picture of zero.

What the offense should do: count the rushers against the blockers. Six rushers against five linemen means one comes free, so the back should stay in to block. That makes it six against six, and if the free safety then joins the rush (“hug”), the quarterback must throw hot, now, to a receiver winning against an inside-shaded defender: a quick out, a fade, or a rub. And because nobody is deep, any receiver who wins a vertical route is a touchdown.

TipPredict the play 3: two on the tight end
Show the Python
off = spread(rb_w=-2.0)
dfn = cover1_def(extra={"MIKE": (4.0, 7.8), "WILL": (4.5, -2.0), "SS": (10.0, 7.5), "FS": (14.0, -1.0),
                        "NB": (1.4, -9.6)})
p = Play(off, dfn, los=LOS, to_go=7)
p.highlight("SS")
fld = draw(p, lateral="full", window=(-8.5, 19.0))
field_legend(fld.ax, ["ring", "ltg"])
plt.show()
Figure 34.15: Third-and-7. The offense’s best receiver is its tight end, Y, in the right slot of a 2x2. The Mike (M) is 4 yards off him, shaded inside. The strong safety (SS, ringed) is 10 yards deep, a step and a half inside Y. The free safety (FS) is 14 yards deep in the middle. The corners and the nickel are pressed on X, Z and H; the Will (W) is over the running back.

What are the two defenders over Y doing, and where should the ball go?

Cover 1 with a bracket on the tight end. Count: four rushers, and five receivers with a man each (the corners on X and Z, the nickel on H, the Will on the back, the Mike on Y). That leaves two spare defenders. One, the free safety, is deep in the middle: Cover 1. The other, the strong safety, has nobody to cover and yet stands only a step and a half inside Y, 10 yards deep, which no robber would do (a robber sits in the middle). He is the “over” half of an under-over bracket on Y, and the Mike, tight and inside, is the “under” half.

Throw somewhere else. The bracket’s bill is paid in the middle: with the strong safety spent on Y, nobody sits in the hole. A crosser from H or X has room once it clears the Mike’s area, and the running back on the Will (an angle route) is a classic answer. X and Z are one-on-one with only the free safety behind them. Throwing to Y into two defenders on third-and-7 is what the defense is daring the quarterback to do. A defense can disguise this, of course, by standing the safety there and playing something else; and the same lean against a 3x1 formation can also belong to a split-field coverage check (see Disguise, Rotation, and Split-Field Coverage).

Takeaways

  • Man coverage covers people, not places. It is tight, certain about who covers whom, and lets the defense pick matchups. Its price is that man defenders watch receivers, not the quarterback, and need help somewhere.
  • The free defenders define the family. Cover 1 keeps one safety deep and usually one more defender to rush, rob or spy; Cover 0 keeps nobody deep and usually sends six or seven. The rat, the robber and the lurker are the same idea: one defender with zone eyes, in the middle, where man coverage is weakest.
  • Leverage follows the help. With inside help (Cover 1), corners usually play outside and funnel receivers inside (split, down and distance can change it); with no help (Cover 0), they play inside and protect the quick throw. Technique (press, off, trail) is chosen per matchup and per down.
  • Close formations and great receivers get special rules. Banjo and combo calls stop stacks and bunches from creating rubs; brackets spend two defenders on one star; a shadow corner spends one.
  • Man coverage is a situational weapon. In the charted NFL seasons it was most common on third and short-to-medium and near the goal line (where Cover 0 is often the most common call), and least common on third-and-long. The public man-rate trend breaks at 2022/2023 because the charting source changed.
  • Every man-beater makes staying with a receiver harder: crossers and mesh, rubs, slants against leverage, double moves, motion at the snap, a back on a linebacker, a scrambling quarterback. The defense’s counters are the free defender, the banjo and the bracket.

Connections

Builds on: Coverage Fundamentals (press, off, trail, the shell), A First Look at Defense (man versus zone), and the offense’s side of the same fights in The Quick Game (beating press, double moves) and Dropback Concepts (mesh, rubs, the angle route).

Sets up: Cover 2 and Tampa 2, where 2-Man puts two safeties over man coverage; Quarters and the Two-High Match Family, where zone defenders turn into man defenders by pattern (and MEG, a corner playing his man everywhere, appears inside a zone call); Disguise, Rotation, and Split-Field Coverage, where the robber comes down from a two-high shell; Blitzing: Numbers, Overloads, A-Gap Mugs, and Cover 0, the pressure side of Cover 1 and Cover 0; and What Beats What, which pairs every coverage in Part 6 with the concepts that beat it.

Case studies: Belichick and Game-Plan Football (brackets and taking away the best player) and Andy Reid and the Kansas City Chiefs (Spagnuolo’s pressure on the defensive side of the Chiefs’ run).

NoteGo deeper
  • Chris B. Brown, The Art of Smart Football (2015) and The Essential Smart Football (2012): essays on the coverage arms race, including man-beaters and the defenses built to stop them.
  • Cody Alexander’s MatchQuarters newsletter and books: the clearest public writing on how modern defenses mix man and zone (combo and match rules) from a coach’s point of view.
  • Coaches’ clinic material on Cover 1 and banjo rules (search for “Cover 1 rat,” “banjo technique,” and “bracket coverage”); and, for the history, Pro Football Hall of Fame biographies of Willie Brown, Mel Blount, Ty Law and Darrelle Revis.

  1. “Bump and run coverage,” Wikipedia: https://en.wikipedia.org/wiki/Bump_and_run_coverage (Brown said he came up with the jam at the line in 1963, with the Denver Broncos, drawing on his experience as a linebacker at Grambling). ESPN, “Willie Brown, Hall of Fame cornerback with Raiders, dies at 78” (Oct. 22, 2019): https://www.espn.com/nfl/story/_/id/27903518 (Davis based the bump-and-run on the full-court press of John Wooden’s UCLA teams; 12 seasons with the Raiders after a trade from Denver in 1967; inducted into the Pro Football Hall of Fame in 1984).↩︎

  2. NFL Rulebook, Rule 8, Section 4 (“Legal and Illegal Contact With Eligible Receivers”): within five yards of the line of scrimmage a defender may contact a receiver in front of him; beyond five yards, while the passer is in the pocket with the ball, he may not initiate contact that impedes the receiver (illegal contact: five yards and an automatic first down). Rule 8, Section 5 governs pass interference once the ball is thrown: https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  3. This book’s calculation from nflverse participation data (method in the note on man-coverage shares): COVER_1 was the label on 28.9% (2018), 30.5%, 27.5%, 23.8%, 22.9% (2022), 34.0% (2023), 37.3% (2024) and 22.5% (2025) of charted regular-season dropbacks, against single digits for Cover 0 and 2-Man. The jump at 2023 is the charting-source change discussed later in the chapter.↩︎

  4. NFL Rulebook, Rule 8, Section 5 (pass interference): https://operations.nfl.com/the-rules/nfl-rulebook/ . A plain-language summary from the Philadelphia Eagles’ “Football 101: Pass interference”: https://philadelphiaeagles.com/news/football-101-pass-interference-13667246 (“any act by a player more than one yard beyond the line of scrimmage [that] significantly hinders an eligible player’s opportunity to catch the ball”; no foul when both players are playing the ball; the defense’s restrictions run from the throw until the ball is touched).↩︎

  5. This book’s calculation from the same data: share of dropbacks with five or more pass rushers, Cover 0 73.4% (2018–2022) and 75.3% (2023–2025), against 47.7% and 39.8% for Cover 1; median time_to_throw on throws, Cover 0 2.25 s (2018–2022) and 2.10 s (2023–2025) against 2.4 to 2.8 s for every other coverage. Between the 20s, 2023–2025: median time_to_throw 2.0 s against Cover 0 (2.4 s or more for every other coverage), and a gain of 20 or more yards on 14.1% of Cover 0 dropbacks (Cover 1 11.0%, Cover 3 9.7%, Cover 2 7.6%, quarters 7.1%); 2018–2022 shows the same order (Cover 0 12.9%, Cover 1 12.5%).↩︎

  6. This book’s calculation from nflverse participation data (method in the note on man-coverage shares): the defense with the highest Cover 0 share of charted regular-season dropbacks was New England in 2018 (13.3%), Baltimore in 2019 (14.5%), Miami in 2020 (14.2%) and 2021 (16.2%), the Giants in 2022 (10.3%) and 2023 (7.4%), Las Vegas in 2024 (8.5%) and Kansas City in 2025 (7.4%). Martindale was Baltimore’s defensive coordinator from 2018 to 2021 and the Giants’ in 2022 and 2023: https://en.wikipedia.org/wiki/Don_Martindale . Flores was Miami’s head coach from 2019 to 2021 (see the note on team man shares).↩︎

  7. Super Bowl XLII (Feb. 3, 2008), Giants 17, Patriots 14, ending New England’s 18–0 season: https://en.wikipedia.org/wiki/Super_Bowl_XLII ; on how the Giants got there (five sacks and nine quarterback hits, with Spagnuolo estimating that he blitzed only about a third of the time): Patriots.com, “Pressure from Giants got to Pats” (Feb. 6, 2008): https://www.patriots.com/news/pressure-from-giants-got-to-pats-139781 ; Spagnuolo was the Giants’ defensive coordinator in 2007–2008 and has been the Chiefs’ since 2019: https://en.wikipedia.org/wiki/Steve_Spagnuolo . Cover 0 ranks are this book’s calculation from nflverse participation data (method in the note on man-coverage shares): Kansas City’s rank in Cover 0 share of charted dropbacks was 3, 2, 3, 3, 5, 2 and 1 from 2019 to 2025 (it was 4th in 2018, the year before Spagnuolo arrived).↩︎

  8. Same sources as the pass-interference note: the offense’s pass-interference restrictions run from the snap until the ball is touched, so a receiver blocking a defender downfield before the throw is a foul; see Contact Rules and Penalties. Eagles, “Football 101: Pass interference”: https://philadelphiaeagles.com/news/football-101-pass-interference-13667246↩︎

  9. Pro Football Hall of Fame, Darrelle Revis: https://profootballhof.com/players/darrelle-revis (Class of 2023, elected in his first year of eligibility); New York Jets, “Darrelle Revis, Pro Football Hall of Fame Class of 2023”: https://newyorkjets.com/news/darrelle-revis-pro-football-hall-of-fame-class-of-2023-jets . 2009 matchups: Dennis Waszak Jr., “Revis shut down his nerves — and then the NFL’s best wide receivers — on his way to the Hall of Fame,” Associated Press (July 30, 2023): https://www.ksat.com/sports/2023/07/31/revis-shut-down-his-nerves-and-then-the-nfls-best-wide-receivers-on-his-way-to-the-hall-of-fame/ (Moss, Chad Johnson [Ochocinco], Andre Johnson, Steve Smith, Owens, Wayne and Roddy White “all non-factors”); Ochocinco’s 0 catches in the Week 17 game, ending a 120-game streak: Ben Reiter, Sports Illustrated (Jan. 7, 2010): https://www.si.com/more-sports/2010/01/07/jets-bengals . The Jets allowed 236 points in 2009, fewest in the NFL: https://en.wikipedia.org/wiki/2009_New_York_Jets_season↩︎

  10. Jeff Legwold, “Will Broncos’ Pat Surtain II shadow top receivers in 2024?,” ESPN (Sept. 10, 2024): https://www.espn.com/nfl/story/_/id/41198764/denver-broncos-cornerback-pat-surtain-ii-cover-top-receivers-dk-metcalf (Surtain matched Metcalf on 24 of his 25 routes in Week 1, per Next Gen Stats). Surtain was the AP Defensive Player of the Year for 2024: https://www.cbsnews.com/colorado/news/associated-press-votes-denver-bronco-patrick-surtain-ii-nfl-top-cornerback↩︎

  11. Sheil Kapadia, “Richard Sherman in the spotlight vs. Julio Jones, Falcons,” ESPN (Jan. 10, 2017): https://www.espn.com/blog/seattle-seahawks/post/_/id/24142/richard-sherman-in-the-spotlight-vs-julio-jones-falcons (a preview of the January 2017 divisional playoff; in the Week 6 meeting, Oct. 16, 2016, Sherman lined up on Jones’s side on 30 of 46 coverage snaps). On Sherman’s usual alignment: NFL.com, “The defining stats from Richard Sherman’s career with Seahawks” (March 2018): https://www.nfl.com/news/the-defining-stats-from-richard-sherman-s-career-with-seahawks-0ap3000000920410 (“Sherman primarily lines up on the left side of the defense”). On Seattle’s Cover 3, with corners pressing a single receiver and bailing against two, and Sherman not travelling with the top receiver: Bucky Brooks, “Seattle Seahawks’ defense must adjust to vulnerabilities,” NFL.com (2015): https://www.nfl.com/news/seattle-seahawks-defense-must-adjust-to-vulnerabilities-0ap3000000561985↩︎

  12. This book’s calculation from nflverse load_participation() joined to play-by-play: regular-season dropbacks (2018–2025) with a charted defense_coverage_type; BLOWN, COMBO and PREVENT excluded; man = COVER_0, COVER_1 and 2_MAN (the same plays the data’s defense_man_zone_type marks as man). NGS supplies the labels for 2016–2022 (none for 2016–2017) and FTN from 2023, with different label sets. Man share by season: 35.2% (2018), 37.3%, 34.6%, 30.4%, 28.9% (2022), 43.8% (2023), 49.6% (2024), 31.1% (2025). Third-and-3 to 6 (with fourth downs): 59.2% (NGS era) and 60.1% (FTN era); first down 25.5% and 35.6%; third-and-11+ 20.9% and 26.0%. Inside the 5: man 87.8% / 77.6%, Cover 0 61.5% / 41.4%. Reproduce with the code behind the figures; small differences from published figures come from the filters.↩︎

  13. This book’s calculation from nflverse participation data (method in the note on man-coverage shares): charted Cover 0 dropbacks inside the 5 had five or more pass rushers on 59.2% of plays in 2018–2022 (NGS) and 69.7% in 2023–2025 (FTN); the median was five rushers in both eras.↩︎

  14. This book’s calculation from nflverse participation data, man share of charted regular-season dropbacks by defense: New England first in 2018 (60.8%) and 2019 (67.6%); Miami first in 2020 (54.0%) and 2021 (48.2%); Denver first in 2024 (63.5%) and 2025 (45.1%). Ranks are within each season, so they are not affected by the 2022/2023 change of charting source. Flores was a Patriots assistant from 2004 to 2018 and Miami’s head coach 2019–2021: https://en.wikipedia.org/wiki/Brian_Flores . Vance Joseph has been Denver’s defensive coordinator since 2023: https://en.wikipedia.org/wiki/Vance_Joseph↩︎

  15. Tom E. Curran, “They called it the ‘Ty Law Rule’ … and that was OK with him,” NBC Sports Boston: https://www.nbcsportsboston.com/nfl/new-england-patriots/they-called-it-the-ty-law-rule-and-that-was-ok-with-him/393549/ (the three interceptions, “This was probably the most simple game plan we had. Just beat them up,” and the Competition Committee’s 2004 crackdown, with Colts president Bill Polian and coach Tony Dungy on the committee side); Patriots Hall of Fame biography of Ty Law: https://www.patriotshalloffame.com/hall_of_famer/ty-law/ . The game was played on Jan. 18, 2004, at Gillette Stadium; final score 24–14: https://accesswdun.com/print/2004/1/165463↩︎

  16. Patriots.com, “Stephon Gilmore named Associated Press 2019 NFL Defensive Player of the Year” (Feb. 1, 2020): https://www.patriots.com/news/stephon-gilmore-named-associated-press-2019-nfl-defensive-player-of-the-year (No. 1 in total defense, 275.9 yards per game, and points allowed, 14.1 per game; six interceptions, tied for the league lead; 20 passes defensed); CBS Sports, “NFL Honors: Patriots’ Stephon Gilmore wins Defensive Player of the Year”: https://www.cbssports.com/nfl/news/nfl-honors-patriots-stephon-gilmore-wins-defensive-player-of-the-year-for-standout-2019-season (two interceptions returned for touchdowns; first Patriot to win the award).↩︎

  17. Barry Petchesky, “The Chiefs Defense Unleashed Hell,” Defector (Feb. 12, 2024): https://defector.com/the-chiefs-defense-unleashed-hell (six rushers, Jones unblocked, Bolton’s quote); CBS Sports (Feb. 12, 2024), quoting Purdy via KNBR (“They brought Zero, and I was trying to get the ball to JJ”): https://www.cbssports.com/nfl/news/2024-super-bowl-49ers-brock-purdy-reflects-on-falling-in-ot-to-chiefs-shares-which-part-of-loss-hurt-most ; Nick Shook, NFL.com (Feb. 12, 2024): https://www.nfl.com/news/chiefs-defense-follows-survive-then-thrive-motto-to-earn-super-bowl-lviii-victory-over-49ers (Jones’s pressure on third-and-4 from the Kansas City 9). Final score Chiefs 25, 49ers 22 (OT).↩︎

  18. Associated Press, “AP source: Jets fire Gregg Williams after call costs 1st win” (Dec. 7, 2020): https://www.news4jax.com/sports/2020/12/07/ap-source-jets-fire-gregg-williams-after-call-costs-1st-win/ (Carr’s 46-yard touchdown pass to Ruggs, in Cover 0 man coverage against rookie cornerback Lamar Jackson, with 5 seconds left; Raiders 31, Jets 28; the game was Sunday, Dec. 6, 2020).↩︎