A machine readable storage medium having instructions embodied thereon, the instructions being executed by one or more processors, comprising: providing, from a device configuration service (110, 210, 310, 410 510) that operates in a service provider environment (100, 200, 300, 400, 500), a list of hardware components (112, 242, 314) that are available when designing a device (130, 280, 330, 570); receiving a selection of hardware components from the list of hardware components; receiving a device capability definition (250, 312) that defines a use case for the device; mapping dependencies between a plurality of code modules (114, 244, 316, 440, 512) that are available when designing the device, in a dependency tree (248, 432); selecting code modules that depend on each other as indicated in the dependency tree; testing interfaces between the selected code modules that depend on each other as indicated in the dependency tree to ensure compatibility and usability between the dependent code modules; providing a list of code modules from the code modules that are compatible with each other and are compatible with selected hardware components, wherein each code module is linked to a corresponding hardware component; receiving a selection of code modules from the list of code modules, wherein the code modules enable the hardware components selected from the list of hardware components to operate in the device; providing the code modules for designing the device to a user computing device, wherein the user computing device generates a device image from the code modules and loads the device image onto the device; and installing the device image on the device. providing, from a device configuration service (110, 210, 310, 410 510) that operates in a service provider environment (100, 200, 300, 400, 500), a list of hardware components (112, 242, 314) that are available when designing a device (130, 280, 330, 570); receiving a selection of hardware components from the list of hardware components; receiving a device capability definition (250, 312) that defines a use case for the device; mapping dependencies between a plurality of code modules (114, 244, 316, 440, 512) that are available when designing the device, in a dependency tree (248, 432); selecting code modules that depend on each other as indicated in the dependency tree; testing interfaces between the selected code modules that depend on each other as indicated in the dependency tree to ensure compatibility and usability between the dependent code modules; providing a list of code modules from the code modules that are compatible with each other and are compatible with selected hardware components, wherein each code module is linked to a corresponding hardware component; receiving a selection of code modules from the list of code modules, wherein the code modules enable the hardware components selected from the list of hardware components to operate in the device; providing the code modules for designing the device to a user computing device, wherein the user computing device generates a device image from the code modules and loads the device image onto the device; and installing the device image on the device.