<?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: Meltflex Sales</title>
    <description>The latest articles on DEV Community by Meltflex Sales (@meltflex_sales_421e71a49f).</description>
    <link>https://dev.to/meltflex_sales_421e71a49f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3783940%2Fe823b412-31e9-4c89-a8ef-04fe5efa8fec.jpg</url>
      <title>DEV Community: Meltflex Sales</title>
      <link>https://dev.to/meltflex_sales_421e71a49f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meltflex_sales_421e71a49f"/>
    <language>en</language>
    <item>
      <title>Tool That Converts Floor Plans to Furnitized Apartment — Here's How It Works Under the Hood</title>
      <dc:creator>Meltflex Sales</dc:creator>
      <pubDate>Sat, 21 Feb 2026 13:15:08 +0000</pubDate>
      <link>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-dlc</link>
      <guid>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-dlc</guid>
      <description>&lt;p&gt;We spent the last year building &lt;a href="https://www.meltflex.tech" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; — a free AI interior design tool that takes any 2D floor plan and converts it&lt;br&gt;
  into an interactive 3D model where you can place real furniture, customize materials, and generate photorealistic renders.&lt;/p&gt;

&lt;p&gt;In this post, I'll break down the technical architecture: how the AI processes floor plans, how we render interactive 3D scenes in the browser, and&lt;br&gt;
  what we learned shipping a WebGL-heavy product.&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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fliving-room-interior-design-ai-render.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fliving-room-interior-design-ai-render.png" alt="MeltFlex 3D interior design" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## The Problem&lt;/p&gt;

&lt;p&gt;Interior design is broken for regular people. You move into a new apartment, stare at an empty room, and have no idea if that sofa you're eyeing will&lt;br&gt;
  actually fit. Professional interior designers charge thousands. Most room planner tools require you to manually draw walls, measure everything, and&lt;br&gt;
  place generic 3D blocks.&lt;/p&gt;

&lt;p&gt;We wanted something simpler — upload a floor plan photo, get a 3D model, place real furniture, see photorealistic renders.&lt;/p&gt;




&lt;p&gt;## Architecture Overview&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; — Next.js + Three.js (WebGL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Pipeline&lt;/strong&gt; — Python (OpenCV, Potrace, custom ML models)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Rendering&lt;/strong&gt; — Three.js with custom materials, lighting, and camera systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Renders&lt;/strong&gt; — Photorealistic image generation from 3D scene data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; — Supabase (auth, storage, database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; — Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how each piece works.&lt;/p&gt;




&lt;p&gt;## Step 1: Floor Plan to Vector Geometry&lt;/p&gt;

&lt;p&gt;When a user uploads a floor plan — an architect drawing, a hand sketch, or a photo from a real estate listing — our AI pipeline kicks in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wall Detection&lt;/strong&gt; — A vision model identifies walls, doors, windows, and room boundaries from the 2D image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vectorization&lt;/strong&gt; — Detected geometry is converted to clean vector paths using Potrace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room Segmentation&lt;/strong&gt; — The AI identifies individual rooms and classifies them (living room, bedroom, kitchen)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Model Generation&lt;/strong&gt; — Vector geometry is extruded into a GLB model with proper wall heights, door/window cutouts, and room metadata&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trickiest part was coordinate systems. Potrace outputs SVGs with an inverted Y-axis and path extraction libraries don't apply group transforms. We&lt;br&gt;
   had to manually convert between pixel space, SVG space, and 3D world space.&lt;/p&gt;

&lt;p&gt;Off-by-one errors in 2D become off-by-a-whole-room errors in 3D. Document your coordinate transforms religiously.&lt;/p&gt;




&lt;p&gt;## Step 2: Interactive 3D Scene with Three.js&lt;/p&gt;

&lt;p&gt;The generated GLB model loads into a Three.js scene in the browser. This is where it gets interesting.&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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fapartment-floor-plan-3d-top-view.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fapartment-floor-plan-3d-top-view.png" alt="3D floor plan view" width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;### Performance Optimization&lt;/p&gt;

