DOOM Now Runs in MS Paint: A Closer Look
Yes, you’ve seen the headlines: DOOM now runs in MS Paint. But unlike the popular meme suggesting DOOM can run anywhere, Paint is not actually running the game. Instead, Windows 11's built-in drawing app serves as the display for the game, while the computations occur elsewhere.
Mark Russinovich, CTO of MS Azure, developed and released the project, aptly named DoomPaint, on GitHub. He explains, “Paint renders the game but does not compute it. Paint computes nothing. Paint has never computed anything. That’s the joke.”
The project leverages the ViZDoom engine to render every frame headlessly and transfers each frame to Paint’s canvas via the Windows clipboard. Remarkably, the game features full keyboard controls, sound effects, and a real MIDI soundtrack, running at a frame rate that peaks at DOOM’s native 35 FPS and dips to what Russinovich humorously calls "spreadsheet-tier."

We delved into the GitHub repository to uncover how the Windows clipboard, of all mechanisms, manages to carry a real-time game engine without crashing.
How to Run DOOM Inside MS Paint
Default controls:
How DoomPaint Differs from Previous “DOOM in Paint” Projects
Contrary to recent headlines, DoomPaint is not the first attempt to display DOOM on a Paint canvas. Previous projects typically involved running the game in a separate window and either mirroring or screen-capturing that window into Paint. This effectively meant playing DOOM in a standard window while merely viewing a copy of it in Paint.
DoomPaint, however, operates differently. There is no secondary DOOM window; Paint’s canvas is the sole display for the game. All user inputs pass through Paint, making it uniquely interactive.
The engine behind DoomPaint is ViZDoom, a ZDoom-based fork designed for AI and reinforcement learning research. This allows it to render without opening a visible window. Russinovich’s wrapper ensures that the window is hidden as soon as it is created, avoiding any screen flashes. The project uses the shareware DOOM1.WAD to supply the first episode, including levels and the original Bobby Prince soundtrack. Levels beyond the first episode rely on Freedoom, a BSD-licensed replacement WAD, since id Software has not made the full game freely redistributable.
The default resolution is 640×400 at up to 35 FPS. Reducing the resolution to 320×200—DOOM’s original resolution from 1993—results in a higher frame rate.
In a demonstration clip, the game’s frames are shown within Paint’s canvas as floating selections, complete with the classic DOOM HUD, health, ammo, armor metrics, and the player’s status face. Paint’s ribbon, including the Copilot button, remains visible above the game display.
How Mark Russinovich Made DOOM Work in Paint
While the concept of “every frame goes to the clipboard and gets pasted” might sound simple, executing this process dozens of times per second without causing Paint to crash is a significant technical challenge.

Paint reads the clipboard asynchronously, following its own schedule. The conventional method of clearing and updating the clipboard using EmptyClipboard and SetClipboardData can cause issues. If the clipboard is emptied while Paint is still reading the previous frame, the process fails, leading to a modal error dialog that halts the game.
Russinovich resolved this issue by avoiding constant rewriting of the clipboard. Instead, DoomPaint uses a reference-counted OLE data object, created through OleSetClipboard, to maintain clipboard ownership. This object provides frame data on demand via the GetData call, ensuring that ongoing reads remain stable. Each GetData call also serves as a signal to the game engine, prompting it to publish the next frame only after Paint confirms the previous one has been read.
To initiate the paste operation, DoomPaint tests two methods at startup. The preferred approach uses a synthetic Ctrl+V keystroke, which avoids triggering menu actions and interfering with gameplay. If this method fails—due to some Paint builds ignoring synthetic input—the project defaults to using Paint’s UI Automation menu, which is slower but more compatible. Each new frame paste automatically commits the previous one as a permanent step in Paint’s undo history, eliminating the need for separate commit actions.
Preventing gameplay keys from inadvertently interacting with Paint’s UI required a low-level Windows keyboard hook (WH_KEYBOARD_LL). This hook intercepts key presses during gameplay to ensure they do not interfere with Paint’s operations. Without this safeguard, accidental key presses could disrupt the paste process and stall the game.
Sound effects are delivered through OpenAL, with Russinovich upgrading to OpenAL-Soft 1.24 for improved audio device handling. Music playback relies on a separate module that extracts raw data from the WAD file, converts it to MIDI if necessary, and plays it via the Windows MIDI sequencer. The project also addresses a common Windows audio bug where devices silently fail to produce sound, implementing a self-healing mechanism that resets the sound system if issues are detected.
Fable 5’s Role and the Future of Software Development
In a LinkedIn post, Russinovich revealed that DoomPaint was built using Claude Fable 5, an AI model he had already been employing for serious research. He described the project as something he created “for fun” in a single morning. The GitHub commit history shows that AI coding tools contributed significantly to the project.
Despite being a lighthearted experiment, DoomPaint required solving real-world challenges, including handling race conditions in Windows, reverse-engineering Paint’s clipboard behavior, and addressing an audio driver bug. This project exemplifies how AI models are increasingly capable of assisting in complex engineering tasks, a trend MS has been heavily investing in. Yusuf Mehdi, in his final year at MS, has committed to advancing the integration of AI into engineering workflows.
Windows Latest depends on readers like you. Make us your preferred source on Google Discover and Google Search, and help our independent reporting reach more people.

