[HN Gopher] Show HN: I made a Doom-like game fit inside a QR code
       ___________________________________________________________________
        
       Show HN: I made a Doom-like game fit inside a QR code
        
       Author : kuberwastaken
       Score  : 282 points
       Date   : 2025-04-18 16:40 UTC (6 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | kuberwastaken wrote:
       | I sometimes pick up random projects just because I can, this was
       | one of those times. I made it as a week long project a while back
       | this year but never shared here, so thought to go for it haha.
       | 
       | I created a game inspired by Doom and the backrooms called The
       | Backdooms under 2.4kb in minified html. (for reference, this
       | entire post would be around 1.8kB haha) I had to use a not
       | popular way of using GZip with Zlib headers (had to write my own
       | script for compressing it, also in the repo) to eventually
       | convert it a size 40 QR code that works right in your browser
       | using Decompressionstream API.
       | 
       | This is of course a very oversimplified description of it, using
       | a lot of the same technologies that DOOM had but combining it
       | with infinite seed based map generation in 2.4kb (QR codes can
       | only store 3kb, which includes changing formats) was pretty hard.
       | 
       | Here are some links about it if you want to nerd out and read
       | more:
       | 
       | Repository Link (MIT License):
       | https://github.com/Kuberwastaken/backdooms
       | 
       | A Hosted (slightly improved) version of The Backdooms:
       | https://kuberwastaken.github.io/backdooms/
       | 
       | Game Trailer: https://www.youtube.com/shorts/QWPr10cAuGc
       | 
       | My Linkedin post about it:
       | https://www.linkedin.com/feed/update/urn:li:activity:7295667...
       | 
       | (PS: You'd need something like https://qrscanner.org/ or
       | something that can scan bigger QR codes and put the text data
       | onto your browser to play it)
       | 
       | My Blogs documenting the process and development in detail:
       | 
       | https://kuberwastaken.github.io/blog/Projects/How-I-Managed-...
       | https://kuberwastaken.github.io/blog/Projects/How-I-Managed-...
        
         | x3n0ph3n3 wrote:
         | I think your trailer video link is bad.
        
           | croisillon wrote:
           | correct link: https://www.youtube.com/shorts/QWPr10cAuGc
        
           | kuberwastaken wrote:
           | Fixed it! My bad haha
        
         | r1chardnl wrote:
         | Your game trailer links to a short called "Fly me to the moon -
         | 19 September 2024". I think this is a mistake?
        
           | kuberwastaken wrote:
           | Should be fixed, sorry haha
        
             | dylan604 wrote:
             | Never gonna give you up lives on in new ways
        
         | sangeeth96 wrote:
         | TIL DecompressionStream, thanks. I managed to shave some more
         | bytes by trimming the HTML bits, raised a PR in case you're
         | interested.
        
           | kuberwastaken wrote:
           | YOU'RE A LEGEND! I just managed to ADD (somewhat of)
           | TOUCHSCREEN SUPPORT, better movement, enemy spawning and
           | damage mechanisms in the space that freed up because of this!
           | Genuinely, thank you, made my month :)
        
             | sangeeth96 wrote:
             | Damn, that's awesome! Glad that was a help :D
        
             | collingreen wrote:
             | Open source victory right here
        
               | kuberwastaken wrote:
               | Absolutely!
        
       | jasonjmcghee wrote:
       | You should update the css for the canvas to be `image-rendering:
       | pixelated` so things look crisp rather than blurry!
        
         | kuberwastaken wrote:
         | I tried that but this just looks more fun and retro haha
        
       | the_arun wrote:
       | My iPhone camera says - "No Usable Data found" when I scan the QR
       | code.
       | 
       | On a different context, loading a game in QR code also made me to
       | think, can anyone inject a malware script using QR codes?
        
         | KeplerBoy wrote:
         | Sure if the parser is broken anything might happen.
         | 
         | Historically there have been exploits for Sony's PSP using
         | modified .tiff images or an exploit for the Nintendo 3DS where
         | a modified .m4a file could be used.
        
         | kuberwastaken wrote:
         | You'd need something like https://qrscanner.org/ because most
         | phones suck at scanning larger QR codes.
         | 
         | Also, it won't work on your phone, can't put in that
         | compatibility with size restraints, sadly
        
         | conradev wrote:
         | I got it to work with a shortcut:
         | https://www.icloud.com/shortcuts/d4793e08d64d4ff1b7ea725b944...
        
           | kuberwastaken wrote:
           | That is seriously cool, didn't know those could do that haha
        
           | ustad wrote:
           | Whats that doing? I get some error about some gallery???
        
       | giarc wrote:
       | I scanned on an iPhone using native QR code scanner and it says
       | "no usable data found".
        
         | kuberwastaken wrote:
         | Hey thanks for checking it out! You'd need something like
         | https://qrscanner.org/ because most phones suck at scanning
         | larger QR codes.
         | 
         | Also, it won't work on your phone, can't put in that
         | compatibility with size restraints, sadly.
        
           | iainmerrick wrote:
           | You mean the game doesn't work on mobile at all?
           | 
           | What kind of device do you use to scan the QR code, then?
        
             | lelandbatey wrote:
             | You do not need to scan a QR code via a physical camera in
             | your hand directly; any general purpose computer can run a
             | QR code parsing program which accepts arbitrary images as
             | input. It's so easy to do that there exist web pages which
             | implement said QR code scanning in JS. Thus, the parent
             | poster has recommended that you save the QR code .png file
             | to your disk and then use such a piece of software, such as
             | the website they linked, to extract the data encoded in
             | that QR code.
             | 
             | That is how you can use nearly any general-purpose computer
             | to scan a QR code.
        
               | kuberwastaken wrote:
               | Indeed! Thank you for explaining this in a way better way
               | :)
        
               | iainmerrick wrote:
               | Or... use a URL.
               | 
               | I'm sure the number of people who've ever scanned a QR
               | code on a desktop computer is more than zero, but not
               | much more.
        
               | kuberwastaken wrote:
               | I think I myself brought that number into early triple
               | digits, but I do also have a hosted version if you're
               | interested!
               | 
               | The reason for doing this project isn't practicality,
               | it's because I can
        
             | kuberwastaken wrote:
             | Nope it doesn't, you can use any QR code scanner that takes
             | image input! I would've loved to include smartphone
             | controls but that would take a LOT of extra bandwidth.
        
             | kuberwastaken wrote:
             | Hey just wanted to update, I Managed to add kind of some
             | mobile touch support here, so if you get an alternate
             | chromium based browser, you can put in the URI to play on
             | mobile too!
        
               | iainmerrick wrote:
               | Nice one!
        
           | ascorbic wrote:
           | fwiw, it works fine with the Pixel's built-in QR code
           | scanner. It recognises it as text, not a URL, but it can copy
           | to clipboard and then pasting in the browser works. Obviously
           | I then die immediately because none of the controls work, but
           | you can't have everything.
        
             | kuberwastaken wrote:
             | Hey just wanted to update, crazy timing but I Managed to
             | add kind of some mobile touch support here because of a
             | recent PR to FURTHER optimize it (crazy), so you can
             | actually play it now if you figure out the controls lol
        
         | pudquick wrote:
         | data: URI URLs aren't supported in it, it has nothing to do
         | with the size / length of the QR code
         | 
         | For example, this self-contained webpage:
         | <html><body>Hi!</body></html>
         | 
         | encoded is:
         | data:text/html;base64,PGh0bWw+PGJvZHk+SGkhPC9ib2R5PjwvaHRtbD4=
         | 
         | If you paste that into a browser, it will render "Hi!". Very
         | short and easy.
         | 
         | But if you encode is as a QR code, it won't work in this
         | situation.
        
           | kuberwastaken wrote:
           | I think it's broken for safari but works on chromium based
           | browsers on mobile too. The QR code basically holds the URI
           | URL itself.
        
             | pudquick wrote:
             | I'm saying the primary gateway most iOS users are using for
             | loading a QR code - the camera app - will not present a
             | transition to load your URL in this situation
             | 
             | Whether the resulting HTML game is playable in Safari is a
             | different discussion.
             | 
             | The QR code, as generated, is effectively "not clickable"
             | for most iOS users, unless they are using something other
             | than the most common way to read QR codes on their phone
             | like a 3rd party QR code reading app or similar.
        
               | kuberwastaken wrote:
               | That I agree, yes haha
        
           | myfonj wrote:
           | You don't even need the base64 encoding for dataURIs: just
           | throw the text payload after mime-type and a comma:
           | data:text/html,<!doctype html><title>Hi!</title><p>Hello.
           | 
           | This is also a valid self-contained HTML document. You have
           | to add `;charset=utf-8`, if you need to go beyond ASCII, and
           | for some browsers watch for URI-encoding of some
           | syntactically significant characters (like `#` and `%`, `?`).
           | 
           | Base64 is indeed good to be "safe" and/or somewhat 'conceal'
           | the payload, but it also makes it larger by 1/3 (every three
           | bytes of input become four characters of the base64 output).
           | So taking the risk some devices would not like raw "ASCII
           | dataURI", the QR of the backrooms QR could shave off 738
           | bytes.
           | 
           | BTW, this is my "HTML sandbox" for testing stuff in a
           | browsers that I summon daily through keyword bookmark to test
           | simple stuff:
           | data:text/html;charset=utf-8;verbatim,<!doctype html><html
           | style="color-scheme:dark light"><title>HTML sandbox
           | 2.0.6</title><meta name=viewport content=width=device-
           | width,initial-scale=1><body
           | style=margin:0;display:flex;height:100vh onload="OT=(DC=docum
           | ent).title,H=(L=location).hash.slice(1)||'',RX=/(^data:.+?(;v
           | erbatim)?,)?([^]*)/,A.value=H.match(RX)[2]?H:decodeURICompone
           | nt(H)||A.value;T=W=0;E=RegExp('^'+(D='data:text/html;charset=
           | utf-8,'));F=()=>{if(W!=(V=A.value))W=V,M=V.match(RX),I.src=M[
           | 2]?V:(M[1]||D)+encodeURIComponent(M[3]),DC.title=NT=((TM=V.ma
           | tch(/<title\b[^]*?\x3E([^]*?)<\/title\b/m))&&(NT=TM[1])&&(NT=
           | NT.trim())&&(DC.title=NT+' @ '+OT))||OT};F()"><textarea
           | autocapitalize=off style=resize:horizontal;width:50vw
           | autofocus id=A onkeyup=clearTimeout(T);T=setTimeout(F,400) on
           | blur=try{history.pushState({},NT,'\u0023'+(S=I.src.replace(E,
           | '')))}catch(e){L.hash=S}><!doctype html><html lang="en"
           | style="color-scheme: dark light;">%0A<meta name="viewport"
           | content="width=device-width, initial-scale=1">%0A<title>%0A%0
           | A</title>%0A<style>%0A%0A</style>%0A<body>%0A%s%0A<script>%0A
           | %0A</script>%0A</textarea><iframe style=border:0;flex-
           | grow:1;width:0 id=I>
        
         | Jerry2 wrote:
         | I'm kinda relieved that it doesn't work on an iPhone. I often
         | scan codes posted around to save the time typing URLs and
         | running arbitrary code by just scanning a QR code freaks me
         | out.
        
           | kuberwastaken wrote:
           | Ironically, I actually wrote a blog about how casually we do
           | this and how dangerous it's become lol
           | https://kuberwastaken.github.io/blog/Technology/QR-Codes-
           | and...
        
           | Blikkentrekker wrote:
           | It runs inside a web browser though. This is no different
           | from visiting an arbitrary link and running whatever
           | arbitrary code in the Javascript sandbox of that link and one
           | already knows a q.r. code an take one to an arbitrary link.
        
             | dylan604 wrote:
             | This QR code does. But what about a QR using similar
             | designed by someone less honorable? With QR codes, you have
             | no idea what will happen until you scan it. At that point,
             | it could be too late
        
           | recursive wrote:
           | Wait until you hear about javascript on web sites.
        
       | deadbabe wrote:
       | How can there not be even one screenshot of the game in the
       | readme?
        
         | kuberwastaken wrote:
         | Because it kept evolving and it was more related to the
         | development than the game itself.
         | 
         | But if you want to skip the friction of scanning the QR code,
         | you can directly play a hosted version at:
         | https://kuberwastaken.github.io/backdooms/
        
           | ant6n wrote:
           | Doesnt work on iOS (ipad). A screenshot would be nice.
        
             | kuberwastaken wrote:
             | Yeah, touch devices suck with it but here's the trailer
             | with some gameplay if you really wanna see how it is:
             | https://www.youtube.com/shorts/QWPr10cAuGc
        
             | kuberwastaken wrote:
             | Hey just wanted to update, I Managed to add kind of some
             | mobile touch support here, so if you get an alternate
             | chromium based browser, you can put in the URI to play on
             | mobile too!
        
           | deadbabe wrote:
           | It doesn't work, but I don't really care to play I just want
           | to see the screenshots of what you made.
        
         | kuberwastaken wrote:
         | Heyo, update: I added a GIF to the repo, hope it's better :)
        
       | jerjerjer wrote:
       | Year 3567: automatic interstellar probe finds remnants a
       | technical alien civilization.
       | 
       | Year 3678, Show HN: I compiled DOOM for an alien CPU
       | architecture.
       | 
       | Vernor Vinge kind of touches this topic a bit in his Zones of
       | Thought series.
        
         | kuberwastaken wrote:
         | Haha I solemnly promise that I'll compile DOOM for an alien CPU
         | architecture if we ever get access to one!
        
         | leni536 wrote:
         | How fitting
         | 
         | https://www.smbc-comics.com/comic/2011-02-17
        
         | flkenosad wrote:
         | How could one theoretically reverse-engineer a CPU?
        
           | flkenosad wrote:
           | With an electron microscope possibly.
        
       | Lerc wrote:
       | I don't want to take away from the achievement because it really
       | is awesome, and should be celebrated.
       | 
       | ...but...
       | 
       | It seems like a fundamental design issue to make a QR code game
       | that isn't designed for the platform where QR codes are most
       | used.
        
         | kuberwastaken wrote:
         | Totally understandable, I can make a snake game inside it fully
         | compatible with mobile but mobile controls just take up a lot
         | of space due to the sheer nature of them haha.
         | 
         | But the compression algorithm is up, feel free to make what you
         | think is awesome and compatible, I'd love to see if you find
         | out hacky solutions to make that work too :P
        
           | Lerc wrote:
           | I might just do something like that. Although I inevitably
           | get caught up in designing some minor tech part.
           | 
           | Last time I attempted something like that I made stack
           | machine texture maker, then embedded it inside a version of
           | TTT that minifies+gzips to under 1500bytes. After a few years
           | of pondering I think there are a few more enhancements to be
           | had.
           | 
           | For reference, This URL has a bunch of textures in it.
           | 
           | https://fingswotidun.com/ttt/#W1s2NCw2NCwxMzExOV0sWzY0LDY0LD.
           | ..
        
         | kuberwastaken wrote:
         | Hey just wanted to update, I Managed to add kind of some mobile
         | touch support here thanks to an awesome PR to further reduce
         | the size, so if you get a chromium based browser, you can put
         | in the URI to play on mobile too!
        
       | EGreg wrote:
       | Reminds me of my submission to Allegro SizeHack 25 years ago, in
       | 2000:
       | 
       | https://www.oocities.org/trentgamblin/sizehack/entries.html#...
       | 
       | I made a PacMan-like game in under 10KB... it was called HackMan
       | :)
       | 
       | But I am most proud of the storyline that came with it!
        
         | kuberwastaken wrote:
         | That is SO cool!
        
       | rezmason wrote:
       | Keep making cool things, kuberwastaken
        
         | kuberwastaken wrote:
         | Will try my best! Thank you :)
        
       | bhavik_dand wrote:
       | crazy stuff!!
        
         | kuberwastaken wrote:
         | Thank you so much!
        
       | kuberwastaken wrote:
       | Update: Managed to add kind of some mobile touch support
       | (literally insane) because of a PR by @sangeeth96 on the repo
        
       | smusamashah wrote:
       | Please add a few screenshots to the repo. I am on phone and for
       | whatever reason all I could see was 3 buttons and black screen.
       | 
       | Edit: Add a gif instead, you won't have to rely on YouTube with
       | that.
        
         | kuberwastaken wrote:
         | Alright! First thing tomorrow :)
         | 
         | Also pushed a commit to hopefully fix the blank screen issue
         | for phones!
        
           | xandrius wrote:
           | Still black screen on Firefox mobile.
        
             | notnmeyer wrote:
             | ios? same thing on safari, and probably every ios browser
        
             | kuberwastaken wrote:
             | Sorry, should be completely fixed now, with a neat little
             | joystick (I presume you're speaking of the hosted verison)
        
         | kuberwastaken wrote:
         | Update: Added a GIF!
        
       | metalman wrote:
       | I am now waiting for news that someone has bio hacked a cockroach
       | or a fruitfly to play doom, if not autonomously then for the full
       | cold shivers, they are now robotisising insects, which could then
       | be accesed through an interface to play doom on a toothbrush
       | booted from a qr code. Sci-fi is lagging
        
         | kuberwastaken wrote:
         | One day indeed
        
       | Bengalilol wrote:
       | Great crazy thing! I am waiting for the addition of "self
       | contained QR code" to canitrundoom (although I don't know if it
       | can be technically approved).
       | 
       | Yet... that game will now make me think twice before scanning any
       | QR ^^
        
         | kuberwastaken wrote:
         | Haha fingers crossed but hopefully we do make it there.
         | 
         | And yup! It's pretty insane how much you can do with QR codes,
         | wrote about it here if you're interested in reading more :P
         | https://kuberwastaken.github.io/blog/Technology/QR-Codes-and...
        
       | Mainan_Tagonist wrote:
       | After several tries, i managed to play it, sort of, on Brave on
       | my Samsung S9.
       | 
       | Very impressive compression trick, as a proof of concept, it is
       | worthy of praise, congrats.
       | 
       | I imagine this approach could be used for much more practical
       | uses.
        
         | dylan604 wrote:
         | Or much more malevolent as well. Just because something novel
         | and fun/entertaining can be done does not mean assholes will
         | not use the same techniques for their gain.
         | 
         | PoCs like this are neat and definitely shows some skillz by the
         | author, but now I'm hoping security types take a look at this
         | to see how vulnerable this could be from asshats.
        
           | autoexec wrote:
           | It's already a good practice not to go around scanning random
           | QR codes. Nobody has to go through the trouble of compressing
           | a bunch of code to run in your browser when you can just make
           | a QR code point to any malicious domain on the internet and
           | infect devices all day long.
        
         | kuberwastaken wrote:
         | Thank you so much haha and yes! It indeed can, I always also
         | like the idea of having QR code game cartridges of sorts haha
         | 
         | (PS I updated the hosted version again and it's much better for
         | mobile controls, try it out if you get the time!)
        
       | askvictor wrote:
       | Firefox mobile on Android gives "Cannot complete request;
       | Additional information about this problem or error is currently
       | unavailable" :(
        
         | kuberwastaken wrote:
         | Interesting, perhaps try a different browser?
        
       | Barrin92 wrote:
       | Love these minimal game projects. Reminds me of .kkrieger
       | 
       | https://en.wikipedia.org/wiki/.kkrieger
        
         | kuberwastaken wrote:
         | Yess!! Someone told me about it when I posted it on LinkedIn,
         | so cool!
        
       | redbell wrote:
       | Really cool project! TIL about 'data:' URLs--while I was familiar
       | with the 'data:' URI scheme and had used it before, I didn't
       | realize it could be used as a full URL. Funny enough, I had been
       | thinking about building something similar that fits entirely
       | within a QR code, but I held off because I mistakenly thought it
       | would require an HTTP(s) link. I was heavily inspired by this
       | work: Can you fit a whole game into a QR
       | code?(https://www.youtube.com/watch?v=ExwqNreocpg)
        
         | kuberwastaken wrote:
         | Thank you for your kind words! I was also inspired by this
         | video back in lockdown, I believe, super cool but I went the
         | opposite route for browser based because of more compatibility.
         | 
         | I have them credited in the repo as well :P
        
       | frellus wrote:
       | This stuff is starting to feel closer to Snow Crash than I'm
       | comfortable with, when I saw that QR code I wondered if my brain
       | was being altered :-D Amazing work.
        
         | kuberwastaken wrote:
         | Hahaha Thank you so much!
        
       | bananaboy wrote:
       | Very cool! Minor nitpick though: DOOM didn't use raycasting. This
       | really a Wolfenstein 3D-like, since Wolf3D did use ray casting.
        
       ___________________________________________________________________
       (page generated 2025-04-18 23:00 UTC)