For every main target there is a VM running, either via kvm or VirtualBox or what ever turns out to be. Those are always running and they have node software installed which listen to commands from the master. In theory those nodes do not have to be on the same machine, but for security reasons I strongly suggest they are. Also, they should only be available via an internal dummy network interface, to avoid intrusion. A node is a simple XMLRPC server, listening on a certain port for commands. The commands are dictated by the master, down to a very low level of what to execute exactly. This to allow maximal flexibility and extension without modifying the node directly. The master itself is a stripped down Django Application (with no website attached to it; Django is only used for the easy database structure). It has a XMLRPC server which allows communication with the outside world. To command the master there is a CLI application, a Django Application as webpage, and an IRC plugin. The CLI application allows triggering compiles, request status and so on. The Django Application presents the user a webpage which gives overview of past and future compiles. Also it allows admins to configure everything, down to the microlevel. The IRC plugin only allows simplistic things, like: request a compile, request last error, ... The master also communicates with an external XMLRPC server to indicate progress and failures. This XMLRPC server is part of the current DorpsGek code, which allows the master to talk back on IRC. Configuration works in this order: 1) Node configuration. Where a node is, what OS it has, extra information, and what targets it supplies. 2) Target configuration. For every target how it should be compiled. Here we assume that every Node which offers the same target, uses the same way to compile that target. This assures us that it doesn't matter on which Node a target is compiled, as they should all be equal. 3) Project configuration. Name of project, base URL, admins, ... 4) Subproject configuration. VCS url, period of compiling, targets, ... Only subprojects can be triggered to do a compile. They send a signal to all targets and start the compile there. What should be compiled is packed in a single file and send to all the nodes which need it. This to avoid any race-condition.