&lt;p&gt;The scene can have hundreds of meshes with high-res textures. We needed it smooth on both desktop and mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texture pipeline&lt;/strong&gt; was the biggest win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original 4K textures — 2-4 MB — never sent to client&lt;/li&gt;
&lt;li&gt;1024px render — 100-300 KB — used for 3D scene&lt;/li&gt;
&lt;li&gt;200px thumbnail — 10-30 KB — used for UI picker grid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cut initial load by around 80% with no visible quality loss.&lt;/p&gt;

&lt;p&gt;Other key optimizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imperative updates only&lt;/strong&gt; — React state changes don't trigger re-renders of the 3D scene. All texture and material changes happen through refs,
not props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAF-throttled resize&lt;/strong&gt; — Every resize listener uses requestAnimationFrame to prevent layout thrashing on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS animations over JS&lt;/strong&gt; — Spinners and loading states use pure CSS keyframes to avoid rAF leaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### Material Application&lt;/p&gt;

&lt;p&gt;When a user selects a floor texture or door material, we traverse the scene graph and apply materials directly to matching meshes.&lt;/p&gt;

&lt;p&gt;Door-to-room assignment is spatial. When a user changes door texture for a room, we find which doors belong to that room using point-in-polygon and&lt;br&gt;
  distance-to-edge algorithms with a 1.5 unit tolerance.&lt;/p&gt;




&lt;p&gt;## Step 3: Real Furniture Placement&lt;/p&gt;

&lt;p&gt;This is what makes &lt;a href="https://www.meltflex.tech/products" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; different from other room planners — every piece of furniture is a real product from&lt;br&gt;
   real brands with real prices.&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%2Fwww.meltflex.tech%2Fblog%2Fblog7%2Fhouse-interior-design-shoppable-living-room.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%2Fwww.meltflex.tech%2Fblog%2Fblog7%2Fhouse-interior-design-shoppable-living-room.jpg" alt="Shoppable living room" width="800" height="1065"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We load furniture as GLB models from our catalog. Each model has accurate real-world dimensions, PBR materials, and product metadata including price,&lt;br&gt;
  brand, and purchase link.&lt;/p&gt;

&lt;p&gt;Users drag furniture into rooms, rotate and position it, and see exactly how it fits. The shopping cart updates in real-time — what you see is what&lt;br&gt;
  you can buy.&lt;/p&gt;




&lt;p&gt;## Step 4: Photorealistic AI Renders&lt;/p&gt;

&lt;p&gt;Once the user has furnished their rooms, they can generate photorealistic renders. The AI takes the 3D scene data — camera position, furniture&lt;br&gt;
  placement, materials, lighting — and produces images that look like professional interior photography.&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%2Fwww.meltflex.tech%2Fblog%2Fblog6%2Fbedroom-interior-design-ai-render.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog6%2Fbedroom-interior-design-ai-render.png" alt="AI photorealistic render" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every piece of furniture in the render is the actual product the user placed. No fake mockups.&lt;/p&gt;




&lt;p&gt;## React 19 + Three.js: Lessons Learned&lt;/p&gt;

&lt;p&gt;### The ref problem&lt;/p&gt;

&lt;p&gt;React 19's memo(forwardRef()) pattern can lose ref.current after re-renders. Our 3D scene component uses this pattern, and we kept getting null refs&lt;br&gt;
  when trying to call imperative methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; — Event-based communication using CustomEvent that bypasses ref forwarding entirely. The Three.js component listens for events&lt;br&gt;
  internally. No refs needed.&lt;/p&gt;

&lt;p&gt;### The mobile resize loop&lt;/p&gt;

&lt;p&gt;Our first mobile version had a catastrophic bug — dispatching a resize event from inside a resize listener created an infinite loop. Combined with rAF&lt;br&gt;
   leaks from inline ref callbacks, it drained battery in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; — RAF-throttled listeners plus CSS animations for all loading states.&lt;/p&gt;

