  We introduce a flexible and graphically intuitive framework that constructs
complex quantum error correction codes from simple codes or states,
generalizing code concatenation. More specifically, we represent the complex
code constructions as tensor networks built from the tensors of simple codes or
states in a modular fashion. Using a set of local moves known as operator
pushing, one can derive properties of the more complex codes, such as
transversal non-Clifford gates, by tracing the flow of operators in the
network. The framework endows a network geometry to any code it builds and is
valid for constructing stabilizer codes as well as non-stabilizer codes over
qubits and qudits. For a contractible tensor network, the sequence of
contractions also constructs a decoding/encoding circuit. To highlight the
framework's range of capabilities and to provide a tutorial, we lay out some
examples where we glue together simple stabilizer codes to construct
non-trivial codes. These examples include the toric code and its variants, a
holographic code with transversal non-Clifford operators, a 3d stabilizer code,
and other stabilizer codes with interesting properties. Surprisingly, we find
that the surface code is equivalent to the 2d Bacon-Shor code after "dualizing"
its tensor network encoding map.
