In this course, we explore the design of beautiful programs, and tools that can help people construct them. We study tools and guidelines for making programs literate—where code is interleaved with thoughtful explanations—and live—where the behavior of code is exposed. The foundation of the course is a history of live and literate programs, from visionary beginnings to contemporary, beautiful programs and tools for constructing them. We discuss what is known about the design of readable programs based on empirical evidence. We then critique the elements of live and literate programming tools, including: incrementality, reactivity, support for branching, program organization, collaboration, code generation, and the design of programming environments that edit themselves. As case studies, we consider the design of mathematical proofs in proof assistants, computational narratives in notebooks, interactive tutorials, and visionary program editors like Lightable and Eve.