<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vipin Yadav</title>
    <description>The latest articles on DEV Community by Vipin Yadav (@vipinyadav01).</description>
    <link>https://dev.to/vipinyadav01</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%2F3713179%2F08e26c90-a448-41ae-9398-4be03326cb86.jpg</url>
      <title>DEV Community: Vipin Yadav</title>
      <link>https://dev.to/vipinyadav01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vipinyadav01"/>
    <language>en</language>
    <item>
      <title>Deploying Full Stack Apps to Vercel: Complete Guide</title>
      <dc:creator>Vipin Yadav</dc:creator>
      <pubDate>Wed, 27 May 2026 21:49:15 +0000</pubDate>
      <link>https://dev.to/vipinyadav01/deploying-full-stack-apps-to-vercel-complete-guide-3o2c</link>
      <guid>https://dev.to/vipinyadav01/deploying-full-stack-apps-to-vercel-complete-guide-3o2c</guid>
      <description>&lt;h1&gt;
  
  
  Deploying Full Stack Apps to Vercel: The Complete Production Guide
&lt;/h1&gt;

&lt;p&gt;Deploying a frontend application to Vercel is incredibly simple — often just a few clicks.&lt;br&gt;&lt;br&gt;
But deploying a &lt;strong&gt;production-ready full stack application&lt;/strong&gt; requires a deeper understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless functions&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Database connection handling&lt;/li&gt;
&lt;li&gt;CORS policies&lt;/li&gt;
&lt;li&gt;API routing&lt;/li&gt;
&lt;li&gt;Domain configuration&lt;/li&gt;
&lt;li&gt;Deployment architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're deploying a &lt;strong&gt;Next.js SaaS platform&lt;/strong&gt;, a &lt;strong&gt;MERN stack application&lt;/strong&gt;, or an &lt;strong&gt;AI-powered web app&lt;/strong&gt;, this guide covers everything you need to know.&lt;/p&gt;


&lt;h1&gt;
  
  
  Why Use Vercel for Full Stack Apps?
&lt;/h1&gt;

&lt;p&gt;Vercel is no longer just a static hosting platform.&lt;br&gt;&lt;br&gt;
With &lt;strong&gt;Serverless Functions&lt;/strong&gt;, &lt;strong&gt;Edge Middleware&lt;/strong&gt;, and seamless Git integrations, it has become one of the best platforms for modern full stack deployments.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Advantages
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ⚡ Global Edge Network
&lt;/h3&gt;

&lt;p&gt;Your frontend assets are automatically cached across Vercel’s global CDN for faster loading times and better Core Web Vitals.&lt;/p&gt;
&lt;h3&gt;
  
  
  🚀 Automatic Scaling
&lt;/h3&gt;

&lt;p&gt;API routes scale automatically depending on traffic demand.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔄 Git-Based Deployments
&lt;/h3&gt;

&lt;p&gt;Every Git push generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preview deployments&lt;/li&gt;
&lt;li&gt;Production builds&lt;/li&gt;
&lt;li&gt;Rollback support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔒 Built-In SSL
&lt;/h3&gt;

&lt;p&gt;Every deployment gets HTTPS enabled automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧠 Excellent DX (Developer Experience)
&lt;/h3&gt;

&lt;p&gt;Minimal DevOps overhead lets you focus on building products instead of managing infrastructure.&lt;/p&gt;


&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

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

&lt;ul&gt;
&lt;li&gt;A GitHub/GitLab/Bitbucket repository&lt;/li&gt;
&lt;li&gt;A Vercel account&lt;/li&gt;
&lt;li&gt;A production database&lt;/li&gt;
&lt;li&gt;Environment variables ready&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Recommended Databases
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Database&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB Atlas&lt;/td&gt;
&lt;td&gt;MERN applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon PostgreSQL&lt;/td&gt;
&lt;td&gt;Next.js + Prisma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;Realtime apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PlanetScale&lt;/td&gt;
&lt;td&gt;Scalable MySQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  Understanding Full Stack Architectures on Vercel
&lt;/h1&gt;

&lt;p&gt;There are two common approaches.&lt;/p&gt;


&lt;h1&gt;
  
  
  1. Decoupled Architecture (MERN Stack)
&lt;/h1&gt;

