<?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>Forem: Mahdi BEN RHOUMA</title>
    <description>The latest articles on Forem by Mahdi BEN RHOUMA (@mahdi_benrhouma_fe1c6005).</description>
    <link>https://forem.com/mahdi_benrhouma_fe1c6005</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%2F3623634%2F405ea568-6e7f-4cab-923a-240f9a44bf72.png</url>
      <title>Forem: Mahdi BEN RHOUMA</title>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mahdi_benrhouma_fe1c6005"/>
    <language>en</language>
    <item>
      <title>Fix Supabase Auth Session Not Persisting After Refresh</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Wed, 15 Apr 2026 10:22:09 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/fix-supabase-auth-session-not-persisting-after-refresh-354f</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/fix-supabase-auth-session-not-persisting-after-refresh-354f</guid>
      <description>&lt;h1&gt;
  
  
  Fix Supabase Auth Session Not Persisting After Refresh
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Fix Supabase Auth Session Not Persisting After Refresh Next.js 14
&lt;/h2&gt;

&lt;p&gt;Supabase auth sessions mysteriously disappearing after page refresh is one of the most frustrating issues indie developers face when building Next.js applications. You implement authentication, everything works perfectly—until the user refreshes the page and suddenly they're logged out. As covered in our &lt;a href="https://iloveblogs.blog/guides/supabase-authentication-authorization" rel="noopener noreferrer"&gt;Supabase Authentication &amp;amp; Authorization Patterns&lt;/a&gt;, authentication is critical to any application, and session persistence is fundamental to good user experience.&lt;/p&gt;

&lt;p&gt;In this guide, I'll show you exactly why this happens and how to fix it in 5 minutes with tested code examples that work with Next.js 14 and Supabase v2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Supabase Sessions Disappear After Refresh
&lt;/h2&gt;

&lt;p&gt;The root cause is how Next.js handles server-side rendering and client-side hydration. When you refresh a page in Next.js 14 with the App Router, the following happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server renders the page&lt;/strong&gt; - The server doesn't have access to browser cookies by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client hydrates&lt;/strong&gt; - React takes over on the client side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session check fails&lt;/strong&gt; - If the session isn't properly passed from server to client, it appears lost&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The issue occurs because Supabase stores session tokens in cookies, but Next.js Server Components don't automatically read these cookies unless you explicitly configure them to do so.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Misconceptions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Supabase is broken"&lt;/strong&gt; - No, it's a Next.js configuration issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I need to use localStorage"&lt;/strong&gt; - Actually, cookies are more secure and work better with SSR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"This only happens in development"&lt;/strong&gt; - It happens in production too if not fixed properly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create Server-Side Supabase Client
&lt;/h3&gt;

&lt;p&gt;First, create a server-side Supabase client that properly reads cookies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/supabase/server.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServerClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/ssr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/headers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookieStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;createServerClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cookieStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;cookieStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// The `set` method was called from a Server Component.&lt;/span&gt;
            &lt;span class="c1"&gt;// This can be ignored if you have middleware refreshing&lt;/span&gt;
            &lt;span class="c1"&gt;// user sessions.&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;cookieStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// The `delete` method was called from a Server Component.&lt;/span&gt;
            &lt;span class="c1"&gt;// This can be ignored if you have middleware refreshing&lt;/span&gt;
            &lt;span class="c1"&gt;// user sessions.&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Client-Side Supabase Client
&lt;/h3&gt;

&lt;p&gt;Create a separate client for browser-side operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/supabase/client.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBrowserClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/ssr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;createBrowserClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Add Middleware for Session Refresh
&lt;/h3&gt;

&lt;p&gt;Create middleware to automatically refresh sessions on every request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServerClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@supabase/ssr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServerClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CookieOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
          &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// Refresh session if expired - required for Server Components&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/((?!_next/static|_next/image|favicon.ico|.*&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;.(?:svg|png|jpg|jpeg|gif|webp)$).*)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Use Server Client in Server Components
&lt;/h3&gt;

&lt;p&gt;In your Server Components, use the server client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/dashboard/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/supabase/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;redirect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DashboardPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Welcome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Your&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="nx"&gt;persists&lt;/span&gt; &lt;span class="nx"&gt;across&lt;/span&gt; &lt;span class="nx"&gt;refreshes&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Use Client Client in Client Components
&lt;/h3&gt;

&lt;p&gt;In Client Components, use the browser client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/supabase/client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;// Listen for auth changes&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;subscription&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onAuthStateChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;subscription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Logged&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working Code Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Authentication Flow
&lt;/h3&gt;

&lt;p&gt;Here's a complete example showing sign-in with session persistence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/login/page.tsx&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/supabase/client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRouter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;LoginPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithPassword&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Session is automatically stored in cookies&lt;/span&gt;
    &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Refresh to update Server Components&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleLogin&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;required&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
        &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;required&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Signing in...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sign In&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Protected Route Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/protected/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/supabase/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;redirect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProtectedPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// User is authenticated, session persists&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Protected&lt;/span&gt; &lt;span class="nx"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;This&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="nx"&gt;requires&lt;/span&gt; &lt;span class="nx"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistake #1: Using only client-side Supabase client&lt;/strong&gt; - This doesn't work with Server Components. You need both server and client implementations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistake #2: Not implementing middleware&lt;/strong&gt; - Without middleware, sessions won't refresh automatically and will expire, causing users to be logged out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistake #3: Mixing server and client clients&lt;/strong&gt; - Always use the server client in Server Components and the browser client in Client Components. Mixing them causes hydration errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistake #4: Not calling router.refresh() after login&lt;/strong&gt; - After authentication, you need to refresh the router to update Server Components with the new session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mistake #5: Forgetting to handle cookie errors&lt;/strong&gt; - The try-catch blocks in the server client are essential because Server Components can't set cookies directly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does my session disappear after refresh?
&lt;/h3&gt;

&lt;p&gt;This happens when Next.js Server Components don't have access to the session cookies. The solution is to create a proper server-side Supabase client that reads cookies using Next.js's &lt;code&gt;cookies()&lt;/code&gt; function and implement middleware to refresh sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How often should I refresh the session?
&lt;/h3&gt;

&lt;p&gt;Supabase automatically refreshes sessions when they're about to expire (default is 1 hour). The middleware handles this automatically on every request, so you don't need to manually refresh sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between server and client Supabase clients?
&lt;/h3&gt;

&lt;p&gt;The server client uses Next.js's &lt;code&gt;cookies()&lt;/code&gt; function to read/write cookies and works in Server Components. The browser client uses browser APIs and works in Client Components. You need both for a complete Next.js 14 App Router application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use localStorage instead of cookies?
&lt;/h3&gt;

&lt;p&gt;While you can use localStorage, cookies are recommended because they work with Server Components, are more secure (httpOnly), and automatically handle session refresh. localStorage only works on the client side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to install additional packages?
&lt;/h3&gt;

&lt;p&gt;Yes, you need &lt;code&gt;@supabase/ssr&lt;/code&gt; package which provides the &lt;code&gt;createServerClient&lt;/code&gt; and &lt;code&gt;createBrowserClient&lt;/code&gt; functions. Install it with: &lt;code&gt;npm install @supabase/ssr&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Supabase Auth Redirect Not Working Next.js App Router Solution&lt;/li&gt;
&lt;li&gt;Handle Supabase Auth Errors in Next.js Middleware&lt;/li&gt;
&lt;li&gt;Implement Supabase Magic Link Auth in Next.js 15&lt;/li&gt;
&lt;li&gt;Build Protected Routes in Next.js 15 with Supabase&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Session persistence in Next.js 14 with Supabase requires proper setup of both server and client Supabase clients, plus middleware to handle session refresh. The key is understanding that Server Components need explicit cookie access, which the &lt;code&gt;@supabase/ssr&lt;/code&gt; package provides.&lt;/p&gt;

&lt;p&gt;Follow the steps above, and your users will stay logged in across page refreshes. The middleware automatically handles session refresh, and the dual-client approach works seamlessly with Next.js's hybrid rendering model.&lt;/p&gt;

&lt;p&gt;Test your implementation by logging in, refreshing the page, and verifying the user remains authenticated. If you encounter issues, double-check that your middleware is running and that you're using the correct client in each context.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/fix-supabase-auth-session-persistence" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>authentication</category>
      <category>nextjs</category>
      <category>sessionmanagement</category>
    </item>
    <item>
      <title>Fitness for Developers: Combating Desk Life</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Tue, 14 Apr 2026 10:21:26 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/fitness-for-developers-combating-desk-life-5e1h</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/fitness-for-developers-combating-desk-life-5e1h</guid>
      <description>&lt;h1&gt;
  
  
  Fitness for Developers: Combating Desk Life
&lt;/h1&gt;

&lt;p&gt;Sitting is the new smoking, but you still have deadlines to meet. Here's how to stay healthy without sacrificing your coding productivity—practical fitness strategies designed for the realities of developer life.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: Check out our guides on &lt;a href="https://iloveblogs.blog/post/home-office-guide" rel="noopener noreferrer"&gt;home office setup&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/ergonomics-setup-for-long-sessions" rel="noopener noreferrer"&gt;ergonomics for long sessions&lt;/a&gt; for complementary health tips.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Developer Health Crisis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Brutal Statistics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;86%&lt;/strong&gt; of developers spend their entire workday sitting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;54%&lt;/strong&gt; report chronic back or neck pain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;68%&lt;/strong&gt; experience eye strain and headaches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;42%&lt;/strong&gt; have gained 20+ pounds since starting their career&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31%&lt;/strong&gt; report anxiety or depression related to sedentary lifestyle&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Compound Effect
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Year 1&lt;/strong&gt;: Occasional back pain, slight weight gain&lt;br&gt;
&lt;strong&gt;Year 3&lt;/strong&gt;: Chronic pain, noticeable fitness decline&lt;br&gt;
&lt;strong&gt;Year 5&lt;/strong&gt;: Serious health issues, reduced energy&lt;br&gt;
&lt;strong&gt;Year 10+&lt;/strong&gt;: Metabolic syndrome, cardiovascular problems&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good news&lt;/strong&gt;: Small, consistent changes can reverse most of these effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Minimum Effective Dose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The 20-20-20 Rule (Enhanced)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Every 20 minutes&lt;/strong&gt;: Look at something 20 feet away for 20 seconds&lt;br&gt;
&lt;strong&gt;Enhancement&lt;/strong&gt;: Stand up and do 20 bodyweight squats&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: Breaks the sitting cycle, improves circulation, maintains muscle activation&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pomodoro Fitness Hack
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;25 minutes focused work&lt;/strong&gt;: Deep coding session&lt;br&gt;
&lt;strong&gt;5 minute break&lt;/strong&gt;: Movement break (not scrolling your phone)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Movement options&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Walk around the office/house&lt;/li&gt;
&lt;li&gt;Do desk stretches&lt;/li&gt;
&lt;li&gt;Climb stairs&lt;/li&gt;
&lt;li&gt;Do jumping jacks&lt;/li&gt;
&lt;li&gt;Practice deep breathing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The 1% Rule
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Improve your health by just 1% each day&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take the stairs instead of elevator&lt;/li&gt;
&lt;li&gt;Park further away&lt;/li&gt;
&lt;li&gt;Stand during phone calls&lt;/li&gt;
&lt;li&gt;Do pushups during code compilation&lt;/li&gt;
&lt;li&gt;Walk to lunch instead of ordering delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desk Setup That Doesn't Destroy You
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Monitor Position
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Eye level&lt;/strong&gt;: Top of screen at or slightly below eye level&lt;br&gt;
&lt;strong&gt;Distance&lt;/strong&gt;: Arm's length away (20-26 inches)&lt;br&gt;
&lt;strong&gt;Angle&lt;/strong&gt;: Slight tilt back (10-20 degrees)&lt;br&gt;
&lt;strong&gt;Multiple monitors&lt;/strong&gt;: Primary monitor directly in front, secondary at slight angle&lt;/p&gt;

&lt;h3&gt;
  
  
  Chair Ergonomics
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Seat height&lt;/strong&gt;: Feet flat on floor, thighs parallel to ground&lt;br&gt;
&lt;strong&gt;Back support&lt;/strong&gt;: Lumbar support maintains natural spine curve&lt;br&gt;
&lt;strong&gt;Armrests&lt;/strong&gt;: Elbows at 90 degrees, shoulders relaxed&lt;br&gt;
&lt;strong&gt;Seat depth&lt;/strong&gt;: 2-3 inches between seat edge and back of knees&lt;/p&gt;

&lt;h3&gt;
  
  
  Keyboard and Mouse
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Keyboard height&lt;/strong&gt;: Elbows at 90 degrees, wrists straight&lt;br&gt;
&lt;strong&gt;Mouse position&lt;/strong&gt;: Same level as keyboard, close to body&lt;br&gt;
&lt;strong&gt;Wrist support&lt;/strong&gt;: Minimal padding, maintain neutral wrist position&lt;br&gt;
&lt;strong&gt;Consider&lt;/strong&gt;: Ergonomic keyboards, vertical mice, trackballs&lt;/p&gt;

&lt;h3&gt;
  
  
  Standing Desk Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't stand all day&lt;/strong&gt;: Alternate between sitting and standing&lt;br&gt;
