<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Artem Amirkhanian</title>
    <description>The latest articles on DEV Community by Artem Amirkhanian (@amirkhanian).</description>
    <link>https://dev.to/amirkhanian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4174923%2F84e8a1ee-354e-4c22-a65f-4b9f22fe0ca1.webp</url>
      <title>DEV Community: Artem Amirkhanian</title>
      <link>https://dev.to/amirkhanian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amirkhanian"/>
    <language>en</language>
    <item>
      <title>I can't code. I built a 30,000-plot 3D city in seven weeks with Claude. Here's what broke.</title>
      <dc:creator>Artem Amirkhanian</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:37:56 +0000</pubDate>
      <link>https://dev.to/pixelrealestate/i-cant-code-i-built-a-30000-plot-3d-city-in-seven-weeks-with-claude-heres-what-broke-53a4</link>
      <guid>https://dev.to/pixelrealestate/i-cant-code-i-built-a-30000-plot-3d-city-in-seven-weeks-with-claude-heres-what-broke-53a4</guid>
      <description>&lt;p&gt;I'm not a developer. I've never written a function by hand. Over about seven weeks I built &lt;a href="https://pixelrealestate.homes/?from=devto" rel="noopener noreferrer"&gt;pixelrealestate.homes&lt;/a&gt;: 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.&lt;/p&gt;

&lt;p&gt;All the code was written by Claude. My job was describing what I wanted, clicking through the result, and saying "no, that's wrong" a lot. This post is the honest version: what the thing is, what went wrong, and what I learned about building with AI when you can't read the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgf9qou8c2jicyjsv8wpj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgf9qou8c2jicyjsv8wpj.gif" alt="Slow fly-over of a dense 3D city at sunset, labelled: Preview, the city once all plots are taken" width="480" height="270"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Preview render: the city once all 30,000 plots are taken. Today there are 8 houses.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What it is
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A 202×202 grid. Minus roads, parks and civic buildings, that leaves exactly 30,000 plots.&lt;/li&gt;
&lt;li&gt;5 districts in rings, from Outer Ring to Core District. Edge plots start at $50, the centre goes up to a few thousand.&lt;/li&gt;
&lt;li&gt;Prices aren't set by hand. One formula: distance from the centre plus how much of the district is already taken.&lt;/li&gt;
&lt;li&gt;Claim a plot and you get a building, a card with your name/link/description, a certificate with a QR code at a permanent URL, a share image, and a view/click counter. Edits are free.&lt;/li&gt;
&lt;li&gt;You can try your picture on a roof for free first. Nothing gets uploaded, no sign-up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyk5twtcauxytk918qe3z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyk5twtcauxytk918qe3z.jpg" alt="A billboard that says YOUR PICTURE on the roof of a small lit house next to a Market Hall, at dusk" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Trying a picture: the camera flies to a free plot and puts it on the roof. Only you see it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stack: three.js, Netlify functions, Supabase (Postgres + auth), Resend for email, Dodo Payments for checkout.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 3D part
&lt;/h3&gt;

&lt;p&gt;The city is one three.js scene sized for all 30,000 plots. Buildings are instanced (one InstancedMesh per material and shape), so even the fully built preview is a few dozen draw calls. Each district has a height band, and the random spread is skewed low, so most buildings sit near the bottom of their band and only a few reach the top. That's what makes a skyline instead of an even carpet. There are 10 building shapes (courtyard, cross, L-shape, setback and so on), and empty plots get one of 8 ground types picked by noise.&lt;/p&gt;

&lt;p&gt;Things that broke along the way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shadows.&lt;/strong&gt; One directional light with a shadow camera covering the whole city. Zoomed out it looked fine. Zoomed in, every shadow edge was a staircase, because one shadow texel covered about 3 screen pixels. The fix: the shadow box follows the camera in a few fixed sizes and snaps to texels, so edges don't crawl when you move. Phones get no real-time shadows at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first-frame freeze.&lt;/strong&gt; Opening the 3D view froze the page for seconds. The cause: shader compilation (~4 s) and the bloom post-processing pass on the very first frame. On top of that, the city was rendering at 60 fps &lt;em&gt;underneath&lt;/em&gt; the hero video, which is why the video stuttered. Main-thread time went from about 20 s to 7 s once the city only renders when it's actually visible and warms up in idle time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows.&lt;/strong&gt; At one point I noticed every building had exactly 32 rows of windows, whatever its height. A two-storey house at the edge looked like a ten-storey tower with a little hat on top. The window texture just didn't know how tall the building was.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0i7you7zum47z5i2yczs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0i7you7zum47z5i2yczs.jpg" alt="Sunset-lit towers with rows of lit windows, labelled as a preview" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Now the windows follow each building's height.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The bugs that actually cost me
&lt;/h3&gt;

&lt;p&gt;The 3D bugs were visible. The expensive ones weren't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The waitlist nobody could reach.&lt;/strong&gt; Before payments were live, I had a waitlist. 755 visits, 1 signup. I assumed nobody cared. Then we found the real reason: a visitor who clicked "Buy" got a &lt;em&gt;login form&lt;/em&gt;. The waitlist panel sat behind a check that only logged-in users ever passed. The server side was fine the whole time. The button just never led there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drag-and-drop deploys.&lt;/strong&gt; Uploading files to GitHub by dragging them into Chrome on Windows once mixed up names and contents. The URL for &lt;code&gt;city3d.js&lt;/code&gt; was serving the contents of &lt;code&gt;admin.html&lt;/code&gt;. I only caught it by comparing checksums of every file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images.&lt;/strong&gt; Owners' pictures were loading at full size: about 1.75 MB per visitor, on a free database plan with 5 GB of monthly traffic. Serving resized thumbnails through Netlify's image CDN cut that to about 0.23 MB.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned about building with AI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The model is confidently wrong in ways I can't catch by reading code.&lt;/strong&gt; I can't read code. So I learned to check results instead: open the live page, click through it on my phone, ask for the actual server response, not a summary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even the checking can lie.&lt;/strong&gt; Once Claude told me the image CDN was broken. It turned out only its own fetch tool was getting a 400. Real browsers were fine. Now every live check happens in a real browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale copies are dangerous.&lt;/strong&gt; Once a whole code review was done on an old copy of the files, and it reported bugs that were already fixed. Now every change starts by comparing against what's actually deployed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second pair of eyes, every time.&lt;/strong&gt; Before each deploy a separate AI agent with no context reviews the change. It catches something almost every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask "is this already there?" before building.&lt;/strong&gt; I asked for a feature that had already existed for days, and got it built twice.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Where it is now
&lt;/h3&gt;

&lt;p&gt;Honestly: 8 houses on the map, and all 8 are plots I gave away so people could test the whole flow. Nobody I don't know has bought one yet. Getting a payment provider to approve a solo project took weeks, and the first one said no.&lt;/p&gt;

&lt;p&gt;So I'd love blunt feedback. Does the 3D run OK on your machine? Is "flat map to buy, 3D city to look at" clear? What would make you want a plot, and what puts you off?&lt;/p&gt;

&lt;p&gt;You can fly straight to a house with a link like &lt;a href="https://pixelrealestate.homes/#fly-69-113" rel="noopener noreferrer"&gt;pixelrealestate.homes/#fly-69-113&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: Claude drafted this post from our work log, and I approved it before posting.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>threejs</category>
      <category>ai</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
