<?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: Declan Fraser</title>
    <description>The latest articles on DEV Community by Declan Fraser (@declan_frasss).</description>
    <link>https://dev.to/declan_frasss</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%2F3320429%2Ff830afc0-329b-4e99-a755-aae10a98fbda.png</url>
      <title>DEV Community: Declan Fraser</title>
      <link>https://dev.to/declan_frasss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/declan_frasss"/>
    <language>en</language>
    <item>
      <title>This is how we all should be vibecoding:</title>
      <dc:creator>Declan Fraser</dc:creator>
      <pubDate>Thu, 11 Sep 2025 16:59:28 +0000</pubDate>
      <link>https://dev.to/declan_frasss/this-is-how-we-all-should-be-vibecoding-14ga</link>
      <guid>https://dev.to/declan_frasss/this-is-how-we-all-should-be-vibecoding-14ga</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/gabeb03/build-a-discord-support-bot-from-scratch-1hlm" class="crayons-story__hidden-navigation-link"&gt;Build a Discord support bot from scratch&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/gabeb03" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1501534%2F5320fbf3-9350-400e-9524-aa254bbe691f.jpeg" alt="gabeb03 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/gabeb03" class="crayons-story__secondary fw-medium m:hidden"&gt;
              gabeb03
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                gabeb03
                
              
              &lt;div id="story-author-preview-content-2839364" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/gabeb03" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1501534%2F5320fbf3-9350-400e-9524-aa254bbe691f.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;gabeb03&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/gabeb03/build-a-discord-support-bot-from-scratch-1hlm" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/gabeb03/build-a-discord-support-bot-from-scratch-1hlm" id="article-link-2839364"&gt;
          Build a Discord support bot from scratch
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/discord"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discord&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/gabeb03/build-a-discord-support-bot-from-scratch-1hlm" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;15&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/gabeb03/build-a-discord-support-bot-from-scratch-1hlm#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>discord</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>DB Environments That Don’t Suck: A Dev’s Guide to Not Breaking Prod</title>
      <dc:creator>Declan Fraser</dc:creator>
      <pubDate>Tue, 05 Aug 2025 16:26:20 +0000</pubDate>
      <link>https://dev.to/declan_frasss/db-environments-that-dont-suck-a-devs-guide-to-not-breaking-prod-3735</link>
      <guid>https://dev.to/declan_frasss/db-environments-that-dont-suck-a-devs-guide-to-not-breaking-prod-3735</guid>
      <description>&lt;p&gt;In JS land, there are a billion different ways to persist data, and most of them suck. If you’re not careful, you can end up mangling your production DB. Data is the core of any web app, so if you mess up your production DB, you’ve just nuked your app. &lt;/p&gt;

&lt;p&gt;Here’s how you can set up different environments in your database so the changes you make to the DB’s schema in dev isn’t reflected in prod, unless you want it to be.&lt;/p&gt;

&lt;p&gt;You are probably expecting SQL code snippets and a technical walk through of how to get Gadget to have two different DB environments. It’s way simpler than that. Every app you make with the Gadget framework has a separate development and production DB. Just create an app, and everything is set up for you. &lt;/p&gt;

&lt;p&gt;Here’s how it works: &lt;/p&gt;

&lt;p&gt;Step 1: Create an app. Sign up for Gadget, then create an app:&lt;/p&gt;

&lt;p&gt;&lt;strong&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%2Fy2z0s3gy3wsqpb65p4fz.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%2Fy2z0s3gy3wsqpb65p4fz.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go through the UI flow to create a new web app with no user auth. &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%2Fuybhlvikjnx1asrtvmag.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%2Fuybhlvikjnx1asrtvmag.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gadget will automatically generate an API that can read and write to our database. We are prompted to choose what language that API should be in. I’ll choose TypeScript. Gadget also creates a frontend for you. I won’t use it in this tutorial:&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%2F2dvl728egajbgei024yi.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%2F2dvl728egajbgei024yi.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gadget will generate a blank project where we can add our tables. All the code that has to do with the database is in the &lt;code&gt;/api&lt;/code&gt; folder: &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%2Ffqxjh236hpvz3it43gcv.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%2Ffqxjh236hpvz3it43gcv.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The models folder holds all the tables for our app. Let’s create a new &lt;code&gt;product&lt;/code&gt; table. &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%2Fbbcp37big9m4rih24w9j.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%2Fbbcp37big9m4rih24w9j.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now edit the schema to include a &lt;code&gt;name&lt;/code&gt; column. &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%2Figw43e3wg2fyshdt84k5.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%2Figw43e3wg2fyshdt84k5.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we’ve created a product table on the app’s &lt;code&gt;development&lt;/code&gt; branch. &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%2Fmd6ybx0eig0mzm7mafbw.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%2Fmd6ybx0eig0mzm7mafbw.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The product table won’t show up in production until we hit the deploy button. That’s how simple it is to keep the two databases separate.&lt;/p&gt;