&lt;p&gt;### Texture size kills mobile&lt;/p&gt;

&lt;p&gt;Serving 4K textures to mobile browsers is a dealbreaker. Our three-tier optimization pipeline solved it. The Supabase image transform API handles&lt;br&gt;
  resizing server-side, so the client only downloads what it needs.&lt;/p&gt;




&lt;p&gt;## What's Next&lt;/p&gt;

&lt;p&gt;We're working on improved room type detection (currently around 50% accuracy), a larger furniture catalog with more brands, better mobile 3D&lt;br&gt;
  interaction, and more texture options for walls, floors, and doors.&lt;/p&gt;




&lt;p&gt;## Try It&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.meltflex.tech/create" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; is free. Upload a floor plan, get a 3D model, furnish it with real products, and generate photorealistic&lt;br&gt;
  renders.&lt;/p&gt;

&lt;p&gt;If you're building anything with Three.js, WebGL, or AI + 3D — I'd love to hear about your approach. What rendering challenges have you run into?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More on AI interior design:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/how-to-design-your-home-with-ai" rel="noopener noreferrer"&gt;How to Design Your Home with AI in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/living-room-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Living Room Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/bedroom-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Bedroom Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/house-interior-design-guide-ai" rel="noopener noreferrer"&gt;House Interior Design Guide&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.JPG" alt=" " width="800" height="1065"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.JPG" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." 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/..." alt="Uploading image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tool That Converts Floor Plans to Furnitized Apartment — Here's How It Works Under the Hood</title>
      <dc:creator>Meltflex Sales</dc:creator>
      <pubDate>Sat, 21 Feb 2026 13:15:08 +0000</pubDate>
      <link>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-5c64</link>
      <guid>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-5c64</guid>
      <description>&lt;p&gt;We spent the last year building &lt;a href="https://www.meltflex.tech" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; — a free AI interior design tool that takes any 2D floor plan and converts it&lt;br&gt;
  into an interactive 3D model where you can place real furniture, customize materials, and generate photorealistic renders.&lt;/p&gt;

&lt;p&gt;In this post, I'll break down the technical architecture: how the AI processes floor plans, how we render interactive 3D scenes in the browser, and&lt;br&gt;
  what we learned shipping a WebGL-heavy product.&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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fliving-room-interior-design-ai-render.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fliving-room-interior-design-ai-render.png" alt="MeltFlex 3D interior design" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## The Problem&lt;/p&gt;

&lt;p&gt;Interior design is broken for regular people. You move into a new apartment, stare at an empty room, and have no idea if that sofa you're eyeing will&lt;br&gt;
  actually fit. Professional interior designers charge thousands. Most room planner tools require you to manually draw walls, measure everything, and&lt;br&gt;
  place generic 3D blocks.&lt;/p&gt;

&lt;p&gt;We wanted something simpler — upload a floor plan photo, get a 3D model, place real furniture, see photorealistic renders.&lt;/p&gt;




&lt;p&gt;## Architecture Overview&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; — Next.js + Three.js (WebGL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Pipeline&lt;/strong&gt; — Python (OpenCV, Potrace, custom ML models)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Rendering&lt;/strong&gt; — Three.js with custom materials, lighting, and camera systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Renders&lt;/strong&gt; — Photorealistic image generation from 3D scene data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; — Supabase (auth, storage, database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; — Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how each piece works.&lt;/p&gt;




&lt;p&gt;## Step 1: Floor Plan to Vector Geometry&lt;/p&gt;

&lt;p&gt;When a user uploads a floor plan — an architect drawing, a hand sketch, or a photo from a real estate listing — our AI pipeline kicks in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wall Detection&lt;/strong&gt; — A vision model identifies walls, doors, windows, and room boundaries from the 2D image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vectorization&lt;/strong&gt; — Detected geometry is converted to clean vector paths using Potrace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room Segmentation&lt;/strong&gt; — The AI identifies individual rooms and classifies them (living room, bedroom, kitchen)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Model Generation&lt;/strong&gt; — Vector geometry is extruded into a GLB model with proper wall heights, door/window cutouts, and room metadata&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trickiest part was coordinate systems. Potrace outputs SVGs with an inverted Y-axis and path extraction libraries don't apply group transforms. We&lt;br&gt;
   had to manually convert between pixel space, SVG space, and 3D world space.&lt;/p&gt;

