<?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: Ngbaronye Nmesirionye</title>
    <description>The latest articles on DEV Community by Ngbaronye Nmesirionye (@panther0508).</description>
    <link>https://dev.to/panther0508</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%2F3876525%2F9f37ff0d-d730-48f6-ae37-313334a8d76b.jpeg</url>
      <title>DEV Community: Ngbaronye Nmesirionye</title>
      <link>https://dev.to/panther0508</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/panther0508"/>
    <language>en</language>
    <item>
      <title>Reworking My User Dashboard in Next.js: What I Broke and What I Fixed</title>
      <dc:creator>Ngbaronye Nmesirionye</dc:creator>
      <pubDate>Thu, 16 Apr 2026 16:47:13 +0000</pubDate>
      <link>https://dev.to/panther0508/reworking-my-user-dashboard-in-nextjs-what-i-broke-and-what-i-fixed-599</link>
      <guid>https://dev.to/panther0508/reworking-my-user-dashboard-in-nextjs-what-i-broke-and-what-i-fixed-599</guid>
      <description>&lt;p&gt;I spent this week doing something developers are often told &lt;em&gt;not&lt;/em&gt; to do: I rewrote a perfectly functional feature.&lt;/p&gt;

&lt;p&gt;The user dashboard for &lt;a href="https://pantero.vercel.app" rel="noopener noreferrer"&gt;Pantero&lt;/a&gt;—the offline AI companion I'm building from my FUTO hostel room—worked. It showed the waitlist position. It displayed the referral link. It did its job.&lt;/p&gt;

&lt;p&gt;But it felt wrong.&lt;/p&gt;

&lt;p&gt;Slow. Clunky. Like it was fighting me every time I opened it. So I tore it down and rebuilt it in Next.js. Here's what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with the Old Dashboard
&lt;/h2&gt;

&lt;p&gt;The original dashboard was built early in the project, back when I was still thinking in plain HTML and scattered JavaScript. It was a single, massive component with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mixed concerns (data fetching, UI rendering, state management all jammed together)&lt;/li&gt;
&lt;li&gt;Poor mobile responsiveness&lt;/li&gt;
&lt;li&gt;No loading states—just blank screens while data loaded&lt;/li&gt;
&lt;li&gt;Hardcoded values that made updates painful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It "worked" for 10 users. At 187+ waitlisters, it was starting to show its cracks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rebuild: Goals
&lt;/h2&gt;

&lt;p&gt;I set three clear goals for the new dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: Load fast, even on 3G.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarity&lt;/strong&gt;: Users should instantly understand their waitlist position, referral stats, and next steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: I should be able to add new features without breaking everything.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Tech Approach
&lt;/h2&gt;

&lt;p&gt;Since Pantero is already a Next.js app, I leaned into the framework's strengths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Fetching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server Components for initial load, client-side fetch for real-time updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React Context for global user state, &lt;code&gt;useState&lt;/code&gt; for local UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loading States&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Suspense&lt;/code&gt; boundaries with skeleton loaders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tailwind CSS (already in the project)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Hardest Part: Balancing Server and Client
&lt;/h2&gt;

