One of the issues with callback based programming is the need to coordinate mutable state among multiple callback handlers. Clojure's core.async provides a way to write code in a more sequential style that helps make the interaction between multiple events clearer. This talk will briefly describe Communicating Sequential Processes (the theoretical foundation on which core.async and other languages such as go and occam are based) before giving an overview of core.async itself.