{
  "id": 13386394,
  "title": "I can't code. I built a 30,000-plot 3D city in seven weeks with Claude. Here's what broke.",
  "url": "https://urgent.news/2026/10/10/i-cant-code-i-built-a-30-000-plot-3d-city-in-seven-weeks-with-claude",
  "topic": "ai",
  "section": "AI",
  "published": "2026-10-10T10:37:56.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/pixelrealestate/i-cant-code-i-built-a-30000-plot-3d-city-in-seven-weeks-with-claude-heres-what-broke-53a4"
  },
  "original_language": "en",
  "account": "I am not a developer, nor have I ever written a function by hand. Over the course of seven weeks, I built pixelrealestate.homes, a shared map of 30,000 plots, with each plot transforming into a building in a three.js city that can be explored. The owner's picture appears on a billboard on the roof. All the code was written by Claude, while I described what I wanted, clicked through the results, and corrected errors frequently. This post provides an honest account of what the project is, what went wrong, and what I learned about building with AI when you can't read the code.\n\nA 202×202 grid constitutes the city, excluding roads, parks, and civic buildings, leaving precisely 30,000 plots. The layout comprises five districts arranged in rings, ranging from the Outer Ring to the Core District. Edge plots range from $50 to a few thousand dollars. Prices are not determined manually; instead, they are calculated using a formula that considers the distance from the center and the extent of district occupancy. Claiming a plot results in ownership of a building, a card featuring your name, link, and description, a certificate containing a QR code, a share image, and a view/click counter. The process is editable, allowing you to try your picture on a roof for free before making it permanent. No sign-up is required, and trying a picture involves a camera flying to a free plot and placing it on the roof for just you to see.\n\nThe city operates as a single three.js scene, encompassing all 30,000 plots. Buildings are instanced, meaning one InstancedMesh per material and shape is utilized. This approach results in a few dozen draw calls, even when the city is fully built, resulting in a few dozen draw calls. Each district features a height band, and the random spread is skewed low, causing most buildings to reside near the bottom of their band and only a few reaching the top. This differentiation creates a skyline rather than an even expanse. There are ten building shapes (courtyard, cross, L-shape, setback, and so on), and empty plots are assigned one of eight ground types, determined by noise.\n\nSeveral issues arose during the project's development:\n\n1. Shadows: A single directional light was employed with a shadow camera spanning the entire city. While the shadows appeared fine when viewed from a distance, zooming in revealed staircases due to one shadow texel covering approximately three screen pixels. To rectify this, the shadow box followed the camera in a few fixed sizes and snapped to texels, eliminating the staircases when moving around.\n\n2. First-frame freeze: Initiating the 3D view froze the page for several seconds. This issue stemmed from shader compilation (approximately 4 seconds) and the bloom post-processing pass occurring on the first frame. Additionally, the city was rendering at 60 frames per second beneath a hero video, which led to video stuttering. To tackle this, rendering only transpired when the city was visible, and warming up in idle time reduced main-thread time from approximately 20 seconds to 7 seconds.\n\n3. Windows: Initially, every building showcased 32 rows of windows, irrespective of its height, resulting in a two-storey house at the edge resembling a ten-storey tower with a small hat atop it. To address this, windows now conform to each building's height.\n\nBeyond the aforementioned 3D bugs, there existed costlier issues that went unnoticed due to the lack of code review:\n\n1. The waitlist encountered a significant problem: nobody could reach it before payments became available. A visitor who clicked the Buy button was met with a login form. Although the server-side functionality was intact, the button failed to direct users to the correct location. This oversight was due to the login check only being triggered for logged-in users. Furthermore, a drag-and-drop deployment process on Windows resulted in a mishap where the city3d.js file was inadvertently replaced with the admin.html file. The error was only identified by comparing checksums of all files.\n\n2. Image dimensions: Owners' pictures were loading at full size, approximately 1.75 MB per visitor, on a free database plan with a 5 GB monthly traffic limit. Implementing resized thumbnails through Netlify's image CDN reduced the image size to about 0.23 MB, a substantial improvement.\n\nDespite the 3D bugs and other challenges, the project is currently limited to eight houses, all of which were given away to facilitate testing the entire workflow. None of these houses have been purchased by anyone besides myself. Obtaining approval from a payment provider for a solo project took several weeks, and the initial provider declined the request. Consequently, I am eager for constructive feedback regarding the 3D rendering's performance on various machines, the clarity of the distinction between a flat map for purchase and a 3D city for viewing, and the factors that would entice someone to acquire a plot while also identifying potential deterrents. You can instantly navigate to a house using a link like pixelrealestate.homes/#fly-69-113.",
  "summary": "I'm not a developer. I've never written a function by hand. Over about seven weeks I built pixelrealestate.homes : one shared map of 30,000 plots where every plot someone claims turns into a building in a three.js city you can fly around. The owner's picture goes on a billboard on the roof. All the code was written by Claude. My job was describing what I wanted, clicking through the result, and…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 4,
    "also_reported_by": [
      {
        "outlet": "XDA Developers",
        "title": "I connected Claude Code to Mermaid, and it replaced every diagramming app I ever used",
        "url": "https://urgent.news/2026/10/07/i-connected-claude-code-to-mermaid-and-it-replaced-every-diagramming",
        "published": "2026-10-07T21:30:18.000Z"
      },
      {
        "outlet": "Dev.to",
        "title": "Claude Code read a file listed in .claudeignore 12 of 12 times; a Read deny rule blocked every read except grep -r",
        "url": "https://urgent.news/2026/10/08/claude-code-read-a-file-listed-in-claudeignore-12-of-12-times-a-read",
        "published": "2026-10-08T02:17:00.000Z"
      },
      {
        "outlet": "Hacker News Best",
        "title": "I think I found a planet nobody knew existed. I used Claude Code to find it",
        "url": "https://urgent.news/2026/10/08/i-think-i-found-a-planet-nobody-knew-existed-i-used-claude-code-to",
        "published": "2026-10-08T07:07:34.000Z"
      }
    ]
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}