A method for offloading execution load from a resource-constrained device (110, 210) to allow the device to run a resource-intensive software program, the method comprising: accessing the resource-intensive software program using a first resource-constrained device (110, 210); executing the resource-intensive software program using the first resource-constrained device (110, 210) until the execution exceeds the resources of the first resource-constrained device (110, 210), wherein executing the resource-intensive software program comprises determining whether execution of the resource-intensive software program will exceed resources of the first resource-constrained device (110, 210) using a resource monitor; determining a load split for the resource-intensive software program to split the resource-intensive software program into a first portion and a second portion (301a, 301b); offloading the second portion of the resource-intensive software program to a second device (120, 220) while retaining the first portion of the resource-intensive software program on the first resource-constrained device (110, 210), wherein the second device (120, 220) is a more capable computing device than the first resource-constrained device (110, 210) and is distinct from the first resource-constrained device (110, 210); and providing the program functionality using the first resource-constrained device (110, 210), wherein the functionality is provided by the first portion and the second portion (301 b) executing cooperatively over a network connection between the first resource-constrained device (110, 210) and the second device (120, 220), wherein the offloading of the second portion of the resource-intensive software program comprises an execution offloading of the resource-intensive software program to the second device (120, 220), wherein the offloading is obtained by transferring the second portion (301 b) to the second device (120, 220) via a network communication link, further comprising performing a re-balancing step, wherein load is transferred back to the first resource-constrained device when the execution load of the software program decreases or the second device is overloaded. accessing the resource-intensive software program using a first resource-constrained device (110, 210); executing the resource-intensive software program using the first resource-constrained device (110, 210) until the execution exceeds the resources of the first resource-constrained device (110, 210), wherein executing the resource-intensive software program comprises determining whether execution of the resource-intensive software program will exceed resources of the first resource-constrained device (110, 210) using a resource monitor; determining a load split for the resource-intensive software program to split the resource-intensive software program into a first portion and a second portion (301a, 301b); offloading the second portion of the resource-intensive software program to a second device (120, 220) while retaining the first portion of the resource-intensive software program on the first resource-constrained device (110, 210), wherein the second device (120, 220) is a more capable computing device than the first resource-constrained device (110, 210) and is distinct from the first resource-constrained device (110, 210); and providing the program functionality using the first resource-constrained device (110, 210), wherein the functionality is provided by the first portion and the second portion (301 b) executing cooperatively over a network connection between the first resource-constrained device (110, 210) and the second device (120, 220), wherein the offloading of the second portion of the resource-intensive software program comprises an execution offloading of the resource-intensive software program to the second device (120, 220), wherein the offloading is obtained by transferring the second portion (301 b) to the second device (120, 220) via a network communication link, further comprising performing a re-balancing step, wherein load is transferred back to the first resource-constrained device when the execution load of the software program decreases or the second device is overloaded.