<?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: Bismark</title>
    <description>The latest articles on DEV Community by Bismark (@bismark_912b0df7cb569c420).</description>
    <link>https://dev.to/bismark_912b0df7cb569c420</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2796178%2F69336d35-e5c2-4a38-a4ac-d5cf038e97f0.png</url>
      <title>DEV Community: Bismark</title>
      <link>https://dev.to/bismark_912b0df7cb569c420</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bismark_912b0df7cb569c420"/>
    <language>en</language>
    <item>
      <title>G-Client (Course Management APP) Journal</title>
      <dc:creator>Bismark</dc:creator>
      <pubDate>Tue, 04 Feb 2025 06:14:34 +0000</pubDate>
      <link>https://dev.to/bismark_912b0df7cb569c420/a-journey-through-overcoming-compatibility-issues-tool-setup-struggles-and-implementing-dark-mode-51cg</link>
      <guid>https://dev.to/bismark_912b0df7cb569c420/a-journey-through-overcoming-compatibility-issues-tool-setup-struggles-and-implementing-dark-mode-51cg</guid>
      <description>&lt;h1&gt;
  
  
  G-Client (Course Management APP) Journal
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Technologies Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shadcn&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NextRequest&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 1: Navigating the Challenges of Next.js Development
&lt;/h2&gt;

&lt;p&gt;Starting a new project always comes with its set of challenges. Even though I'm familiar with Next.js, setting up essential tools for my development process was trickier than expected. This journal documents my journey through overcoming compatibility issues, setting up necessary tools, and implementing dark mode in my project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Struggles with Shadcn Setup
&lt;/h3&gt;

&lt;p&gt;Shadcn is my favorite component library due to its ease of use and flexibility. However, when integrating it into my project, I encountered issues. My project was initially set up with Next.js 15, which is not fully supported by Shadcn yet. During installation, I faced errors and compatibility warnings, causing delays in my setup.&lt;/p&gt;

&lt;h4&gt;
  
  
  How I Fixed It:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Downgraded Next.js&lt;/strong&gt; – Since Shadcn works best with Next.js 14, I modified my &lt;code&gt;package.json&lt;/code&gt; to specify version 14 and reinstalled dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reinstalled dependencies&lt;/strong&gt; – Running &lt;code&gt;npm install&lt;/code&gt; ensured that my packages aligned with Next.js 14.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconfigured Shadcn&lt;/strong&gt; – Once the installation issues were resolved, I ensured that the components worked seamlessly across my app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After making these adjustments, everything functioned as expected, and I could use Shadcn components without any further issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing Light and Dark Mode in Next.js
&lt;/h3&gt;

&lt;p&gt;A major feature I wanted in my application was a clean and scalable solution for light and dark mode. Initially, this seemed straightforward, but I faced challenges ensuring persistence across sessions and handling hydration mismatches.&lt;/p&gt;

&lt;h4&gt;
  
  
  Steps to Implement Dark Mode in Next.js:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Theme Provider&lt;/strong&gt; – This provider manages the theme state and persists user preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap the Provider in Layout&lt;/strong&gt; – Ensuring the entire application is covered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suppress Hydration Errors&lt;/strong&gt; – Using &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;suppressHydrationWarning&lt;/code&gt; to handle hydration mismatches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Tailwind Configuration&lt;/strong&gt; – Adding &lt;code&gt;darkMode: 'class'&lt;/code&gt; in &lt;code&gt;tailwind.config.js&lt;/code&gt; allowed theme manipulation via CSS classes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After implementing these steps, the theme switching worked seamlessly across my project, enhancing the user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;The initial setup was frustrating, but overcoming these challenges made the development process much smoother. If you're working with Next.js 15 and encountering issues with Shadcn or dark mode implementation, I hope my experience helps you troubleshoot effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Understanding Request and NextRequest in Next.js API Routes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In Next.js API routes, handling requests efficiently is crucial for building performant applications. The &lt;code&gt;NextRequest&lt;/code&gt; object extends the default &lt;code&gt;Request&lt;/code&gt; object, providing enhanced capabilities such as structured URL parsing, easier access to cookies, and improved request metadata handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Differences Between &lt;code&gt;Request&lt;/code&gt; and &lt;code&gt;NextRequest&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The standard &lt;code&gt;Request&lt;/code&gt; object is suitable for handling basic HTTP requests, while &lt;code&gt;NextRequest&lt;/code&gt; offers additional utilities tailored for Next.js middleware and API routes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: Using &lt;code&gt;Request&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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;req&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;body&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;req&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="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="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="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;Request received&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;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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&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;application/json&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;h4&gt;
  
  
  Example: Using &lt;code&gt;NextRequest&lt;/code&gt;
