<?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: Solomon Isu</title>
    <description>The latest articles on DEV Community by Solomon Isu (@solodevx).</description>
    <link>https://dev.to/solodevx</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%2F1249175%2Fca3a1d23-3fe0-499e-b0ac-4b65f0f413c4.JPG</url>
      <title>DEV Community: Solomon Isu</title>
      <link>https://dev.to/solodevx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solodevx"/>
    <language>en</language>
    <item>
      <title>I Built a Job Tracker and These Bugs Nearly Finished Me — Advice Welcome 🐛</title>
      <dc:creator>Solomon Isu</dc:creator>
      <pubDate>Sun, 03 May 2026 23:18:53 +0000</pubDate>
      <link>https://dev.to/solodevx/i-built-a-job-tracker-and-these-bugs-nearly-finished-me-advice-welcome-592j</link>
      <guid>https://dev.to/solodevx/i-built-a-job-tracker-and-these-bugs-nearly-finished-me-advice-welcome-592j</guid>
      <description>&lt;p&gt;Hey Dev.to community 👋&lt;/p&gt;

&lt;p&gt;I'm a growing developer and I just finished building my first &lt;br&gt;
real full-stack project — a Job Application Tracker built with &lt;br&gt;
Next.js, TypeScript, MongoDB and DnD Kit.&lt;/p&gt;

&lt;p&gt;I'm writing this partly to document what I faced, partly to &lt;br&gt;
laugh about it, and mostly to ask for advice from more experienced &lt;br&gt;
developers on how to handle these situations better next time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Project
&lt;/h2&gt;

&lt;p&gt;A Kanban-style job application tracker where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add, edit and delete job applications&lt;/li&gt;
&lt;li&gt;Drag and drop between columns&lt;/li&gt;
&lt;li&gt;Move jobs via dropdown menu&lt;/li&gt;
&lt;li&gt;All updates reflect immediately without page refresh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router)&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;MongoDB + Mongoose&lt;/li&gt;
&lt;li&gt;Better Auth&lt;/li&gt;
&lt;li&gt;DnD Kit&lt;/li&gt;
&lt;li&gt;shadcn/ui + Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bugs — A Sarcastic Love Letter 💌
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The useEffect setState Anti-Pattern
&lt;/h3&gt;

&lt;p&gt;I was calling setBoard and setColumns directly inside a useEffect. &lt;br&gt;
React responded with a wall of red text about cascading re-renders. &lt;br&gt;
Delightful.&lt;/p&gt;

&lt;p&gt;The fix was simple — useState already handles initial values. &lt;br&gt;
The useEffect was doing the same job twice.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: Is there a pattern you follow to know when &lt;br&gt;
useEffect is actually necessary vs unnecessary?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. TypeScript's Obsession With Types
&lt;/h3&gt;

&lt;p&gt;initialBoard had 3 possible values (Board | null | undefined). &lt;br&gt;
setBoard only accepted 2 (Board | null). TypeScript lost its mind. &lt;br&gt;
I lost my mind. Eventually we came to an agreement.&lt;/p&gt;

&lt;p&gt;The fix was using initialBoard?.columns in the if check which &lt;br&gt;
gave TypeScript enough confidence to calm down.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: How do you handle these type narrowing situations &lt;br&gt;
more elegantly in large codebases?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. The UI That Refused To Update
&lt;/h3&gt;

&lt;p&gt;Server actions were saving to the database perfectly. The UI &lt;br&gt;
sat there staring at me like nothing happened.&lt;/p&gt;

&lt;p&gt;Turns out telling the database something changed and telling &lt;br&gt;
the UI something changed are two completely different conversations. &lt;br&gt;
I had to build a full callback chain from useBoard all the way &lt;br&gt;
down to each component.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: Is this callback chain pattern the right &lt;br&gt;
approach or is there a cleaner way? Should I be using something &lt;br&gt;
like Zustand or React Query instead?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. revalidatePath — The Silent Callback Killer
&lt;/h3&gt;

&lt;p&gt;Just when the callback chain was working — revalidatePath was &lt;br&gt;
quietly running in the background wiping all callbacks out on &lt;br&gt;
every action. onJobAdded is not a function it said.&lt;/p&gt;

&lt;p&gt;Removing revalidatePath fixed it — but now I'm handling all &lt;br&gt;
UI updates manually.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: What's the best practice here? revalidatePath &lt;br&gt;
vs manual state updates? Or a combination of both?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. "use cache" — The Freshness Illusion
&lt;/h3&gt;

&lt;p&gt;Next.js was serving beautifully cached stale data on every refresh. &lt;br&gt;
Move a job to a new column. Refresh. Gone. Back where it started. &lt;br&gt;
Like it never happened.&lt;/p&gt;

&lt;p&gt;Removing "use cache" fixed it immediately.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: How do you properly handle caching in Next.js &lt;br&gt;
App Router without breaking real-time updates?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. The DnD Hydration Mismatch
&lt;/h3&gt;

&lt;p&gt;The crown jewel. DnD Kit generating DndDescribedBy-0 on the server &lt;br&gt;
and DndDescribedBy-1 on the client. A difference of exactly ONE &lt;br&gt;
number causing a wall of red hydration warnings on every single &lt;br&gt;
page load.&lt;/p&gt;

&lt;p&gt;Although purely cosmetic — it's a bloody pain in the ass.&lt;/p&gt;

&lt;p&gt;The fix was the isMounted pattern — only rendering DndContext &lt;br&gt;
on the client:&lt;/p&gt;

