<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq" -->

---
title: Hello, my name is Niels Leenheer | daily.dev
description: A developer built a fully playable DOOM renderer using only CSS for rendering, with JavaScript handling only the game loop. Every wall, floor, sprite, and...
canonical: https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Hello, my name is Niels Leenheer | daily.dev
og:description: A developer built a fully playable DOOM renderer using only CSS for rendering, with JavaScript handling only the game loop. Every wall, floor, sprite, and...
og:url: https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq
og:image: https://api.daily.dev/og/posts/1KfzJqNuq.png
og:image:alt: Hello, my name is Niels Leenheer
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Hello, my name is Niels Leenheer

**[Hacker News](https://daily.dev/sources/hn)** · 24 min read · 69 upvotes · 7 comments

## Summary

A developer built a fully playable DOOM renderer using only CSS for rendering, with JavaScript handling only the game loop. Every wall, floor, sprite, and enemy is a <div> positioned in 3D space using CSS transforms. The project showcases advanced CSS features including 3D transforms with trig functions (hypot, atan2, sin, cos), @property for animatable custom properties, clip-path with shape() for irregular polygon floors, SVG filters for the spectre invisibility effect, anchor positioning for the responsive HUD, and a type-grinding hack for pure-CSS culling. Key architectural decisions include passing raw DOOM coordinates as CSS custom properties and letting CSS compute geometry, moving the world instead of a camera, and using CSS transitions/animations for doors, lifts, and projectiles. The post details browser bugs encountered in Safari and Chrome, performance limitations requiring manual culling, and depth-sorting challenges with coplanar surfaces.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://nielsleenheer.com/articles/2026/css-is-doomed-rendering-doom-in-3d-with-css/>

## Community discussion

Top comments from developers on daily.dev.

**@danjuniormarinho** · 2 upvotes

> Amazing, this must be my favorite project of this year.
> Congrats

**@pduran** · 0 upvotes

> Complete awesomeness!

**@markr** · 0 upvotes

> You beat me to it! I am about halfway through the process, love how you have mimicked the movement, feels just like the original. Amazing job!!!!

**@alexeyzerkalenkov** · 0 upvotes

> My full respect to the author!

**@niemann** · 0 upvotes

> well done

## Similar posts on daily.dev

- [Crafting Generative CSS Worlds](https://daily.dev/posts/crafting-generative-css-worlds-txipt46sc) · Codrops · 4 upvotes · 0 comments
- [3D CSS, from Super Mario Bros 3 to Mario 64](https://daily.dev/posts/3d-css-from-super-mario-bros-3-to-mario-64-wffpiq4wt) · Creative Design Technologist · 32 upvotes · 8 comments
- [DOOM runs in ChatGPT and Claude / Blog](https://daily.dev/posts/doom-runs-in-chatgpt-and-claude-blog-8ubvlkaoz) · Hacker News · 0 upvotes · 0 comments
- [Creating 3D text engine in the browser](https://daily.dev/posts/creating-3d-text-engine-in-the-browser-9zfk5d8hf) · ITNEXT · 48 upvotes · 5 comments

---

Tags: [#webdev](https://daily.dev/tags/webdev), [#css](https://daily.dev/tags/css)

[View this post on daily.dev](https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Hello, my name is Niels Leenheer","url":"https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq"},"datePublished":"2026-03-28T22:57:32.406Z","dateModified":"2026-03-28T22:58:03.272Z","description":"A developer built a fully playable DOOM renderer using only CSS for rendering, with JavaScript handling only the game loop. Every wall, floor, sprite, and...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/714023ae54fa44847322770a2099e339?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/714023ae54fa44847322770a2099e339?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Hacker News","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Hacker News","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/hn","url":"https://daily.dev/sources/hn"},"commentCount":7,"discussionUrl":"https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":69},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":7}],"keywords":"webdev,css","timeRequired":"PT24M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Hacker News","item":"https://daily.dev/sources/hn"},{"@type":"ListItem","position":3,"name":"Hello, my name is Niels Leenheer"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/hello-my-name-is-niels-leenheer-1kfzjqnuq","comment":[{"@type":"Comment","text":"Amazing, this must be my favorite project of this year.\nCongrats","datePublished":"2026-04-01T12:05:44.810Z","url":"https://daily.dev/posts/1KfzJqNuq#c-7u21V5dSj","author":{"@type":"Person","name":"Danniel Marinho","url":"https://daily.dev/danjuniormarinho","image":"https://media.daily.dev/image/upload/s--jPvbNNGz--/f_auto/v1775126651/avatars/avatar_BHFCv2u2f59SDi4FPjHhJ?_a=BAMAMiWQ0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2}},{"@type":"Comment","text":"Complete awesomeness!","datePublished":"2026-04-03T19:47:34.356Z","url":"https://daily.dev/posts/1KfzJqNuq#c-X127oPd6R","author":{"@type":"Person","name":"PDuran","url":"https://daily.dev/pduran","image":"https://lh3.googleusercontent.com/a/AGNmyxaVPrJj1W2xhfX6Rk8-fklbwM0wUdyaa0j6bvJD=s96-c"}},{"@type":"Comment","text":"You beat me to it! I am about halfway through the process, love how you have mimicked the movement, feels just like the original. Amazing job!!!","datePublished":"2026-04-04T15:27:42.293Z","url":"https://daily.dev/posts/1KfzJqNuq#c-8YEKDpVKY","author":{"@type":"Person","name":"Mark R","url":"https://daily.dev/markr","image":"https://lh3.googleusercontent.com/a/ACg8ocLHWRfbfR9kVoGBGx0hFQHRqd2RtzFArrQrINZYfL4eACwbMUQ=s96-c"}},{"@type":"Comment","text":"My full respect to the author!","datePublished":"2026-06-15T17:39:56.021Z","url":"https://daily.dev/posts/1KfzJqNuq#c-qpnruJGcQ","author":{"@type":"Person","name":"Alexey Zerkalenkov","url":"https://daily.dev/alexeyzerkalenkov","image":"https://lh3.googleusercontent.com/a/ACg8ocKQBwPwaHC4XrPy0rniDybogCxlwDp7QCLkbwsqNRQSFhqDIlIf=s96-c"}},{"@type":"Comment","text":"well done","datePublished":"2026-04-01T22:14:58.061Z","url":"https://daily.dev/posts/1KfzJqNuq#c-LEREEPqZf","author":{"@type":"Person","name":"DNH","url":"https://daily.dev/niemann","image":"https://avatars.githubusercontent.com/u/3074491?v=4"}}]}
```

