Sitting Down Over Coffee: Why We Bet on Next.js
When founders approach us at INQ Studios to build their initial product, one of the first questions is always: "What tech stack are we using, and why?"
A few years ago, the default answer for most web agencies was to build a separate React single-page app and pair it with a standalone Node.js or Python backend. We built several early client applications this way.
What we quickly realized was how much time we spent writing "glue code." We would write a database query on the server, create an API route, define TypeScript interfaces for the request and response, write a fetch function on the client, handle loading spinners, and manage local state. For simple forms or dashboards, we were spending more time piping data across network boundaries than actually building useful product features.
When we switched our foundation to Next.js and React Server Components, everything became much simpler.
The Biggest Change: Fetching Data Right Where It Lives
What surprised us most after moving to Next.js 15 was how much code simply disappeared.
Instead of making the browser request an HTML shell, download a huge JavaScript bundle, and then fire off multiple API requests to get user data, Next.js lets us fetch data directly on the server before sending rendered HTML to the user.
[Traditional React App]
Browser ──> Downloads JS (1MB) ──> Shows Spinner ──> Fetches API ──> Shows Data
[Next.js Server Components]
Browser ──> Receives Rendered Page with Data (Sub-100ms)
This single architectural change eliminated the annoying "loading cascade" where different parts of a dashboard pop in at different times.
WHAT WE LEARNED
If your users see three different loading spinners while opening a simple analytics screen, it's usually not a network problem. It's an architectural decision to fetch data too far away from where it's stored.
Handling Forms Without the API Boilerplate
One mistake we made in earlier projects was over-engineering backend controllers for basic user inputs. In Next.js 15, Server Actions let us write functions that run on the server and call them directly from our UI forms.
We validate every request before it reaches our database because fixing bad data later is far more expensive and frustrating than catching it at the form boundary.
Here is a simplified look at how clean this feels in practice:
// A server action running directly on the server edge
export async function submitProjectBrief(formData: FormData) {
"use server";
const email = formData.get("email");
const details = formData.get("details");
// Validate inputs before touching the database
if (!email || !details) {
return { error: "Please fill out all required fields." };
}
await db.lead.create({ data: { email, details } });
return { success: true };
}
Where Next.js Can Catch Teams Off Guard
We don't pretend Next.js is magic or without trade-offs. Here are a few things that caught us off guard when we first started building production apps with it:
- Thinking everything needs to be a Client Component: It's tempting to add
"use client"at the top of every file when you need a simple click handler or state variable. Doing this too aggressively turns your app right back into a heavy client-side bundle. - Caching Behavior: Next.js has powerful caching mechanisms, but understanding when data is cached and when it revalidates takes practice. We spent a few late nights early on wondering why a database update wasn't showing up on screen immediately until we mastered route revalidation.
Summary
We choose Next.js 15 for startups not because it's popular, but because it lets a small, focused team build software that feels fast, stays maintainable, and gets to market in weeks rather than months.
If you're building an early-stage SaaS product or custom application, keeping your stack unified lets you focus on what really matters: solving problems for your users.
Need to build software that follows the same engineering principles?
INQ Studios builds production-ready SaaS platforms, internal tools, and web applications for ambitious teams.
Let's build together →
Frequently Asked Questions
Why do you prefer Next.js over separate frontend and backend apps for startups?
Combining your frontend and database mutations into a single Next.js project removes the need to write and maintain dozens of REST API endpoints during early iterations.
Is Next.js 15 hard to learn for small engineering teams?
The learning curve is mainly understanding Server Components vs Client Components. Once that clicks, developer iteration speed increases significantly.