&lt;strong&gt;Start small&lt;/strong&gt;: 15-30 minutes at a time&lt;br&gt;
&lt;strong&gt;Anti-fatigue mat&lt;/strong&gt;: Reduces leg strain&lt;br&gt;
&lt;strong&gt;Footrest&lt;/strong&gt;: Allows position changes&lt;br&gt;
&lt;strong&gt;Monitor adjustment&lt;/strong&gt;: Screen should be higher when standing&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercise That Fits Your Schedule
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The 7-Minute Scientific Workout
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Research-backed routine&lt;/strong&gt; that provides maximum benefit in minimum time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Jumping jacks&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wall sits&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push-ups&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abdominal crunches&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step-ups&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Squats&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triceps dips&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plank&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High knees running&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lunges&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push-up rotation&lt;/strong&gt; (30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side planks&lt;/strong&gt; (30 seconds each side)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Rest&lt;/strong&gt;: 10 seconds between exercises&lt;br&gt;
&lt;strong&gt;Total time&lt;/strong&gt;: 7 minutes&lt;br&gt;
&lt;strong&gt;Frequency&lt;/strong&gt;: 3-4 times per week&lt;/p&gt;

&lt;h3&gt;
  
  
  Desk Exercises (No Sweat Required)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Neck stretches&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chin tucks (10 reps)&lt;/li&gt;
&lt;li&gt;Neck rotations (5 each direction)&lt;/li&gt;
&lt;li&gt;Side neck stretches (hold 15 seconds each)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shoulder and upper back&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shoulder blade squeezes (10 reps)&lt;/li&gt;
&lt;li&gt;Shoulder rolls (10 forward, 10 backward)&lt;/li&gt;
&lt;li&gt;Doorway chest stretches (hold 30 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lower back and hips&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seated spinal twists (10 each direction)&lt;/li&gt;
&lt;li&gt;Hip flexor stretches (hold 30 seconds each)&lt;/li&gt;
&lt;li&gt;Seated figure-4 stretch (hold 30 seconds each leg)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Legs and glutes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calf raises (20 reps)&lt;/li&gt;
&lt;li&gt;Seated leg extensions (10 each leg)&lt;/li&gt;
&lt;li&gt;Glute squeezes (hold 5 seconds, 10 reps)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Commute Workout
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Walking/Biking to work&lt;/strong&gt;: Best option if possible&lt;br&gt;
&lt;strong&gt;Public transport&lt;/strong&gt;: Stand instead of sitting, get off one stop early&lt;br&gt;
&lt;strong&gt;Driving&lt;/strong&gt;: Park further away, do car stretches at red lights&lt;br&gt;
&lt;strong&gt;Remote work&lt;/strong&gt;: Take a "fake commute" walk before and after work&lt;/p&gt;

&lt;h2&gt;
  
  
  Nutrition for Sustained Energy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Developer's Dilemma
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Common problems&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skipping meals during deep work sessions&lt;/li&gt;
&lt;li&gt;Relying on caffeine and sugar for energy&lt;/li&gt;
&lt;li&gt;Mindless snacking while coding&lt;/li&gt;
&lt;li&gt;Ordering unhealthy takeout due to time constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meal Prep for Coders
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sunday prep session&lt;/strong&gt; (1-2 hours):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cook proteins in bulk (chicken, fish, beans)&lt;/li&gt;
&lt;li&gt;Prepare vegetables (wash, chop, roast)&lt;/li&gt;
&lt;li&gt;Make grab-and-go snacks&lt;/li&gt;
&lt;li&gt;Portion out meals for the week&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Easy meal formulas&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Breakfast&lt;/strong&gt;: Protein + healthy fat + complex carb&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lunch&lt;/strong&gt;: Lean protein + vegetables + whole grain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dinner&lt;/strong&gt;: Similar to lunch, lighter portion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snacks&lt;/strong&gt;: Protein + fiber (nuts, Greek yogurt, fruit)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hydration Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Forgetting to drink water during focused work&lt;br&gt;
&lt;strong&gt;The solution&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large water bottle at your desk&lt;/li&gt;
&lt;li&gt;Set hourly hydration reminders&lt;/li&gt;
&lt;li&gt;Herbal teas for variety&lt;/li&gt;
&lt;li&gt;Limit caffeine to morning hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hydration goals&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8-10 glasses of water daily&lt;/li&gt;
&lt;li&gt;More if you drink coffee/tea&lt;/li&gt;
&lt;li&gt;Monitor urine color (pale yellow is ideal)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Brain Food for Better Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foods that enhance cognitive function&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blueberries&lt;/strong&gt;: Improve memory and focus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fatty fish&lt;/strong&gt;: Omega-3s for brain health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nuts and seeds&lt;/strong&gt;: Healthy fats and protein&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark chocolate&lt;/strong&gt;: Improves concentration (in moderation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green tea&lt;/strong&gt;: L-theanine for calm focus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Foods that crash your energy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sugary snacks and drinks&lt;/li&gt;
&lt;li&gt;Refined carbohydrates&lt;/li&gt;
&lt;li&gt;Heavy, greasy meals&lt;/li&gt;
&lt;li&gt;Excessive caffeine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sleep Optimization for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Screen Time Problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Blue light exposure&lt;/strong&gt; from screens disrupts circadian rhythms and melatonin production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solutions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blue light filtering glasses&lt;/li&gt;
&lt;li&gt;f.lux or Night Shift on devices&lt;/li&gt;
&lt;li&gt;No screens 1 hour before bed&lt;/li&gt;
&lt;li&gt;Dim lighting in evening&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sleep Hygiene for Night Owls
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Many developers are natural night owls&lt;/strong&gt;, but you still need quality sleep:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistent schedule&lt;/strong&gt;: Same bedtime and wake time, even on weekends&lt;br&gt;
&lt;strong&gt;Cool, dark room&lt;/strong&gt;: 65-68°F, blackout curtains, eye mask&lt;br&gt;
&lt;strong&gt;Comfortable mattress&lt;/strong&gt;: Invest in quality sleep surface&lt;br&gt;
&lt;strong&gt;No caffeine after 2 PM&lt;/strong&gt;: Caffeine has a 6-hour half-life&lt;/p&gt;

&lt;h3&gt;
  
  
  The Power Nap Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When you're stuck on a problem&lt;/strong&gt;, a 20-minute nap can be more effective than another cup of coffee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10-20 minutes&lt;/strong&gt;: Refreshing without grogginess&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiet, dark space&lt;/strong&gt;: Even your car works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set an alarm&lt;/strong&gt;: Longer naps cause sleep inertia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best timing&lt;/strong&gt;: 1-3 PM (natural energy dip)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mental Health and Stress Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Impostor Syndrome Workout
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Exercise reduces anxiety and builds confidence&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Physical accomplishments translate to mental resilience&lt;/li&gt;
&lt;li&gt;Endorphins improve mood naturally&lt;/li&gt;
&lt;li&gt;Regular exercise improves sleep quality&lt;/li&gt;
&lt;li&gt;Physical challenges provide perspective on coding challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stress-Busting Techniques
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deep breathing&lt;/strong&gt; (4-7-8 technique):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inhale for 4 counts&lt;/li&gt;
&lt;li&gt;Hold for 7 counts&lt;/li&gt;
&lt;li&gt;Exhale for 8 counts&lt;/li&gt;
&lt;li&gt;Repeat 4 times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Progressive muscle relaxation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tense and release muscle groups&lt;/li&gt;
&lt;li&gt;Start with toes, work up to head&lt;/li&gt;
&lt;li&gt;Hold tension for 5 seconds, release for 10&lt;/li&gt;
&lt;li&gt;Great for end-of-day wind-down&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mindfulness meditation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with 5 minutes daily&lt;/li&gt;
&lt;li&gt;Use apps like Headspace or Calm&lt;/li&gt;
&lt;li&gt;Focus on breath or body sensations&lt;/li&gt;
&lt;li&gt;Improves focus and reduces stress&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building Sustainable Habits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Habit Stack Method
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Attach new habits to existing routines&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After I sit down at my desk → I adjust my monitor height&lt;/li&gt;
&lt;li&gt;After I finish a coding session → I do 10 pushups&lt;/li&gt;
&lt;li&gt;After I eat lunch → I take a 10-minute walk&lt;/li&gt;
&lt;li&gt;After I close my laptop → I do neck stretches&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The 2-Minute Rule
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Make habits so easy you can't say no&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can't do a full workout? Do 2 minutes&lt;/li&gt;
&lt;li&gt;Can't meal prep? Wash one vegetable&lt;/li&gt;
&lt;li&gt;Can't meditate for 20 minutes? Do 2 minutes&lt;/li&gt;
&lt;li&gt;Can't walk for an hour? Walk around the block&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tracking and Accountability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What gets measured gets managed&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use fitness apps or wearables&lt;/li&gt;
&lt;li&gt;Track workouts in a simple spreadsheet&lt;/li&gt;
&lt;li&gt;Join developer fitness communities online&lt;/li&gt;
&lt;li&gt;Find an accountability partner at work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technology Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fitness Apps for Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Workout apps&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seven&lt;/strong&gt;: 7-minute workouts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nike Training Club&lt;/strong&gt;: Free workouts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freeletics&lt;/strong&gt;: Bodyweight training&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sworkit&lt;/strong&gt;: Customizable routines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Habit tracking&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Habitica&lt;/strong&gt;: Gamified habit building&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaks&lt;/strong&gt;: Simple habit tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Way of Life&lt;/strong&gt;: Color-coded day tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ergonomics and breaks&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stretchly&lt;/strong&gt;: Break reminders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Out&lt;/strong&gt;: Forced break software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workrave&lt;/strong&gt;: RSI prevention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stand Up!&lt;/strong&gt;: Standing reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wearable Technology
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fitness trackers&lt;/strong&gt; can motivate movement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step counting and movement reminders&lt;/li&gt;
&lt;li&gt;Heart rate monitoring during exercise&lt;/li&gt;
&lt;li&gt;Sleep quality tracking&lt;/li&gt;
&lt;li&gt;Stress level monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Smart watches&lt;/strong&gt; add convenience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workout tracking without phone&lt;/li&gt;
&lt;li&gt;Quick fitness app access&lt;/li&gt;
&lt;li&gt;Breathing reminders&lt;/li&gt;
&lt;li&gt;Activity competitions with friends&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating a Developer-Friendly Gym Routine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Minimalist Approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;3 days per week, 45 minutes each&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 1: Upper body&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push-ups or bench press&lt;/li&gt;
&lt;li&gt;Pull-ups or rows&lt;/li&gt;
&lt;li&gt;Overhead press&lt;/li&gt;
&lt;li&gt;Planks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 2: Lower body&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Squats or leg press&lt;/li&gt;
&lt;li&gt;Deadlifts or hip hinges&lt;/li&gt;
&lt;li&gt;Lunges or step-ups&lt;/li&gt;
&lt;li&gt;Calf raises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 3: Full body circuit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Burpees&lt;/li&gt;
&lt;li&gt;Mountain climbers&lt;/li&gt;
&lt;li&gt;Jumping jacks&lt;/li&gt;
&lt;li&gt;Bodyweight squats&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Home Gym Essentials
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Minimal equipment, maximum results&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resistance bands (versatile, portable)&lt;/li&gt;
&lt;li&gt;Adjustable dumbbells (space-efficient)&lt;/li&gt;
&lt;li&gt;Yoga mat (for stretching and bodyweight exercises)&lt;/li&gt;
&lt;li&gt;Pull-up bar (doorway or wall-mounted)&lt;/li&gt;
&lt;li&gt;Foam roller (for recovery)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gym Alternatives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't like traditional gyms?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rock climbing (problem-solving + fitness)&lt;/li&gt;
&lt;li&gt;Martial arts (discipline + self-defense)&lt;/li&gt;
&lt;li&gt;Dance classes (fun + cardio)&lt;/li&gt;
&lt;li&gt;Hiking (nature + exercise)&lt;/li&gt;
&lt;li&gt;Swimming (low-impact, full-body)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The ROI of Developer Fitness
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Productivity Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Regular exercise improves&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus and concentration&lt;/strong&gt;: Better attention span for complex problems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory and learning&lt;/strong&gt;: Faster skill acquisition and retention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creativity&lt;/strong&gt;: Enhanced problem-solving abilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Energy levels&lt;/strong&gt;: Sustained performance throughout the day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stress resilience&lt;/strong&gt;: Better handling of deadlines and pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Career Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Healthy developers&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take fewer sick days&lt;/li&gt;
&lt;li&gt;Have more energy for side projects&lt;/li&gt;
&lt;li&gt;Perform better in interviews&lt;/li&gt;
&lt;li&gt;Advance faster in their careers&lt;/li&gt;
&lt;li&gt;Have longer, more sustainable careers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Financial Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Health is wealth&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower healthcare costs&lt;/li&gt;
&lt;li&gt;Reduced sick leave&lt;/li&gt;
&lt;li&gt;Higher earning potential&lt;/li&gt;
&lt;li&gt;Longer career lifespan&lt;/li&gt;
&lt;li&gt;Better quality of life&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started: Your 30-Day Plan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Week 1: Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set up ergonomic workspace&lt;/li&gt;
&lt;li&gt;Start 20-20-20 rule&lt;/li&gt;
&lt;li&gt;Take daily 10-minute walks&lt;/li&gt;
&lt;li&gt;Do basic desk stretches&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 2: Movement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add 7-minute workout 3x/week&lt;/li&gt;
&lt;li&gt;Increase walking to 15 minutes&lt;/li&gt;
&lt;li&gt;Practice good posture habits&lt;/li&gt;
&lt;li&gt;Start hydration tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 3: Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Meal prep one day&lt;/li&gt;
&lt;li&gt;Add strength exercises&lt;/li&gt;
&lt;li&gt;Improve sleep hygiene&lt;/li&gt;
&lt;li&gt;Try stress management techniques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 4: Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Establish consistent routine&lt;/li&gt;
&lt;li&gt;Track progress and adjust&lt;/li&gt;
&lt;li&gt;Plan for long-term sustainability&lt;/li&gt;
&lt;li&gt;Celebrate your improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Long Game
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fitness for developers isn't about becoming a bodybuilder&lt;/strong&gt;—it's about sustainable health practices that enhance your coding career and quality of life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small, be consistent, and focus on progress over perfection.&lt;/strong&gt; Your future self (and your code) will thank you.&lt;/p&gt;

&lt;p&gt;The best workout is the one you'll actually do. The best diet is the one you can stick to. The best health routine is the one that fits your developer lifestyle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your body is the hardware that runs your mind. Keep it maintained, and it will serve you well for decades of coding to come.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.mayoclinic.org/healthy-lifestyle/adult-health/expert-answers/sitting/faq-20058005" rel="noopener noreferrer"&gt;Mayo Clinic on Sedentary Lifestyle&lt;/a&gt; - Medical guidance on combating desk-bound health risks&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.cdc.gov/physicalactivity/basics/adults/index.htm" rel="noopener noreferrer"&gt;CDC Physical Activity Guidelines&lt;/a&gt; - Official exercise recommendations for adults&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our health content.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/fitness-for-developers" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>fitness</category>
      <category>developerwellbeing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Facebook Outage March 3, 2026: What Happened and Why</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Mon, 13 Apr 2026 10:52:01 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/facebook-outage-march-3-2026-what-happened-and-why-5h0</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/facebook-outage-march-3-2026-what-happened-and-why-5h0</guid>
      <description>&lt;h1&gt;
  
  
  Facebook Outage March 3, 2026: What Happened and Why
&lt;/h1&gt;

&lt;p&gt;On March 3, 2026, Facebook experienced a significant outage that left millions of users unable to access the platform. By 5 PM, over 10,000 users had reported access issues on Downdetector.com, with many turning to Twitter to share their frustrations. Here's what we know about the incident and what it teaches us about infrastructure reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Incident
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Timeline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;5:00 PM (17:00)&lt;/strong&gt; - Users begin reporting access issues&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First reports appear on Downdetector.com&lt;/li&gt;
&lt;li&gt;Users unable to load Facebook feed&lt;/li&gt;
&lt;li&gt;Mobile app and web interface affected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5:15 PM&lt;/strong&gt; - Reports spike to 10,000+&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Downdetector shows widespread outage&lt;/li&gt;
&lt;li&gt;Twitter fills with complaints&lt;/li&gt;
&lt;li&gt;#FacebookDown trends globally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ongoing&lt;/strong&gt; - No official statement from Meta&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users left in the dark about cause&lt;/li&gt;
&lt;li&gt;No ETA provided&lt;/li&gt;
&lt;li&gt;Speculation runs rampant on social media&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scope of Impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reported Issues:&lt;/strong&gt; 10,000+ on Downdetector (likely much higher)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affected Services:&lt;/strong&gt; Facebook web and mobile app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic Spread:&lt;/strong&gt; Global (reports from multiple countries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration:&lt;/strong&gt; Ongoing at time of reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  User Reports
&lt;/h3&gt;

&lt;p&gt;Users reported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unable to load Facebook feed&lt;/li&gt;
&lt;li&gt;Login failures&lt;/li&gt;
&lt;li&gt;Slow loading times&lt;/li&gt;
&lt;li&gt;Error messages when accessing the platform&lt;/li&gt;
&lt;li&gt;Mobile app crashes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Official Response
&lt;/h3&gt;

&lt;p&gt;As of the time of reporting, Meta had not released an official statement explaining the outage. This is typical during active incidents—companies focus on resolution rather than communication. However, transparency is crucial for maintaining user trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Causes of Large-Scale Outages
&lt;/h2&gt;

&lt;p&gt;While the exact cause of this Facebook outage remains unknown, here are the most common causes of large-scale social media outages:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Database Failures
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Complete service unavailability
Cause: Database server crash, corruption, or overload
Duration: 30 minutes to several hours
Example: 2021 Facebook outage (6+ hours)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database failures are catastrophic because they affect all services that depend on data access. If the primary database goes down and failover systems don't work, the entire platform becomes inaccessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. DNS Issues
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Users can't reach the service
Cause: DNS server failure or misconfiguration
Duration: 5-30 minutes
Example: 2016 Dyn DDoS attack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS translates domain names (facebook.com) to IP addresses. If DNS fails, users can't reach the service even if servers are running.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Load Balancer Failures
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Uneven traffic distribution, cascading failures
Cause: Load balancer crash or misconfiguration
Duration: 15-60 minutes
Example: Various cloud provider outages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load balancers distribute traffic across servers. If they fail, traffic concentrates on a few servers, causing them to crash.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deployment Bugs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Service crashes after deployment
Cause: Bad code pushed to production
Duration: 5-30 minutes (if caught quickly)
Example: 2019 Facebook outage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single bad deployment can bring down an entire service. This is why companies use canary deployments and automated rollbacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. DDoS Attacks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Service overwhelmed by traffic
Cause: Malicious traffic flood
Duration: Minutes to hours
Example: 2016 Dyn attack affected Twitter, Netflix, etc.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DDoS attacks flood services with traffic, exhausting resources and making the service unavailable to legitimate users.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Infrastructure Provider Issues
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact: Entire data center goes down
Cause: Cloud provider outage
Duration: 30 minutes to several hours
Example: AWS, Google Cloud, Azure outages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a service relies on a single cloud provider and that provider has an outage, the service goes down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons for Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Build Redundancy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Bad: Single point of failure&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connectToDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary-db.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Good: Multiple replicas with failover&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connectToDatabase&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary-db.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;replica-1.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;replica-2.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;failover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Implement Circuit Breakers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Good: Circuit breaker pattern&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;failures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;lastFailureTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;closed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;half-open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;closed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastFailureTime&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;half-open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Circuit breaker is open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;closed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;onFailure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failures&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastFailureTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failures&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Monitor Everything
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Good: Comprehensive monitoring&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;monitoring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Application metrics&lt;/span&gt;
  &lt;span class="na"&gt;trackRequestLatency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Slow request: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; took &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Infrastructure metrics&lt;/span&gt;
  &lt;span class="na"&gt;trackDatabaseLatency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Slow query: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; took &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Error tracking&lt;/span&gt;
  &lt;span class="na"&gt;trackError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Send to error tracking service&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Uptime monitoring&lt;/span&gt;
  &lt;span class="na"&gt;trackUptime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;isUp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isUp&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Graceful Degradation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Good: Graceful degradation&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPostsWithComments&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Try to get posts with comments&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchPostsWithComments&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch posts with comments, degrading...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Fallback: Get posts without comments&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Fallback: Return cached data&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getCachedPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Communicate During Outages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Good: Status page updates&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;statusPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;updateStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;operational&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;degraded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Update status page&lt;/span&gt;
    &lt;span class="c1"&gt;// Notify users via email, SMS, push notification&lt;/span&gt;
    &lt;span class="c1"&gt;// Post on social media&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;postIncident&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;impact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create incident post&lt;/span&gt;
    &lt;span class="c1"&gt;// Notify stakeholders&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Incident: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Facebook Should Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immediate Actions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Acknowledge the issue&lt;/strong&gt; - Post on status page and social media&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide updates&lt;/strong&gt; - Every 15-30 minutes with progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigate root cause&lt;/strong&gt; - Identify what went wrong&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement fix&lt;/strong&gt; - Deploy solution and verify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor closely&lt;/strong&gt; - Watch for cascading failures&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Post-Incident Actions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Publish post-mortem&lt;/strong&gt; - Explain what happened&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share lessons learned&lt;/strong&gt; - What will prevent this in future&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outline improvements&lt;/strong&gt; - Specific changes to infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apologize to users&lt;/strong&gt; - Acknowledge impact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offer compensation&lt;/strong&gt; - If appropriate (ad credits, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;This outage highlights a critical reality: &lt;strong&gt;even the largest tech companies experience downtime&lt;/strong&gt;. Facebook has some of the best engineers and infrastructure in the world, yet outages still happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Outages Happen
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; - Modern systems have thousands of interdependent components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale&lt;/strong&gt; - Serving billions of users amplifies any failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Velocity&lt;/strong&gt; - Rapid deployment increases risk of bugs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cascading failures&lt;/strong&gt; - One failure triggers others&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human error&lt;/strong&gt; - Mistakes happen despite best practices&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Cost of Downtime
&lt;/h3&gt;

&lt;p&gt;For a company like Facebook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revenue loss&lt;/strong&gt; - Millions per hour (lost ad impressions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User churn&lt;/strong&gt; - Some users switch to competitors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand damage&lt;/strong&gt; - Trust eroded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stock impact&lt;/strong&gt; - Investors lose confidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Employee stress&lt;/strong&gt; - Teams work around the clock to fix&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons for All Developers
&lt;/h2&gt;

&lt;p&gt;Whether you're building a startup or working at a major tech company, this outage teaches important lessons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Redundancy is essential&lt;/strong&gt; - Single points of failure will fail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring is critical&lt;/strong&gt; - You can't fix what you don't see&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication matters&lt;/strong&gt; - Users want to know what's happening&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing is vital&lt;/strong&gt; - Test failover and disaster recovery regularly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preparation pays off&lt;/strong&gt; - Have incident response plans ready&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/building-saas-nextjs-supabase" rel="noopener noreferrer"&gt;Building Resilient Systems with Next.js and Supabase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/nextjs-supabase-database-optimization-scaling" rel="noopener noreferrer"&gt;Database Optimization and Scaling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/nextjs-supabase-security-best-practices" rel="noopener noreferrer"&gt;Security Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Facebook outage on March 3, 2026, is a reminder that infrastructure reliability is hard. Even with unlimited resources and world-class engineers, outages happen. The key is preparing for them: build redundancy, monitor everything, communicate clearly, and have a plan to recover quickly.&lt;/p&gt;

&lt;p&gt;For developers building applications, this outage should inspire you to invest in reliability. Your users depend on your service being available. Make it a priority.&lt;/p&gt;

&lt;p&gt;We'll update this post as more information becomes available about the cause and resolution of the outage.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Check back for official statements from Meta and detailed post-mortem analysis.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/facebook-outage-march-2026-what-happened" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>facebook</category>
      <category>outage</category>
      <category>downtime</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>The Ethics of AI: A Developer's Responsibility</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Sun, 12 Apr 2026 09:52:19 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/the-ethics-of-ai-a-developers-responsibility-3j4c</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/the-ethics-of-ai-a-developers-responsibility-3j4c</guid>
      <description>&lt;h1&gt;
  
  
  The Ethics of AI: A Developer's Responsibility
&lt;/h1&gt;

&lt;p&gt;"Move fast and break things" used to be the mantra. But when the "things" you might break are democracies, individual privacies, or social fabrics, speed shouldn't be the only variable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our articles on &lt;a href="https://iloveblogs.blog/post/future-of-ai-software-development" rel="noopener noreferrer"&gt;the future of AI in software development&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/ai-coding-assistants-productivity" rel="noopener noreferrer"&gt;AI coding assistants&lt;/a&gt; for more AI insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Black Box Problem
&lt;/h2&gt;

&lt;p&gt;Modern Deep Learning models are opaque. We know the input and the output, but the "why" often escapes even the creators. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responsibility:&lt;/strong&gt; Developers must prioritize &lt;strong&gt;Explainable AI (XAI)&lt;/strong&gt;. Users deserve to know why a loan was denied or a resume rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Bias is Code Bias
&lt;/h2&gt;

&lt;p&gt;AI learns from historical data, and history is full of prejudice. If we feed these biases into our models, we amplify them at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actionable Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit Datasets&lt;/strong&gt;: Scrutinize training data for representation gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fairness Metrics&lt;/strong&gt;: Test models against diverse demographic groups before deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-Loop&lt;/strong&gt;: meaningful human oversight for high-stakes decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy in the Age of Inference
&lt;/h2&gt;

&lt;p&gt;It's not just about what data you collect, but what you can &lt;em&gt;infer&lt;/em&gt;. AI can predict health conditions, political leanings, or future locations from seemingly innocuous metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by Design&lt;/strong&gt;: Minizimize data collection. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Federated Learning&lt;/strong&gt;: Train models on devices without moving user data to central servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Dual-Use Dilemma
&lt;/h2&gt;

&lt;p&gt;Powerful AI tools can be used for creativity or deception (Deepfakes). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;br&gt;
We are the architects of this new intelligence. It is not enough to ask "Can we build this?" We must relentlessly ask "Should we build this, and how do we make it safe?"&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ethicsinaction.ieee.org/" rel="noopener noreferrer"&gt;AI Ethics Guidelines by IEEE&lt;/a&gt; - Industry standards for ethical AI development&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://partnershiponai.org/" rel="noopener noreferrer"&gt;Partnership on AI&lt;/a&gt; - Multi-stakeholder organization advancing responsible AI&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our AI ethics content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;p&gt;Explore more articles in our AI Integration series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iloveblogs.blog/guides/ai-integration-nextjs-supabase" rel="noopener noreferrer"&gt;AI Integration for Next.js + Supabase Applications&lt;/a&gt; - Complete guide covering all aspects&lt;/li&gt;
&lt;li&gt;More related articles coming soon&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/ethics-in-ai-development" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethics</category>
      <category>ai</category>
      <category>society</category>
      <category>responsibility</category>
    </item>
    <item>
      <title>The Ultimate Ergonomics Guide: Saving Your Back, 8 Hours at a Time</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Sat, 11 Apr 2026 09:50:56 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/the-ultimate-ergonomics-guide-saving-your-back-8-hours-at-a-time-3meg</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/the-ultimate-ergonomics-guide-saving-your-back-8-hours-at-a-time-3meg</guid>
      <description>&lt;h1&gt;
  
  
  The Ultimate Ergonomics Guide: Saving Your Back, 8 Hours at
&lt;/h1&gt;

&lt;p&gt;We spend 1/3 of our lives in bed and another 1/3 in a chair. You probably bought a nice mattress. Start treating your chair with the same respect.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our articles on &lt;a href="https://iloveblogs.blog/post/home-office-guide" rel="noopener noreferrer"&gt;setting up your home office&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/fitness-for-developers" rel="noopener noreferrer"&gt;fitness for developers&lt;/a&gt; for more insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The 90-90-90 Rule
&lt;/h2&gt;

&lt;p&gt;When sitting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Elbows&lt;/strong&gt; should be at 90 degrees.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Hips&lt;/strong&gt; should be at 90 degrees.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Knees&lt;/strong&gt; should be at 90 degrees (feet flat on the floor).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your feet dangle, get a footrest. Ideally, your keyboard should be at elbow height so your wrists remain neutral.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor Height Matters
&lt;/h2&gt;

&lt;p&gt;The top of your monitor/screen should be at or slightly below eye level.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too low?&lt;/strong&gt; Tech neck (forward head posture).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too high?&lt;/strong&gt; Dry eyes (you blink less looking up) and neck strain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Standing Desks: Not a Magic Bullet
&lt;/h2&gt;

&lt;p&gt;Standing all day is just as bad as sitting all day (hello, varicose veins).&lt;br&gt;
&lt;strong&gt;The Goal:&lt;/strong&gt; Movement.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sit for 45 mins.&lt;/li&gt;
&lt;li&gt;Stand for 15 mins.&lt;/li&gt;
&lt;li&gt;Walk for 5 mins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 20-20-20 Rule for Eyes
&lt;/h2&gt;

&lt;p&gt;Every 20 minutes, look at something 20 feet away for 20 seconds. Digital eye strain is real, and it kills your focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You only get one spine. Optimizing your setup isn't an expense; it's an investment in your career longevity.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.osha.gov/etools/computer-workstations" rel="noopener noreferrer"&gt;OSHA Computer Workstation Guidelines&lt;/a&gt; - Official workplace ergonomics standards from the Occupational Safety and Health Administration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ergo.human.cornell.edu/" rel="noopener noreferrer"&gt;Cornell University Ergonomics Web&lt;/a&gt; - Research-based ergonomic guidelines and workstation setup recommendations from Cornell's Human Factors and Ergonomics Research Group.&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our content.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/ergonomics-setup-for-long-sessions" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>health</category>
      <category>ergonomics</category>
      <category>workspace</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Edge Computing: Why Your App Should Think Locally</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Fri, 10 Apr 2026 10:13:25 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/edge-computing-why-your-app-should-think-locally-cka</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/edge-computing-why-your-app-should-think-locally-cka</guid>
      <description>&lt;h1&gt;
  
  
  Edge Computing: Why Your App Should Think Locally
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Forget the Cloud, Get Closer!
&lt;/h2&gt;

&lt;p&gt;Ever marvel at the responsiveness of a self-driving car as it navigates a busy intersection, making split-second decisions? Or perhaps you've witnessed the proactive nature of a smart factory, identifying potential equipment failures before they lead to costly downtime? These are not mere technological advancements; they represent a paradigm shift in how we process and interact with data, moving away from centralized cloud solutions and embracing the power of edge computing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our articles on &lt;a href="https://iloveblogs.blog/post/future-of-ai-software-development" rel="noopener noreferrer"&gt;the future of AI in software development&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/plug-play-brains-ai-apis" rel="noopener noreferrer"&gt;building with AI APIs&lt;/a&gt; for related technology insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Edge computing, in essence, is about &lt;strong&gt;processing data where it's created&lt;/strong&gt; – at the "edge" of the network, rather than sending it all the way to a distant cloud. Think of it as distributing intelligence, giving local devices the ability to analyze and react to information in real-time. It's like having a local branch office handle immediate tasks while headquarters manages the big picture.&lt;/p&gt;

&lt;p&gt;The promise is tantalizing: quicker responses, smoother experiences, and the ability to unlock entirely new technological possibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Aha!" Moment: Where Did This Idea Come From?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Early Seeds
&lt;/h3&gt;

&lt;p&gt;The concept of edge computing isn't entirely new. Recall the early days of the internet, when loading a simple webpage could feel like an eternity. &lt;strong&gt;Content Delivery Networks (CDNs)&lt;/strong&gt; emerged in the 90s as a solution, strategically caching content closer to users, reducing latency and improving website performance. This can be considered the primordial form of "edge."&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile's Contribution
&lt;/h3&gt;

&lt;p&gt;Mobile technology also played a crucial role. As mobile devices became more sophisticated, they faced limitations in processing power and battery life. To overcome these constraints, early mobile systems offloaded tasks to &lt;strong&gt;"surrogate servers,"&lt;/strong&gt; essentially extending the device's capabilities by leveraging nearby resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Evolution of Terms
&lt;/h3&gt;

&lt;p&gt;Terms like &lt;strong&gt;"cloudlets"&lt;/strong&gt; (mini-clouds nearby) and &lt;strong&gt;"fog computing"&lt;/strong&gt; (a cloudy layer at the edge) began to circulate, each representing a slightly different approach to distributing computing resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Perfect Storm
&lt;/h3&gt;

&lt;p&gt;The true catalyst for edge computing's rise was the confluence of two powerful forces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The IoT Explosion:&lt;/strong&gt; Billions of smart devices generating vast amounts of data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 5G Revolution:&lt;/strong&gt; Ultra-fast speeds and low latency creating perfect conditions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This combination made "thinking locally" not just a good idea, but an absolute necessity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Going Local is a Game-Changer: The Power of the Edge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Speed Demon (Latency Reduction)
&lt;/h3&gt;

&lt;p&gt;In scenarios where every millisecond counts, the reduction in latency offered by edge computing is critical. Autonomous vehicles, for example, cannot afford delays in processing sensor data. Similarly, real-time patient monitoring systems require immediate analysis to detect and respond to critical events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Impact:&lt;/strong&gt; Reducing latency from 100ms to 1ms can mean the difference between life and death in medical applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bandwidth Buddy (Efficiency &amp;amp; Cost Savings)
&lt;/h3&gt;

&lt;p&gt;By processing data locally, edge computing significantly reduces the amount of data that needs to be transmitted over the internet. This not only alleviates network congestion but also lowers bandwidth costs, especially for applications that generate large volumes of data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced data transmission costs&lt;/li&gt;
&lt;li&gt;Lower cloud storage requirements&lt;/li&gt;
&lt;li&gt;Decreased network infrastructure strain&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Superhero &amp;amp; Privacy Protector
&lt;/h3&gt;

&lt;p&gt;Processing sensitive data locally can enhance security and privacy. By keeping data within a controlled environment, organizations can reduce the risk of interception or unauthorized access during transit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data stays within local perimeter&lt;/li&gt;
&lt;li&gt;Reduced attack surface during transmission&lt;/li&gt;
&lt;li&gt;Better compliance with data sovereignty laws&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reliability Rock Star
&lt;/h3&gt;

&lt;p&gt;Edge devices can continue operating even when the internet connection is disrupted, providing a level of resilience that is not possible with cloud-based systems. This is particularly important for critical infrastructure and industrial applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Magic (Applications)
&lt;/h3&gt;

&lt;p&gt;The possibilities are vast:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Factories:&lt;/strong&gt; Predictive maintenance and real-time quality control prevent costly downtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Healthcare:&lt;/strong&gt; Remote patient monitoring and personalized medicine deliver life-saving insights instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retail:&lt;/strong&gt; Personalized shopping experiences and optimized inventory management enhance customer satisfaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gaming &amp;amp; AR/VR:&lt;/strong&gt; Immersive and lag-free gaming and augmented reality experiences become truly seamless.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bumps in the Road: Why Everyone Isn't on the Edge (Yet!)
&lt;/h2&gt;

&lt;p&gt;Despite its immense potential, edge computing faces several challenges that prevent universal adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Price Tag
&lt;/h3&gt;

&lt;p&gt;Deploying and maintaining edge infrastructure can be expensive, requiring significant upfront investment in hardware and software. Organizations must weigh the costs against the benefits carefully.&lt;/p&gt;

&lt;h3&gt;
  
  
  "It's Complicated"
&lt;/h3&gt;

&lt;p&gt;Managing a distributed network of edge devices can be complex, requiring specialized skills and expertise. The complexity increases exponentially with the number of edge nodes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security's Sprawl
&lt;/h3&gt;

&lt;p&gt;The proliferation of edge devices increases the attack surface, making it more challenging to secure the overall system. Each edge device becomes a potential entry point for malicious actors.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Wild West" Standards
&lt;/h3&gt;

&lt;p&gt;The lack of standardized protocols and frameworks can hinder interoperability between different edge systems, creating vendor lock-in and integration challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Talent Gap
&lt;/h3&gt;

&lt;p&gt;There is a shortage of skilled professionals with the expertise to design, deploy, and manage edge computing solutions. This skills gap is slowing adoption across industries.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Data Deluge at the Edge
&lt;/h3&gt;

&lt;p&gt;Managing the massive amounts of data generated at the edge requires robust data management and analytics capabilities, which can be overwhelming for organizations unprepared for the scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead: The Edge of Tomorrow
&lt;/h2&gt;

&lt;p&gt;The future of edge computing is bright, with several exciting trends on the horizon.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Gets Local
&lt;/h3&gt;

&lt;p&gt;Artificial intelligence is increasingly being deployed at the edge, enabling devices to make intelligent decisions in real-time without relying on cloud connectivity. This &lt;strong&gt;"AI at the Edge"&lt;/strong&gt; revolution is transforming everything from smartphones to industrial equipment.&lt;/p&gt;

&lt;h3&gt;
  
  
  6G &amp;amp; Beyond
&lt;/h3&gt;

&lt;p&gt;Next-generation wireless technologies like &lt;strong&gt;6G&lt;/strong&gt; will further enhance the capabilities of edge computing, enabling new applications such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immersive XR experiences with zero latency&lt;/li&gt;
&lt;li&gt;Hyper-connected smart cities&lt;/li&gt;
&lt;li&gt;Real-time holographic communications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Smart Hybrids
&lt;/h3&gt;

&lt;p&gt;Cloud and edge computing will increasingly work in tandem, with edge handling real-time processing and cloud providing large-scale data analytics and storage. This &lt;strong&gt;hybrid approach&lt;/strong&gt; offers the best of both worlds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation is Key
&lt;/h3&gt;

&lt;p&gt;Automation tools and platforms will simplify the management of distributed edge systems, making it easier to deploy and scale edge applications without requiring extensive technical expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Greener Computing
&lt;/h3&gt;

&lt;p&gt;Efforts are underway to develop more energy-efficient edge devices and solutions, reducing the environmental impact of edge computing while maintaining performance benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Frontiers
&lt;/h3&gt;

&lt;p&gt;The applications of edge computing are constantly expanding:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous Drones &amp;amp; Delivery:&lt;/strong&gt; Ultra-fast decisions for flying robots navigating complex environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precision Agriculture:&lt;/strong&gt; Hyper-local crop monitoring for healthier food production and sustainable farming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Digital Twins:&lt;/strong&gt; Creating virtual copies of real-world objects that update in real-time at the edge, enabling predictive maintenance and optimization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Cities:&lt;/strong&gt; Traffic optimization, environmental monitoring, and public safety systems that respond instantly to changing conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Your App Ready to Think Locally?
&lt;/h2&gt;

&lt;p&gt;Edge computing is transforming the way we interact with technology, bringing intelligence and processing power closer to the point of interaction. This shift represents more than just a technical evolution—it's a fundamental reimagining of how we design and deploy applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Considerations for Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Architecture Redesign:&lt;/strong&gt; Applications need to be redesigned to take advantage of distributed processing capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Strategy:&lt;/strong&gt; Determine what data should be processed locally versus in the cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Planning:&lt;/strong&gt; Implement robust security measures for distributed edge nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalability Planning:&lt;/strong&gt; Design systems that can scale across multiple edge locations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Competitive Advantage
&lt;/h3&gt;

&lt;p&gt;Organizations that embrace edge computing early will gain significant competitive advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster, more responsive applications&lt;/li&gt;
&lt;li&gt;Reduced operational costs&lt;/li&gt;
&lt;li&gt;Enhanced user experiences&lt;/li&gt;
&lt;li&gt;New revenue opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While challenges remain, the benefits of edge computing are undeniable. The future is distributed, and understanding edge computing is essential for staying ahead in an increasingly connected world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question isn't whether edge computing will become mainstream—it's whether your application will be ready to embrace its local brain when the time comes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we move toward a world of billions of connected devices, real-time AI, and immersive experiences, edge computing isn't just an option—it's becoming a necessity. The apps that think locally will be the ones that win globally.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/edge/" rel="noopener noreferrer"&gt;AWS Edge Computing&lt;/a&gt; - Amazon's comprehensive edge computing solutions and documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.cloudflare.com/workers/" rel="noopener noreferrer"&gt;Cloudflare Workers Documentation&lt;/a&gt; - Leading edge computing platform for developers&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our technology content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article is part of our comprehensive &lt;a href="https://iloveblogs.blog/guides/deploying-nextjs-supabase-production" rel="noopener noreferrer"&gt;Deploying Next.js + Supabase to Production&lt;/a&gt; guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Your App Ready to Think Locally?
&lt;/h3&gt;

&lt;p&gt;Edge computing is transforming the way we interact with technology, bringing intelligence and processing power closer to the point of interaction. This shift represents more than just a technical evolution—it's a fundamental reimagining of how we design and deploy applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;p&gt;Explore more articles in our Deployment &amp;amp; DevOps series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iloveblogs.blog/guides/deploying-nextjs-supabase-production" rel="noopener noreferrer"&gt;Deploying Next.js + Supabase to Production&lt;/a&gt; - Complete guide covering all aspects&lt;/li&gt;
&lt;li&gt;More related articles coming soon&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/edge-computing" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>edgecomputing</category>
      <category>cloud</category>
      <category>iot</category>
      <category>performance</category>
    </item>
    <item>
      <title>7 Dog Training Mistakes That Make Behavior Worse</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Thu, 09 Apr 2026 10:19:45 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/7-dog-training-mistakes-that-make-behavior-worse-70k</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/7-dog-training-mistakes-that-make-behavior-worse-70k</guid>
      <description>&lt;h1&gt;
  
  
  7 Dog Training Mistakes That Make Behavior Worse
&lt;/h1&gt;

&lt;p&gt;Most dog behavior problems aren't caused by "bad dogs"—they're caused by well-meaning owners making common training mistakes. After working with thousands of dogs and their families, I've seen the same errors repeated over and over, often making problems worse instead of better.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: Check out our guides on &lt;a href="https://iloveblogs.blog/post/cat-behavior-problems-solutions" rel="noopener noreferrer"&gt;cat behavior problems&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/choosing-right-pet" rel="noopener noreferrer"&gt;choosing the right pet&lt;/a&gt; for more pet care insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Dog Training Mistakes Happen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Root Causes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Inconsistent information&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conflicting advice from different sources&lt;/li&gt;
&lt;li&gt;Outdated training methods still being taught&lt;/li&gt;
&lt;li&gt;Social media "quick fixes" that don't work&lt;/li&gt;
&lt;li&gt;Well-meaning but incorrect advice from friends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Human nature working against us&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We want immediate results (dogs learn gradually)&lt;/li&gt;
&lt;li&gt;We apply human logic to dog behavior&lt;/li&gt;
&lt;li&gt;We give up too quickly when methods don't work instantly&lt;/li&gt;
&lt;li&gt;We accidentally reward bad behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lack of understanding&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not knowing how dogs actually learn&lt;/li&gt;
&lt;li&gt;Misreading dog body language&lt;/li&gt;
&lt;li&gt;Expecting dogs to generalize training too quickly&lt;/li&gt;
&lt;li&gt;Not considering the dog's individual personality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The cost of mistakes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Behavior problems get worse over time&lt;/li&gt;
&lt;li&gt;Dogs become confused and stressed&lt;/li&gt;
&lt;li&gt;Trust between dog and owner breaks down&lt;/li&gt;
&lt;li&gt;Some dogs end up surrendered to shelters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mistake #1: Inconsistent Rules and Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Different family members, different rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mom says "no jumping," Dad allows it&lt;/li&gt;
&lt;li&gt;Kids let dog on furniture, parents don't&lt;/li&gt;
&lt;li&gt;One person uses "sit," another uses "sit down"&lt;/li&gt;
&lt;li&gt;Inconsistent enforcement of boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Changing rules based on mood&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allowing begging when you're eating something tasty&lt;/li&gt;
&lt;li&gt;Letting dog sleep in bed sometimes but not others&lt;/li&gt;
&lt;li&gt;Being strict when stressed, lenient when relaxed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;Dogs thrive on consistency and clear expectations. When rules constantly change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dogs become confused about what's expected&lt;/li&gt;
&lt;li&gt;They test boundaries more frequently&lt;/li&gt;
&lt;li&gt;Training progress slows dramatically&lt;/li&gt;
&lt;li&gt;Anxiety and stress increase&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Family Meeting&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discuss and agree on all house rules&lt;/li&gt;
&lt;li&gt;Write down commands everyone will use&lt;/li&gt;
&lt;li&gt;Decide on consequences for breaking rules&lt;/li&gt;
&lt;li&gt;Post rules where everyone can see them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Consistent Commands&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use these exact words:
- "Sit" (not "sit down" or "sit please")
- "Stay" (not "wait" or "hold on")
- "Come" (not "come here" or "get over here")
- "Down" (not "lie down" or "lay down")
- "Off" (not "down" or "get off")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: 100% Consistency&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rules apply 24/7, regardless of circumstances&lt;/li&gt;
&lt;li&gt;Every family member enforces the same rules&lt;/li&gt;
&lt;li&gt;Visitors are informed of house rules&lt;/li&gt;
&lt;li&gt;No exceptions, even when dog is "being cute"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Fix Inconsistency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Establish clear rules and commands&lt;br&gt;
&lt;strong&gt;Week 2&lt;/strong&gt;: Practice consistent enforcement&lt;br&gt;
&lt;strong&gt;Week 3&lt;/strong&gt;: Address any confusion with extra training&lt;br&gt;
&lt;strong&gt;Week 4&lt;/strong&gt;: Maintain consistency long-term&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeline&lt;/strong&gt;: Most dogs adapt to consistent rules within 2-3 weeks.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mistake #2: Using Punishment and Dominance
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Outdated "alpha" methods&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alpha rolls (forcing dog onto back)&lt;/li&gt;
&lt;li&gt;Scruff shaking&lt;/li&gt;
&lt;li&gt;Yelling or intimidation&lt;/li&gt;
&lt;li&gt;"Showing the dog who's boss"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Punishment-based training&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shock collars for basic training&lt;/li&gt;
&lt;li&gt;Hitting or physical corrections&lt;/li&gt;
&lt;li&gt;Rubbing nose in accidents&lt;/li&gt;
&lt;li&gt;Withholding food or water&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;Modern animal behavior science has debunked dominance theory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dogs don't see humans as "pack leaders"&lt;/li&gt;
&lt;li&gt;Punishment creates fear, not respect&lt;/li&gt;
&lt;li&gt;Fearful dogs are more likely to bite&lt;/li&gt;
&lt;li&gt;Stress interferes with learning&lt;/li&gt;
&lt;li&gt;Damages the human-dog bond&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real consequences&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased aggression&lt;/li&gt;
&lt;li&gt;Anxiety and fearfulness&lt;/li&gt;
&lt;li&gt;Suppressed warning signals (dog may bite without warning)&lt;/li&gt;
&lt;li&gt;Reduced willingness to try new behaviors&lt;/li&gt;
&lt;li&gt;Behavioral problems often get worse&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Positive reinforcement training&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reward good behavior immediately&lt;/li&gt;
&lt;li&gt;Ignore or redirect unwanted behavior&lt;/li&gt;
&lt;li&gt;Use treats, praise, and play as rewards&lt;/li&gt;
&lt;li&gt;Focus on teaching what you want, not punishing what you don't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to redirect instead of punish&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instead of: Yelling "NO!" when dog jumps
Try: Turn away, ignore jumping, reward when four paws are on ground

Instead of: Scolding for chewing shoes
Try: Redirect to appropriate chew toy, praise for chewing toy

Instead of: Punishing for pulling on leash
Try: Stop moving when dog pulls, reward loose leash walking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Building trust&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be patient and consistent&lt;/li&gt;
&lt;li&gt;Celebrate small victories&lt;/li&gt;
&lt;li&gt;End training sessions on a positive note&lt;/li&gt;
&lt;li&gt;Make training fun for both of you&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Success Timeline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Week 1&lt;/strong&gt;: Dog may be confused by new approach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2&lt;/strong&gt;: Dog starts responding to positive methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3&lt;/strong&gt;: Noticeable improvement in behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Month 2&lt;/strong&gt;: Strong foundation of trust and cooperation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mistake #3: Inadequate or Inconsistent Exercise
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Not enough physical exercise&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One short walk per day&lt;/li&gt;
&lt;li&gt;Only letting dog out in backyard&lt;/li&gt;
&lt;li&gt;Skipping exercise on busy days&lt;/li&gt;
&lt;li&gt;Thinking small dogs don't need much exercise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not enough mental stimulation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No puzzle toys or training games&lt;/li&gt;
&lt;li&gt;Same routine every day&lt;/li&gt;
&lt;li&gt;No new experiences or environments&lt;/li&gt;
&lt;li&gt;Leaving dog alone with nothing to do for hours&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"A tired dog is a good dog"&lt;/strong&gt; - this saying exists for a reason:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excess energy leads to destructive behavior&lt;/li&gt;
&lt;li&gt;Bored dogs create their own entertainment (usually destructive)&lt;/li&gt;
&lt;li&gt;Lack of stimulation causes anxiety and stress&lt;/li&gt;
&lt;li&gt;Pent-up energy makes training much harder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common problems from inadequate exercise&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excessive barking&lt;/li&gt;
&lt;li&gt;Destructive chewing&lt;/li&gt;
&lt;li&gt;Hyperactivity and inability to settle&lt;/li&gt;
&lt;li&gt;Attention-seeking behaviors&lt;/li&gt;
&lt;li&gt;Difficulty focusing during training&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Physical exercise requirements&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;High-energy breeds (Border Collie, Australian Shepherd, Jack Russell):
- 2+ hours of vigorous exercise daily
- Running, hiking, fetch, agility

Medium-energy breeds (Golden Retriever, Beagle, Cocker Spaniel):
- 1-2 hours of moderate exercise daily
- Walks, swimming, play sessions

Low-energy breeds (Bulldog, Basset Hound, Pug):
- 30-60 minutes of gentle exercise daily
- Short walks, indoor play
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mental stimulation ideas&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puzzle feeders and treat-dispensing toys&lt;/li&gt;
&lt;li&gt;Hide treats around the house&lt;/li&gt;
&lt;li&gt;Teach new tricks weekly&lt;/li&gt;
&lt;li&gt;Rotate toys to maintain novelty&lt;/li&gt;
&lt;li&gt;Practice obedience in new locations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Tire Out Your Dog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Morning Exercise&lt;/strong&gt; (20-30 minutes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brisk walk or jog&lt;/li&gt;
&lt;li&gt;Fetch in the yard&lt;/li&gt;
&lt;li&gt;Treadmill training for bad weather&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Mental Challenges&lt;/strong&gt; (15-20 minutes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Training session with treats&lt;/li&gt;
&lt;li&gt;Puzzle toys during meals&lt;/li&gt;
&lt;li&gt;Hide and seek games&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Evening Activity&lt;/strong&gt; (20-30 minutes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Another walk or play session&lt;/li&gt;
&lt;li&gt;Social time with family&lt;/li&gt;
&lt;li&gt;Calm activities before bed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exercise Troubleshooting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"I don't have time for long walks"&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a treadmill or hire a dog walker&lt;/li&gt;
&lt;li&gt;Try high-intensity activities (fetch is more tiring than walking)&lt;/li&gt;
&lt;li&gt;Mental stimulation can substitute for some physical exercise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"My dog is still hyper after exercise"&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You may need more mental stimulation&lt;/li&gt;
&lt;li&gt;Some dogs need a cool-down period&lt;/li&gt;
&lt;li&gt;Consider if your dog is overtired (yes, this happens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Bad weather prevents outdoor exercise"&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indoor activities: stairs, hallway fetch, treadmill&lt;/li&gt;
&lt;li&gt;Mental games: training, puzzle toys, hide treats&lt;/li&gt;
&lt;li&gt;Dog daycare or indoor dog parks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mistake #4: Poor Timing of Rewards and Corrections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Delayed rewards&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Praising dog 30 seconds after they sit&lt;/li&gt;
&lt;li&gt;Giving treats after dog has moved on to different behavior&lt;/li&gt;
&lt;li&gt;Waiting until you find treats in your pocket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Delayed corrections&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scolding dog for accident you found hours later&lt;/li&gt;
&lt;li&gt;Correcting jumping after dog has already stopped&lt;/li&gt;
&lt;li&gt;Addressing behavior problems days after they happen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rewarding the wrong behavior&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giving attention when dog is demanding it&lt;/li&gt;
&lt;li&gt;Treating dog to "calm them down" when they're excited&lt;/li&gt;
&lt;li&gt;Petting dog when they're fearful (reinforcing fear)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dogs live in the moment&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They associate rewards/corrections with whatever they're doing RIGHT NOW&lt;/li&gt;
&lt;li&gt;A 3-second delay is too long for most dogs to make the connection&lt;/li&gt;
&lt;li&gt;Delayed feedback confuses dogs about what behavior you want&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Accidental reinforcement&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might be rewarding the behavior that happened just before the treat&lt;/li&gt;
&lt;li&gt;Dogs repeat behaviors that get them attention (even negative attention)&lt;/li&gt;
&lt;li&gt;Inconsistent timing makes training much slower&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Perfect timing rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reward within 1-2 seconds of desired behavior&lt;/li&gt;
&lt;li&gt;Use a marker word ("Yes!" or clicker) to mark exact moment&lt;/li&gt;
&lt;li&gt;Have treats ready before starting training&lt;/li&gt;
&lt;li&gt;Practice your timing without the dog first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Improve Your Timing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Use a Marker&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dog sits → Immediately say "Yes!" → Give treat
Dog comes when called → "Yes!" the moment they turn toward you → Treat when they arrive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Be Prepared&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep treats in your pocket during training&lt;/li&gt;
&lt;li&gt;Have rewards ready before asking for behavior&lt;/li&gt;
&lt;li&gt;Use praise as immediate reward, treat as secondary reward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Practice&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with easy behaviors dog already knows&lt;/li&gt;
&lt;li&gt;Focus on marking the exact moment of correct behavior&lt;/li&gt;
&lt;li&gt;Gradually work up to more complex behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common timing mistakes&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wrong: Dog sits, stands up, then you say "good sit" and give treat
Right: Dog sits → "Yes!" immediately → treat while still sitting

Wrong: Dog comes running, you wait until they reach you to praise
Right: Dog turns toward you when called → "Yes!" immediately → praise and treat when they arrive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Timing Training Exercise
&lt;/h3&gt;

&lt;p&gt;Practice this daily for one week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask dog to sit&lt;/li&gt;
&lt;li&gt;The moment their bottom touches ground, say "Yes!"&lt;/li&gt;
&lt;li&gt;Immediately give treat&lt;/li&gt;
&lt;li&gt;Repeat 10 times&lt;/li&gt;
&lt;li&gt;Notice how much faster your dog responds with good timing&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mistake #5: Not Understanding Dog Body Language
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Misreading stress signals&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thinking panting always means dog is happy&lt;/li&gt;
&lt;li&gt;Interpreting lip licking as "being cute"&lt;/li&gt;
&lt;li&gt;Missing signs that dog is overwhelmed&lt;/li&gt;
&lt;li&gt;Pushing training when dog is showing stress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Misunderstanding play vs. aggression&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allowing "play" that's actually bullying&lt;/li&gt;
&lt;li&gt;Not recognizing when dog is uncomfortable&lt;/li&gt;
&lt;li&gt;Missing warning signs before dog snaps&lt;/li&gt;
&lt;li&gt;Confusing excitement with aggression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ignoring calming signals&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not recognizing when dog is trying to de-escalate&lt;/li&gt;
&lt;li&gt;Continuing interaction when dog shows avoidance&lt;/li&gt;
&lt;li&gt;Missing subtle "no" signals from dog&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dogs communicate constantly&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They're always telling us how they feel&lt;/li&gt;
&lt;li&gt;Ignoring their signals leads to bigger problems&lt;/li&gt;
&lt;li&gt;Stressed dogs can't learn effectively&lt;/li&gt;
&lt;li&gt;Misunderstandings damage trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Escalation happens gradually&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dogs give many warnings before biting&lt;/li&gt;
&lt;li&gt;Each ignored signal makes the next one stronger&lt;/li&gt;
&lt;li&gt;Eventually dogs may skip warnings and go straight to biting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn to read stress signals&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Early stress signs:
- Lip licking when not hungry
- Yawning when not tired
- Panting when not hot/exercised
- Avoiding eye contact
- Moving slowly or freezing

Moderate stress signs:
- Excessive shedding
- Drooling
- Trembling
- Hiding or trying to escape
- Displacement behaviors (scratching, sniffing ground)

Severe stress signs:
- Growling or snapping
- Rigid body posture
- Whale eye (showing whites of eyes)
- Raised hackles
- Aggressive posturing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Calming signals dogs use&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turning head away&lt;/li&gt;
&lt;li&gt;Sniffing the ground&lt;/li&gt;
&lt;li&gt;Yawning&lt;/li&gt;
&lt;li&gt;Play bow&lt;/li&gt;
&lt;li&gt;Sitting or lying down&lt;/li&gt;
&lt;li&gt;Moving slowly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Respond to Stress Signals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Stop what you're doing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't continue training if dog is stressed&lt;/li&gt;
&lt;li&gt;Give dog space and time to calm down&lt;/li&gt;
&lt;li&gt;Remove stressors from environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Help dog feel safe&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use calm, quiet voice&lt;/li&gt;
&lt;li&gt;Avoid direct eye contact&lt;/li&gt;
&lt;li&gt;Let dog approach you rather than approaching them&lt;/li&gt;
&lt;li&gt;Offer high-value treats from a distance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Adjust your approach&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break training into smaller steps&lt;/li&gt;
&lt;li&gt;Reduce distractions in environment&lt;/li&gt;
&lt;li&gt;Use higher-value rewards&lt;/li&gt;
&lt;li&gt;Shorten training sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Body Language Training Exercise
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Observe your dog for 10 minutes daily, noting all body language&lt;br&gt;
&lt;strong&gt;Week 2&lt;/strong&gt;: Practice recognizing stress signals during training&lt;br&gt;
&lt;strong&gt;Week 3&lt;/strong&gt;: Adjust your training based on dog's body language&lt;br&gt;
&lt;strong&gt;Week 4&lt;/strong&gt;: Help others learn to read your dog's signals&lt;/p&gt;
&lt;h2&gt;
  
  
  Mistake #6: Expecting Too Much Too Fast
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Unrealistic timelines&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expecting puppy to be housetrained in a week&lt;/li&gt;
&lt;li&gt;Getting frustrated when dog doesn't learn trick in one session&lt;/li&gt;
&lt;li&gt;Thinking dog should generalize training immediately&lt;/li&gt;
&lt;li&gt;Expecting perfect behavior in all situations after basic training&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skipping steps&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teaching "stay" for 10 minutes before mastering 10 seconds&lt;/li&gt;
&lt;li&gt;Expecting recall in dog park before mastering it at home&lt;/li&gt;
&lt;li&gt;Training in distracting environments before dog knows basics&lt;/li&gt;
&lt;li&gt;Moving to advanced tricks before mastering basic commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All-or-nothing thinking&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thinking dog "knows" command if they do it sometimes&lt;/li&gt;
&lt;li&gt;Getting frustrated by inconsistent performance&lt;/li&gt;
&lt;li&gt;Not understanding that learning is gradual&lt;/li&gt;
&lt;li&gt;Expecting same performance in all environments&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learning is gradual&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dogs need many repetitions to form habits&lt;/li&gt;
&lt;li&gt;Each new environment requires re-learning&lt;/li&gt;
&lt;li&gt;Stress and excitement interfere with performance&lt;/li&gt;
&lt;li&gt;Consistency takes time to develop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frustration hurts training&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dogs pick up on human frustration&lt;/li&gt;
&lt;li&gt;Stress makes learning harder for both dog and human&lt;/li&gt;
&lt;li&gt;Impatience leads to shortcuts that don't work&lt;/li&gt;
&lt;li&gt;Giving up too early prevents success&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Realistic training timelines&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Basic commands (sit, stay, come):
- 2-4 weeks for reliable performance at home
- 2-3 months for performance in distracting environments
- 6+ months for truly reliable performance everywhere

Housetraining:
- 4-6 months for most puppies
- 1-2 years for small breeds
- Adult dogs: 2-4 weeks if no medical issues

Complex behaviors:
- 3-6 months for solid foundation
- 1+ years for advanced training
- Lifetime of maintenance and practice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The 3 D's of training&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: How long dog holds behavior&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distance&lt;/strong&gt;: How far away you can be&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distraction&lt;/strong&gt;: How many distractions dog can ignore&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Only work on ONE "D" at a time&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master 5-second stay, then work on distance&lt;/li&gt;
&lt;li&gt;Master stay across room, then add distractions&lt;/li&gt;
&lt;li&gt;Never increase all three at once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Set Realistic Goals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Break behaviors into tiny steps&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Teaching "stay":
Week 1: 1-2 seconds, right in front of dog
Week 2: 3-5 seconds, right in front of dog
Week 3: 5-10 seconds, right in front of dog
Week 4: 10 seconds, take one step back
Week 5: 10 seconds, take two steps back
...and so on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Practice in easy environments first&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master behavior at home before trying outside&lt;/li&gt;
&lt;li&gt;Start in quiet room, gradually add distractions&lt;/li&gt;
&lt;li&gt;Practice when dog is calm and focused&lt;/li&gt;
&lt;li&gt;End sessions on successful note&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Celebrate small victories&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acknowledge every improvement&lt;/li&gt;
&lt;li&gt;Don't focus on what dog can't do yet&lt;/li&gt;
&lt;li&gt;Remember that progress isn't always linear&lt;/li&gt;
&lt;li&gt;Some days will be better than others&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Patience Training Exercise
&lt;/h3&gt;

&lt;p&gt;For one week, focus only on celebrating what your dog DOES right:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notice every small improvement&lt;/li&gt;
&lt;li&gt;Reward attempts, not just perfect performance&lt;/li&gt;
&lt;li&gt;Keep training sessions short (5-10 minutes)&lt;/li&gt;
&lt;li&gt;End each session with something dog does well&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mistake #7: Giving Up Too Early
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What This Looks Like
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Switching methods constantly&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trying new training method every week&lt;/li&gt;
&lt;li&gt;Giving up on technique after few days&lt;/li&gt;
&lt;li&gt;Constantly searching for "quick fixes"&lt;/li&gt;
&lt;li&gt;Not giving any method enough time to work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconsistent practice&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Training intensively for a week, then stopping&lt;/li&gt;
&lt;li&gt;Only training when problems occur&lt;/li&gt;
&lt;li&gt;Skipping training sessions regularly&lt;/li&gt;
&lt;li&gt;Not practicing learned behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Expecting linear progress&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting discouraged by temporary setbacks&lt;/li&gt;
&lt;li&gt;Thinking dog has "forgotten" training after bad day&lt;/li&gt;
&lt;li&gt;Not understanding that learning has ups and downs&lt;/li&gt;
&lt;li&gt;Giving up during normal learning plateaus&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why This Backfires
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dogs need consistency&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frequent method changes confuse dogs&lt;/li&gt;
&lt;li&gt;Each new approach requires starting over&lt;/li&gt;
&lt;li&gt;Inconsistent practice leads to inconsistent results&lt;/li&gt;
&lt;li&gt;Dogs need time to form habits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Learning isn't linear&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All learning involves plateaus and setbacks&lt;/li&gt;
&lt;li&gt;Dogs have good days and bad days&lt;/li&gt;
&lt;li&gt;Progress often happens in sudden jumps after plateaus&lt;/li&gt;
&lt;li&gt;Giving up during plateau means missing breakthrough&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Right Way
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Commit to methods for minimum time periods&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give any training method at least 3-4 weeks&lt;/li&gt;
&lt;li&gt;Practice consistently during that time&lt;/li&gt;
&lt;li&gt;Track progress to see gradual improvements&lt;/li&gt;
&lt;li&gt;Only change methods if truly not working after adequate trial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Understand normal learning patterns&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Week 1: Dog is confused, inconsistent performance
Week 2: Some improvement, still inconsistent
Week 3: More consistent, but not reliable
Week 4: Good performance in familiar environments
Week 6: Reliable performance at home
Week 8: Starting to generalize to new environments
Week 12: Solid, reliable behavior in most situations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to Stay Motivated&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Track progress&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep training journal&lt;/li&gt;
&lt;li&gt;Note small improvements daily&lt;/li&gt;
&lt;li&gt;Take videos to see progress over time&lt;/li&gt;
&lt;li&gt;Celebrate milestones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Focus on the process&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enjoy training sessions with your dog&lt;/li&gt;
&lt;li&gt;Focus on building relationship, not just results&lt;/li&gt;
&lt;li&gt;Remember that training is ongoing, not destination&lt;/li&gt;
&lt;li&gt;Find joy in small daily improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Get support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join training classes for motivation&lt;/li&gt;
&lt;li&gt;Connect with other dog owners&lt;/li&gt;
&lt;li&gt;Work with professional trainer if needed&lt;/li&gt;
&lt;li&gt;Remember that everyone struggles sometimes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Commitment Exercise
&lt;/h3&gt;

&lt;p&gt;Choose one behavior to work on for the next month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Practice 5-10 minutes daily&lt;/li&gt;
&lt;li&gt;Track progress in journal&lt;/li&gt;
&lt;li&gt;Don't change methods for full month&lt;/li&gt;
&lt;li&gt;Notice how consistency improves results&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Avoid These Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a Training Plan
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Assess current situation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What behaviors need work?&lt;/li&gt;
&lt;li&gt;What mistakes are you currently making?&lt;/li&gt;
&lt;li&gt;What's your dog's learning style?&lt;/li&gt;
&lt;li&gt;What are your realistic goals?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Choose methods and stick to them&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Research positive training methods&lt;/li&gt;
&lt;li&gt;Commit to trying method for at least one month&lt;/li&gt;
&lt;li&gt;Get whole family on board with approach&lt;/li&gt;
&lt;li&gt;Consider professional help if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Set up for success&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have treats and rewards ready&lt;/li&gt;
&lt;li&gt;Choose quiet training environment&lt;/li&gt;
&lt;li&gt;Keep sessions short (5-15 minutes)&lt;/li&gt;
&lt;li&gt;End on positive note&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Track progress&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep simple training log&lt;/li&gt;
&lt;li&gt;Note what works and what doesn't&lt;/li&gt;
&lt;li&gt;Celebrate small improvements&lt;/li&gt;
&lt;li&gt;Adjust approach based on results&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Get Professional Help
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Consider a professional trainer if&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're not seeing progress after 4-6 weeks&lt;/li&gt;
&lt;li&gt;Dog shows aggression or fear&lt;/li&gt;
&lt;li&gt;You feel overwhelmed or frustrated&lt;/li&gt;
&lt;li&gt;Family members disagree on training methods&lt;/li&gt;
&lt;li&gt;Dog has specific behavioral issues (separation anxiety, reactivity)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to choose a trainer&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for positive reinforcement methods&lt;/li&gt;
&lt;li&gt;Ask about certifications (CCPDT, KPA, etc.)&lt;/li&gt;
&lt;li&gt;Observe a class before signing up&lt;/li&gt;
&lt;li&gt;Ask for references from other clients&lt;/li&gt;
&lt;li&gt;Avoid trainers who use dominance or punishment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;Q: How long does it take to fix training mistakes?&lt;br&gt;
A: It depends on how long the mistakes have been happening and which mistakes you're making. Simple issues like inconsistent commands can be fixed in 2-3 weeks. More complex problems like fear from punishment-based training may take 3-6 months to fully resolve. The key is consistency with the correct approach.&lt;/p&gt;

&lt;p&gt;Q: My dog was doing well but suddenly regressed. What happened?&lt;br&gt;
A: Regression is normal in dog training. Common causes include: changes in routine, new stressors, adolescence (6-18 months), or simply needing more practice. Don't panic - go back to basics, increase rewards, and be patient. Most regressions resolve within 1-2 weeks with consistent training.&lt;/p&gt;

&lt;p&gt;Q: Is it too late to fix mistakes with an older dog?&lt;br&gt;
A: It's never too late! While puppies learn faster, adult dogs can absolutely learn new behaviors and unlearn bad habits. Older dogs often have better attention spans and are less distracted than puppies. The process may take longer, but the results are just as good with patience and consistency.&lt;/p&gt;

&lt;p&gt;Q: How do I get my family to be consistent with training?&lt;br&gt;
A: Hold a family meeting to discuss and agree on rules and commands. Write everything down and post it where everyone can see. Practice commands together so everyone uses the same technique. Consider having one person lead training initially, then teach others. Consistency is crucial - even one person allowing bad behavior can undermine progress.&lt;/p&gt;

&lt;p&gt;Q: What if positive training doesn't work for my dog?&lt;br&gt;
A: If positive training isn't working, you're likely making one of these mistakes: poor timing, inconsistent practice, unrealistic expectations, or not using high enough value rewards. Before giving up, try: better treats, shorter sessions, easier environments, or professional help. True positive training works for virtually all dogs when done correctly.&lt;/p&gt;

&lt;p&gt;Q: How do I know if I'm rewarding at the right time?&lt;br&gt;
A: Use a marker word like "Yes!" or a clicker to mark the exact moment your dog does the right behavior, then give the treat. If your dog seems confused about what earned the reward, your timing needs work. Practice with simple behaviors your dog already knows to improve your timing skills.&lt;/p&gt;

&lt;p&gt;Q: My dog only listens when I have treats. Is this bad?&lt;br&gt;
A: This is normal in early training! Gradually reduce treat frequency by rewarding every other time, then every third time, etc. Replace some treats with praise, petting, or play. Eventually, your dog will respond reliably with only occasional treats. Don't eliminate rewards completely - even well-trained dogs need occasional reinforcement.&lt;/p&gt;

&lt;p&gt;Q: How do I train my dog when I'm frustrated?&lt;br&gt;
A: Don't train when you're frustrated - dogs pick up on your emotions and it makes learning harder. Take a break, do something calming, then return to training when you're in a better mindset. If you're consistently frustrated, the training approach may not be right for you and your dog. Consider getting professional help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Most dog training problems stem from these seven common mistakes. The good news? They're all fixable with the right approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistency is more important than perfection&lt;/li&gt;
&lt;li&gt;Positive methods work better than punishment&lt;/li&gt;
&lt;li&gt;Dogs need adequate exercise and mental stimulation&lt;/li&gt;
&lt;li&gt;Good timing makes training much more effective&lt;/li&gt;
&lt;li&gt;Learning your dog's body language prevents problems&lt;/li&gt;
&lt;li&gt;Realistic expectations prevent frustration&lt;/li&gt;
&lt;li&gt;Persistence pays off - don't give up too early&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your action plan&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify which mistakes you're currently making&lt;/li&gt;
&lt;li&gt;Choose one mistake to focus on first&lt;/li&gt;
&lt;li&gt;Implement the correct approach consistently&lt;/li&gt;
&lt;li&gt;Track your progress for motivation&lt;/li&gt;
&lt;li&gt;Be patient - change takes time&lt;/li&gt;
&lt;li&gt;Get professional help if needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remember: there are no "bad dogs," only dogs whose needs aren't being met or who haven't been taught what we want them to do. With patience, consistency, and the right approach, almost any behavior problem can be improved.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apdt.com/" rel="noopener noreferrer"&gt;Association of Professional Dog Trainers&lt;/a&gt; - Find certified positive trainers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.akc.org/expert-advice/training/" rel="noopener noreferrer"&gt;American Kennel Club Training Resources&lt;/a&gt; - Evidence-based training advice&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our articles.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/dog-training-mistakes-avoid" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dogs</category>
      <category>pettraining</category>
      <category>dogbehavior</category>
      <category>petcare</category>
    </item>
    <item>
      <title>The First 30 Days: Dog Training Essentials</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Wed, 08 Apr 2026 10:13:49 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/the-first-30-days-dog-training-essentials-2nap</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/the-first-30-days-dog-training-essentials-2nap</guid>
      <description>&lt;h1&gt;
  
  
  The First 30 Days: Dog Training Essentials
&lt;/h1&gt;

&lt;p&gt;Bringing a new dog home is exciting, but the first 30 days are critical for establishing rules, boundaries, and a bond. Consistency is the golden rule of dog training.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our articles on &lt;a href="https://iloveblogs.blog/post/top-dog-breeds-active-families" rel="noopener noreferrer"&gt;top dog breeds for active families&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/choosing-right-pet" rel="noopener noreferrer"&gt;choosing the right pet&lt;/a&gt; for more insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Potty Training 101
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Schedule:&lt;/strong&gt; Take them out first thing in the morning, after meals, after naps, and before bed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;High Praise:&lt;/strong&gt; When they go outside, throw a party. Treats, "Good dog!", lots of excitement.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No Punishment:&lt;/strong&gt; If accidents happen inside, clean it up without a fuss. Punishing after the fact only confuses them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Basic Commands: The Big Three
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Sit:&lt;/strong&gt; The foundation of impulse control.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Stay:&lt;/strong&gt; Essential for safety (e.g., preventing them from bolting out the door).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Recall (Come):&lt;/strong&gt; potentially life-saving. always reward a successful recall, never use it to punish.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Crate Training
&lt;/h2&gt;

&lt;p&gt;A crate is not a cage; it's a safe den.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Make it comfortable with blankets.&lt;/li&gt;
&lt;li&gt;  Feed meals in the crate to create positive associations.&lt;/li&gt;
&lt;li&gt;  Never use the crate as punishment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Socialization
&lt;/h2&gt;

&lt;p&gt;Exposing your dog to new people, places, and sounds in a positive way is crucial, especially for puppies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Controlled Meetings:&lt;/strong&gt; Don't just throw them into a dog park. Start with one-on-one playdates.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Positive Reinforcement:&lt;/strong&gt; Pair scary new things (like garbage trucks or vacuums) with high-value treats.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Training takes patience. There will be good days and bad days. But putting in the work now will result in a well-behaved, confident, and happy member of the family for years to come.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.akc.org/expert-advice/training/" rel="noopener noreferrer"&gt;AKC Dog Training Resources&lt;/a&gt; - The American Kennel Club's comprehensive training guides and expert advice.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.aspca.org/pet-care/dog-care/dog-training" rel="noopener noreferrer"&gt;ASPCA Dog Training Tips&lt;/a&gt; - Science-based training methods from America's leading animal welfare organization.&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our content.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/dog-training-essentials" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dogs</category>
      <category>training</category>
      <category>education</category>
      <category>pets</category>
    </item>
    <item>
      <title>Docker Development Environment Setup: Complete Guide 2026</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:12:27 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/docker-development-environment-setup-complete-guide-2026-32gj</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/docker-development-environment-setup-complete-guide-2026-32gj</guid>
      <description>&lt;h1&gt;
  
  
  Docker Development Environment Setup: Complete Guide 2026
&lt;/h1&gt;

&lt;p&gt;Setting up Docker for development can transform your workflow, but getting it right takes some know-how. After years of helping teams containerize their applications, I've learned what actually works in real-world development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: Check out our guides on &lt;a href="https://iloveblogs.blog/post/typescript-javascript-migration-guide-2026" rel="noopener noreferrer"&gt;TypeScript migration&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/home-office-guide" rel="noopener noreferrer"&gt;remote work setup&lt;/a&gt; for more development insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Docker for Development?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Real Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Consistency across environments&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Works on my machine" becomes "works everywhere"&lt;/li&gt;
&lt;li&gt;Same environment for all team members&lt;/li&gt;
&lt;li&gt;Identical dev, staging, and production setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Faster onboarding&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New developers productive in minutes, not days&lt;/li&gt;
&lt;li&gt;No complex installation instructions&lt;/li&gt;
&lt;li&gt;One command to start everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Isolation and cleanup&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple projects without conflicts&lt;/li&gt;
&lt;li&gt;Easy to tear down and rebuild&lt;/li&gt;
&lt;li&gt;No leftover dependencies cluttering your system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Production parity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catch environment-specific bugs early&lt;/li&gt;
&lt;li&gt;Test with production-like services&lt;/li&gt;
&lt;li&gt;Smooth deployment process&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When Docker Makes Sense
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Perfect for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full-stack applications with multiple services&lt;/li&gt;
&lt;li&gt;Projects with complex dependencies&lt;/li&gt;
&lt;li&gt;Teams with different operating systems&lt;/li&gt;
&lt;li&gt;Microservices architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skip Docker if&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building simple static sites&lt;/li&gt;
&lt;li&gt;Working solo on small scripts&lt;/li&gt;
&lt;li&gt;Learning a new language (native install is simpler)&lt;/li&gt;
&lt;li&gt;Your team has zero Docker experience and tight deadlines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before diving in, make sure you have:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop installed (&lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;download here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Basic command line knowledge&lt;/li&gt;
&lt;li&gt;A code editor (VS Code recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Helpful&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding of your application's architecture&lt;/li&gt;
&lt;li&gt;Familiarity with environment variables&lt;/li&gt;
&lt;li&gt;Basic networking concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;System requirements&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8GB RAM minimum (16GB recommended)&lt;/li&gt;
&lt;li&gt;20GB free disk space&lt;/li&gt;
&lt;li&gt;Windows 10/11 Pro, macOS 10.15+, or Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Set Up Docker for Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install Docker Desktop
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Using Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; docker

&lt;span class="c"&gt;## Or download from docker.com&lt;/span&gt;
&lt;span class="c"&gt;## Start Docker Desktop from Applications&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Download Docker Desktop from docker.com&lt;/span&gt;
&lt;span class="c"&gt;## Enable WSL 2 backend during installation&lt;/span&gt;
&lt;span class="c"&gt;## Restart your computer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux (Ubuntu/Debian)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Install Docker Engine&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com &lt;span class="nt"&gt;-o&lt;/span&gt; get-docker.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh

&lt;span class="c"&gt;## Add your user to docker group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;

&lt;span class="c"&gt;## Install Docker Compose&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify installation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Your First Dockerfile
&lt;/h3&gt;

&lt;p&gt;Let's start with a Node.js application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;

&lt;span class="c"&gt;## Set working directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;## Copy package files&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="c"&gt;## Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;## Copy application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;## Expose port&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="c"&gt;## Start application&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "run", "dev"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key concepts&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM&lt;/code&gt;: Base image to build from&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR&lt;/code&gt;: Sets the working directory inside container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY&lt;/code&gt;: Copies files from host to container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN&lt;/code&gt;: Executes commands during build&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD&lt;/code&gt;: Command to run when container starts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Add Docker Compose
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;docker-compose.yml&lt;/code&gt; for multi-service setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=development&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgresql://user:password@db:5432/myapp&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run dev&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16-alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=user&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=myapp&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start your environment&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Enable Hot Reload
&lt;/h3&gt;

&lt;p&gt;For Node.js with nodemon:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Dockerfile.dev&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;## Install nodemon globally&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nodemon

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nodemon", "src/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile.dev&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;CHOKIDAR_USEPOLLING=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For React/Vite&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5173:5173"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./frontend:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;VITE_API_URL=http://localhost:3000&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run dev -- --host&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Configure Environment Variables
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## .env&lt;/span&gt;
&lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development
&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://user:password@db:5432/myapp
&lt;span class="nv"&gt;REDIS_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis://redis:6379
&lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-api-key-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=${NODE_ENV}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=${DATABASE_URL}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Add &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Set Up Debugging
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;VS Code launch configuration&lt;/strong&gt; (&lt;code&gt;.vscode/launch.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"attach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Docker: Attach to Node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"localRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"remoteRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inspector"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update Dockerfile for debugging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "--inspect=0.0.0.0:9229", "src/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update docker-compose.yml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9229:9229"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Optimize Build Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use .dockerignore&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
npm-debug.log
.git
.env
.DS_Store
dist
build
coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Multi-stage builds&lt;/strong&gt; for production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Build stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;## Production stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/dist ./dist&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Layer caching&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Copy package files first (changes less frequently)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;## Copy source code last (changes frequently)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Development Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Full-Stack Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./frontend:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REACT_APP_API_URL=http://localhost:4000&lt;/span&gt;

  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./backend&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4000:4000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./backend:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgresql://user:password@db:5432/myapp&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16-alpine&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=user&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=myapp&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Microservices Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api-gateway&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./services/gateway&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;auth-service&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;user-service&lt;/span&gt;

  &lt;span class="na"&gt;auth-service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./services/auth&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;JWT_SECRET=${JWT_SECRET}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=${AUTH_DB_URL}&lt;/span&gt;

  &lt;span class="na"&gt;user-service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./services/users&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=${USER_DB_URL}&lt;/span&gt;

  &lt;span class="na"&gt;message-queue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rabbitmq:3-management&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5672:5672"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15672:15672"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Useful Docker Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Daily Development
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Start services&lt;/span&gt;
docker compose up

&lt;span class="c"&gt;## Start in background&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;## Stop services&lt;/span&gt;
docker compose down

&lt;span class="c"&gt;## Rebuild and start&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;

&lt;span class="c"&gt;## View logs&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; app

&lt;span class="c"&gt;## Execute command in running container&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app npm &lt;span class="nb"&gt;install &lt;/span&gt;package-name

&lt;span class="c"&gt;## Open shell in container&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debugging and Maintenance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## List running containers&lt;/span&gt;
docker ps

&lt;span class="c"&gt;## List all containers&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;## View container logs&lt;/span&gt;
docker logs container-name

&lt;span class="c"&gt;## Inspect container&lt;/span&gt;
docker inspect container-name

&lt;span class="c"&gt;## Remove stopped containers&lt;/span&gt;
docker container prune

&lt;span class="c"&gt;## Remove unused images&lt;/span&gt;
docker image prune

&lt;span class="c"&gt;## Remove everything (careful!)&lt;/span&gt;
docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Operations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Access PostgreSQL&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;db psql &lt;span class="nt"&gt;-U&lt;/span&gt; user &lt;span class="nt"&gt;-d&lt;/span&gt; myapp

&lt;span class="c"&gt;## Run migrations&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app npm run migrate

&lt;span class="c"&gt;## Seed database&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app npm run seed

&lt;span class="c"&gt;## Backup database&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;db pg_dump &lt;span class="nt"&gt;-U&lt;/span&gt; user myapp &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql

&lt;span class="c"&gt;## Restore database&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-T&lt;/span&gt; db psql &lt;span class="nt"&gt;-U&lt;/span&gt; user myapp &amp;lt; backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Port Already in Use
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt;: &lt;code&gt;Bind for 0.0.0.0:3000 failed: port is already allocated&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Find process using port&lt;/span&gt;
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :3000  &lt;span class="c"&gt;# macOS/Linux&lt;/span&gt;
netstat &lt;span class="nt"&gt;-ano&lt;/span&gt; | findstr :3000  &lt;span class="c"&gt;# Windows&lt;/span&gt;

&lt;span class="c"&gt;## Kill the process or change port in docker-compose.yml&lt;/span&gt;
ports:
  - &lt;span class="s2"&gt;"3001:3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Volume Permission Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt;: &lt;code&gt;EACCES: permission denied&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Add user in Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1000 appuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    adduser &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; 1000 &lt;span class="nt"&gt;-G&lt;/span&gt; appuser appuser

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Slow Performance on macOS/Windows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: File sync is slow with volumes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;## Use delegated or cached mode&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app:delegated&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or use Docker volumes instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/app&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Container Keeps Restarting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Check logs&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common causes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application crashes on startup&lt;/li&gt;
&lt;li&gt;Missing environment variables&lt;/li&gt;
&lt;li&gt;Database not ready (add healthcheck)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution with healthcheck&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16-alpine&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Don't run as root&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1000 appuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    adduser &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; 1000 &lt;span class="nt"&gt;-G&lt;/span&gt; appuser appuser
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use specific image versions&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Bad&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:latest&lt;/span&gt;

&lt;span class="c"&gt;## Good&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20.11-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scan for vulnerabilities&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker scan your-image:tag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Minimize layers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## Bad&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; package1
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; package2

&lt;span class="c"&gt;## Good&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; package1 package2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use alpine images&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine  # ~40MB&lt;/span&gt;
&lt;span class="c"&gt;## vs&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20  # ~900MB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Maintainability
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Document your setup&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## README.md&lt;/span&gt;

&lt;span class="gu"&gt;## Development Setup&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Install Docker Desktop
&lt;span class="p"&gt;2.&lt;/span&gt; Copy &lt;span class="sb"&gt;`.env.example`&lt;/span&gt; to &lt;span class="sb"&gt;`.env`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Run &lt;span class="sb"&gt;`docker compose up`&lt;/span&gt;
&lt;span class="p"&gt;4.&lt;/span&gt; Access app at http://localhost:3000

&lt;span class="gu"&gt;## Common Commands&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`docker compose up`&lt;/span&gt; - Start services
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`docker compose down`&lt;/span&gt; - Stop services
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`docker compose logs -f`&lt;/span&gt; - View logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use make for common tasks&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;## Makefile
&lt;/span&gt;&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;up down logs shell test&lt;/span&gt;

&lt;span class="nl"&gt;up&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="nl"&gt;down&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    docker compose down

&lt;span class="nl"&gt;logs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="nl"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app sh

&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;app npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;Q: Should I use Docker for development or just production?&lt;br&gt;
A: Use Docker for both. Development with Docker ensures your local environment matches production, catching environment-specific bugs early. The initial setup time pays off quickly with consistent environments across your team.&lt;/p&gt;

&lt;p&gt;Q: How do I handle database migrations in Docker?&lt;br&gt;
A: Run migrations as part of your startup script or as a separate service. Add a migration command to your docker-compose.yml: &lt;code&gt;docker compose exec app npm run migrate&lt;/code&gt;. For production, run migrations before deploying new code.&lt;/p&gt;

&lt;p&gt;Q: Why is my Docker container so slow on macOS?&lt;br&gt;
A: File system performance with volumes can be slow on macOS. Use &lt;code&gt;:delegated&lt;/code&gt; or &lt;code&gt;:cached&lt;/code&gt; flags on volumes, or use named volumes instead of bind mounts for node_modules and other frequently accessed directories.&lt;/p&gt;

&lt;p&gt;Q: How do I debug inside a Docker container?&lt;br&gt;
A: Expose the debug port (9229 for Node.js) in docker-compose.yml and use your IDE's remote debugging feature. VS Code has excellent Docker debugging support with the Docker extension.&lt;/p&gt;

&lt;p&gt;Q: Should I commit my docker-compose.yml to git?&lt;br&gt;
A: Yes, commit docker-compose.yml but not .env files. Create a .env.example with dummy values for documentation. Each developer creates their own .env from the example.&lt;/p&gt;

&lt;p&gt;Q: How do I update dependencies in a Docker container?&lt;br&gt;
A: Run &lt;code&gt;docker compose exec app npm install package-name&lt;/code&gt; to install in the running container, or rebuild with &lt;code&gt;docker compose up --build&lt;/code&gt; after updating package.json locally.&lt;/p&gt;

&lt;p&gt;Q: What's the difference between CMD and ENTRYPOINT?&lt;br&gt;
A: CMD provides default arguments that can be overridden. ENTRYPOINT defines the main command that always runs. Use CMD for development (easy to override) and ENTRYPOINT for production (consistent behavior).&lt;/p&gt;

&lt;p&gt;Q: How do I share my Docker setup with the team?&lt;br&gt;
A: Commit Dockerfile, docker-compose.yml, and .dockerignore to git. Create a .env.example file. Document setup steps in README.md. Consider using a Makefile for common commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Docker transforms development from "works on my machine" to "works everywhere." The key is starting simple and adding complexity only when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your action plan&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Docker Desktop&lt;/li&gt;
&lt;li&gt;Create a basic Dockerfile&lt;/li&gt;
&lt;li&gt;Add docker-compose.yml for services&lt;/li&gt;
&lt;li&gt;Enable hot reload for your framework&lt;/li&gt;
&lt;li&gt;Document the setup for your team&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The initial setup takes time, but you'll save hours every week with consistent environments and faster onboarding.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/" rel="noopener noreferrer"&gt;Docker Official Documentation&lt;/a&gt; - Comprehensive Docker guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Docker Compose Documentation&lt;/a&gt; - Multi-container applications&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our articles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;p&gt;Explore more articles in our Deployment &amp;amp; DevOps series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iloveblogs.blog/guides/deploying-nextjs-supabase-production" rel="noopener noreferrer"&gt;Deploying Next.js + Supabase to Production&lt;/a&gt; - Complete guide covering all aspects&lt;/li&gt;
&lt;li&gt;More related articles coming soon&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced Docker Networking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-Container Communication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with networking&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgresql://user:password@db:5432/myapp&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REDIS_URL=redis://redis:6379&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=user&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=password&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=myapp&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

  &lt;span class="c1"&gt;# Service discovery example&lt;/span&gt;
  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./api&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;APP_HOST=app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;APP_PORT=3000&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-network&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Network Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Advanced networking with custom DNS&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ipv4_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.20.0.2&lt;/span&gt;
        &lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;myapp.local&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;api.local&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ipv4_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.20.0.3&lt;/span&gt;
        &lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database.local&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
    &lt;span class="na"&gt;ipam&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;subnet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;172.20.0.0/16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Production-Ready Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Health Checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with health checks&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;curl"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-f"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000/health"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;40s&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;user"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resource Limits
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with resource constraints&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512M&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.5'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256M&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1G&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Debugging in Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Node.js Debugging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with debug port exposed&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9229:9229"&lt;/span&gt;  &lt;span class="c1"&gt;# Node.js debug port&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_OPTIONS=--inspect=0.0.0.0:9229&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node --inspect=0.0.0.0:9229 server.js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VS Code Debug Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;.vscode/launch.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Docker Node Debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"attach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"restart"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"skipFiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;node_internals&amp;gt;/**"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Debugging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to PostgreSQL in Docker&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;db psql &lt;span class="nt"&gt;-U&lt;/span&gt; user &lt;span class="nt"&gt;-d&lt;/span&gt; myapp

&lt;span class="c"&gt;# View logs&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; db

&lt;span class="c"&gt;# Execute SQL directly&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;db psql &lt;span class="nt"&gt;-U&lt;/span&gt; user &lt;span class="nt"&gt;-d&lt;/span&gt; myapp &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT * FROM users;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Layer Caching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile optimized for layer caching&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copy package files first (changes less frequently)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;# Copy source code (changes frequently)&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Build&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Production stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=0 /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=0 /app/.next ./.next&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=0 /app/package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Volume Performance on macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with optimized volumes&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Use delegated for one-way sync (app → host)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app:delegated&lt;/span&gt;

      &lt;span class="c1"&gt;# Use cached for two-way sync with caching&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./src:/app/src:cached&lt;/span&gt;

      &lt;span class="c1"&gt;# Use named volume for node_modules (faster)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node_modules:/app/node_modules&lt;/span&gt;

      &lt;span class="c1"&gt;# Exclude directories&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/node_modules&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/app/.next&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;node_modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring and Logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Centralized Logging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with logging driver&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json-file"&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;max-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10m"&lt;/span&gt;
        &lt;span class="na"&gt;max-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service=app"&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json-file"&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;max-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10m"&lt;/span&gt;
        &lt;span class="na"&gt;max-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service=database"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  View Logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View all logs&lt;/span&gt;
docker compose logs

&lt;span class="c"&gt;# Follow logs in real-time&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# View logs for specific service&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; app

&lt;span class="c"&gt;# View last 100 lines&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;--tail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100

&lt;span class="c"&gt;# View logs with timestamps&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Issues and Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Port Already in Use
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find process using port&lt;/span&gt;
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :3000

&lt;span class="c"&gt;# Kill process&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; &amp;lt;PID&amp;gt;

&lt;span class="c"&gt;# Or use different port in docker-compose.yml&lt;/span&gt;
ports:
  - &lt;span class="s2"&gt;"3001:3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Slow File System on macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use named volumes instead of bind mounts&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Instead of: - .:/app&lt;/span&gt;
      &lt;span class="c1"&gt;# Use named volume:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app_data:/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node_modules:/app/node_modules&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;node_modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Out of Disk Space
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clean up unused images&lt;/span&gt;
docker image prune

&lt;span class="c"&gt;# Clean up unused containers&lt;/span&gt;
docker container prune

&lt;span class="c"&gt;# Clean up everything&lt;/span&gt;
docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;# Check disk usage&lt;/span&gt;
docker system &lt;span class="nb"&gt;df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing in Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Run Tests in Container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml with test service&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=development&lt;/span&gt;

  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=test&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run Tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run tests once&lt;/span&gt;
docker compose run &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Run tests with coverage&lt;/span&gt;
docker compose run &lt;span class="nb"&gt;test &lt;/span&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt;:coverage

&lt;span class="c"&gt;# Run specific test file&lt;/span&gt;
docker compose run &lt;span class="nb"&gt;test &lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; auth.test.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices Checklist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;□ Use .dockerignore to exclude unnecessary files
□ Use multi-stage builds for smaller images
□ Pin base image versions (not latest)
□ Run as non-root user in production
□ Use environment variables for configuration
□ Set resource limits
□ Add health checks
□ Use named volumes for persistent data
□ Commit docker-compose.yml to git
□ Create .env.example for documentation
□ Use specific versions for dependencies
□ Optimize layer caching
□ Use Alpine images for smaller size
□ Implement proper logging
□ Test in production-like environment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/posts/kubernetes-docker-container-orchestration-2026" rel="noopener noreferrer"&gt;Kubernetes &amp;amp; Docker Container Orchestration 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/deploying-nextjs-supabase-production" rel="noopener noreferrer"&gt;Deploying Next.js + Supabase to Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/posts/nextjs-performance-optimization" rel="noopener noreferrer"&gt;Next.js Performance Optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/building-saas-nextjs-supabase" rel="noopener noreferrer"&gt;Building SaaS with Next.js and Supabase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/posts/typescript-javascript-migration-guide-2026" rel="noopener noreferrer"&gt;TypeScript JavaScript Migration Guide 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/posts/serverless-edge-computing-revolution-2026" rel="noopener noreferrer"&gt;Serverless &amp;amp; Edge Computing Revolution 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Docker development environments transform how teams work together. The initial setup investment pays dividends through consistency, faster onboarding, and fewer "works on my machine" problems.&lt;/p&gt;

&lt;p&gt;Start simple with a basic docker-compose.yml, then gradually add complexity as your needs grow. Use the patterns in this guide to build a development environment that scales with your team.&lt;/p&gt;

&lt;p&gt;Remember: the best Docker setup is one your team actually uses. Keep it simple, document it well, and iterate based on feedback.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/docker-development-environment-setup" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>development</category>
      <category>containers</category>
    </item>
    <item>
      <title>Digital Detox Retreats: A Growing Trend</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Mon, 06 Apr 2026 10:16:05 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/digital-detox-retreats-a-growing-trend-an9</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/digital-detox-retreats-a-growing-trend-an9</guid>
      <description>&lt;h1&gt;
  
  
  Digital Detox Retreats: A Growing Trend
&lt;/h1&gt;

&lt;p&gt;In a world where the average person checks their phone 96 times per day, a counter-movement is gaining momentum. &lt;strong&gt;Digital detox retreats&lt;/strong&gt;—where participants pay premium prices to surrender their devices—are booming.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our guides on &lt;a href="https://iloveblogs.blog/post/mindfulness-stress-management" rel="noopener noreferrer"&gt;mindfulness for stress management&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/social-media-mental-health-impact" rel="noopener noreferrer"&gt;social media's mental health impact&lt;/a&gt; for related wellness insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Paradox of Paying to Disconnect
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Numbers Don't Lie
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$3,000-$8,000&lt;/strong&gt;: Average cost for a week-long digital detox retreat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;300%&lt;/strong&gt;: Growth in digital wellness retreats since 2020&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;72%&lt;/strong&gt;: Participants who report lasting behavior changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;89%&lt;/strong&gt;: Retreat-goers who are high earners in tech or finance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You're Actually Buying
&lt;/h3&gt;

&lt;p&gt;It's not just about removing phones. These retreats offer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured environments&lt;/strong&gt; that make disconnection easier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative activities&lt;/strong&gt; to fill the digital void&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community support&lt;/strong&gt; from like-minded individuals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional guidance&lt;/strong&gt; on sustainable tech habits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accountability&lt;/strong&gt; that's hard to create alone&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who's Checking Out?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Typical Participant
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tech Workers&lt;/strong&gt;: Ironically, the people building our digital world are the most eager to escape it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executives&lt;/strong&gt;: High-stress professionals seeking mental clarity and better decision-making.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parents&lt;/strong&gt;: Wanting to model healthy tech habits for their children.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students&lt;/strong&gt;: Overwhelmed by social media pressure and academic stress.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Breaking Point Stories
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sarah, Software Engineer&lt;/strong&gt;: "I realized I was checking Slack at 2 AM and couldn't remember the last time I read a book."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marcus, Marketing Director&lt;/strong&gt;: "My 5-year-old asked why I loved my phone more than him. That was my wake-up call."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lisa, College Student&lt;/strong&gt;: "Instagram was making me miserable, but I couldn't stop scrolling. I needed external help."&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Happens at These Retreats
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Surrender Ritual
&lt;/h3&gt;

&lt;p&gt;Most retreats begin with a &lt;strong&gt;device surrender ceremony&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phones locked in individual safes&lt;/li&gt;
&lt;li&gt;Participants receive analog alternatives (paper maps, physical books)&lt;/li&gt;
&lt;li&gt;Emergency contact protocols established&lt;/li&gt;
&lt;li&gt;Withdrawal symptoms acknowledged and normalized&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Daily Structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Morning&lt;/strong&gt;: Meditation, journaling, nature walks&lt;br&gt;
&lt;strong&gt;Midday&lt;/strong&gt;: Workshops on mindfulness and digital wellness&lt;br&gt;
&lt;strong&gt;Afternoon&lt;/strong&gt;: Physical activities, creative pursuits, skill-building&lt;br&gt;
&lt;strong&gt;Evening&lt;/strong&gt;: Group discussions, analog entertainment, early sleep&lt;/p&gt;

&lt;h3&gt;
  
  
  The Curriculum
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mindfulness training&lt;/strong&gt; to recognize digital impulses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive behavioral techniques&lt;/strong&gt; for breaking habits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time management&lt;/strong&gt; without digital tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication skills&lt;/strong&gt; for face-to-face interaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hobby development&lt;/strong&gt; to replace screen time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Science Behind Digital Overwhelm
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Constant Connectivity Does to Your Brain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dopamine Dysregulation&lt;/strong&gt;: Constant notifications create addiction-like patterns&lt;br&gt;
&lt;strong&gt;Attention Fragmentation&lt;/strong&gt;: Multitasking reduces cognitive performance by 40%&lt;br&gt;
&lt;strong&gt;Sleep Disruption&lt;/strong&gt;: Blue light and mental stimulation affect circadian rhythms&lt;br&gt;
&lt;strong&gt;Anxiety Amplification&lt;/strong&gt;: FOMO and comparison culture increase stress hormones&lt;/p&gt;

&lt;h3&gt;
  
  
  The Withdrawal is Real
&lt;/h3&gt;

&lt;p&gt;Participants commonly experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phantom vibrations&lt;/strong&gt; from missing phones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anxiety spikes&lt;/strong&gt; when unable to check messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boredom intolerance&lt;/strong&gt; without constant stimulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social awkwardness&lt;/strong&gt; in device-free conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Different Flavors of Digital Detox
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Luxury Wilderness Retreats
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: Remote mountains, forests, or beaches&lt;br&gt;
&lt;strong&gt;Focus&lt;/strong&gt;: Nature immersion and outdoor activities&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $5,000-$10,000 per week&lt;br&gt;
&lt;strong&gt;Clientele&lt;/strong&gt;: Executives and high earners&lt;/p&gt;

&lt;h3&gt;
  
  
  Mindfulness-Based Programs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: Meditation centers and monasteries&lt;br&gt;
&lt;strong&gt;Focus&lt;/strong&gt;: Buddhist or secular mindfulness practices&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $2,000-$5,000 per week&lt;br&gt;
&lt;strong&gt;Clientele&lt;/strong&gt;: Spiritually-minded individuals&lt;/p&gt;

&lt;h3&gt;
  
  
  Adventure-Based Detox
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: National parks and adventure destinations&lt;br&gt;
&lt;strong&gt;Focus&lt;/strong&gt;: Physical challenges and outdoor skills&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $3,000-$7,000 per week&lt;br&gt;
&lt;strong&gt;Clientele&lt;/strong&gt;: Active professionals seeking excitement&lt;/p&gt;

&lt;h3&gt;
  
  
  Family-Friendly Options
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: Resorts and camps designed for families&lt;br&gt;
&lt;strong&gt;Focus&lt;/strong&gt;: Reconnecting with family members&lt;br&gt;
&lt;strong&gt;Price&lt;/strong&gt;: $4,000-$8,000 for a family of four&lt;br&gt;
&lt;strong&gt;Clientele&lt;/strong&gt;: Parents wanting to model healthy habits&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business of Disconnection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Market Growth
&lt;/h3&gt;

&lt;p&gt;The digital wellness industry is projected to reach &lt;strong&gt;$18 billion by 2027&lt;/strong&gt;, driven by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increasing awareness of tech addiction&lt;/li&gt;
&lt;li&gt;Corporate wellness programs&lt;/li&gt;
&lt;li&gt;Mental health prioritization&lt;/li&gt;
&lt;li&gt;Post-pandemic lifestyle reassessment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Players
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Camp Grounded&lt;/strong&gt;: Adult summer camp with strict no-phone policies&lt;br&gt;
&lt;strong&gt;Digital Detox&lt;/strong&gt;: Luxury retreats in exotic locations&lt;br&gt;
&lt;strong&gt;Unplugged&lt;/strong&gt;: Weekend retreats in cabins without WiFi&lt;br&gt;
&lt;strong&gt;Off the Grid&lt;/strong&gt;: Adventure-based programs with digital fasting&lt;/p&gt;

&lt;h3&gt;
  
  
  Corporate Programs
&lt;/h3&gt;

&lt;p&gt;Companies like Google, Facebook, and Goldman Sachs now offer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Digital wellness workshops&lt;/strong&gt; for employees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sponsored retreat attendance&lt;/strong&gt; as benefits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device-free meeting policies&lt;/strong&gt; in offices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mindfulness training&lt;/strong&gt; programs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Skeptics' Perspective
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Just Turn Off Your Phone"
&lt;/h3&gt;

&lt;p&gt;Critics argue that paying thousands for what you can do for free is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privilege signaling&lt;/strong&gt; rather than genuine wellness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoiding root causes&lt;/strong&gt; of digital dependency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporary solutions&lt;/strong&gt; that don't address systemic issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing the point&lt;/strong&gt; of technology's benefits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Rebound Effect
&lt;/h3&gt;

&lt;p&gt;Studies show that &lt;strong&gt;60% of participants&lt;/strong&gt; return to previous usage patterns within 3 months without ongoing support.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Works Long-Term
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sustainable Strategies from Successful Participants
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Gradual Reduction&lt;/strong&gt;: Slowly decreasing usage rather than cold turkey&lt;br&gt;
&lt;strong&gt;Environmental Design&lt;/strong&gt;: Creating phone-free zones at home&lt;br&gt;
&lt;strong&gt;Replacement Activities&lt;/strong&gt;: Developing engaging offline hobbies&lt;br&gt;
&lt;strong&gt;Social Support&lt;/strong&gt;: Finding communities that support digital wellness&lt;br&gt;
&lt;strong&gt;Professional Help&lt;/strong&gt;: Working with therapists specializing in tech addiction&lt;/p&gt;

&lt;h3&gt;
  
  
  The Integration Challenge
&lt;/h3&gt;

&lt;p&gt;The most successful retreat graduates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set specific boundaries&lt;/strong&gt; rather than complete avoidance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use technology intentionally&lt;/strong&gt; rather than habitually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintain offline relationships&lt;/strong&gt; and activities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular check-ins&lt;/strong&gt; with retreat communities or coaches&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DIY Digital Detox: Retreat Principles at Home
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Your Own Structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Awareness tracking (log all device usage)&lt;br&gt;
&lt;strong&gt;Week 2&lt;/strong&gt;: Boundary setting (no phones during meals)&lt;br&gt;
&lt;strong&gt;Week 3&lt;/strong&gt;: Replacement activities (pick up old hobbies)&lt;br&gt;
&lt;strong&gt;Week 4&lt;/strong&gt;: Social support (involve family/friends)&lt;/p&gt;

&lt;h3&gt;
  
  
  Essential Elements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Physical barriers&lt;/strong&gt; (phone charging stations outside bedrooms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time boundaries&lt;/strong&gt; (no screens after 9 PM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative activities&lt;/strong&gt; (books, puzzles, exercise)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accountability partners&lt;/strong&gt; (friends or family members)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular reflection&lt;/strong&gt; (journaling about the experience)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of Digital Wellness
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Emerging Trends
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AI-Powered Wellness&lt;/strong&gt;: Apps that learn your patterns and suggest breaks&lt;br&gt;
&lt;strong&gt;Corporate Integration&lt;/strong&gt;: More companies offering digital wellness benefits&lt;br&gt;
&lt;strong&gt;Preventive Education&lt;/strong&gt;: Schools teaching healthy tech habits early&lt;br&gt;
&lt;strong&gt;Technology Solutions&lt;/strong&gt;: Tools designed to promote mindful usage&lt;/p&gt;

&lt;h3&gt;
  
  
  The Irony
&lt;/h3&gt;

&lt;p&gt;The most successful digital wellness programs often use technology to help people use technology better—apps that track usage, block distracting sites, or remind users to take breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is It Worth the Investment?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Whom It Makes Sense
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High earners&lt;/strong&gt; who can afford it without financial stress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severe cases&lt;/strong&gt; where self-directed efforts have failed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People seeking community&lt;/strong&gt; around digital wellness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Those needing accountability&lt;/strong&gt; and professional guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alternatives to Consider
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local meditation groups&lt;/strong&gt; and mindfulness classes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camping trips&lt;/strong&gt; with friends who share wellness goals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Therapy&lt;/strong&gt; specifically focused on technology addiction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gradual self-directed&lt;/strong&gt; digital wellness programs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Digital detox retreats are a symptom of a larger cultural shift. We're beginning to recognize that &lt;strong&gt;constant connectivity comes with real costs&lt;/strong&gt;—to our attention, relationships, and mental health.&lt;/p&gt;

&lt;p&gt;Whether you pay for a luxury retreat or create your own digital boundaries, the goal is the same: &lt;strong&gt;intentional technology use&lt;/strong&gt; that serves your life rather than controlling it.&lt;/p&gt;

&lt;p&gt;The fact that people are willing to pay thousands to disconnect reveals how difficult it's become to do so on our own. But it also shows that we're finally taking digital wellness seriously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question isn't whether you need a digital detox—it's how you'll create sustainable boundaries in an increasingly connected world.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.humanetech.com/" rel="noopener noreferrer"&gt;Center for Humane Technology&lt;/a&gt; - Resources on building a healthier relationship with technology&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.digitalwellnessinstitute.com/" rel="noopener noreferrer"&gt;Digital Wellness Institute&lt;/a&gt; - Research and certification in digital wellness&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we research our wellness content.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/digital-detox-retreats-growing-trend" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>digitalwellbeing</category>
      <category>mentalhealth</category>
      <category>detox</category>
      <category>lifestyle</category>
    </item>
    <item>
      <title>Design Systems: Building for Scale</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Sun, 05 Apr 2026 09:49:05 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/design-systems-building-for-scale-4eca</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/design-systems-building-for-scale-4eca</guid>
      <description>&lt;h1&gt;
  
  
  Design Systems: Building for Scale
&lt;/h1&gt;

&lt;p&gt;Design systems have evolved from nice-to-have style guides to essential infrastructure for modern product teams. Here's how to build systems that scale with your organization while maintaining design quality.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;: See our articles on &lt;a href="https://iloveblogs.blog/post/ux-psychology-user-behavior" rel="noopener noreferrer"&gt;UX psychology and user behavior&lt;/a&gt; and &lt;a href="https://iloveblogs.blog/post/ai-coding-assistants-productivity" rel="noopener noreferrer"&gt;AI coding assistants&lt;/a&gt; for related development insights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Makes a Design System Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Beyond Style Guides
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional style guides&lt;/strong&gt;: Static documentation of colors, fonts, and spacing&lt;br&gt;
&lt;strong&gt;Modern design systems&lt;/strong&gt;: Living ecosystems of reusable components, patterns, and principles&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key difference&lt;/strong&gt;: Design systems are built for implementation, not just documentation.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Three Pillars
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Design Tokens&lt;/strong&gt;: The atomic elements (colors, typography, spacing)&lt;br&gt;
&lt;strong&gt;Component Library&lt;/strong&gt;: Reusable UI building blocks&lt;br&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Guidelines, principles, and usage patterns&lt;/p&gt;
&lt;h2&gt;
  
  
  Building Your Foundation: Design Tokens
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Color Systems That Scale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Semantic naming over descriptive&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;blue-500&lt;/code&gt;, &lt;code&gt;red-300&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;primary-600&lt;/code&gt;, &lt;code&gt;error-light&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why semantic naming works&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier to rebrand or theme&lt;/li&gt;
&lt;li&gt;Clear intent and usage&lt;/li&gt;
&lt;li&gt;Consistent across platforms&lt;/li&gt;
&lt;li&gt;Accessible by default&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Typography Hierarchies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Modular scale approach&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Base: 16px
Scale: 1.25 (Major Third)
Sizes: 12px, 16px, 20px, 25px, 31px, 39px, 49px
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Responsive typography&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fluid scaling between breakpoints&lt;/li&gt;
&lt;li&gt;Consistent line heights and spacing&lt;/li&gt;
&lt;li&gt;Optimized for readability across devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Spacing Systems
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;8-point grid system&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All spacing increments of 8px (8, 16, 24, 32, 40, 48...)&lt;/li&gt;
&lt;li&gt;Consistent vertical rhythm&lt;/li&gt;
&lt;li&gt;Easier developer handoff&lt;/li&gt;
&lt;li&gt;Better alignment across components&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Component Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Atomic Design Methodology
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Atoms&lt;/strong&gt;: Basic HTML elements (buttons, inputs, labels)&lt;br&gt;
&lt;strong&gt;Molecules&lt;/strong&gt;: Simple component groups (search form, navigation item)&lt;br&gt;
&lt;strong&gt;Organisms&lt;/strong&gt;: Complex UI sections (header, product grid, footer)&lt;br&gt;
&lt;strong&gt;Templates&lt;/strong&gt;: Page-level layouts and structures&lt;br&gt;
&lt;strong&gt;Pages&lt;/strong&gt;: Specific instances with real content&lt;/p&gt;
&lt;h3&gt;
  
  
  Component API Design
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Good component APIs are&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predictable&lt;/strong&gt;: Similar props work similarly across components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt;: Support common use cases without being overly complex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composable&lt;/strong&gt;: Can be combined to create new patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible&lt;/strong&gt;: Built-in ARIA attributes and keyboard navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Example: Button Component
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Flexible but not overwhelming&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; 
  &lt;span class="na"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; 
  &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"large"&lt;/span&gt; 
  &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;leftIcon&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SaveIcon&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSave&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Save Changes
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// Variants: primary, secondary, ghost, danger&lt;/span&gt;
&lt;span class="c1"&gt;// Sizes: small, medium, large&lt;/span&gt;
&lt;span class="c1"&gt;// States: default, hover, active, disabled, loading&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Documentation That Developers Actually Use
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Living Documentation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Interactive examples&lt;/strong&gt;: CodeSandbox or Storybook integration&lt;br&gt;
&lt;strong&gt;Copy-paste code&lt;/strong&gt;: Ready-to-use snippets&lt;br&gt;
&lt;strong&gt;Do's and don'ts&lt;/strong&gt;: Visual examples of proper usage&lt;br&gt;
&lt;strong&gt;Accessibility notes&lt;/strong&gt;: ARIA requirements and keyboard interactions&lt;/p&gt;
&lt;h3&gt;
  
  
  Usage Guidelines
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When to use&lt;/strong&gt;: Clear criteria for component selection&lt;br&gt;
&lt;strong&gt;Variations&lt;/strong&gt;: All available props and configurations&lt;br&gt;
&lt;strong&gt;Content guidelines&lt;/strong&gt;: Voice, tone, and messaging standards&lt;br&gt;
&lt;strong&gt;Responsive behavior&lt;/strong&gt;: How components adapt across screen sizes&lt;/p&gt;
&lt;h3&gt;
  
  
  Design Principles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Clear principles guide decisions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clarity over cleverness&lt;/strong&gt;: Simple, understandable interfaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency over customization&lt;/strong&gt;: Predictable patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility first&lt;/strong&gt;: Inclusive design from the start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance matters&lt;/strong&gt;: Fast, lightweight components&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Implementation Strategies
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Technology-Agnostic Tokens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Design tokens in JSON&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"50"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#f0f9ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"500"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#3b82f6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"900"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#1e3a8a"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spacing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"xs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"md"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"16px"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Generate platform-specific code&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS custom properties&lt;/li&gt;
&lt;li&gt;Sass variables&lt;/li&gt;
&lt;li&gt;JavaScript objects&lt;/li&gt;
&lt;li&gt;iOS/Android resources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Component Libraries
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React example with TypeScript&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ButtonProps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secondary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ghost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;size&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ButtonProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onClick&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
      &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`btn btn--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; btn--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-Platform Consistency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Web&lt;/strong&gt;: React, Vue, Angular component libraries&lt;br&gt;
&lt;strong&gt;Mobile&lt;/strong&gt;: React Native, Flutter, or native implementations&lt;br&gt;
&lt;strong&gt;Design&lt;/strong&gt;: Figma, Sketch, or Adobe XD libraries&lt;br&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Storybook, Docusaurus, or custom sites&lt;/p&gt;
&lt;h2&gt;
  
  
  Governance and Adoption
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Design System Team Structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Core team responsibilities&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain component library and tokens&lt;/li&gt;
&lt;li&gt;Create documentation and guidelines&lt;/li&gt;
&lt;li&gt;Review and approve new patterns&lt;/li&gt;
&lt;li&gt;Support adoption across teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contributor model&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product teams propose new components&lt;/li&gt;
&lt;li&gt;Design system team reviews and refines&lt;/li&gt;
&lt;li&gt;Collaborative implementation and testing&lt;/li&gt;
&lt;li&gt;Shared ownership of quality and consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Measuring Success
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Adoption metrics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Percentage of products using the system&lt;/li&gt;
&lt;li&gt;Component usage across applications&lt;/li&gt;
&lt;li&gt;Design-to-development handoff time&lt;/li&gt;
&lt;li&gt;Consistency scores in design reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quality metrics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accessibility compliance rates&lt;/li&gt;
&lt;li&gt;Performance benchmarks&lt;/li&gt;
&lt;li&gt;User satisfaction scores&lt;/li&gt;
&lt;li&gt;Developer experience feedback&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Change Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Versioning strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic versioning for breaking changes&lt;/li&gt;
&lt;li&gt;Migration guides for major updates&lt;/li&gt;
&lt;li&gt;Deprecation warnings and timelines&lt;/li&gt;
&lt;li&gt;Backward compatibility when possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Communication channels&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular office hours for questions&lt;/li&gt;
&lt;li&gt;Slack channels for quick support&lt;/li&gt;
&lt;li&gt;Monthly newsletters with updates&lt;/li&gt;
&lt;li&gt;Quarterly roadmap reviews&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Common Pitfalls and Solutions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Over-Engineering Early
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Building too many components before understanding needs&lt;br&gt;
&lt;strong&gt;The solution&lt;/strong&gt;: Start with the most common patterns, expand based on actual usage&lt;/p&gt;
&lt;h3&gt;
  
  
  Lack of Designer-Developer Collaboration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Designers and developers working in silos&lt;br&gt;
&lt;strong&gt;The solution&lt;/strong&gt;: Joint design system team with shared tools and processes&lt;/p&gt;
&lt;h3&gt;
  
  
  Inconsistent Implementation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Teams interpreting guidelines differently&lt;br&gt;
&lt;strong&gt;The solution&lt;/strong&gt;: Automated testing, linting, and clear code examples&lt;/p&gt;
&lt;h3&gt;
  
  
  Resistance to Adoption
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Teams preferring custom solutions&lt;br&gt;
&lt;strong&gt;The solution&lt;/strong&gt;: Make the design system easier to use than building from scratch&lt;/p&gt;
&lt;h2&gt;
  
  
  Tools and Technologies
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Design Tools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Figma&lt;/strong&gt;: Collaborative design with component libraries and auto-layout&lt;br&gt;
&lt;strong&gt;Sketch&lt;/strong&gt;: Traditional design tool with symbol libraries&lt;br&gt;
&lt;strong&gt;Adobe XD&lt;/strong&gt;: Design and prototyping with component states&lt;br&gt;
&lt;strong&gt;Framer&lt;/strong&gt;: Design tool with code component integration&lt;/p&gt;
&lt;h3&gt;
  
  
  Development Tools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Storybook&lt;/strong&gt;: Component development and documentation&lt;br&gt;
&lt;strong&gt;Chromatic&lt;/strong&gt;: Visual testing and review workflows&lt;br&gt;
&lt;strong&gt;Style Dictionary&lt;/strong&gt;: Design token transformation&lt;br&gt;
&lt;strong&gt;Lerna/Nx&lt;/strong&gt;: Monorepo management for multi-package systems&lt;/p&gt;
&lt;h3&gt;
  
  
  Documentation Platforms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docusaurus&lt;/strong&gt;: Documentation sites with MDX support&lt;br&gt;
&lt;strong&gt;GitBook&lt;/strong&gt;: Collaborative documentation with design integration&lt;br&gt;
&lt;strong&gt;Notion&lt;/strong&gt;: All-in-one workspace for team collaboration&lt;br&gt;
&lt;strong&gt;Custom solutions&lt;/strong&gt;: Tailored documentation experiences&lt;/p&gt;
&lt;h2&gt;
  
  
  Advanced Patterns
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Theming and Customization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CSS custom properties for theming&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3b82f6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#60a5fa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1f2937&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Component variants&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brand-specific styling&lt;/li&gt;
&lt;li&gt;Product-specific modifications&lt;/li&gt;
&lt;li&gt;Accessibility-focused alternatives&lt;/li&gt;
&lt;li&gt;Experimental design explorations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Micro-Interactions and Animation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Consistent motion principles&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easing curves and timing functions&lt;/li&gt;
&lt;li&gt;Entrance and exit animations&lt;/li&gt;
&lt;li&gt;Loading and state transitions&lt;/li&gt;
&lt;li&gt;Hover and focus interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Animation tokens&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"animation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"150ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"normal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"300ms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"slow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"500ms"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"easing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ease-out"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cubic-bezier(0, 0, 0.2, 1)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ease-in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cubic-bezier(0.4, 0, 1, 1)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessibility Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Built-in accessibility features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARIA attributes and roles&lt;/li&gt;
&lt;li&gt;Keyboard navigation patterns&lt;/li&gt;
&lt;li&gt;Focus management and indicators&lt;/li&gt;
&lt;li&gt;Screen reader optimizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Accessibility testing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated testing with axe-core&lt;/li&gt;
&lt;li&gt;Manual testing with screen readers&lt;/li&gt;
&lt;li&gt;Color contrast validation&lt;/li&gt;
&lt;li&gt;Keyboard-only navigation testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of Design Systems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI-Powered Design Systems
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Automated component generation&lt;/strong&gt;: AI creating components from design mockups&lt;br&gt;
&lt;strong&gt;Intelligent suggestions&lt;/strong&gt;: Recommending existing components for new designs&lt;br&gt;
&lt;strong&gt;Accessibility scanning&lt;/strong&gt;: Automated detection and fixing of accessibility issues&lt;br&gt;
&lt;strong&gt;Performance optimization&lt;/strong&gt;: AI-driven component optimization&lt;/p&gt;

&lt;h3&gt;
  
  
  Design-to-Code Workflows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Figma to code&lt;/strong&gt;: Automated component generation from design files&lt;br&gt;
&lt;strong&gt;Design tokens sync&lt;/strong&gt;: Real-time synchronization between design and code&lt;br&gt;
&lt;strong&gt;Visual regression testing&lt;/strong&gt;: Automated detection of design inconsistencies&lt;br&gt;
&lt;strong&gt;Component usage analytics&lt;/strong&gt;: Data-driven decisions about component evolution&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-Platform Evolution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Universal design systems&lt;/strong&gt;: Single system spanning web, mobile, and desktop&lt;br&gt;
&lt;strong&gt;Platform-specific optimizations&lt;/strong&gt;: Tailored experiences while maintaining consistency&lt;br&gt;
&lt;strong&gt;Voice and conversational interfaces&lt;/strong&gt;: Design systems for non-visual interactions&lt;br&gt;
&lt;strong&gt;AR/VR design patterns&lt;/strong&gt;: Spatial design system considerations&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started: Your Design System Roadmap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Foundation (Months 1-2)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Audit existing designs and identify patterns&lt;/li&gt;
&lt;li&gt;Define design principles and brand guidelines&lt;/li&gt;
&lt;li&gt;Create basic design tokens (colors, typography, spacing)&lt;/li&gt;
&lt;li&gt;Build 5-10 core components (button, input, card, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Expansion (Months 3-6)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add complex components and patterns&lt;/li&gt;
&lt;li&gt;Create comprehensive documentation&lt;/li&gt;
&lt;li&gt;Implement in first product or application&lt;/li&gt;
&lt;li&gt;Establish governance and contribution processes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Scale (Months 6-12)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Roll out across multiple products and teams&lt;/li&gt;
&lt;li&gt;Add advanced features (theming, animations)&lt;/li&gt;
&lt;li&gt;Implement automated testing and quality checks&lt;/li&gt;
&lt;li&gt;Measure adoption and iterate based on feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 4: Optimization (Year 2+)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Advanced patterns and micro-interactions&lt;/li&gt;
&lt;li&gt;Cross-platform expansion&lt;/li&gt;
&lt;li&gt;AI-powered enhancements&lt;/li&gt;
&lt;li&gt;Community contributions and ecosystem growth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Business Case
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quantifiable Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Development efficiency&lt;/strong&gt;: 30-50% faster feature development&lt;br&gt;
&lt;strong&gt;Design consistency&lt;/strong&gt;: 90%+ reduction in design inconsistencies&lt;br&gt;
&lt;strong&gt;Maintenance costs&lt;/strong&gt;: 60% reduction in UI bug reports&lt;br&gt;
&lt;strong&gt;Onboarding time&lt;/strong&gt;: 40% faster new team member productivity&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Advantages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Brand consistency&lt;/strong&gt;: Cohesive experience across all touchpoints&lt;br&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Faster expansion into new products and markets&lt;br&gt;
&lt;strong&gt;Quality assurance&lt;/strong&gt;: Higher baseline quality for all user interfaces&lt;br&gt;
&lt;strong&gt;Innovation focus&lt;/strong&gt;: More time for unique features and experiences&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design systems are not just about consistency—they're about enabling teams to build better products faster.&lt;/strong&gt; The initial investment in creating a robust design system pays dividends in development speed, design quality, and user experience consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small, think big, and iterate based on real usage.&lt;/strong&gt; The best design systems evolve with their organizations, balancing consistency with flexibility, and enabling creativity within a structured framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your design system should feel like a superpower for your team, not a constraint.&lt;/strong&gt; When done right, it becomes the foundation that enables your organization to build exceptional user experiences at scale.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://m3.material.io/" rel="noopener noreferrer"&gt;Material Design by Google&lt;/a&gt; - Google's comprehensive design system documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;W3C Web Accessibility Guidelines&lt;/a&gt; - Official accessibility standards for design systems&lt;/li&gt;
&lt;li&gt;Learn more &lt;a href="https://iloveblogs.blog/about" rel="noopener noreferrer"&gt;about our editorial team&lt;/a&gt; and how we approach design content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;p&gt;Explore more articles in our Advanced Patterns series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://iloveblogs.blog/guides/building-saas-nextjs-supabase" rel="noopener noreferrer"&gt;Complete Guide to Building SaaS with Next.js and Supabase&lt;/a&gt; - Complete guide covering all aspects&lt;/li&gt;
&lt;li&gt;More related articles coming soon&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/design-systems-scale-consistency" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>uiux</category>
      <category>designsystems</category>
      <category>frontend</category>
      <category>scalability</category>
    </item>
    <item>
      <title>Deploying Next.js + Supabase to Production</title>
      <dc:creator>Mahdi BEN RHOUMA</dc:creator>
      <pubDate>Sat, 04 Apr 2026 09:48:54 +0000</pubDate>
      <link>https://forem.com/mahdi_benrhouma_fe1c6005/deploying-nextjs-supabase-to-production-3bjj</link>
      <guid>https://forem.com/mahdi_benrhouma_fe1c6005/deploying-nextjs-supabase-to-production-3bjj</guid>
      <description>&lt;h1&gt;
  
  
  Deploying Next.js + Supabase to Production
&lt;/h1&gt;

&lt;p&gt;Deploying to production is more than pushing code—it's about reliability, performance, and maintainability. This comprehensive guide covers everything you need to deploy Next.js + Supabase applications with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Proper Deployment Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reliability:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-downtime deployments&lt;/li&gt;
&lt;li&gt;Automatic rollbacks on failure&lt;/li&gt;
&lt;li&gt;Health checks and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge deployment for low latency&lt;/li&gt;
&lt;li&gt;Optimized builds&lt;/li&gt;
&lt;li&gt;CDN for static assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maintainability:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Environment management&lt;/li&gt;
&lt;li&gt;Database migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Deployment Platforms Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vercel (Recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built by Next.js creators&lt;/li&gt;
&lt;li&gt;Zero-config deployment&lt;/li&gt;
&lt;li&gt;Automatic HTTPS&lt;/li&gt;
&lt;li&gt;Edge network&lt;/li&gt;
&lt;li&gt;Preview deployments&lt;/li&gt;
&lt;li&gt;Free tier available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Next.js applications, indie developers, startups&lt;/p&gt;

&lt;h3&gt;
  
  
  Netlify
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple deployment&lt;/li&gt;
&lt;li&gt;Good free tier&lt;/li&gt;
&lt;li&gt;Edge functions&lt;/li&gt;
&lt;li&gt;Form handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Static sites, JAMstack applications&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS (Advanced)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full control&lt;/li&gt;
&lt;li&gt;Scalable&lt;/li&gt;
&lt;li&gt;Many services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex setup&lt;/li&gt;
&lt;li&gt;Higher cost&lt;/li&gt;
&lt;li&gt;Steeper learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Enterprise applications, specific requirements&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-Hosted
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete control&lt;/li&gt;
&lt;li&gt;Cost-effective at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires DevOps expertise&lt;/li&gt;
&lt;li&gt;Maintenance overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Large applications, specific compliance needs&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Vercel Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initial Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Install Vercel CLI&lt;/span&gt;
npm i &lt;span class="nt"&gt;-g&lt;/span&gt; vercel

&lt;span class="c"&gt;## Login&lt;/span&gt;
vercel login

&lt;span class="c"&gt;## Deploy&lt;/span&gt;
vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;vercel.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"buildCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"installCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm install"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"framework"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nextjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"regions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"iad1"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"NEXT_PUBLIC_SUPABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@supabase-url"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"NEXT_PUBLIC_SUPABASE_ANON_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@supabase-anon-key"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automatic Deployments
&lt;/h3&gt;

&lt;p&gt;Connect GitHub repository:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Vercel dashboard&lt;/li&gt;
&lt;li&gt;Click "New Project"&lt;/li&gt;
&lt;li&gt;Import Git repository&lt;/li&gt;
&lt;li&gt;Configure build settings&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every push to main branch triggers deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Deploy Next.js Supabase App to Vercel Production, Configure Custom Domain for Next.js on Vercel&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Environment Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## .env.local (development)
NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-local-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-local-service-key

## Production (set in Vercel dashboard)
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-prod-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-prod-service-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Environment-Specific Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;anonKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_APP_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vercel Environment Variables
&lt;/h3&gt;

&lt;p&gt;Set in Vercel dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Project Settings&lt;/li&gt;
&lt;li&gt;Click "Environment Variables"&lt;/li&gt;
&lt;li&gt;Add variables for Production, Preview, Development&lt;/li&gt;
&lt;li&gt;Redeploy to apply changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Implement Environment Variables Best Practices Next.js, Deploy Next.js 15 to Vercel Without Environment Variable Errors&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Database Migrations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Supabase CLI Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Install Supabase CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;supabase &lt;span class="nt"&gt;--save-dev&lt;/span&gt;

&lt;span class="c"&gt;## Initialize Supabase&lt;/span&gt;
npx supabase init

&lt;span class="c"&gt;## Link to remote project&lt;/span&gt;
npx supabase &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="nt"&gt;--project-ref&lt;/span&gt; your-project-ref
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Migrations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Create new migration&lt;/span&gt;
npx supabase migration new add_posts_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- supabase/migrations/20260216000000_add_posts_table.sql&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;uuid_generate_v4&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Enable RLS&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="n"&gt;ENABLE&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;LEVEL&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- RLS policies&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="nv"&gt;"Users can view own posts"&lt;/span&gt;
  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;POLICY&lt;/span&gt; &lt;span class="nv"&gt;"Users can create posts"&lt;/span&gt;
  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;
  &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apply Migrations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Apply to local database&lt;/span&gt;
npx supabase db push

&lt;span class="c"&gt;## Apply to production&lt;/span&gt;
npx supabase db push &lt;span class="nt"&gt;--db-url&lt;/span&gt; &lt;span class="s2"&gt;"postgresql://..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Migration Best Practices
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- ✅ Good: Reversible migrations&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;(...);&lt;/span&gt;

&lt;span class="c1"&gt;-- Add rollback in separate file&lt;/span&gt;
&lt;span class="c1"&gt;-- supabase/migrations/20260216000001_rollback_posts.sql&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ✅ Good: Add columns with defaults&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'draft'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ❌ Bad: Breaking changes without migration path&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;important_field&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Handle Database Migrations in Production Supabase, Supabase Database Schema Design for SaaS Applications&lt;/p&gt;

&lt;h2&gt;
  
  
  5. CI/CD Pipelines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;## .github/workflows/deploy.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run linter&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run lint&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Type check&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run type-check&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Vercel&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;amondnet/vercel-action@v20&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;vercel-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VERCEL_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;vercel-org-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VERCEL_ORG_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;vercel-project-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VERCEL_PROJECT_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;vercel-args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--prod'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Migration in CI/CD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;## .github/workflows/migrate.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Database Migration&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;supabase/migrations/**'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;migrate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Supabase CLI&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;supabase/setup-cli@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run migrations&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx supabase db push --db-url ${{ secrets.DATABASE_URL }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Set Up CI/CD Pipeline for Next.js with GitHub Actions, Deploy Next.js Supabase App to Vercel Production&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Monitoring and Logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error Tracking with Sentry
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @sentry/nextjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// sentry.client.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Sentry&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sentry/nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dsn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SENTRY_DSN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tracesSampleRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// sentry.server.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Sentry&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sentry/nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dsn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SENTRY_DSN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tracesSampleRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Application Logging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/logger.ts&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;LogLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LogLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Send to logging service&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/logs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;logEntry&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;logEntry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/monitoring.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trackPerformance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Send to analytics&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/metrics&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;trackPerformance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data_fetch_time&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Monitor Next.js Application Performance in Production, Set Up Error Tracking with Sentry in Next.js&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Custom Domain Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Add Domain to Vercel
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to Project Settings → Domains&lt;/li&gt;
&lt;li&gt;Add your domain (e.g., &lt;code&gt;example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Configure DNS records:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: A
Name: @
Value: 76.76.21.21

Type: CNAME
Name: www
Value: cname.vercel-dns.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSL Certificate
&lt;/h3&gt;

&lt;p&gt;Vercel automatically provisions SSL certificates via Let's Encrypt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redirect Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.mjs&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;redirects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;has&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;host&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;www.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;permanent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Configure Custom Domain for Next.js on Vercel, Deploy Next.js Supabase App to Vercel Production&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Scaling Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Horizontal Scaling
&lt;/h3&gt;

&lt;p&gt;Vercel automatically scales based on traffic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless functions scale independently&lt;/li&gt;
&lt;li&gt;Edge functions deployed globally&lt;/li&gt;
&lt;li&gt;Static assets served from CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database Scaling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Add indexes for frequently queried columns&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_posts_user_id&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_posts_created_at&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Use connection pooling&lt;/span&gt;
&lt;span class="c1"&gt;-- Configure in Supabase dashboard: Database → Connection Pooling&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Caching Strategy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/posts/page.tsx&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;revalidate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// Revalidate every 60 seconds&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Edge Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/edge/route.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;edge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Runs on edge, close to users&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from the edge!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Next.js Edge Runtime vs Node Runtime When to Use, Supabase Database Query Optimization&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Disaster Recovery
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Database Backups
&lt;/h3&gt;

&lt;p&gt;Supabase automatically backs up your database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point-in-time recovery (PITR) available on Pro plan&lt;/li&gt;
&lt;li&gt;Daily backups retained for 7 days&lt;/li&gt;
&lt;li&gt;Manual backups via CLI
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Create manual backup&lt;/span&gt;
npx supabase db dump &lt;span class="nt"&gt;-f&lt;/span&gt; backup.sql

&lt;span class="c"&gt;## Restore from backup&lt;/span&gt;
psql &lt;span class="nt"&gt;-h&lt;/span&gt; db.your-project.supabase.co &lt;span class="nt"&gt;-U&lt;/span&gt; postgres &lt;span class="nt"&gt;-d&lt;/span&gt; postgres &lt;span class="nt"&gt;-f&lt;/span&gt; backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rollback Strategy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Rollback to previous deployment (Vercel)&lt;/span&gt;
vercel rollback

&lt;span class="c"&gt;## Rollback database migration&lt;/span&gt;
npx supabase migration down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Health Checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/health/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/supabase/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;// Check database connection&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;healthy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unhealthy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Security Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Good: Server-side only&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serviceKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SUPABASE_SERVICE_ROLE_KEY&lt;/span&gt;

&lt;span class="c1"&gt;// ❌ Bad: Exposed to client&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serviceKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SERVICE_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  API Rate Limiting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/rate-limit.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Ratelimit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@upstash/ratelimit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@upstash/redis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratelimit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Ratelimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEnv&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Ratelimit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slidingWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10 s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkRateLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ratelimit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;success&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CORS Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access-Control-Allow-Origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://iloveblog.blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Access-Control-Allow-Methods&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET, POST, PUT, DELETE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security Headers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.mjs&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/:path*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DENY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Content-Type-Options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nosniff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Referrer-Policy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;origin-when-cross-origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Implement API Rate Limiting in Next.js Applications, Implement Environment Variables Best Practices Next.js&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Common Deployment Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build Errors
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Module not found after deploy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Clear cache and rebuild&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; .next node_modules
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Environment Variable Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Environment variables not available&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure variables are set in Vercel dashboard&lt;/li&gt;
&lt;li&gt;Prefix client-side variables with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Redeploy after adding variables&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database Connection Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Can't connect to Supabase&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Check connection pooling settings&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;persistSession&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Fix Next.js Build Error Module Not Found After Deploy, Deploy Next.js 15 to Vercel Without Environment Variable Errors&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Deployment Checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pre-Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] All tests passing&lt;/li&gt;
&lt;li&gt;[ ] Linter passing&lt;/li&gt;
&lt;li&gt;[ ] Type checking passing&lt;/li&gt;
&lt;li&gt;[ ] Environment variables configured&lt;/li&gt;
&lt;li&gt;[ ] Database migrations ready&lt;/li&gt;
&lt;li&gt;[ ] Security headers configured&lt;/li&gt;
&lt;li&gt;[ ] Error tracking setup&lt;/li&gt;
&lt;li&gt;[ ] Performance monitoring setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Deploy to staging first&lt;/li&gt;
&lt;li&gt;[ ] Run smoke tests&lt;/li&gt;
&lt;li&gt;[ ] Check error logs&lt;/li&gt;
&lt;li&gt;[ ] Verify database migrations&lt;/li&gt;
&lt;li&gt;[ ] Test critical user flows&lt;/li&gt;
&lt;li&gt;[ ] Monitor performance metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Post-Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Verify production deployment&lt;/li&gt;
&lt;li&gt;[ ] Check error rates&lt;/li&gt;
&lt;li&gt;[ ] Monitor performance&lt;/li&gt;
&lt;li&gt;[ ] Test from different locations&lt;/li&gt;
&lt;li&gt;[ ] Verify SSL certificate&lt;/li&gt;
&lt;li&gt;[ ] Check custom domain&lt;/li&gt;
&lt;li&gt;[ ] Monitor database performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQ)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the best platform to deploy Next.js with Supabase?
&lt;/h3&gt;

&lt;p&gt;Vercel is the recommended platform for Next.js applications. It's built by the Next.js team, offers zero-config deployment, automatic HTTPS, preview deployments for pull requests, and global edge network distribution. The free tier is generous for indie developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle environment variables in production?
&lt;/h3&gt;

&lt;p&gt;Set environment variables in your deployment platform's dashboard (Vercel, Netlify, etc.). Use &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; prefix for client-side variables. Never commit secrets to Git. Use different values for development, staging, and production environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I run database migrations before or after deployment?
&lt;/h3&gt;

&lt;p&gt;Run migrations before deployment in a separate step. Use Supabase CLI with &lt;code&gt;npx supabase db push&lt;/code&gt; in your CI/CD pipeline. Test migrations in staging first, and always create rollback migrations for safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I implement zero-downtime deployments?
&lt;/h3&gt;

&lt;p&gt;Use platforms like Vercel that support atomic deployments. They deploy to new infrastructure, run health checks, then switch traffic. If deployment fails, traffic stays on the old version. Always test in staging first.&lt;/p&gt;

&lt;h3&gt;
  
  
  What monitoring should I set up for production?
&lt;/h3&gt;

&lt;p&gt;Implement error tracking (Sentry), performance monitoring (Vercel Analytics), uptime monitoring (UptimeRobot), and database monitoring (Supabase Dashboard). Set up alerts for critical errors, high response times, and downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle database backups?
&lt;/h3&gt;

&lt;p&gt;Supabase automatically backs up your database daily (retained for 7 days on free tier, longer on paid plans). Pro plan includes Point-in-Time Recovery (PITR). Create manual backups before major migrations using &lt;code&gt;npx supabase db dump&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use connection pooling in production?
&lt;/h3&gt;

&lt;p&gt;Yes, always enable connection pooling for production. It prevents connection limit errors under load and improves performance. Enable it in Supabase Dashboard → Database → Connection Pooling and use the pooled connection string.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I rollback a failed deployment?
&lt;/h3&gt;

&lt;p&gt;On Vercel, use &lt;code&gt;vercel rollback&lt;/code&gt; or rollback via dashboard. For database migrations, run your rollback migration with &lt;code&gt;npx supabase migration down&lt;/code&gt;. Always test rollback procedures in staging.&lt;/p&gt;

&lt;h3&gt;
  
  
  What security headers should I configure?
&lt;/h3&gt;

&lt;p&gt;Configure X-Frame-Options (DENY), X-Content-Type-Options (nosniff), Referrer-Policy (origin-when-cross-origin), and Content-Security-Policy. Use next.config.js headers() function to set these for all routes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I optimize build times in CI/CD?
&lt;/h3&gt;

&lt;p&gt;Cache node_modules and .next directories, use npm ci instead of npm install, enable Turbopack for faster builds, and run tests in parallel. Consider using GitHub Actions cache or Vercel's built-in caching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use preview deployments?
&lt;/h3&gt;

&lt;p&gt;Yes, preview deployments are essential for testing changes before production. They create a unique URL for each pull request, allowing you to test features, run E2E tests, and get stakeholder approval before merging.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle secrets in CI/CD?
&lt;/h3&gt;

&lt;p&gt;Use your CI/CD platform's secrets management (GitHub Secrets, GitLab CI/CD variables). Never commit secrets to Git. Use different secrets for staging and production. Rotate secrets regularly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the best way to monitor database performance?
&lt;/h3&gt;

&lt;p&gt;Use Supabase Dashboard's Query Performance tab to identify slow queries. Monitor connection count, query execution time, and database size. Set up alerts for high CPU usage or connection limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I implement health checks?
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;/api/health&lt;/code&gt; endpoint that checks database connectivity, external service availability, and critical functionality. Use this endpoint for uptime monitoring and deployment verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/building-saas-nextjs-supabase" rel="noopener noreferrer"&gt;Complete Guide to Building SaaS with Next.js and Supabase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/nextjs-performance-optimization" rel="noopener noreferrer"&gt;Next.js Performance Optimization for Indie Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iloveblogs.blog/guides/supabase-authentication-authorization" rel="noopener noreferrer"&gt;Supabase Authentication &amp;amp; Authorization Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Set Up CI/CD Pipeline for Next.js with GitHub Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Deploying to production is a critical step in your application's lifecycle. With Vercel and Supabase, you get a powerful, scalable infrastructure without managing servers.&lt;/p&gt;

&lt;p&gt;Focus on these key areas: automated deployments, proper environment configuration, database migrations, monitoring, and security. Start simple, then add complexity as needed.&lt;/p&gt;

&lt;p&gt;Ship with confidence. Deploy today.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://iloveblogs.blog/post/deploying-nextjs-supabase-production" rel="noopener noreferrer"&gt;https://iloveblogs.blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deployment</category>
      <category>nextjs</category>
      <category>supabase</category>
      <category>vercel</category>
    </item>
  </channel>
</rss>