&lt;p&gt;Off-by-one errors in 2D become off-by-a-whole-room errors in 3D. Document your coordinate transforms religiously.&lt;/p&gt;




&lt;p&gt;## Step 2: Interactive 3D Scene with Three.js&lt;/p&gt;

&lt;p&gt;The generated GLB model loads into a Three.js scene in the browser. This is where it gets interesting.&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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fapartment-floor-plan-3d-top-view.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog5%2Fapartment-floor-plan-3d-top-view.png" alt="3D floor plan view" width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;### Performance Optimization&lt;/p&gt;

&lt;p&gt;The scene can have hundreds of meshes with high-res textures. We needed it smooth on both desktop and mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texture pipeline&lt;/strong&gt; was the biggest win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original 4K textures — 2-4 MB — never sent to client&lt;/li&gt;
&lt;li&gt;1024px render — 100-300 KB — used for 3D scene&lt;/li&gt;
&lt;li&gt;200px thumbnail — 10-30 KB — used for UI picker grid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cut initial load by around 80% with no visible quality loss.&lt;/p&gt;

&lt;p&gt;Other key optimizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imperative updates only&lt;/strong&gt; — React state changes don't trigger re-renders of the 3D scene. All texture and material changes happen through refs,
not props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAF-throttled resize&lt;/strong&gt; — Every resize listener uses requestAnimationFrame to prevent layout thrashing on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS animations over JS&lt;/strong&gt; — Spinners and loading states use pure CSS keyframes to avoid rAF leaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### Material Application&lt;/p&gt;

&lt;p&gt;When a user selects a floor texture or door material, we traverse the scene graph and apply materials directly to matching meshes.&lt;/p&gt;

&lt;p&gt;Door-to-room assignment is spatial. When a user changes door texture for a room, we find which doors belong to that room using point-in-polygon and&lt;br&gt;
  distance-to-edge algorithms with a 1.5 unit tolerance.&lt;/p&gt;




&lt;p&gt;## Step 3: Real Furniture Placement&lt;/p&gt;

&lt;p&gt;This is what makes &lt;a href="https://www.meltflex.tech/products" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; different from other room planners — every piece of furniture is a real product from&lt;br&gt;
   real brands with real prices.&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%2Fwww.meltflex.tech%2Fblog%2Fblog7%2Fhouse-interior-design-shoppable-living-room.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%2Fwww.meltflex.tech%2Fblog%2Fblog7%2Fhouse-interior-design-shoppable-living-room.jpg" alt="Shoppable living room" width="800" height="1065"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We load furniture as GLB models from our catalog. Each model has accurate real-world dimensions, PBR materials, and product metadata including price,&lt;br&gt;
  brand, and purchase link.&lt;/p&gt;

&lt;p&gt;Users drag furniture into rooms, rotate and position it, and see exactly how it fits. The shopping cart updates in real-time — what you see is what&lt;br&gt;
  you can buy.&lt;/p&gt;




&lt;p&gt;## Step 4: Photorealistic AI Renders&lt;/p&gt;

&lt;p&gt;Once the user has furnished their rooms, they can generate photorealistic renders. The AI takes the 3D scene data — camera position, furniture&lt;br&gt;
  placement, materials, lighting — and produces images that look like professional interior photography.&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%2Fwww.meltflex.tech%2Fblog%2Fblog6%2Fbedroom-interior-design-ai-render.png" 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%2Fwww.meltflex.tech%2Fblog%2Fblog6%2Fbedroom-interior-design-ai-render.png" alt="AI photorealistic render" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every piece of furniture in the render is the actual product the user placed. No fake mockups.&lt;/p&gt;