&lt;p&gt;const [isMounted, setIsMounted] = useState(false);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
  setIsMounted(true);&lt;br&gt;
}, []);&lt;/p&gt;

&lt;p&gt;if (!isMounted) return null;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Advice needed: Is there a better way to handle DnD Kit &lt;br&gt;
hydration issues in Next.js? Is this a known issue with a &lt;br&gt;
planned fix?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Building a real project teaches you things no tutorial ever will.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React is opinionated. Respect it.&lt;/li&gt;
&lt;li&gt;TypeScript is unforgiving. Respect it more.&lt;/li&gt;
&lt;li&gt;Next.js caching will humble you.&lt;/li&gt;
&lt;li&gt;Purely cosmetic bugs are still a bloody pain in the ass.&lt;/li&gt;
&lt;li&gt;Debugging at 2am builds character apparently.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Ask
&lt;/h2&gt;

&lt;p&gt;I'm a growing developer and I'd love honest feedback from the &lt;br&gt;
community:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Are there better patterns for any of these solutions?&lt;/li&gt;
&lt;li&gt;What tools or libraries would have made this easier?&lt;/li&gt;
&lt;li&gt;What would YOU have done differently?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All advice welcome — roast me if you must. I can take it. 😂&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/solodevx/venarium-job-application-tracker" rel="noopener noreferrer"&gt;https://github.com/solodevx/venarium-job-application-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>When AI Misses the Whole Picture: A Tailwind Debugging Story</title>
      <dc:creator>Solomon Isu</dc:creator>
      <pubDate>Sun, 01 Feb 2026 01:08:25 +0000</pubDate>
      <link>https://dev.to/solodevx/when-ai-misses-the-whole-picture-a-tailwind-debugging-story-1djh</link>
      <guid>https://dev.to/solodevx/when-ai-misses-the-whole-picture-a-tailwind-debugging-story-1djh</guid>
      <description>&lt;p&gt;Programming is full of surprises, but some challenges are more frustrating than others. Recently, I spent almost two days stuck on a single problem—all because the advice I got didn’t consider the full picture. I want to share this experience to help other developers avoid the same trap, and to highlight how AI, even when helpful, can sometimes mislead you if it misses context.&lt;/p&gt;

&lt;p&gt;The npx Tailwind Install Issue&lt;/p&gt;

&lt;p&gt;It all started with a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx tailwindcss init -p

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

&lt;/div&gt;



&lt;p&gt;This command is meant to initialize a Tailwind project with a tailwind.config.js file and a postcss.config.js file. Easy, right?&lt;/p&gt;

&lt;p&gt;Not quite. If you’re using Tailwind 4, this command doesn’t behave like it used to in Tailwind 3. Tailwind 4 does not fully support the old CLI workflow, which means the initialization might fail, or certain features may not work as expected.&lt;/p&gt;

&lt;p&gt;My first instinct was to troubleshoot endlessly—updating dependencies, changing syntax, and even rewriting parts of my project. Nothing worked.&lt;/p&gt;

&lt;p&gt;The simple solution? Revert to Tailwind 3 if you really need the command-line binary workflow. Tailwind 3 supports npx tailwindcss init -p perfectly, and everything works out of the box.&lt;/p&gt;

&lt;p&gt;The Linter That Said “No”&lt;/p&gt;

&lt;p&gt;Next came the &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/theme"&gt;@theme&lt;/a&gt;&lt;/em&gt; directive. Tailwind allows you to do something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;

@layer components {
  .btn {
    @apply px-4 py-2 bg-blue-500 text-white rounded;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is valid and works perfectly. But my linter kept throwing errors, flagging &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/theme"&gt;@theme&lt;/a&gt;&lt;/em&gt; as “unknown” or “invalid.”&lt;/p&gt;

&lt;p&gt;Here’s the key takeaway: this was not a Tailwind error. It was purely a linting issue. Tools like ESLint or stylelint sometimes don’t recognize Tailwind’s newer directives or custom syntax.&lt;br&gt;
The fix? Either configure the linter to understand Tailwind, or ignore the lint errors temporarily. The code will still run correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Real Lesson&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The frustrating part was not the error itself—it was how easy the solution actually was:&lt;br&gt;
Read the official documentation. Tailwind’s docs clearly explain the differences between versions, CLI usage, and directives like &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/theme"&gt;@theme&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There are also accounts of other programmers and developers who encountered - my advice read their experiences, view the codes, and deduce the breaking point in your codes.&lt;br&gt;
Don’t blindly follow AI advice. AI can misinterpret your setup, skip steps, or focus on unrelated “fixes” that waste hours.&lt;br&gt;
Understand what’s actually an error. Not every red underline is a bug. Sometimes it’s just a linter yelling at you.&lt;/p&gt;

&lt;p&gt;After all the spinning in circles, I realized the solution was simple: stick with the Tailwind version that fits your workflow, and know when a lint error isn’t really a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why I’m Writing This&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AI can help us code faster, suggest patterns, and explain concepts—but it doesn’t always see the full context of your project. If you rely on it blindly, you can waste days stuck on problems that have simple solutions.&lt;/p&gt;

&lt;p&gt;Sharing my experience isn’t just about Tailwind, it’s about learning to debug effectively, understanding your tools, and knowing when to trust the documentation over automated advice.&lt;/p&gt;

&lt;p&gt;If this story saves even one developer a couple of days of frustration, it’s worth it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>react</category>
      <category>tailwindcss</category>
    </item>
  </channel>
</rss>
