This could maybe eventually go to https://github.com/hatton/NetSparkle. My hesitation is that it's kind of specific to our way of using TeamCity and our build scripts There are two levels of indirection here to give us maximum forward compatibility and control over what upgrades happen in what channels. First, we go use a url based on our channel ("http://bloomlibrary.org/channels/UpgradeTable{channel}.txt) to download a file. Then, in that file, we search for a row that matches our version number to decide which upgrades folder to use.