
doom runs the original shareware episode of Doom in WebAssembly on an RCWeb shared display. Open /doom/?r=<room> and scan the on-screen QR code to join the same room with the companion doom-c touch controller.
Doom is id Software's landmark 1993 first-person shooter. This app contains the original shareware campaign, Episode 1: Knee-Deep in the Dead. Its nine maps take the player through the demon-infested UAC facilities on Phobos, including one secret level.
The player explores mazes, collects weapons, ammunition, health, armour, and coloured keys, fights monsters, and finds the exit to each level. The campaign, enemy behaviour, map logic, status bar, menus, sound effects, and music are all produced by the original game data and the WebAssembly Doom engine. This RCWeb adaptation adds a shared-screen presentation and remote phone controls without moving the game simulation away from the viewer.
Show QR code button that opens the same controller link in a modal. Wider layouts keep the QR code visible in the right-hand panel./doom-c/ with the current room details, so the phone connects to the correct display.Fire, Use, or Run; tap Weapon to cycle weapon slots 1-7.Menu to open or close it, then Select or Fire to confirm the highlighted choice.?r= URL through /assets/core/comms.js. The Doom viewer creates a QR link to /doom-c/ with that same room, keeping unrelated rooms isolated.up, right, fire, or strafe-left. It sends an action only when a control is pressed, changed, or released rather than continuously streaming joystick coordinates.rc.sendFunctionCall("doom", "doomApp.controlDown", ...) and the matching controlUp call target only browsers running the doom app in that room. Each call includes the controller's current RCWeb client ID and its persistent controller identity.doomApp API validates that the sender owns the single-player controls, then converts the named action into the keyboard events expected by the WebAssembly engine.doomControl.receiveState, reporting whether that phone owns the controls and whether Doom is loading, ready, or has failed.The viewer is authoritative: the WAD, engine, game state, rendering, and audio remain in its browser. RCWeb transports control intent and connection status only; it does not run Doom on the server or copy the game state to the phone.
Sound effects and music run through the viewer's browser audio context. If the viewer displays Enable sound, press it once on the display to satisfy browser autoplay rules. Episode 1 music is served locally from /doom/music/; the game does not depend on an external music host.
The viewer includes the shareware doom.wad, the WebAssembly engine, and locally served Episode 1 music from farrelke/console-doom. The fixed WAD and OGG music are stored under src/main/immutable/app/doom; the viewer shell and replaceable JavaScript/WebAssembly engine are stored under src/main/apps/app/doom. See UPSTREAM.md and COPYING-GPL-2.0.txt in this app directory for source, license, and attribution details.