Will Dart Run DOOM?

Yes, and Here's How We Vibe Coded It

Lee Higgins ·

For years, the question “But can it run DOOM?” has been the ultimate test of any computing platform. It’s a meme, sure, but it’s also a genuine benchmark of capability. So when we decided to push Dart to its limits, there was really only one question worth asking.

Play It Now

This is not a video — press ESC to interact or view fullscreen.

What “Pure Dart” Actually Means

When we say “pure Dart,” we mean it. No FFI calls to C libraries. No WebAssembly escape hatches. No cheating with platform-specific rendering. Just Dart code, running the actual DOOM rendering pipeline.

This wasn’t about proving Dart is the best language for games. It’s about understanding what’s possible when you commit to a constraint and see it through.

Core Architecture

The project split into three packages:

  • doom_core — Pure Dart engine
  • doom_math — Fixed-point arithmetic
  • doom_wad — File parsing

Flutter serves as a display shell rather than the computational engine.

Technical Achievements

  • BSP traversal and wall rendering entirely in Dart
  • Fixed-point mathematics matching 1993 constraints
  • Binary Angle Measurement (BAM) system for angle arithmetic
  • Original DOOM demo playback capability (mostly working)
  • Multiple CRT shader display modes via GPU acceleration

Understanding DOOM’s Rendering

DOOM’s rendering engine is a masterpiece of 1990s engineering. It uses a technique called Binary Space Partitioning (BSP) to efficiently determine what’s visible from the player’s viewpoint. The entire game world is divided into convex subsectors, and the engine traverses this tree structure to render walls, floors, and ceilings.

The key insight is that DOOM isn’t truly 3D—it’s 2.5D. The maps are fundamentally 2D with height information. This constraint, which seemed limiting in 1993, turns out to make the rendering mathematically elegant.

Vibe Coding

We developed this through “vibe coding” — collaborative development with Claude AI. The process emphasized verification systems, clear prompts, and human insight into why original code used specific approaches.

Current Limitations

Demo playback still desynchronizes after several minutes, and audio remains unimplemented.

What’s Next

A visual level editor and an ambitious vision for a retro multiplayer experience.

Reflections

Building DOOM in Dart taught us more about both technologies than any tutorial could. DOOM’s engine reveals just how much you can accomplish with clever algorithms and deep understanding of your constraints. Dart proved it can handle computationally intensive tasks when you work with, rather than against, its strengths.

I finally understand the DOOM rendering magic that puzzled me as a teenager. The real lesson isn’t that Dart can run DOOM—it’s that constraints breed creativity, and understanding fundamentals never goes out of style.

Want to work with us?

We build production software with human + agent teams.