Development
Conception
The Backdooms began as an attempt to store a whole game in one QR code, not as a port of Doom. On 30 July 2020 the YouTuber MattKC published "Can you fit a whole game into a QR code?"[11] The page accompanying that video documents a Windows executable of Snake, reduced with the Crinkler linker from about 3.2 KB to about 1.4 KB inside a version-40 QR code, whose largest binary payload he gives as 2,953 bytes, plus a minified JavaScript Snake meant to show that a browser game could fit the same limit.[12] Kuber Mehta wrote on 13 February 2025 that he had seen the video a couple of years earlier and had taken it up only the week before; he wanted the game to be Doom, found no HTML version to adapt, and wrote a lookalike in raw HTML and JavaScript with no engine, libraries, or image files, naming it The Backdooms for a resemblance he saw to The Backrooms, and he presented that lookalike—his quotation marks—as the first "Doom" in a QR code, after ports to toasters, a MacBook Touch Bar, and smart fridges.[6] The size he aimed at, which PC Gamer later quoted, was "a playable DOOM-inspired game smaller than three paragraphs of plain text": a QR code holds on the order of 3 KB, and one chaingun sprite from the 1993 game is about 1.2 KB.[4] Jess Kinghorn's 23 April 2025 PC Gamer article states the result plainly: it is not actually Doom.[4] TechSpot's Alfonso Maruccia, a day earlier, likewise calls Backdooms a program inspired by id Software's shooter and by the Backrooms creepypasta, not the original engine.[1]Timeline and authorship
Maruccia identifies Mehta as a computer science and artificial intelligence student in New Delhi who spent about a week on how much a QR code can hold once its payload is compressed, then used a Doom-like HTML program to demonstrate the method.[1] The GitHub repositoryKuberwastaken/backdooms, created at 12:13 UTC on 12 February 2025, describes "a self-contained game that fits inside a QR code inspired by DOOM 1993 and The Backrooms," and it carries the MIT License.[2]
The first commit, three minutes later and authored as Kuberwastaken, reads "Added Everything I've done since the past week"; later that day a message says "IT WORKS!!!!!!!!!," and a commit authored as Kuber Mehta adds the license file; at 22:20 UTC on 13 February, 03:50 Indian Standard Time on 14 February, another message describes "a more effecient compression workflow with Zlib + Gzip," using zlib and gzip.[13] His 13 February account puts numbers on that week: an early build near 3.4 KB, four days of minification to about 2.4 KB, a Python encoder rewritten over more than 34 iterations, and Base64's roughly one-third overhead, which he wrote would have left too little of a version-40 code; the post also records a further change the next day, which he described as about 15 percent better.[6] Kinghorn quotes his report of two days prompting ChatGPT, DeepSeek, and Claude, from Anthropic—repeatedly advised to host the page on a website—until ChatGPT suggested DecompressionStream.[4] Maruccia reports that hint as the point at which the compressed page could be unpacked and run locally, with the whole program carried in the URL.[1]
Inspirations
TechSpot places Backdooms in the "Can it run Doom?" tradition of unofficial ports to unlikely machines, while stressing that the engine in the code is not id's.[1] PC Gamer makes the same limit explicit: a QR code joins that list of odd hosts only with an asterisk, because the program is not the 1993 game.[4] The repository readme credits id Software for Doom; MattKC, "for putting this idea in my head 5 years ago"; and Toby Fox, because the GitHub-hosted build uses an 8-bit version of the Undertale track Bonetrousle.[3] The technique he adopted for the picture is Doom's rather than Snake's. Kinghorn writes that early versions used small fixed maps, which he replaced with maps generated from a seed, and that the sense of depth is a simplified form of the ray casting in the 1993 game—so both, in that article's phrase, are a two-dimensional game "in a trench coat."[4]Gameplay
Perspective and setting
Backdooms is a first-person shooter view of a maze, not a port of id Software's 1993 Doom. [4] [1] Kuber Mehta described the picture as raycasting, "a 1992 rendering trick": one ray per column, and a taller rectangle when the wall is nearer. [6] On 23 April 2025, PC Gamer's Jess Kinghorn called that "a simplified version of raycasting" and wrote that this game and Doom were each "a 2D game in a trench coat." [4] The player, she wrote, is "avoiding red-eyed rectangles amid grey walls." [4] A day earlier, TechSpot's Alfonso Maruccia described an "infinitely generated" browser maze of "Doom-style corridors," playable on a desktop or a phone. [1]
Controls and combat
The left and right arrows turn. W or the up arrow walks forward and S or the down arrow walks backward, a tenth of a cell per frame, and only through open space. A and D are unread, and the mouse does not steer. A click fires while ammunition remains. Health starts at 100 and ammunition at 25, shown as a red HP bar and a yellow ammunition bar. Two enemies of 100 health begin beside the player, dark red rectangles with red eyes that turn a brighter red below half health. They walk toward the player much more slowly than the player moves, a little faster as they close, and holding a move or turn key can place more of them on nearby open cells. [14] Mehta wrote that early copies left enemies standing still, then empty once the player left the start, and that chasing and spawning while walking were added later. [6] Inside half a unit, an enemy removes one health on every frame, so the drain is quicker when the browser is drawing faster, until the screen stops on GAME OVER. A shot spends one round, kicks the view, and takes 50 health from every enemy within five units and a narrow angle ahead, walls or not. Two such hits remove an enemy. Ammunition returns one round at a time on a small random chance per frame, and it never exceeds 25. There is nothing to pick up and no other weapon. [14]Playable builds
The build the readme calls "a slightly less compressed version" is not what the repository QR code contains. [3] The HTML inside that QR image is the published fileMINIFIED-BACKDOOMS.html. [15] [16] It has no audio, no score, no green bar on enemies, and no grey weapon, only an orange flash for a shot. A touch on the left or right half of the screen turns that way and walks forward; there is no fire button. Enemies are not blocked by walls, further enemies stop once ten are alive, and game over is only the words GAME OVER. [16]
The readme's GitHub Pages address redirects to kuber.studio/backdooms, which frames THE-BACKDOOMS.html, the longer build shown above. [3] [17] [18] A kill adds one to a score, and game over prints that score with "Press F5". Enemies stop at walls, and if fewer than five are already within five units the script may add one to three. On a touch screen a joystick sits at the lower left, a FIRE button sits at the lower right, and a tap also shoots. [14] The first click starts an external MP3. The readme says this copy uses an 8-bit version of Bonetrousle and credits Toby Fox; the itch.io page makes the same claim. [3] [19] Each time the track ends, playback slows by a tenth, down to a tenth of the original speed, and a game over sets the rate to 0.3. [14] That audio is absent from the QR script. [16] TechSpot's statement that the compressed program generates music, as well as corridors and targets, fits the hosted page rather than the file a scan runs. [1]
The copy embedded on itch.io is a third script. [19] It keeps the score, the green bars, the weapon rectangle, and the same music file, but it has no joystick, its enemies move at one constant speed, and a hit does not paint the full-screen red flash used by the other two. [20]
Rendering and world generation
Backdooms is one HTML document. Its JavaScript redraws a 320-by-240 canvas stretched to the window, and walls, enemies, a weapon block, and the status bars are filled rectangles rather than image files.[14][21] Kuber Mehta has written that the page omitted an engine, stored assets, and libraries so it would stay small enough to encode.[6] Technology coverage describes generated corridors in the manner of Doom, not a port of the 1993 engine.[1]Raycasting
The depth cue is ray casting, a pseudo-3D view of a flat map made with one calculation per vertical line. In the form known from id Software's 1992 game Wolfenstein 3D, each column sends a ray across a grid of wall and empty cells, and distance to the first wall sets the stripe height, so nearer walls are taller.[22] Doom does not march a ray per column. Its levels are split in advance with binary space partitioning, walls are sorted near to far, and column height still follows from distance.[23]
(i − 160) / 160, nearly a 90-degree field of view; the blog sketch instead adds (i − 160) / 500. The ray steps 0.1 units until a wall or distance 20, then multiplies by the cosine of the angle off the facing direction so walls do not bow. Column height is 240 / distance, capped at 240, drawn one pixel wide in a grey of 200 / distance, and the distance is saved for occlusion.[14][22] Fixed steps can skip a thin wall, so the aggressively minified file walks grid lines with a digital differential analyzer, stops at the first wall cell or at distance 20, and applies the same cosine, height, and grey.[22][16]
Enemies are rectangles, not bitmaps. Screen x is 160 plus the relative angle times 160, and width is about 80 / distance. A dark red body and two red eye marks are drawn only inside a limited angle and only if closer than the stored wall distance; the longer file also paints a short health line, and recoil shifts the columns after a shot. PC Gamer described the same grey walls and red-eyed rectangles.[14][4]
Procedural maps
An early repository file stores the level as eight strings of eight characters—a walled border, a few interior blocks, and three hand-placed enemies. Rays stop on the character'1'.[24] Mehta wrote that maps of about 8 by 8 and 16 by 16 were too small, and that a function of cell coordinates plus a seed replaced the table.[6] PC Gamer reported maps that continue as the player walks and that can be recovered from the seed.[4] The replacement is procedural generation.
The readable function leaves open any cell less than four units from 4 on both axes, opens a corridor where the coordinate plus 1,000 leaves a remainder of 3 when divided by 7, in x or in y, and otherwise sets a wall about five percent of the time. The percentage is the fractional part of a scaled sine of the coordinates and a seed chosen once as a random number times 100, so the same cell stays stable. The minified file uses cosine of that mix. Hard-coding the seed, as Mehta described, freezes a layout. Movement into a wall cell is rejected.[14][16][6]
Two enemies start beside the player. While a movement key is held, the readable build may add one to three more if fewer than five lie inside a radius of five and a draw near 0.02 succeeds, and only on open ground. The minified build caps the list at ten and adds at most one. In the readable build they advance only through open cells, and contact lowers health. Mehta wrote that spawning during travel replaced an earlier version that never added enemies after the start.[14][16][6]
Minification of game logic
Minification removed characters that did not change the loop. Mehta set a readable wall draw, height240 / distance and fillRect, beside h.fillRect(i,120-240/d/2,1,240/d), with comments removed and names cut to single letters.[6] PC Gamer quoted the phrase "extremely aggressive minification," and TechSpot treated that shortening as what made a playable HTML scene fit in a few kilobytes of text.[4][1]
The readable repository page is 10,492 bytes and also holds a mobile joystick, audio, and web analytics that the small build omits.[14] The aggressively minified file is 2,824 bytes of style, a canvas, and one script. with(Math) drops the Math. prefix, commas join statements, and position, angle, health, ammunition, the map, enemies, keys, and the drawing context are single letters, while the weapon, flash, and bars stay rectangles and short text.[16] Mehta wrote that one pass cut a build from about 3.4 KB to 2.4 KB.[6] Compression into the QR symbol is separate from this loop.
Compression and encoding
QR Code capacity
A QR code symbol's version fixes its module grid. Version 1 is 21 × 21 modules and Version 40 is 177 × 177, with each higher version adding four modules on a side. [5] Capacity then depends on that version, the character mode, and the error-correction level. DENSO WAVE's summary of the ISO/IEC 18004 symbol lists four levels—L, M, Q, and H—as restoring about 7%, 15%, 25%, and 30% of codewords, using a Reed–Solomon code added to the data. [25] [26] More recovery spends more codewords on redundancy. The publisher says level L suits a clean environment with a large amount of data, and describes level M as the level most often selected. [26]
Self-extracting wrapper
The symbol does not hold the game source as plain text. The encoder reads the HTML, compresses it with Python's zlib binding at level 9 andwbits=31, and Base64-encodes the result. [7] In that library, level 9 is the top of the 0–9 scale, and wbits=31 is in the 25–31 range that adds a gzip header and trailer rather than a zlib wrapper or a raw stream; its low bits select a 32,768-byte window. [28] RFC 1952 specifies gzip as a wrapper around the DEFLATE method plus a checksum, and RFC 1951 defines DEFLATE as LZ77 matching plus Huffman coding. [29] [30] Base64, in RFC 4648, represents three octets as four characters, an expansion of about one third before padding. [31]
That text is interpolated into a one-line JavaScript module: <script type="module">document.open();document.write(await new Response(new Response(Uint8Array.from(atob("{b64}"), c => c.charCodeAt(0))).body.pipeThrough(new DecompressionStream("gzip"))).text());document.close();</script> [7] The module decodes the Base64 with atob, pipes the bytes through DecompressionStream("gzip"), and reads the result as text. DecompressionStream is the decompression half of the Compression Streams API and has the shape of a TransformStream, so it works with pipeThrough; MDN's example decompresses a blob with gzip. [8] The API overview names gzip and deflate as the built-in formats, which avoids shipping a decompression library, and records the feature as available across browsers since May 2023, including in workers. [32] document.open, document.write, and document.close then replace the page with the restored markup. [7]
The script Base64-encodes that module again and prefixes data:text/html;base64,. [7] MDN defines a data URL—the name that replaced "data URI"—as data:[<media-type>][;base64],<data>, used to embed a small file inline, including an HTML document. [33] Because this outer pass expands the whole wrapper, the gzipped game has to finish well under 2,953 bytes once the script and the data: prefix are counted. Browsers are not required to support any particular data-URL length; Chromium and Firefox limits are in the hundreds of megabytes, so the symbol, not the scheme, is what binds. [33] The same page says top-level navigation to data: URLs is blocked in modern browsers, which limits how the payload can be opened rather than how many bytes the symbol stores. [33]
Compression is what leaves room after those expansions. PC Gamer reports Mehta's account that Base64 alone, without a compression stage, left very little of the symbol for the game, and that after two days of prompts to ChatGPT, DeepSeek, and Claude—prompts that mostly recommended hosting the page on a website—ChatGPT named DecompressionStream. [4] TechSpot describes that suggestion as the step that let the compressed program be expanded in the browser, and describes the scanned result as a self-extracting page whose game is stored in the URL. [1] Both are summarizing the developer; neither publishes its own measurement of the compression ratio.
Encoder and later variants
On the main branch, a comment says the wrapper was changed from deflate decompression to gzip, matchingwbits=31 and the browser's "gzip" argument. [7] An earlier revision, commit 4d87b3e1, called gzip.compress at level 9 and wrapped the payload in a full HTML document with a classic script, then Base64-encoded that document as the data URL; the version-40 fallback was already there. [34] Switching to zlib.compressobj at wbits=31 did not leave the gzip container. Python documents that range as a gzip header and trailer, and the browser call stayed DecompressionStream("gzip"). [28] [7] The shortening is in the wrapper: the current template drops the document type and the html, head, and body elements, leaving the module script. [7] [34]
A BigInt branch keeps the same compression but does not Base64-encode the compressed bytes. It converts them with int.from_bytes, embeds the integer as a BigInt literal, and rebuilds the byte array by masking eight bits at a time, shifting, and reversing before DecompressionStream("gzip"). [35] The URL is data:text/html, plus urllib.parse.quote of the script, so the outer layer is percent-encoding rather than a second Base64 alphabet. [35] The readme calls the branch an alternative "using BigInt instead of Base64 for even smaller QR codes" and says it has limited mobile-browser compatibility. [3] That size comparison is the project's own description; the code shows a decimal integer and a short script, percent-encoded, in place of Base64 nested inside Base64.
Release and distribution
Repository and license
The public source is the GitHub repositoryKuberwastaken/backdooms, created on 12 February 2025.[2] The repository API lists HTML as the primary language and the topics doom, game, minification, qrcode, and thebackrooms, and describes the project as a self-contained game, inspired by Doom (1993) and The Backrooms, that fits inside a QR code.[2] A language breakdown also reports Python.[36] The homepage field is http://kuber.studio/backdooms/.[2] On 3 October 2026 the API reported 641 stars and 24 forks.[2] Kuber Mehta, under the account Kuberwastaken, accounts for most commits; Sangeeth Sudheer (runofthemillgeek) and Terence Eden (edent) are the other listed contributors.[37]
The repository uses the MIT License, and the license file begins “Copyright (c) 2025 Kuber Mehta”.[38] That text matches the Open Source Initiative’s MIT terms: the software may be used, copied, modified, merged, published, distributed, sublicensed, and sold if the copyright and permission notices are kept, and it is offered without warranty.[39] The README repeats the grant and says other QR-code games, including smaller ones, would be welcome.[3]
Scanning and hosting
The Releases and tags lists are empty, so numbered builds are not published that way.[40][41] The compressed copy is the fileqrcode.png.[42] QRGEN.py encodes the page as a data URI starting data:text/html;base64,, which a scanner is expected to hand to a browser rather than save as a separate download.[7] The README shows that image and links scanqr.org, a browser decoder that reads an uploaded image or a webcam.[3][43] It also says that, after the URI opens, play does not need a network connection because the address contains the page.[3]
A larger copy is hosted with GitHub Pages.[3] https://kuberwastaken.github.io/backdooms/ redirects to https://kuber.studio/backdooms/, still served by GitHub.[44] There, index.html frames THE-BACKDOOMS.html and loads a Google tag.[45] The framed file adds an on-screen joystick and an audio element whose source is public/Game-Music.mp3.[14] The README calls that hosted music an 8-bit Undertale track.[3] An itch.io page of the same name, by Kuberwastaken, lists the project as a released free HTML5 game in the Shooter and Adventure genres and links the repository.[19]
Making another code requires Python 3.7 or newer and qrcode with Pillow (pip install qrcode[pil]).[3] The script gzip-compresses the HTML with zlib at level 9 (wbits=31), Base64-encodes it into a module that the browser expands with DecompressionStream set to "gzip", then Base64-encodes that wrapper as the QR payload.[7] It uses error correction L and the smallest version that fits, or version 40 if fitting fails, and warns if the wrapper is over 3,072 bytes.[7] The README’s example is python3 QRGEN.py EVEN-SMALLER-SLAMMER-BACKROOMS.html qrcode.png.[3] On the BigInt branch the compressed bytes are stored as a BigInt instead of Base64; that README says the encoding leaves more room but works less reliably on mobile browsers.[46]
Version history
A badge in the README says version 13.0, which does not appear as a tag or release.[3] Snapshots inlegacy-versions run from v1.html to v12.html, with extra files v2.1, v3.1, v5.1, v10.1, and v11.1.[47] The only commit touching v12.html is “IT WORKS!!!!!!!!!” on 12 February 2025.[48] The README calls the work up to that publication about a week long.[3]
Early files are titled Mini DOOM.[49] v1.html uses a fixed map, v2.html adds an ammunition counter and bars, a comment in v3.html describes a simple procedural pattern, and a comment in v5.html describes a noise-based map.[24][50][51][52] From v6.html the title is The Backdooms.[53] v9.html adds a random map SEED, and v10.1.html aliases Math functions with single-letter names.[54][55]
aggresive-minified-version/MINIFIED-BACKDOOMS.html is the touch-enabled minified file.[16] On main, its last commit, and the last commit for qrcode.png, is “MOBILE COMPATIBILITY!” on 18 April 2025.[56][57] Earlier that day, Sudheer’s pull request 3 removed wrapper tags; the request records 2,117 bytes before and 1,975 after, prior to the mobile edit.[58] Older minified files, including EVEN-SMALLER-SLAMMER-BACKROOMS.html, stay under legacy-versions/legacy-agressive-minified-versions.[59] The generator’s own comment says “v42”, separate from the 13.0 badge.[7] A third branch, agent/opening-spawn-calm, was updated on 17 September 2026 with “Calm the opening enemy spawns” and is not a tagged release.[60]
Reception
Technology press
From 18 to 23 April 2025, technology sites described Backdooms as a size-coding demonstration rather than the 1993 id Software game named in the headlines. Rob Beschizza's Boing Boing post on 18 April, "Doom in a QR code," said the program fit a legitimate QR code, which the post put at about 3 kilobytes. It named Kuber Mehta and quoted his account of a compressed, self-extracting, infinitely generating HTML game, inspired by Doom (1993) and The Backrooms, plus the phrase "EXTREMELY aggressive minification."[61] Alfonso Maruccia's TechSpot article on 22 April was headlined "Doom can now run in a self-contained QR code. Sort of." It said Backdooms does not run the original engine. Mehta, a computer-science and artificial-intelligence student in New Delhi, had spent about a week on QR storage and then used a Doom-like scene as the demonstration. A scan, he wrote, opens infinitely generated corridor-like HTML carried in the URL, so no further connection is required. Decompression uses the browser's DecompressionStream API, which a chatbot suggested to Mehta. The article said the compressed code produces graphics, enemies, and music, and called the project only loosely related to Doom.[1] Jess Kinghorn's PC Gamer piece the next day, crediting TechSpot, added QR codes "with an asterisk" beside a pregnancy test, gut bacteria, and moldy potatoes. She quoted Mehta's aim—"Create a playable DOOM-inspired game smaller than three paragraphs of plain text"—and a roughly 1.2 KB chaingun sprite against a QR limit of about 3 KB. Base64 encoding, the article said, left too little room; after prompts to ChatGPT, DeepSeek, and Claude, ChatGPT's mention of DecompressionStream supplied the step. She described seed-based maps in place of fixed ones, and simplified ray casting that she grouped with the 1993 game as two-dimensional rendering presented as 3D: grey walls and red-eyed rectangles. The headline still quoted "literally the entire game"; the body argued the code is not Doom.[4]Hacker News discussion
On 18 April 2025 the account kuberwastaken posted "Show HN: I made a Doom-like game fit inside a QR code" to Hacker News, linking the GitHub repository. That day's archived front page lists the submission first. The item records 531 points and 136 comments. Mehta called it a week-long project from earlier in 2025: minified HTML under 2.4 KB, gzip with zlib headers, a version-40 QR code, DecompressionStream, and seed-based maps. He said it needed a scanner that can handle a large code. The trailer link initially opened the wrong video.[62][63] Commenters tested whether a phone could open it. Several reported that the iPhone camera returned "No usable data found." One argued that the iOS camera will not launch adata: URI at all, independent of length. A Pixel scanner, another wrote, yielded text to paste into a browser, after which the controls failed. Mehta replied that many cameras fail on large codes and that phone play had been omitted for lack of bytes; he later said Safari was broken and that Chromium-based mobile browsers could open the URI. After a commenter opened a pull request that trimmed HTML tags and cut the minified payload from 2,117 to 1,975 bytes, Mehta used the space to add limited touchscreen support, better movement, enemy spawning, and damage, and he posted in the thread that the game could then be played on a phone if the controls were figured out.[64] Another comment called a QR game not built for phones a mismatch, because phones are where such codes are usually read.[63]
The thread also disputed the framing. One reader was relieved a scan would not run arbitrary code; replies likened it to any page running JavaScript. A commenter wrote that Doom did not use ray casting and that the result was closer to Wolfenstein 3D. Others mentioned .kkrieger and a sub-10 KB size-coding entry from 2000. On Firefox, keys did nothing until a shot—Mehta said the click starts music—and strafing needed the arrow keys. Mobile Firefox showed a black screen or an error for some; one person played briefly in Brave on a Samsung phone. Asked for a picture, Mehta added a GIF to the repository.[63]
Later citation
On 24 April 2025 David Noever, of PeopleTec, Inc., in Huntsville, Alabama, submitted to arXiv the preprint "Encoding Software For Perpetuity: A Compact Representation Of Apollo 11 Guidance Code" (arXiv:2506.11008, cs.SE). The abstract page and the API both date version 1 to 24 April 2025, 03:44:30 UTC. The note describes putting selected Apollo 11 lunar-module routines for the Apollo Guidance Computer—software it links to the team led by Margaret Hamilton—into one QR image of about 3 KB, using tokenization and a small HTML page a phone can show offline.[65][66][10] Noever cites Backdooms as the prompt. The introduction points to QR compression "such as those demonstrated by the Backdooms project," and a background section says the project "successfully compressed a playable game inspired by DOOM into a QR code by using extreme minification and the DecompressionStream API." Reference [3] is "Mehta, K. (2024). Backdooms: A self-contained game that fits inside a QR code inspired by DOOM 1993 and The Backrooms," with the GitHub URL. That 2024 date is the paper's: the repository was created on 12 February 2025, and the Hacker News post placed the work earlier in 2025. The note says the lunar-module sources exceed 40,000 lines and that the image keeps excerpts, including the landing sequence and 1202 alarm handling. It also notes low error correction and browser APIs that may not last, and presents the Apollo image as a partial display copy rather than an archive.[10][2][63]Context in constrained software
Running Doom on unexpected platforms
In a note dated 23 December 1997 and distributed with the Linux sources, id Software programmer John Carmack wrote that the released Doom code was "quite portable" and that bringing it up on almost any platform should be straightforward.[67] He listed "Port it to your favorite operating system" among project ideas; the release still required the original game data.[67] In September 2020, programmer Foone Turing showed Doom in a digital pregnancy test. PCMag reported that the stick's CPU could not be reprogrammed and that its LCD could show only a few preset messages, so both were replaced, leaving a 128-by-32-pixel monochrome display in the plastic shell.[68] PC Gamer wrote that the first clip was footage and that an interactive build followed a day later.[69] Turing, answering complaints that this was merely Doom in a shell, joked about a microcontroller in a potato.[68] In October 2020 PC Gamer described a power experiment, not a potato computer: YouTuber Equalo tried to boot a Raspberry Pi Zero from about 100 pounds of boiled potato slices, the Pi did not start, the potatoes molded, and Doom ran on a TI-84 calculator fed by that bank.[70] A 2024 class project moved the claim into biology without placing the engine in cells. MIT graduate student Lauren Ramlan modeled E. coli in a 32-by-48 microwell grid as a 1-bit display for frames drawn on an ordinary computer.[71] Ars Technica reported that the grid was only simulated and that a Python model put a five-hour session at about 599 years, given roughly 70 minutes to peak fluorescence and 8 hours 20 minutes to recover.[71] PC Gamer's April 2025 article placed the pregnancy test, the bacterial display, and the moldy potatoes in that series, then marked an asterisk for Kuber Mehta's HTML page, which it calls "the backdooms."[4] It is Doom-inspired rather than Doom. The piece says a QR code holds only up to about 3 KB, notes Mehta's figure of 1.2 KB for the original chaingun sprite alone, and quotes the aim as a playable game "smaller than three paragraphs of plain text," using the 1993 shooter and the Backrooms creepypasta.[4]Size-coding on the web
Kilobyte ceilings define the demoscene, a non-commercial culture of real-time audiovisual programs shown in competition. On 9 April 2020 the Ministry of Education and Culture in Finland inscribed the demoscene on the National Inventory of Living Heritage, kept under UNESCO's 2003 convention; the Finnish Heritage Agency listed it among twelve additions that brought the inventory to 64 elements.[72]
Other programs stored in QR codes
A QR code has a fixed payload. Programmer MattKC's 2020 write-up notes that a version 40 symbol stores up to 2,953 bytes, and records a Windows Snake he fitted into one: Crinkler reduced a 3.2 KB executable to about 1.4 KB, restored from a webcam by zbarcam assnake.exe.[76]
Vincent Bruijn's QR3K repository, created on GitHub on 3 September 2025, asks for a complete web game in those 2,953 bytes, opened from a URL by a small loader.[77] The README suggests Snake, Pong, and similar small-state games.[77] It is a general jam, not a Doom port, and it postdates April 2025 coverage of Backdooms.[4]
TinySol, formerly MonoSol, is Klondike solitaire in x86 assembly for MS-DOS from the 8086 upward, first released in March 2022 in builds from 3.5 KB down to 1.8 KB.[78] Its author, publishing as Classic Bits, writes that a 2.2 KB "mini lo-rez" build fits a QR code and was printed on 5.25-inch floppy sleeves at Vintage Computer Festival Southwest in 2026.[78] PC Gamer's report on a copy from the event describes the QR edition as a reduced build, decoded with a printed snippet and run in DOSBox.[79]
David Noever of PeopleTec used the same capacity for source text. A note submitted to arXiv on 24 April 2025 describes one scannable image of selected Apollo Guidance Computer assembly from the Apollo 11 lunar module, written for the MIT team led by Margaret Hamilton.[65] Against 40,202 lines of Luminary 099, he reports a version 25 symbol at L error correction: a 1.4 KB payload, about 0.1 percent of the codebase.[10] The P63 landing sequence and the 1202 alarm handler stay readable; other opcodes become single-character tokens inside HTML and JavaScript that a phone decompresses offline.[10] Noever cites Mehta's Backdooms repository as a recent self-extracting QR page, then uses the idea for an excerpt rather than a game.[10] The note's own limits are the sliver of source retained, 7 percent error correction, browser APIs that may not last, and the absence of the 15-bit machine.[10]
Limitations
Relation to the original Doom
Backdooms does not run id Software’s 1993 shooter Doom. Jess Kinghorn wrote in PC Gamer on 23 April 2025 that putting Doom itself in a QR code is not straightforward: the codes hold at most about 3 KB, and Kuber Mehta had noted that the original chaingun sprite alone is 1.2 KB.[4] She reported his compromise—“a playable DOOM-inspired game smaller than three paragraphs of plain text”—and stated that the result is not actually Doom.[4] On 22 April 2025, Alfonso Maruccia made the same distinction in TechSpot under the headline “Doom can now run in a self-contained QR code. Sort of”: the project does not run the original engine.[1] What opens is an infinitely generated HTML scene of Doom-like corridors, also drawing on The Backrooms, which then needs no internet connection because the program is stored in the URL—a data URI for a new program, not Doom’s engine, levels, or art.[1]Scanner and browser compatibility
On the Hacker News thread of 18 April 2025, commenters reported that an iPhone camera returned “No Usable Data found.”[80][81] Mehta replied that most phones fail on large QR codes, pointed to qrscanner.org, and said phone play was outside the size budget.[82] Later that day he wrote that a pull request had added partial touch support for a Chromium-based mobile browser.[83][84] Another commenter argued that the camera message was not mainly about density: the iPhone camera will not open adata: URI even for a tiny HTML page.[85] Mehta also wrote that the payload was broken in Safari but worked in Chromium-based mobile browsers.[86] Mobile Firefox users reported a black screen and a failed request.[87][88] On 19 April he wrote that the touch-control changes had broken Firefox mobile and that he believed it worked again.[89]
DecompressionStream, which inflates compressed bytes including gzip, is older and wider than those reports.[8] MDN’s compatibility data lists the "gzip" format from Google Chrome 80, Firefox 113, and Safari 16.4, with Android and iOS editions mirroring those versions.[90] TechSpot on 22 April 2025 already described play on desktops and smartphones.[1] The repository readme, at the revision badged version 13.0, later says the game is mobile-compatible on browsers that implement DecompressionStream, naming Microsoft Edge, Yandex Browser, and Opera.[3] Symbol density, data-URI handoff, the decompression API, and control code remained separate limits.