Short answer: CSS codes, named for Calderbank, Shor and Steane, build quantum error-correcting codes from two classical linear codes, one protecting against bit flips and one against phase flips. The Steane code is the best-known example: it is a [[7,1,3]] code that encodes one logical qubit in seven physical qubits and corrects one error. This is textbook theory, and the materials are a 1996 paper, lecture notes and a tutorial.
Starting from the bit-flip and phase-flip problem
Lecture notes from a University of Maryland course start with the three-bit repetition code, which maps a superposition of 0 and 1 to the same amplitudes on 000 and 111, with check operators Z1Z2 and Z2Z3. They explain that this code does poorly on phase errors, because a phase error changes the sign between the two code words but does not move the state out of the code space. Using the identity that a Hadamard conjugates Z into X, the notes rotate the code to protect against phase flips, but then bit flips act like phase flips. Shor's 1995 code, they say, protects against both by encoding against phase errors first and then protecting each of the three qubits against bit flips.
The CSS recipe
A tutorial from a 2024 quantum algorithms school says the CSS class gives a simple recipe for constructing quantum error-correcting codes from classical linear codes. In a linear [n,k] code, the code space is the kernel of a parity check matrix. Because quantum states must be protected from both Pauli-X and Pauli-Z errors, CSS codes combine two classical linear codes, whose parity check matrices define the X and Z stabilizers. Since stabilizers from the same matrix commute, the rows of the two matrices must also commute, which holds if the number of qubits touched by both types is even for every pair of stabilizers.
Steane's 1996 paper states the recipe in terms of two classical codes C1 and C2, where the dual of C2 is contained in C1, and uses it to obtain codes for up to 16 information qubits correcting small numbers of errors, tabulated in the paper. It then obtains more efficient codes by letting C1 have reduced distance and introducing sign changes among code words in a systematic way, leading to single-error-correcting codes for 3, 4 and 5 information qubits with block lengths of 8, 10 and 11 qubits. The paper notes that a computer search for sign allocations becomes too time consuming as parameters grow, so intelligent search is needed.
The Steane code
The tutorial says the Steane code, proposed by Andrew Steane in 1996, is a [[7,1,3]] stabilizer code: seven physical qubits encode one logical qubit, with code distance 3, so it corrects up to one error. It uses the same parity check matrix for both X and Z types, with three rows of weight four. The X stabilizer generators act as X on qubits 1-2-3-4, 2-3-5-6 and 3-4-6-7, and the Z generators act as Z on the same sets of qubits.
What this does not tell you
These materials describe how the codes are built, not how they perform on hardware. They do not cover fault-tolerant circuits or thresholds, and the sign-change codes in Steane's paper are a separate refinement of the basic recipe.
FAQ
What is a CSS code?
A quantum code made from two classical linear codes, one for each kind of Pauli error.
What is the Steane code?
A [[7,1,3]] CSS code encoding one logical qubit in seven physical qubits, correcting one error.
Why not just use the repetition code?
The lecture notes show the three-qubit repetition code does not protect against phase errors.
What condition makes the construction work?
The X and Z stabilizers must commute, which the tutorial says holds when each pair overlaps on an even number of qubits.
Did Steane's paper go beyond the basic recipe?
Yes. It describes codes with sign changes, giving single-error-correcting codes with block lengths 8, 10 and 11 for 3, 4 and 5 information qubits.
All field notes