&lt;/h4&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;NextRequest&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="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="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;GET&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;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;const&lt;/span&gt; &lt;span class="nx"&gt;body&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;req&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&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;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&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;searchParams&lt;/span&gt; &lt;span class="o"&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;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&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;clientIp&lt;/span&gt; &lt;span class="o"&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;ip&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;cookies&lt;/span&gt; &lt;span class="o"&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;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&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;NextResponse&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;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Received data: &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;body&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="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pathname&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientIp&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="nx"&gt;cookies&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;
  
  
  When to Use Each
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;Request&lt;/code&gt;&lt;/strong&gt; for basic API handling when additional Next.js-specific utilities are not needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;NextRequest&lt;/code&gt;&lt;/strong&gt; when working with middleware, edge functions, or when structured URL parsing and request metadata are required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these differences ensures that I use the right tool for the job, optimizing my Next.js API routes for better efficiency and maintainability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: Implementing Authentication with NextAuth.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Authentication is a crucial part of any course management system. I decided to implement authentication using NextAuth.js due to its flexibility and built-in support for multiple providers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up NextAuth.js
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install NextAuth.js&lt;/strong&gt; – &lt;code&gt;npm install next-auth&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create an API Route&lt;/strong&gt; – NextAuth requires a dynamic API route in &lt;code&gt;pages/api/auth/[...nextauth].ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure Providers&lt;/strong&gt; – I chose GitHub authentication for simplicity.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Example Setup:
&lt;/h4&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="nx"&gt;NextAuth&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;next-auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;GitHubProvider&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;next-auth/providers/github&lt;/span&gt;&lt;span class="dl"&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;default&lt;/span&gt; &lt;span class="nc"&gt;NextAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;GitHubProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;clientId&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;GITHUB_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;clientSecret&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;GITHUB_CLIENT_SECRET&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="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;With authentication in place, users can log in securely and access personalized course data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: Optimizing Performance with ISR and Caching
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Since my app involves displaying course content, optimizing performance was a priority. Incremental Static Regeneration (ISR) and caching strategies helped reduce server load and improve user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing ISR
&lt;/h3&gt;

&lt;p&gt;ISR allows me to update static pages without rebuilding the entire site.&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;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;getStaticProps&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;courses&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;fetchCourses&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="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;courses&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;10&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;This ensures the course list updates every 10 seconds while keeping page loads fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5: Deploying and Monitoring the Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;After development, I needed to deploy and monitor the app to ensure smooth performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment with Vercel
&lt;/h3&gt;

&lt;p&gt;Since Next.js integrates seamlessly with Vercel, deployment was straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pushed my code to GitHub.&lt;/li&gt;
&lt;li&gt;Linked my repository to Vercel.&lt;/li&gt;
&lt;li&gt;Configured environment variables.&lt;/li&gt;
&lt;li&gt;Deployed with a single click.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Monitoring Performance
&lt;/h3&gt;

&lt;p&gt;To track errors and optimize performance, I integrated tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vercel Analytics&lt;/strong&gt; for real-time insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry&lt;/strong&gt; for error tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Lighthouse&lt;/strong&gt; for performance audits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup helps maintain a stable and high-performing application.&lt;/p&gt;




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

&lt;p&gt;This journal captures my technical journey in setting up and optimizing my course management app, &lt;strong&gt;G-Client&lt;/strong&gt;. From troubleshooting compatibility issues with Shadcn to implementing dark mode, authentication, performance optimizations, and deployment strategies, each challenge taught me valuable lessons. As I continue developing this project, I expect to encounter more hurdles, but with every problem comes an opportunity to learn and improve.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>shadcn</category>
      <category>typescript</category>
      <category>nextrequest</category>
    </item>
  </channel>
</rss>
