🐙 Check out Postmark's new MCP Server!
x
How a dev built an email-controlled Game Boy Emulator with Postmark. | Postmark

How a developer built an email-controlled Game Boy emulator with Postmark (because why not?)

Meet Rens Wolters from PartyRens, who decided that controlling a Game Boy Advance emulator through email wasn't just possible but absolutely necessary. PostmarkGBA is what happens when a developer's weekend project meets genuine ingenuity, and we had to know more.

We caught up with Rens to understand how this beautiful chaos came to life.

 

How the heck did you come up with the idea to control Pokémon via email?! #

When I first saw it, the idea was always to make a game. The problem with making a game however, is that the challenge actually becomes making a "mail based game engine". And to demo it you have to build an entire fun, memorable game on top of that. So when discussing with co-workers, we quickly decided it was better to take an existing game and support that.

Then there's the more traditional games like chess, but that's not really memorable. At some point someone joked "but can it run Doom?", and because Pokémon has the "Twitch Plays" community, I knew that was possible. That's how we got to Pokémon.

However, even though Pokémon was always the intention, the emulator can run any GBA game. You can even modify buttons to emulate other platforms as well. Anything RetroPie runs should work, although playing Super Mario would be quite difficult. You could try Yu-gi-oh, though.

What was the trickiest part of making this work, and how did you solve it? #

I actually got the whole thing working on Windows in a few hours, but deploying it on my Raspberry Pi gave me a lot of issues. First, my RetroPie installation used an outdated Node version which was impossible to upgrade, so I had to reinstall the whole thing to even be compatible.

Then, I had problems finding the correct screenshot library. It took me the entire night to get the correct combination of node libraries, server config and actual code to get anything that's not just a black screen. When I finally got there, I found out it didn't work with my RetroPie setup and I had to start over.

I actually solved this by skipping it and focusing on keyboard input first. When working on that, I had to update keybindings in the RetroArch config when I noticed the hotkeys for screenshots. So that's what I ended up doing, making a screenshot is actually just done by pressing two buttons and moving the screenshot to the web server. I guess sometimes the best way to deal with something is to let it be for a while and come back with fresh ideas.

Did you discover anything unexpected about Postmark's Inbound processing feature while building this? #

At work, I wasn't the one who implemented our Postmark integration, and because we don't use the Pro package I didn't even know it was a feature. So it was totally new for me, but the documentation was really easy. You basically only have to build an API route with a specific request body and you can do whatever you want.

During development, I did notice some things that actually steered the design. At first I had two API routes, but I only had 1 input stream. So I had to combine the two routes, which started the rule of "always accept the incoming email". This was further enforced by errors. At first, I was rather strict on input validation, but that quickly resulted in Postmark retrying the call. When you think about it, you want the user to always get feedback, even if they didn't do it right. This way, they know they can interact with the system, and you can provide help on how they can interact correctly. So I switched to being much more lenient on inputs, catching all exceptions and always replying to the user. I added some confirmation that they had pressed buttons, but accepting every input as valid really got the experience on the right track.

So, to sort of summarize some tips: Catch all errors and always send a response, even if the input was incorrect. In my case I was able to respond using email, so I could even add a small F.A.Q. section to help even more.

What's your advice for other developers who want to push the boundaries of what's "normal"? #

It may be a bit cliché, but just have fun.

If the goal is to make anything fun, efficient, profitable, etc., you will probably fail 99 out of 100 times. I'm no different. But as long as you have fun, that doesn't matter. If you're struggling with this, think about what got you into development in the first place. Find what's fun for you, and do that. As long as you're having fun, there's no such thing as failure.

These goofy projects are my favorite because I can just build whatever I want, show it to people, and just have a laugh over it. This project especially was really fun, because some of my friends were actually playing this a lot. They were chatting with each other about what to do, sharing walkthroughs and maps to make it more efficient, and giving me feedback about how to improve the experience. I think that's what I'll remember the most about this whole challenge.

This is the actual setup that’s been running in my home office 24/7 for over a month.

The Beautiful Chaos of Email Gaming #

PostmarkGBA has been running 24/7 in Rens' home office for over a month now, and it's accidentally become a social experience. Friends collaborate on strategies, share walkthroughs, and provide feedback - all through the humble medium of email. 

The project perfectly captures the spirit of creative development: sometimes the best innovations come from asking "what if?" instead of "should I?" It's a reminder that the most memorable projects often emerge from developers who aren't afraid to be a little ridiculous and follow their curiosity wherever it leads.

Plus, it proves that Postmark's Inbound processing can handle pretty much anything you throw at it - even if what you're throwing is a request to make Pikachu use Thunder Shock.

Built something cool with Postmark lately? Tell us about it

Postmark team

Postmark team

Hi, we’re the humans behind Postmark! When you see this signature, you’ll know the piece was written collaboratively by our remote-first team distributed across the globe.