&lt;p&gt;Frontend and backend are deployed separately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
├── client/          # React / Vite frontend
└── server/          # Express backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Typical Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2. Monolithic Architecture (Next.js)
&lt;/h1&gt;

&lt;p&gt;Everything lives in a single repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-next-app/
├── app/
│   ├── page.tsx
│   └── api/
│       └── users/route.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is currently the most optimized architecture for Vercel.&lt;/p&gt;




&lt;h1&gt;
  
  
  Deploying a MERN Backend on Vercel
&lt;/h1&gt;

&lt;p&gt;Unlike traditional VPS hosting, Vercel runs backend APIs as &lt;strong&gt;serverless functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No permanent server process&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;app.listen()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Functions spin up only when needed&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Setting Up &lt;code&gt;vercel.json&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Create a &lt;code&gt;vercel.json&lt;/code&gt; file inside your backend directory.&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"builds"&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;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@vercel/node"&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;"routes"&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;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"dest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api/index.js"&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;This tells Vercel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which file is the serverless entry point&lt;/li&gt;
&lt;li&gt;How to route incoming traffic&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Express Server Setup for Vercel
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;api/index.js&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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="nx"&gt;cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cors&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="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;origin&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;CLIENT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;credentials&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&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="nx"&gt;app&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/health&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&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;success&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="na"&gt;message&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 Running&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;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Important: Never Use &lt;code&gt;app.listen()&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This is one of the biggest mistakes beginners make.&lt;/p&gt;

&lt;p&gt;❌ Wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vercel handles the server lifecycle automatically.&lt;/p&gt;




&lt;h1&gt;
  
  
  Environment Variables
&lt;/h1&gt;

&lt;p&gt;Never push secrets to GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Variables in Vercel Dashboard
&lt;/h2&gt;

&lt;p&gt;Go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project → Settings → Environment Variables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Variables
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MONGODB_URI=
JWT_SECRET=
CLIENT_URL=
NEXTAUTH_SECRET=
DATABASE_URL=
OPENAI_API_KEY=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Database Connection Best Practices
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Serverless functions are stateless.&lt;/p&gt;

&lt;p&gt;Every request may create a new database connection.&lt;/p&gt;

&lt;p&gt;Without optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You hit connection limits&lt;/li&gt;
&lt;li&gt;Performance becomes unstable&lt;/li&gt;
&lt;li&gt;APIs become slow&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  MongoDB Connection Caching
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Recommended Approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isConnected&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connectDB&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isConnected&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&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;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&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;MONGODB_URI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;isConnected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;connectDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Prisma Setup for Next.js
&lt;/h1&gt;

&lt;p&gt;If using Prisma:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PrismaClient&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;@prisma/client&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;globalForPrisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;globalThis&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;prisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;globalForPrisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prisma&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;PrismaClient&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="nx"&gt;globalForPrisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prisma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents multiple Prisma instances during development.&lt;/p&gt;




&lt;h1&gt;
  
  
  Deploying Frontend + Backend Separately
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Frontend Deployment
&lt;/h2&gt;

&lt;p&gt;Deploy:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Backend Deployment
&lt;/h2&gt;

&lt;p&gt;Deploy:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then connect them using environment variables.&lt;/p&gt;




&lt;h1&gt;
  
  
  Connecting Frontend to Backend
&lt;/h1&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_API_URL=https://your-api.vercel.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEXT_PUBLIC_API_URL=https://your-api.vercel.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Deploying with GitHub (Recommended)
&lt;/h1&gt;

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

&lt;h3&gt;
  
  
  1. Push Code to GitHub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial deployment"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Import Repository in Vercel
&lt;/h3&gt;

&lt;p&gt;Go to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add New&lt;/li&gt;
&lt;li&gt;Project&lt;/li&gt;
&lt;li&gt;Import Git Repository&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Configure Root Directory
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Root Directory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/client&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/server&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  4. Add Environment Variables
&lt;/h3&gt;

&lt;p&gt;Paste all required secrets before deployment.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Deploy
&lt;/h3&gt;

&lt;p&gt;Vercel automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installs dependencies&lt;/li&gt;
&lt;li&gt;Builds the project&lt;/li&gt;
&lt;li&gt;Creates preview deployments&lt;/li&gt;
&lt;li&gt;Generates a production URL&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Deploying with Vercel CLI
&lt;/h1&gt;