&lt;p&gt;Now, how do we write to the &lt;code&gt;product&lt;/code&gt; database? We need to hit the API endpoint that runs the &lt;code&gt;api/models/product/actions/create.ts&lt;/code&gt; action. You can use the API tab to make API calls in the Gadget UI:&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%2F7nnflyrvhs55qd796rby.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%2F7nnflyrvhs55qd796rby.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to make requests from your frontend, we need to install the Gadget library, then use the Gadget api to create a new record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @gadgetinc/react @gadget-client/product-tagger # &amp;lt;---- Replace with your Gadget project name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ProductTaggerClient } from "@gadget-client/product-tagger";

export const api = new ProductTaggerClient({
  authenticationMode: { browserSession: true },
});

const productRecord = await api.product.create({
  name: "example value for name",
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about the API Gadget generated, go to the “Docs” page, and read through the really nice auto-generated docs specific to your database:&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%2F2xh64z8kffa7f1d3alnr.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%2F2xh64z8kffa7f1d3alnr.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution 2: Supabase&lt;/strong&gt;&lt;br&gt;
Supabase is much more flexible than Gadget. This is both a pro and a con. You can run custom PostgreSQL queries in Supabase and optimize it for your specific use case. That’s awesome. It took me 2 hours to fully understand and implement environment management in Supabase. That’s not so awesome. &lt;/p&gt;

&lt;p&gt;First, you need a Supabase database. Follow Supabase’s excellent docs to get your first database up and running: &lt;a href="https://supabase.com/docs/guides/database/overview" rel="noopener noreferrer"&gt;supabase.com/docs/guides/database/overview&lt;/a&gt;. You can copy my Supabase table if you want to follow along: &lt;/p&gt;

&lt;p&gt;Now that your database is created,you need a project that uses Supabase as the datastore. I set up this Node.js project that just reads and writes to a dummy database. &lt;a href="https://github.com/gabeb03/supabase-env-demo" rel="noopener noreferrer"&gt;Here’s the GitHub link&lt;/a&gt; if you want to follow along. &lt;/p&gt;

&lt;p&gt;Start the Supabase CLI by running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you need to tell Supabase which database you want to connect to. You need to login, then give the CLI the project ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase login
supabase link --project-ref $PROJECT_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get your $PROJECT_ID from your project's dashboard URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://supabase.com/dashboard/project/&amp;lt;project-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let’s sync the schema of the production DB with your local instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase db pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works just like a &lt;code&gt;git pull&lt;/code&gt;:&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%2Fubxig95um1l3xlafhuto.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%2Fubxig95um1l3xlafhuto.png" alt=" " width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s change our local Supabase instance and add a personal_record column. To keep each change atomic, we create migrations. Migrations are little pieces of SQL that change the schema of a database when you run them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase migration new add_personal_record_col
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we edit the migration in &lt;code&gt;supabase/migrations/&amp;lt;timestamp&amp;gt;_add_personal_record.sql&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE public.workouts
ADD COLUMN personal_record integer;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We apply the migration by running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase db reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s say you’re super happy with your new &lt;code&gt;personal_record&lt;/code&gt; column in your database and you want to add it to the production database. We can &lt;code&gt;push&lt;/code&gt; the change to the production schema like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase db push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pushing the schema directly to the production database is not the best idea. Supabase recommends you set up a staging environment and run a GitHub action to run the migration when changes are merged to &lt;code&gt;main&lt;/code&gt;. The Supabase docs walk you through how to do that &lt;a href="https://supabase.com/docs/guides/deployment/managing-environments#deploy-a-migration" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to keep your development data separate from your production data, you need branches. &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%2Feuelqmishoikynpx1vm2.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%2Feuelqmishoikynpx1vm2.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, this is a paid feature, so you have to part with $25 a month to see how this feature works. Supabase does a great job of describing the feature in their &lt;a href="https://supabase.com/docs/guides/deployment/branching" rel="noopener noreferrer"&gt;docs&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supabase is getting a lot of hype in the dev community, but the DX of setting up separate environments was pretty mid. It took me almost 2 hours to have an environment that worked well. With Gadget, it was literally as easy as creating a new app via the GUI.&lt;/p&gt;

&lt;p&gt;Granted, Supabase is more flexible, but most of the time I don’t care about flexibility. I want my project set up the right way with zero hassle.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>backend</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