&lt;p&gt;## React 19 + Three.js: Lessons Learned&lt;/p&gt;

&lt;p&gt;### The ref problem&lt;/p&gt;

&lt;p&gt;React 19's memo(forwardRef()) pattern can lose ref.current after re-renders. Our 3D scene component uses this pattern, and we kept getting null refs&lt;br&gt;
  when trying to call imperative methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; — Event-based communication using CustomEvent that bypasses ref forwarding entirely. The Three.js component listens for events&lt;br&gt;
  internally. No refs needed.&lt;/p&gt;

&lt;p&gt;### The mobile resize loop&lt;/p&gt;

&lt;p&gt;Our first mobile version had a catastrophic bug — dispatching a resize event from inside a resize listener created an infinite loop. Combined with rAF&lt;br&gt;
   leaks from inline ref callbacks, it drained battery in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; — RAF-throttled listeners plus CSS animations for all loading states.&lt;/p&gt;

&lt;p&gt;### Texture size kills mobile&lt;/p&gt;

&lt;p&gt;Serving 4K textures to mobile browsers is a dealbreaker. Our three-tier optimization pipeline solved it. The Supabase image transform API handles&lt;br&gt;
  resizing server-side, so the client only downloads what it needs.&lt;/p&gt;




&lt;p&gt;## What's Next&lt;/p&gt;

&lt;p&gt;We're working on improved room type detection (currently around 50% accuracy), a larger furniture catalog with more brands, better mobile 3D&lt;br&gt;
  interaction, and more texture options for walls, floors, and doors.&lt;/p&gt;




&lt;p&gt;## Try It&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.meltflex.tech/create" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; is free. Upload a floor plan, get a 3D model, furnish it with real products, and generate photorealistic&lt;br&gt;
  renders.&lt;/p&gt;

&lt;p&gt;If you're building anything with Three.js, WebGL, or AI + 3D — I'd love to hear about your approach. What rendering challenges have you run into?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More on AI interior design:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/how-to-design-your-home-with-ai" rel="noopener noreferrer"&gt;How to Design Your Home with AI in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/living-room-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Living Room Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/bedroom-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Bedroom Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/house-interior-design-guide-ai" rel="noopener noreferrer"&gt;House Interior Design Guide&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.JPG" alt=" " width="800" height="1065"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.JPG" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." 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/..." alt="Uploading image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tool That Converts Floor Plans to Furnitized Apartment — Here's How It Works Under the Hood</title>
      <dc:creator>Meltflex Sales</dc:creator>
      <pubDate>Sat, 21 Feb 2026 13:15:08 +0000</pubDate>
      <link>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-2mnp</link>
      <guid>https://dev.to/meltflex_sales_421e71a49f/tool-that-converts-floor-plans-to-furnitized-apartment-heres-how-it-works-under-the-hood-2mnp</guid>
      <description>&lt;p&gt;We spent the last year building &lt;a href="https://www.meltflex.tech" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; — a free AI interior design tool that takes any 2D floor plan and converts it&lt;br&gt;
  into an interactive 3D model where you can place real furniture, customize materials, and generate photorealistic renders.&lt;/p&gt;

&lt;p&gt;In this post, I'll break down the technical architecture: how the AI processes floor plans, how we render interactive 3D scenes in the browser, and&lt;br&gt;
  what we learned shipping a WebGL-heavy product.&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.amazonaws.com%2Fuploads%2Farticles%2F501xev7s9fwj24voi5us.png" 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.amazonaws.com%2Fuploads%2Farticles%2F501xev7s9fwj24voi5us.png" alt="MeltFlex 3D interior design" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## The Problem&lt;/p&gt;

&lt;p&gt;Interior design is broken for regular people. You move into a new apartment, stare at an empty room, and have no idea if that sofa you're eyeing will&lt;br&gt;
  actually fit. Professional interior designers charge thousands. Most room planner tools require you to manually draw walls, measure everything, and&lt;br&gt;
  place generic 3D blocks.&lt;/p&gt;