&lt;p&gt;Install CLI:&lt;br&gt;
&lt;/p&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; &lt;span class="nt"&gt;-g&lt;/span&gt; vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nt"&gt;--prod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Custom Domain Setup
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Add Your Domain
&lt;/h2&gt;

&lt;p&gt;Go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project → Settings → Domains
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  DNS Configuration
&lt;/h1&gt;

&lt;p&gt;Vercel will provide records like:&lt;/p&gt;

&lt;h2&gt;
  
  
  A Record
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;h2&gt;
  
  
  CNAME Record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cname.vercel-dns.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Common Deployment Issues
&lt;/h1&gt;




&lt;h1&gt;
  
  
  1. CORS Errors
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Access-Control-Allow-Origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;origin&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;CLIENT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;credentials&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;p&gt;Also verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct production frontend URL&lt;/li&gt;
&lt;li&gt;No trailing slash mismatch&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2. Function Timeout Errors
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;504 Gateway Timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cause
&lt;/h2&gt;

&lt;p&gt;Heavy processing inside serverless functions.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Use Background Jobs
&lt;/h3&gt;

&lt;p&gt;Recommended services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inngest&lt;/li&gt;
&lt;li&gt;Upstash QStash&lt;/li&gt;
&lt;li&gt;Trigger.dev&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optimize Database Queries
&lt;/h3&gt;

&lt;p&gt;Avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large aggregations&lt;/li&gt;
&lt;li&gt;Blocking operations&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  3. Build Failures
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Common Reasons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Missing Environment Variables
&lt;/h3&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Incorrect Node Version
&lt;/h3&gt;

&lt;p&gt;Specify:&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;"engines"&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;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"20.x"&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;h1&gt;
  
  
  4. API Routes Not Working
&lt;/h1&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File naming&lt;/li&gt;
&lt;li&gt;Export syntax&lt;/li&gt;
&lt;li&gt;Route paths&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vercel.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Production Deployment Tips
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Use Separate Environments
&lt;/h2&gt;

&lt;p&gt;Vercel supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;li&gt;Preview&lt;/li&gt;
&lt;li&gt;Production&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Enable Analytics
&lt;/h1&gt;

&lt;p&gt;Vercel Analytics helps track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Core Web Vitals&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Use Edge Middleware Carefully
&lt;/h1&gt;

&lt;p&gt;Great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Redirects&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But avoid heavy logic inside middleware.&lt;/p&gt;




&lt;h1&gt;
  
  
  Recommended Tech Stack for 2026
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Best Overall Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 15&lt;/li&gt;
&lt;li&gt;TailwindCSS&lt;/li&gt;
&lt;li&gt;ShadCN UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Server Actions&lt;/li&gt;
&lt;li&gt;Route Handlers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL + Prisma&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Auth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Better Auth / Clerk&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vercel&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Vercel provides one of the best developer experiences for deploying modern full stack applications.&lt;/p&gt;

&lt;p&gt;Once you understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless architecture&lt;/li&gt;
&lt;li&gt;Environment variable management&lt;/li&gt;
&lt;li&gt;Database optimization&lt;/li&gt;
&lt;li&gt;Routing strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you can deploy highly scalable production-grade apps in minutes.&lt;/p&gt;

&lt;p&gt;The biggest advantage is speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster iteration&lt;/li&gt;
&lt;li&gt;Preview deployments&lt;/li&gt;
&lt;li&gt;Minimal infrastructure management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which means more time building products and less time handling DevOps.&lt;/p&gt;




&lt;h1&gt;
  
  
  Useful Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vercel.com/docs" rel="noopener noreferrer"&gt;https://vercel.com/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/deployment" rel="noopener noreferrer"&gt;https://nextjs.org/docs/deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/atlas/database" rel="noopener noreferrer"&gt;https://www.mongodb.com/atlas/database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prisma.io/" rel="noopener noreferrer"&gt;https://www.prisma.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>serverless</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Reduced My Docker Image Size by 90% Using Multi-Stage Builds</title>
      <dc:creator>Vipin Yadav</dc:creator>
      <pubDate>Wed, 28 Jan 2026 17:06:58 +0000</pubDate>
      <link>https://dev.to/vipinyadav01/how-i-reduced-my-docker-image-size-by-90-using-multi-stage-builds-p4h</link>
      <guid>https://dev.to/vipinyadav01/how-i-reduced-my-docker-image-size-by-90-using-multi-stage-builds-p4h</guid>
      <description>&lt;h1&gt;
  
  
  Optimizing Docker Images: From Gigabytes to Megabytes
