Most of the hard work is done by the Butano engine: https://github.com/GValiente/butano I'm also using go to process the original assets and prerender the static part of the levels.
It runs on real hardware but you can (ironically) play it now in the browser thanks to EmulatorJS: https://nostabyte.itch.io/bloxorzgba
I might writeup a full tech breakdown of how it works at some point if anyone is interested.