<?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: builtstack</title>
    <description>The latest articles on DEV Community by builtstack (@builtstack).</description>
    <link>https://dev.to/builtstack</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143380%2Fa983dbbc-5e9c-4745-b8f1-7e01181d6da3.png</url>
      <title>DEV Community: builtstack</title>
      <link>https://dev.to/builtstack</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/builtstack"/>
    <language>en</language>
    <item>
      <title>3 bugs that cost me 3 weeks building a form builder</title>
      <dc:creator>builtstack</dc:creator>
      <pubDate>Fri, 25 Sep 2026 19:44:21 +0000</pubDate>
      <link>https://dev.to/builtstack/3-bugs-that-cost-me-3-weeks-building-a-form-builder-1mfb</link>
      <guid>https://dev.to/builtstack/3-bugs-that-cost-me-3-weeks-building-a-form-builder-1mfb</guid>
      <description>&lt;p&gt;I built a form builder (mini-Tally) as a side project.&lt;/p&gt;

&lt;p&gt;The code was the easy part. These three bugs cost me the most time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 1 — Typing didn't work
&lt;/h2&gt;

&lt;p&gt;In my form editor, typing in a question field did nothing. The letters just didn't appear.&lt;/p&gt;

&lt;p&gt;Cause: I used &lt;code&gt;setBlocks(blocks.map(...))&lt;/code&gt; — which captures stale state.&lt;/p&gt;

&lt;p&gt;Fix — use the functional form:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
setBlocks((prev) =&amp;gt; prev.map((b) =&amp;gt; 
  b.id === id ? { ...b, label } : b
));
Bug 2 — GitHub ate my src folder
I dragged my project folder into GitHub's web uploader. It said "uploaded 20 files." The build failed with "module not found: src/main.tsx".

The browser uploader had silently skipped the src folder entirely.

Lesson: don't use the web uploader for folders with nested files. Use git.

Bug 3 — Auth worked locally, broke in production
Sign-up worked on localhost. On the deployed site, it did nothing. No error, just silence.

Cause: Supabase redirect URLs were only configured for localhost. Supabase rejected requests from the production domain.

Fix: After deploying, add your production URL to Supabase → Authentication → URL Configuration. Both the Site URL and the Redirect URLs list.

The stack
Next.js 16 (App Router, Server Actions)

Supabase (Auth + Postgres + RLS)

Tailwind CSS

TypeScript

What I built
A form builder with 6 question types, public form pages, and CSV export.

Live demo: https://getjustforms.vercel.app

If you hit any of these bugs, ping me in the comments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>debugging</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How I Built a Form Builder with Next.js 16 and Supabase</title>
      <dc:creator>builtstack</dc:creator>
      <pubDate>Fri, 25 Sep 2026 18:13:55 +0000</pubDate>
      <link>https://dev.to/builtstack/how-i-built-a-form-builder-with-nextjs-16-and-supabase-1h1i</link>
      <guid>https://dev.to/builtstack/how-i-built-a-form-builder-with-nextjs-16-and-supabase-1h1i</guid>
      <description>&lt;p&gt;Three weeks ago I built a form builder. Not a company — just a tool I needed.&lt;/p&gt;

&lt;p&gt;Here are the three bugs that cost me the most time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug #1 — React state closure
&lt;/h2&gt;

&lt;p&gt;Typing in the question editor did nothing. The letters didn't appear.&lt;/p&gt;

&lt;p&gt;Cause: I was mapping over state directly instead of using the functional update form.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
// ❌ Broken
setBlocks(blocks.map((b) =&amp;gt; b.id === id ? { ...b, label } : b));

// ✅ Correct
setBlocks((prev) =&amp;gt; prev.map((b) =&amp;gt; b.id === id ? { ...b, label } : b));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>supabase</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