&lt;/h1&gt;

&lt;p&gt;Docker images bloating to several gigabytes? Your container deployments taking forever? Multi-stage builds are the key to shrinking images, as seen in this transition from &lt;strong&gt;1.2GB to 120MB&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Standard Dockerfile builds include everything: build tools, dev dependencies, source files, and compilation artifacts. Your production container doesn't need any of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (1.2GB):&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:18&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 &lt;span class="nb"&gt;install&lt;/span&gt;
&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="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/server.js"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Solution: Multi-Stage Builds
&lt;/h2&gt;

&lt;p&gt;Multi-stage builds allow the use of multiple &lt;code&gt;FROM&lt;/code&gt; statements. Each stage can copy artifacts from previous stages while leaving behind everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After (120MB):&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;# Stage 1: Build&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:18&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="nt"&gt;--only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&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;# Stage 2: Production&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=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;USER&lt;/span&gt;&lt;span class="s"&gt; node&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/server.js"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Improvements
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Alpine Base Image&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;node:18&lt;/code&gt; ≈ 900MB&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;node:18-alpine&lt;/code&gt; ≈ 110MB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production Dependencies Only&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;npm ci --only=production&lt;/code&gt; excludes &lt;code&gt;devDependencies&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No TypeScript, testing frameworks, or linters in the production layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Selective Copying&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Only copies &lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt;, and necessary config files.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Go Application
&lt;/h3&gt;

&lt;p&gt;Go benefits significantly as the entire compiler is excluded from the final image.&lt;br&gt;
&lt;strong&gt;Result: 800MB → 15MB&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;# 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;golang:1.21&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; go.mod go.sum ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;go mod download
&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;&lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux go build &lt;span class="nt"&gt;-o&lt;/span&gt; main .

