Software wise I wrote my own from scratch. I program in C for work so I was ok with this bit. I also needed the custom handling for the space bar so it would act as a modifier. This worked out surprisingly easily, basically if you tap space quickly it'll register as a space, but only when the key is released. If you hold it and press another key it acts as a modifier.
Once I got all the letter and number keys modifying so I could get to all the keys of a normal keyboard I thought about what else I could use the space modification for. Looking at the punctuation keys to the right of the letters I realised they are quite far from the shift key so I made space act as a shift modifier for these. So space+ [ = {
Also I realised that open and close parenthesis are quite hard to get to, as you need shift + space + 2 to get (
So I used space + x = ( and space *c =) as x and c do not have mirrored letters they need to modify to.
This is the finished product, all works as expected, just have to get used to it now!
Note the slightly wonky Windows key because the keycap's not designed for it to be on the top row, but I think it's ok. And Tab became backspace, which modifies to tab if that makes sense!