This happens because of how the coding environment interacts with your hardware. Before you can use CircuitBlocks, your device needs to be equipped with MicroPython. MicroPython is a specialized Python interpreter for microcontrollers that acts as a live terminal.
When you create a program in CircuitBlocks and click run, the code is sent via USB and begins executing immediately on the device. However, this code is running in the device's active memory. If the device is reset by pressing the reset button or by turning it off and on again, the program is cleared from that temporary memory.
The MicroPython system on the device is designed to wait for the next command and does not automatically store the entire program on the device's permanent storage. This allows for a very fast and interactive "tinkering" experience, but it does mean that if you want to run your code again after a power cycle, you need to press run in CircuitBlocks once more.
So how do I keep my work?
Your sketch is saved in your CircuitBlocks account, not on the device. Your programs are never written to the device's own storage, so the way to keep one is to leave it saved in your account and press run again after each power cycle.
One thing this does change on the device. To use CircuitBlocks at all, it writes a MicroPython image over the software your device shipped with, so the device's own built-in features stay unavailable until you use Restore firmware at code.circuitmess.com to put them back. That is why a device that has been coded does nothing on its own after a power cycle. This applies to every device CircuitBlocks supports, not just some of them.