Jumping into custom web app development before a business actually needs it is a common, expensive mistake, and so is waiting too long after the signs are already clear, stuck manually working around limitations that a real, custom solution would hav...
I wrote earlier about a buried cookies call silently forcing an entire page into dynamic rendering. searchParams causes the exact same category of behavior, through a completely different, and in some ways more surprising, mechanism, since using it d...
This one catches people specifically because the code looks like careful error handling, and it's actually the thing breaking the exact feature it's wrapped around.
The Setup That Looks Like Responsible Error Handling
// actions/auth.ts
'use server...
The About page is consistently one of the most visited pages on a business website, often second only to the homepage, which makes it strange how often it gets treated as an afterthought, a rushed paragraph of vague mission-statement language written...
"It looks nice" is the wrong frame for evaluating a website investment, and it's the default frame most business owners unconsciously use anyway, since design is the most visible, easiest-to-judge part of a site. The actual return on a well-built web...
I've recommended .lean in earlier posts, it's genuinely the right call for read-heavy queries, faster, lighter, no Mongoose document overhead. There's a real gap it opens up that's worth calling out specifically, because it silently undoes a common, ...
next/image optimizing external images is genuinely convenient, resizing, format conversion, all handled automatically through Next.js's built-in image optimization endpoint. That endpoint fetches the remote image server-side before serving the optimi...
This is one of those React gotchas that's been written about for years and still shows up constantly in real code, specifically because it looks completely correct and works fine in the exact scenario most people test.
The Setup That Looks Fine
// ...
If you've ever seen a hydration mismatch warning in the console for a timestamp, and just suppressed it with suppressHydrationWarning because the page still worked, it's worth actually understanding what that warning was telling you, because the unde...
This is one of the more stressful situations in hiring freelance help, and it's common enough to be worth a real, practical answer rather than just sympathy. A developer who was responsive and reliable suddenly goes quiet, mid-project, with money alr...
"You should be blogging" is advice given to nearly every business regardless of what they actually do, which is exactly why it's worth questioning rather than accepting automatically. A blog is a real, ongoing commitment, and for some businesses it's...
If you've ever called revalidatePath after a mutation, watched the data still show up stale on the page, and fixed it by just also calling revalidatePath on a few more related paths until it finally worked, you were probably fighting the actual behav...
Here's something that trips up almost everyone moving from a fetch-based API to a direct MongoDB connection in Next.js, and it's costing real database load on projects that don't even realize it's happening.
Next.js automatically deduplicates fetch ...
The first time I added a second language to a project, I stored the actual translated string in component state instead of a translation key. It worked fine until a user switched languages mid-session and half the interface stayed in the old language...
The message came in with a number attached that made me reread it twice. A full SaaS build, a real budget, a client who seemed to already know exactly what they wanted. Every instinct said say yes immediately before they change their mind.
I turned ...
Four years ago I had a Fiverr profile, zero reviews, and no idea why nobody was clicking on my gigs.
Today I run a Level 2 seller account with a strong rating and no negative reviews. Nothing about that happened overnight, and most of what moved the...
I wrote a post a while back about Server Actions being public, directly callable endpoints regardless of your UI, and a fair number of comments pushed back with some version of "sure, but at least they're not vulnerable to CSRF like a regular form po...
Every SaaS project eventually needs the same thing, a way to charge people. Stripe handles the actual payment processing, but wiring it into Next.js correctly, especially getting webhooks right, is where most of the real work sits.
Here is the setup...
A queue status that only updates on page refresh is not actually useful for a live dashboard. Neither is a chat that requires the user to manually reload to see a new message. Real-time features are where Server Components stop being enough on their ...
Building a SaaS product from scratch involves the same handful of pieces every time. Authentication, a database that actually scales, subscription billing, and a dashboard people can use without a manual. None of these are individually hard. Getting ...