Also called: HeapTupleHeaderData, t_hoff, row header
In plain English
Every heap row begins with a fixed header (HeapTupleHeaderData) of about 23 bytes carrying the MVCC fields xmin/xmax, the row’s own location pointer (ctid), and flag words (t_infomask) recording things like “this row has NULLs” or “this row has variable-width columns”. t_hoff marks where the header (plus any NULL bitmap) ends and the column data begins.
Why it matters
The header is fixed per-row overhead, which is why very narrow tables still have a noticeable minimum row size. Its flag bits (HEAP_HASNULL, HEAP_HASVARWIDTH, HEAP_HASEXTERNAL) tell deforming whether to expect a NULL bitmap, padding, or TOAST pointers — driving how the rest of the row is read.