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.