Agile approaches are the most used development processes in a wide range of application domains. However, Agile was not designed to support the development of cyber-physical systems (CPS) since they often require not only traditional software development but also hardware and firmware co-development. This talk will present the challenges we face everyday developing a distributed IoT system with hundreds of devices in a Smart City application domain. The system is completely designed and developed internally including: a) custom circuit boards with dozen of components; b) the related firmware for managing the device, the connectivity, the sensors, etc.; c) and a cloud-based control and monitoring system. Agile approaches and open source tools help us in coordinating the development of all these sub-systems and release a working system to our customer allowing us to identify and address problems quickly.