I find that looking at the project.clj for most of these projects is a good first step in getting a good idea of the core libraries these projects are relying on. Mostly if one of the more popular and heavily used open source libraries, like Compojure for example, are using certain base libraries, like Ring in the case of Compojure, I can then focus on how those base libraries are being leveraged. This is how I got a good idea of how Ring middleware works and that helped me understand Noir worked and allowed me to also understand how one could substitute something like Grizzly for Jetty or how to implement something like OAuth 2 using just middleware.