DEV Community

ANKUSH CHOUDHARY JOHAL
ANKUSH CHOUDHARY JOHAL

Posted on • Originally published at johal.in

The Case Against Next.js 15 for Small Projects: Remix 3 Is a Better Fit

The Case Against Next.js 15 for Small Projects: Remix 3 Is a Better Fit

Next.js has long been a go-to framework for React developers, but its 15th major release doubles down on features tailored for large-scale, enterprise-grade applications. For small projects — think landing pages, simple SaaS MVPs, personal blogs, or internal tools — Next.js 15’s heavy feature set often creates more overhead than value. Enter Remix 3: a lean, performance-focused framework that prioritizes developer experience and simplicity for small-scale work.

Next.js 15’s Bloat Problem for Small Projects

Next.js 15 ships with a massive default toolchain: built-in image optimization, incremental static regeneration (ISR), server-side rendering (SSR), static site generation (SSG), API routes, middleware, and a growing ecosystem of first-party packages. For a large e-commerce site or enterprise dashboard, these features are indispensable. For a 5-page marketing site? They add unnecessary build time, bundle size, and cognitive load.

Take build times: Next.js 15’s default configuration includes type checking, linting, and optimization steps that can add 10-30 seconds to small project builds. Remix 3, by contrast, skips non-essential defaults, with build times often under 5 seconds for comparable small projects. Bundle size tells a similar story: a bare Next.js 15 app ships with ~40KB of framework runtime code, while Remix 3’s core runtime is under 10KB.

Data Handling: Remix 3’s Nested Routes Win

Next.js 15’s data fetching model uses getServerSideProps, getStaticProps, or the newer App Router’s server components and actions. While powerful, this model requires developers to juggle multiple data fetching patterns, especially when mixing static and dynamic content. Remix 3’s nested routing and loader/action pattern simplifies this: every route has a dedicated loader for data fetching and action for mutations, all tied directly to the route hierarchy.

For small projects, this means less boilerplate. A simple contact form in Remix 3 uses a single action function in the route file, with no need to set up API routes or separate server functions. Next.js 15 would require either an API route, a server action, or a form handler in a page component — adding unnecessary complexity for a small feature.

Deployment and Configuration Simplicity

Next.js 15 requires a Node.js server for SSR/ISR features, or a specialized hosting provider like Vercel that supports its custom build output. For small projects, this adds deployment friction: you can’t just drop the build folder on a static host unless you opt out of most Next.js features. Remix 3, by contrast, supports static site generation out of the box, with builds that can be deployed to any static host, or run on a minimal Node server if needed.

Configuration is another pain point. Next.js 15’s next.config.js file has hundreds of possible options, many of which are irrelevant for small projects. Remix 3’s configuration is minimal: most small projects need no custom config at all, with sensible defaults that work for 90% of use cases.

When Next.js 15 Still Makes Sense

This isn’t a blanket condemnation of Next.js 15. If your small project will scale to millions of users, need complex ISR, or require deep integration with Vercel’s ecosystem, Next.js 15 is still a strong choice. But for the vast majority of small projects — where speed of development, low overhead, and simple deployment matter more than enterprise features — Remix 3 is the better fit.

Conclusion

Next.js 15 is a fantastic framework for large applications, but it’s overkill for small projects. Remix 3’s lean core, intuitive data handling, and simple deployment model make it a far better choice for developers building small-scale React applications. If you’re starting a new small project today, skip the Next.js bloat and give Remix 3 a try.

Top comments (0)