&lt;p&gt;We wanted something simpler — upload a floor plan photo, get a 3D model, place real furniture, see photorealistic renders.&lt;/p&gt;




&lt;p&gt;## Architecture Overview&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; — Next.js + Three.js (WebGL)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Pipeline&lt;/strong&gt; — Python (OpenCV, Potrace, custom ML models)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Rendering&lt;/strong&gt; — Three.js with custom materials, lighting, and camera systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Renders&lt;/strong&gt; — Photorealistic image generation from 3D scene data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; — Supabase (auth, storage, database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; — Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how each piece works.&lt;/p&gt;




&lt;p&gt;## Step 1: Floor Plan to Vector Geometry&lt;/p&gt;

&lt;p&gt;When a user uploads a floor plan — an architect drawing, a hand sketch, or a photo from a real estate listing — our AI pipeline kicks in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wall Detection&lt;/strong&gt; — A vision model identifies walls, doors, windows, and room boundaries from the 2D image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vectorization&lt;/strong&gt; — Detected geometry is converted to clean vector paths using Potrace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room Segmentation&lt;/strong&gt; — The AI identifies individual rooms and classifies them (living room, bedroom, kitchen)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Model Generation&lt;/strong&gt; — Vector geometry is extruded into a GLB model with proper wall heights, door/window cutouts, and room metadata&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trickiest part was coordinate systems. Potrace outputs SVGs with an inverted Y-axis and path extraction libraries don't apply group transforms. We&lt;br&gt;
   had to manually convert between pixel space, SVG space, and 3D world space.&lt;/p&gt;

&lt;p&gt;Off-by-one errors in 2D become off-by-a-whole-room errors in 3D. Document your coordinate transforms religiously.&lt;/p&gt;




&lt;p&gt;## Step 2: Interactive 3D Scene with Three.js&lt;/p&gt;

&lt;p&gt;The generated GLB model loads into a Three.js scene in the browser. This is where it gets interesting.&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.amazonaws.com%2Fuploads%2Farticles%2F9soboq4vzg83dt0r92nv.png" 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.amazonaws.com%2Fuploads%2Farticles%2F9soboq4vzg83dt0r92nv.png" alt="3D floor plan view" width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;### Performance Optimization&lt;/p&gt;

&lt;p&gt;The scene can have hundreds of meshes with high-res textures. We needed it smooth on both desktop and mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texture pipeline&lt;/strong&gt; was the biggest win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Original 4K textures — 2-4 MB — never sent to client&lt;/li&gt;
&lt;li&gt;1024px render — 100-300 KB — used for 3D scene&lt;/li&gt;
&lt;li&gt;200px thumbnail — 10-30 KB — used for UI picker grid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This cut initial load by around 80% with no visible quality loss.&lt;/p&gt;

&lt;p&gt;Other key optimizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imperative updates only&lt;/strong&gt; — React state changes don't trigger re-renders of the 3D scene. All texture and material changes happen through refs,
not props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAF-throttled resize&lt;/strong&gt; — Every resize listener uses requestAnimationFrame to prevent layout thrashing on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS animations over JS&lt;/strong&gt; — Spinners and loading states use pure CSS keyframes to avoid rAF leaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### Material Application&lt;/p&gt;

&lt;p&gt;When a user selects a floor texture or door material, we traverse the scene graph and apply materials directly to matching meshes.&lt;/p&gt;

&lt;p&gt;Door-to-room assignment is spatial. When a user changes door texture for a room, we find which doors belong to that room using point-in-polygon and&lt;br&gt;
  distance-to-edge algorithms with a 1.5 unit tolerance.&lt;/p&gt;




&lt;p&gt;## Step 3: Real Furniture Placement&lt;/p&gt;