&lt;p&gt;The dashboard needs to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static data (user's email, join date) → perfect for Server Components&lt;/li&gt;
&lt;li&gt;Dynamic data (current waitlist position, referral count) → needs client-side updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept running into hydration mismatches because I was mixing server-rendered content with client-updated numbers. The fix was simple once I understood it: &lt;strong&gt;keep the dynamic parts isolated in client components&lt;/strong&gt; and pass static data as props from the server.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
`jsx
// Server Component (app/dashboard/page.tsx)
export default async function DashboardPage() {
  const user = await getUser(); // server-side fetch

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Welcome, {user.email}&amp;lt;/h1&amp;gt;
      &amp;lt;WaitlistPosition initialPosition={user.position} /&amp;gt;
      &amp;lt;ReferralStats initialCount={user.referralCount} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

// Client Component (components/WaitlistPosition.tsx)
'use client';

export function WaitlistPosition({ initialPosition }) {
  const [position, setPosition] = useState(initialPosition);

  // Refresh every 30 seconds
  useEffect(() =&amp;gt; {
    const interval = setInterval(async () =&amp;gt; {
      const newPosition = await fetchPosition();
      setPosition(newPosition);
    }, 30000);
    return () =&amp;gt; clearInterval(interval);
  }, []);

  return &amp;lt;p&amp;gt;Your position: #{position}&amp;lt;/p&amp;gt;;
}
`

This pattern saved me so much headache.

Before and After
Here's what the dashboard looked like before the rework:


![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ca8nv0kkh25ztl5kbxfb.png)

And here's the new version (still a work in progress):


![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0di2q0wrfowqnjbrg5zh.png)
The new dashboard:

Shows waitlist position prominently

Displays referral link with a one-click copy button

Includes a simple referral count tracker

Has a clear call-to-action to join the WhatsApp Channel

Loads with skeleton states instead of blank screens

What's Still Missing
Animated transitions between states

Dark mode toggle (coming soon)

Real-time referral notifications

Mobile bottom sheet for quick actions

The Bigger Picture
This dashboard rework isn't just about making things pretty. It's the foundation for everything coming next:

Verified credential generation

AI mentorship history

Community leaderboards

If the dashboard felt clunky at 187 users, it would have collapsed at 1,000. Now I have a solid base to build on.

Current Pantero Metrics
Metric  Count
Waitlist    187+
Countries   Nigeria, Ghana, Kenya
Dashboard rebuild time  4 days
Bugs fixed during rebuild   7
New bugs created    3 (working on it)
Join the Waitlist
If you're curious about the offline AI companion I'm building through all this Next.js chaos:

🔗 pantero.vercel.app

The waitlist is open. The dashboard is better. The build continues.

Have you ever rewritten a feature that "worked" because you knew it could be better? How did it go? Let's swap war stories in the comments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>From HTML to Next.js: The Painful (and Honest) Transition of a FUTO Undergrad</title>
      <dc:creator>Ngbaronye Nmesirionye</dc:creator>
      <pubDate>Tue, 14 Apr 2026 07:37:33 +0000</pubDate>
      <link>https://dev.to/panther0508/from-html-to-nextjs-the-painful-and-honest-transition-of-a-futo-undergrad-4mm1</link>
      <guid>https://dev.to/panther0508/from-html-to-nextjs-the-painful-and-honest-transition-of-a-futo-undergrad-4mm1</guid>
      <description>&lt;p&gt;I started my frontend journey like many developers: writing &lt;code&gt;index.html&lt;/code&gt;, linking &lt;code&gt;style.css&lt;/code&gt;, and maybe throwing in a &lt;code&gt;script.js&lt;/code&gt; if I was feeling fancy.&lt;/p&gt;

&lt;p&gt;It was simple. It was predictable. It was home.&lt;/p&gt;

&lt;p&gt;Then I decided to learn Next.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wake-Up Call
&lt;/h2&gt;

&lt;p&gt;I'm an undergraduate at FUTO, and I'm building an offline AI companion called &lt;a href="https://pantero.vercel.app" rel="noopener noreferrer"&gt;Pantero&lt;/a&gt;. The waitlist is growing (187+ now), the offline AI core is stable, and the frontend is complete. But let me tell you—getting there involved a lot of pain.&lt;/p&gt;

&lt;p&gt;Coming from plain HTML and CSS, Next.js felt like being handed the controls to a spaceship after only ever riding a bicycle. Suddenly there was file-based routing, Server Components, Client Components, and this mysterious &lt;code&gt;'use client'&lt;/code&gt; directive that I kept forgetting to add until my &lt;code&gt;useState&lt;/code&gt; hooks exploded in my face[reference:0].&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mistakes I Made (So You Don't Have To)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake #1: Treating Next.js Like Plain HTML + React&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I thought I could just drop my components anywhere and import &lt;code&gt;react-router-dom&lt;/code&gt; like I used to. Wrong. Next.js has its own routing system. If you try to fight it, you'll spend more time debugging than building. I learned that the hard way[reference:1].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake #2: Forgetting That Everything Is a Server Component by Default&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the App Router, every component is a Server Component unless you explicitly say otherwise. I kept trying to use &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useEffect&lt;/code&gt; in components that were running on the server. The error messages were cryptic. The frustration was real[reference:2].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake #3: Ignoring File-Based Routing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I thought, "How hard can routing be? I'll just make components and link them manually." Chaos. Some links worked, some didn't. Dynamic routes became unpredictable. SEO was broken. Once I embraced the &lt;code&gt;/app&lt;/code&gt; folder structure, everything clicked[reference:3].&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm Sticking With It
&lt;/h2&gt;

&lt;p&gt;Despite the pain, Next.js is teaching me a better way to build. It's forcing me to think about performance, SEO, and user experience from the start. And for Pantero—where every kilobyte matters on a 3G connection—that's essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Build Goes On
&lt;/h2&gt;

&lt;p&gt;While I'm wrestling with Server Actions and trying to understand caching, Pantero keeps moving forward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;187+ waitlist members&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;3+ countries&lt;/strong&gt; (Nigeria, Ghana, Kenya)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Offline AI core&lt;/strong&gt; stable and running entirely in-browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Join the Waitlist
&lt;/h2&gt;

&lt;p&gt;If you're a developer who's been through this transition (or you're in the middle of it right now), I'd love to hear your story. And if you're curious about what I'm building through all this struggle:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://pantero.vercel.app" rel="noopener noreferrer"&gt;pantero.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The waitlist is open. The build continues. The pain is real—but so is the progress.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What was your biggest struggle when you first moved from plain HTML/CSS to a real framework? Let's commiserate in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>nextjs</category>
      <category>programming</category>
    </item>
    <item>
      <title>No Internet? No Problem. I Built an AI That Works Offline from My Hostel Room</title>
      <dc:creator>Ngbaronye Nmesirionye</dc:creator>
      <pubDate>Mon, 13 Apr 2026 11:57:49 +0000</pubDate>
      <link>https://dev.to/panther0508/no-internet-no-problem-i-built-an-ai-that-works-offline-from-my-hostel-room-2ld5</link>
      <guid>https://dev.to/panther0508/no-internet-no-problem-i-built-an-ai-that-works-offline-from-my-hostel-room-2ld5</guid>
      <description>&lt;p&gt;I'm a student at the Federal University of Technology, Owerri (FUTO). Between lectures, assignments, and the occasional power outage, I've spent the last three months building something I believe can change how young Africans learn tech skills.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;&lt;a href="https://pantero.vercel.app" rel="noopener noreferrer"&gt;Pantero&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Ambition vs. Infrastructure
&lt;/h2&gt;

&lt;p&gt;Here's a scene that plays out daily across Nigeria:&lt;/p&gt;

&lt;p&gt;A student finds a great online course. They're excited. They start learning. Then the data finishes. Or the network drops. The momentum dies. The tab gets closed. And the dream of becoming a developer gets pushed to "someday."&lt;/p&gt;

&lt;p&gt;I've lived this. And I knew there had to be a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: An AI Mentor That Works Offline
&lt;/h2&gt;

&lt;p&gt;What if you had a personal mentor that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs entirely in your browser&lt;/li&gt;
&lt;li&gt;Works without an internet connection after the first load&lt;/li&gt;
&lt;li&gt;Guides you from zero to job-ready skills&lt;/li&gt;
&lt;li&gt;Never judges you for asking the same question twice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's Pantero. The core idea is simple but technically ambitious: &lt;strong&gt;offline-first AI mentorship for African youth.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack (For the Curious)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&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;React + TypeScript + Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Engine&lt;/td&gt;
&lt;td&gt;Local-first models running in the browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State Management&lt;/td&gt;
&lt;td&gt;React Context + LocalStorage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Tool&lt;/td&gt;
&lt;td&gt;Vite (bootstrapped with Lovable)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Hardest Part: Offline AI
&lt;/h2&gt;

&lt;p&gt;The offline AI integration was the biggest technical challenge. I needed models that were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small enough to load quickly on 3G&lt;/li&gt;
&lt;li&gt;Powerful enough to provide real mentorship value&lt;/li&gt;
&lt;li&gt;Capable of running entirely client-side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After testing several approaches, I landed on a combination of quantized models and intelligent caching. The AI runs in your browser, not on a server. Your data never leaves your device. And it works even when you're offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where We Are Now
&lt;/h2&gt;

&lt;p&gt;Pantero is &lt;strong&gt;pre-launch&lt;/strong&gt;. The frontend is complete. The offline AI core is live for testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 187+ waitlist members&lt;/li&gt;
&lt;li&gt;🌍 3+ countries (Nigeria, Ghana, Kenya)&lt;/li&gt;
&lt;li&gt;🛠️ 12+ early testers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I've Learned So Far
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build for the reality, not the ideal.&lt;/strong&gt; Assuming everyone has fiber internet is a mistake. Offline-first isn't a feature—it's a necessity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share early, share often.&lt;/strong&gt; Posting updates on Indie Hackers and WhatsApp has brought more valuable feedback than any closed-door development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your constraints are your differentiator.&lt;/strong&gt; Being a student with limited resources forced me to keep Pantero lean and focused. That's now a strength.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next (The Roadmap)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Polish the AI mentorship flows&lt;/li&gt;
&lt;li&gt;[ ] Add verified credential generation&lt;/li&gt;
&lt;li&gt;[ ] Open beta access for waitlist members&lt;/li&gt;
&lt;li&gt;[ ] Public launch on Product Hunt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;I'm building Pantero in public. If you're a developer, a student, or just curious about offline AI, I'd love to hear from you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;&lt;a href="https://pantero.vercel.app" rel="noopener noreferrer"&gt;Join the waitlist&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Follow the build:&lt;/strong&gt; I'm posting weekly updates in this series&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Have you tried building offline-first experiences? What challenges did you face? Let's discuss in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
