Open-source project
Kuberwastaken/backdooms avatar
Kuberwastaken/backdooms

The Backdooms is a whole FPS game packed into a single QR code

A self-contained game that fits inside a QR code inspired by DOOM 1993 and The Backrooms

642 stars25 forksHTMLMIT

At a glance

What is it?
The Backdooms is a compressed, self-extracting HTML first-person shooter that lives entirely inside a QR code, using Zlib compression, base64 encoding and the browser DecompressionStream API. The trade is that a QR code holds about 2.5 KB of game, and the browser support depends on an API that not every scanner's browser has.
Who is it for?
The Backdooms suits a developer who wants to study extreme size reduction, or a reader who wants a demonstration that a playable game fits in a scannable square. It does not suit a project that needs a real game, since a QR code caps out at roughly 2.5 KB of game and a few kilobytes of scanner overhead, and it does not suit a reader whose scanner opens a browser without DecompressionStream support.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 36 days ago.
What is it written in?
Mainly HTML, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The entire game is one scannable square

The premise is stated without hedging. The Backdooms is a compressed, self-extracting and infinitely generating HTML game inspired by DOOM 1993 and The Backrooms, and it can be launched and played in a web browser directly from a QR code. The repository carries the QR code as qrcode.png at the root, and the README says plainly that this is literally the entire game, with a link to a scanning service so you can play it from the README itself. The project description calls it a self-contained game that fits inside a QR code, and the author describes it as a week-long study, now slightly longer, designed to push the limits of QR code storage and compression and to demonstrate a method of hosting lightweight web applications entirely within a QR code. That framing matters, because it explains why the constraints are as aggressive as they are: the goal is the demonstration, and the game is the payload that makes it hard.

Zlib, base64 and DecompressionStream in a loop

The compression workflow is documented step by step in the technical breakdown, and the interesting detail is that it is a loop rather than a straight line. The input HTML is read, compressed with Zlib, and encoded in base64 so the result stays text-safe enough to embed in an HTML file. That data is placed in a JavaScript wrapper that calls the DecompressionStream API to decompress it in the browser. The result is then converted to a data:text/html;base64,... URI, and the system asks whether that URI fits inside a QR code. If it does, a QR code is generated. If it does not, the HTML is reduced in size and the whole cycle runs again. That is the mechanism that makes an infinitely generating game possible within a fixed capacity, since the game regenerates levels from a seed rather than storing them.

The QR generation logic has a hard ceiling and says so

The generation logic is the part of the README that admits the limits. The system first tries to generate the smallest possible QR version using qr.make(fit=True), which adjusts the QR size dynamically based on the content length. If the required version exceeds 40, which the README names as the QR code standard limit, it forces version 40 with fit=False. The lowest error correction level, L, is used, because that allows the maximum data capacity. And if the data is still too large for a version 40 code at level L, the process fails and returns an error, and the outcome section says the process terminates with an error message indicating that the data is too large to be encoded. There is no fallback to a different encoding and no attempt to split the payload. The error correction setting is the trade-off worth noting, because level L means the code has the least redundancy and therefore the least tolerance for a smudged or poorly lit scan.

Generating a code needs Python, and the game needs the browser API

There are two dependency sets and they belong to different sides of the project. To play, the README says the only technical requirement is a modern web browser. To generate your own QR code from your own HTML, you need Python 3.7 or newer, the qrcode library for generating the codes and pillow for image handling, and the install step is a single pip command:

bash
pip install qrcode[pil]

@@C1@@Converting a game file to a code is then one script invocation with the input HTML and the output image path as arguments,

bash
python3 QRGEN.py <your-game.html> <output-qrcode.png>

and the README gives a worked example using one of the project's own HTML files. The scan step is whatever QR reader or phone camera you already have, and the README's claim is that the game opens directly in the browser with nothing to download or install. The dependencies are light because the tools do one job each and the heavy lifting happens in the browser rather than in Python.

Browser support is narrower than "any modern browser"

This is the limitation that catches people out, and the README is reasonably clear about it. The mobile compatibility entry says the game works on modern mobile browsers that support the DecompressionStream APIs, naming Edge, Yandex and Opera, and that entry is marked as new. The DecompressionStream API is what does the gzip decompression in the browser, and without it the wrapper cannot unpack the payload, so a scanner that opens a page in a browser without that API will show a broken page rather than a game. The README's alternative implementation note makes the same point from the other side. There is a BigInt branch offering an alternative implementation using BigInt instead of Base64 for even smaller QR codes, but it has limited mobile browser compatibility. So there are two builds with opposite size and compatibility trade-offs, and the choice of which to run is a choice about which browsers you expect to be used.

The repository keeps the game, the generator and the older attempts

The top level of the repository shows how the project accumulated. There is THE-BACKDOOMS.html, which is the game itself, QRGEN.py, the generator, qrcode.png, the code for the compressed version, and index.html. Then there are the directories that record the process: aggresive-minified-version/, which holds the more heavily minified build, legacy-versions/ for earlier attempts, and public/ for the assets shown in the README, including the gameplay animation. The GitHub-hosted version linked from the README is described as a slightly less compressed version, and the author notes the music is an 8-bit version of Bonetrousle from Undertale, with Toby Fox credited alongside id Software for developing DOOM. The author is Kuber Mehta, and the MIT licence is stated as free to use, modify and share. The README also says the project would make the author very happy to see other QR games, or better versions of DOOM in a QR code, given how few resources exist on the subject, and there is a blog post on the author's MindDump site describing the trial and error.

Editorial conclusion

The Backdooms suits a developer who wants to study extreme size reduction, or a reader who wants a demonstration that a playable game fits in a scannable square. It does not suit a project that needs a real game, since a QR code caps out at roughly 2.5 KB of game and a few kilobytes of scanner overhead, and it does not suit a reader whose scanner opens a browser without DecompressionStream support. Before adopting, check the browser list the README gives, which names Edge, Yandex and Opera, and note that the last push to the repository was on 2026-09-17 with the version badge reading 13.0 under an MIT licence.

Frequently asked questions

How do I play The Backdooms?

Scan the QR code in the repository with a smartphone or QR scanner, which opens the game directly in a web browser with nothing to download or install. The game also runs from a slightly less compressed version hosted on GitHub Pages, linked from the README.

How do I put my own HTML game into a QR code?

Install the dependencies with `pip install qrcode[pil]`, then run `python3 QRGEN.py <your-game.html> <output-qrcode.png>`. The README's example uses the project's own HTML file, and the script reports an error if the payload is too large to fit in a QR code.

What does The Backdooms need to run in a browser?

The DecompressionStream API, which the README says means modern mobile browsers that support it, naming Edge, Yandex and Opera. There is also a BigInt branch using BigInt instead of Base64 for smaller codes, but the README notes that variant has limited mobile browser compatibility.

How much data fits in the QR code?

The README refers to a game of about 2.5 KB. The generator tries the smallest possible QR version with fit=True, forces version 40 if that exceeds the QR standard limit, and uses the lowest error correction level L for maximum capacity. If the data still does not fit, the process fails with an error that the data is too large to encode.

What licence is The Backdooms released under?

MIT, described in the README as free to use, modify and share, with the licence file in the repository root. The project version badge reads 13.0 and the repository publishes no GitHub releases, and the last push was on 2026-09-17.

Official sources

  1. Issues
  2. Kuberwastaken/backdooms on GitHub
  3. License: MIT
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/kuberwastaken-backdooms.svg)](https://hysenlabs.com/projects/kuberwastaken-backdooms)

Was this useful?