&lt;p&gt;This is what makes &lt;a href="https://www.meltflex.tech/products" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; different from other room planners — every piece of furniture is a real product from&lt;br&gt;
   real brands with real prices.&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.amazonaws.com%2Fuploads%2Farticles%2Ff1pjyeavbq2a0gelep6q.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.amazonaws.com%2Fuploads%2Farticles%2Ff1pjyeavbq2a0gelep6q.jpg" alt="Shoppable living room" width="800" height="1065"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We load furniture as GLB models from our catalog. Each model has accurate real-world dimensions, PBR materials, and product metadata including price,&lt;br&gt;
  brand, and purchase link.&lt;/p&gt;

&lt;p&gt;Users drag furniture into rooms, rotate and position it, and see exactly how it fits. The shopping cart updates in real-time — what you see is what&lt;br&gt;
  you can buy.&lt;/p&gt;




&lt;p&gt;## Step 4: Photorealistic AI Renders&lt;/p&gt;

&lt;p&gt;Once the user has furnished their rooms, they can generate photorealistic renders. The AI takes the 3D scene data — camera position, furniture&lt;br&gt;
  placement, materials, lighting — and produces images that look like professional interior photography.&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.amazonaws.com%2Fuploads%2Farticles%2Fq41rtj47cswqwguqkt91.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fq41rtj47cswqwguqkt91.png" alt="AI photorealistic render" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every piece of furniture in the render is the actual product the user placed. No fake mockups.&lt;/p&gt;




&lt;p&gt;## React 19 + Three.js: Lessons Learned&lt;/p&gt;

&lt;p&gt;### The ref problem&lt;/p&gt;

&lt;p&gt;React 19's memo(forwardRef()) pattern can lose ref.current after re-renders. Our 3D scene component uses this pattern, and we kept getting null refs&lt;br&gt;
  when trying to call imperative methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; — Event-based communication using CustomEvent that bypasses ref forwarding entirely. The Three.js component listens for events&lt;br&gt;
  internally. No refs needed.&lt;/p&gt;

&lt;p&gt;### The mobile resize loop&lt;/p&gt;

&lt;p&gt;Our first mobile version had a catastrophic bug — dispatching a resize event from inside a resize listener created an infinite loop. Combined with rAF&lt;br&gt;
   leaks from inline ref callbacks, it drained battery in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; — RAF-throttled listeners plus CSS animations for all loading states.&lt;/p&gt;

&lt;p&gt;### Texture size kills mobile&lt;/p&gt;

&lt;p&gt;Serving 4K textures to mobile browsers is a dealbreaker. Our three-tier optimization pipeline solved it. The Supabase image transform API handles&lt;br&gt;
  resizing server-side, so the client only downloads what it needs.&lt;/p&gt;




&lt;p&gt;## What's Next&lt;/p&gt;

&lt;p&gt;We're working on improved room type detection (currently around 50% accuracy), a larger furniture catalog with more brands, better mobile 3D&lt;br&gt;
  interaction, and more texture options for walls, floors, and doors.&lt;/p&gt;




&lt;p&gt;## Try It&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.meltflex.tech/create" rel="noopener noreferrer"&gt;MeltFlex&lt;/a&gt; is free. Upload a floor plan, get a 3D model, furnish it with real products, and generate photorealistic&lt;br&gt;
  renders.&lt;/p&gt;

&lt;p&gt;If you're building anything with Three.js, WebGL, or AI + 3D — I'd love to hear about your approach. What rendering challenges have you run into?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More on AI interior design:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/how-to-design-your-home-with-ai" rel="noopener noreferrer"&gt;How to Design Your Home with AI in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/living-room-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Living Room Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/bedroom-interior-design-ideas-ai" rel="noopener noreferrer"&gt;Bedroom Interior Design Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meltflex.tech/blog/house-interior-design-guide-ai" rel="noopener noreferrer"&gt;House Interior Design Guide&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.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.amazonaws.com%2Fuploads%2Farticles%2Fja2e5stlvo4ykig2wq4y.JPG" alt=" " width="800" height="1065"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.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.amazonaws.com%2Fuploads%2Farticles%2Fwxm2pmj0hfxxg1erv8b0.JPG" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/..." 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/..." alt="Uploading image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
