Succinct non-interactive proof systems, also called SNARKs, have emerged as an extremely versatile tool that is used in many areas of computing, including blockchains, data provenance, and machine learning. This course provides an in-depth coverage of how SNARKs work and how to use them in practice. We will cover the beautiful ideas used to construct SNARKs, along with a programming project that will teach students how to use the latest SNARK tools. The course assumes no prior knowledge of zero-knowledge proof systems, but does require an understanding of the basics of cryptography, as covered in CS255 or equivalent.