&lt;span class="c"&gt;# Production stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; alpine:latest&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk &lt;span class="nt"&gt;--no-cache&lt;/span&gt; add ca-certificates
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /root/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/main .&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["./main"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Python with pip
&lt;/h3&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="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.11&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; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--user&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&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 /root/.local /root/.local&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH=/root/.local/bin:$PATH&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "app.py"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Java with Maven
&lt;/h3&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="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;maven:3.9-openjdk-17&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; pom.xml .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;mvn dependency:go-offline
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src ./src&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;mvn package &lt;span class="nt"&gt;-DskipTests&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; openjdk:17-jdk-slim&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/target/*.jar app.jar&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "app.jar"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices &amp;amp; Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Optimization Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Order Layers by Change Frequency:&lt;/strong&gt; Place &lt;code&gt;COPY package*.json&lt;/code&gt; before &lt;code&gt;COPY .&lt;/code&gt; to leverage layer caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;.dockerignore&lt;/code&gt;:&lt;/strong&gt; Exclude &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;, and environment files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine Commands:&lt;/strong&gt; Use &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;\&lt;/code&gt; to reduce the number of layers in a single stage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Impact
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Time (Subsequent)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60% Faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Push/Pull Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~85-90% Faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disk Space&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90% Reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40% Reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Debugging Multi-Stage Builds
&lt;/h2&gt;

&lt;p&gt;You can build or inspect specific stages using the &lt;code&gt;--target&lt;/code&gt; flag:&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;# Build specific stage for debugging&lt;/span&gt;
docker build &lt;span class="nt"&gt;--target&lt;/span&gt; builder &lt;span class="nt"&gt;-t&lt;/span&gt; myapp:debug &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Inspect intermediate layers&lt;/span&gt;
docker &lt;span class="nb"&gt;history &lt;/span&gt;myapp:builder

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The initial investment in refactoring your Dockerfile pays dividends in performance, cost, and developer experience. Start with your largest images first—that's where you'll see the biggest wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What size reduction did you achieve? Share your results below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#docker&lt;/code&gt; &lt;code&gt;#devops&lt;/code&gt; &lt;code&gt;#containers&lt;/code&gt; &lt;code&gt;#performance&lt;/code&gt;&lt;/p&gt;




</description>
      <category>docker</category>
      <category>webdev</category>
      <category>devops</category>
      <category>containers</category>
    </item>
    <item>
      <title>How I Built LaunchTrack: An AI Career Coach with Next.js and Gemini API</title>
      <dc:creator>Vipin Yadav</dc:creator>
      <pubDate>Fri, 16 Jan 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/vipinyadav01/how-i-built-launchtrack-an-ai-career-coach-with-nextjs-and-gemini-api-354</link>
      <guid>https://dev.to/vipinyadav01/how-i-built-launchtrack-an-ai-career-coach-with-nextjs-and-gemini-api-354</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Hey everyone! 👋

I'm excited to share my latest project - &lt;span class="gs"&gt;**LaunchTrack**&lt;/span&gt;, an AI-powered career coaching platform. In this post, I'll walk you through how I built it and the technologies I used.

&lt;span class="gu"&gt;## 🚀 What is LaunchTrack?&lt;/span&gt;

LaunchTrack is an AI career coach that helps job seekers with:
&lt;span class="p"&gt;
-&lt;/span&gt; Personalized job search support
&lt;span class="p"&gt;-&lt;/span&gt; Interview preparation
&lt;span class="p"&gt;-&lt;/span&gt; Resume analysis
&lt;span class="p"&gt;-&lt;/span&gt; Career advice powered by AI

&lt;span class="gs"&gt;**Live Demo:**&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;launchtrack.vercel.app&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://launchtrack.vercel.app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gs"&gt;**GitHub:**&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;github.com/vipinyadav01/aicareercoach&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://github.com/vipinyadav01/aicareercoach&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;## 🛠️ Tech Stack&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Frontend:**&lt;/span&gt; Next.js 14 (App Router)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AI:**&lt;/span&gt; Google Gemini API
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Database:**&lt;/span&gt; Prisma + PostgreSQL
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Authentication:**&lt;/span&gt; Clerk
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Styling:**&lt;/span&gt; Tailwind CSS + Shadcn UI
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**State Management:**&lt;/span&gt; Zustand
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Background Jobs:**&lt;/span&gt; Inngest

&lt;span class="gu"&gt;## 💡 Key Features&lt;/span&gt;

&lt;span class="gu"&gt;### 1. AI-Powered Career Advice&lt;/span&gt;

Using Google Gemini API, users get personalized career guidance based on their profile and goals.

&lt;span class="gu"&gt;### 2. Resume Analysis&lt;/span&gt;

Upload your resume and get instant AI feedback on how to improve it.

&lt;span class="gu"&gt;### 3. Interview Preparation&lt;/span&gt;

Practice with AI-generated interview questions tailored to your target role.

&lt;span class="gu"&gt;### 4. PWA Support&lt;/span&gt;

Works offline and can be installed as a mobile app!

&lt;span class="gu"&gt;## 🔧 Architecture Overview&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;┌─────────────────────────────────────────────┐&lt;br&gt;
│ Next.js App │&lt;br&gt;
├─────────────────────────────────────────────┤&lt;br&gt;
│ Pages │ API Routes │ Server Actions │&lt;br&gt;
├─────────────────────────────────────────────┤&lt;br&gt;
│ Prisma ORM │&lt;br&gt;
├─────────────────────────────────────────────┤&lt;br&gt;
│ PostgreSQL │ Gemini API │ Inngest │&lt;br&gt;
└─────────────────────────────────────────────┘&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## 🎯 Challenges &amp;amp; Solutions

### Challenge 1: Rate Limiting Gemini API
**Solution:** Implemented request queuing with Inngest background jobs.

### Challenge 2: Streaming AI Responses
**Solution:** Used Next.js Edge Runtime with streaming responses.

### Challenge 3: PWA Offline Support
**Solution:** Configured next-pwa with custom service worker caching.

## 📊 Results

- ⚡ **Lighthouse Score:** 95+
- 📱 **PWA:** Installable on all devices
- 🔒 **Security:** A+ rating

## 🔗 Links

- **Portfolio:** [devxvipin.me](https://devxvipin.me)
- **GitHub:** [github.com/vipinyadav01](https://github.com/vipinyadav01)
- **LinkedIn:** [linkedin.com/in/vipinyadav01](https://linkedin.com/in/vipinyadav01)

---

Thanks for reading! Let me know if you have any questions in the comments.

Follow me for more web development content! 🚀

#nextjs #ai #webdev #javascript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
