< back to Hermes Series
REFERENCE

Web App Stack Comparison

React/Next.js vs Ruby on Rails vs Laravel vs Django — every architectural decision mapped

Badge KeyBuilt-inincludedAdd-oncommunity pkgYou decidemultiple optionsMust buildrequired work
Architecture
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Pattern
Component-based SPA
Frontend-only; needs separate backend
[Backend required]
MVC monolith
Full-stack in one app
[Built-in]
MVC monolith
Full-stack in one app
[Built-in]
MVT monolith
Model-View-Template; same idea
[Built-in]
Rendering
Client-side (CSR)
Next.js adds SSR/SSG but AI defaults to CSR
Server-side (SSR)
Hotwire / Turbo for interactivity
Server-side (SSR)
Blade templates; Livewire for reactivity
Server-side (SSR)
Django templates; HTMX growing
API Layer
Next.js API routes or Express
You build it yourself
[You decide]
Built-in REST + API mode
rails new --api for JSON-only
[Built-in]
Built-in routing + API
Laravel Sanctum for API auth
[Built-in]
Django REST Framework
De facto standard add-on
[Add-on]
Database & ORM
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
ORM
Prisma or Drizzle
You pick and configure
[You decide]
ActiveRecord
Convention-driven, tightly integrated
[Built-in]
Eloquent
ActiveRecord-style, fluent syntax
[Built-in]
Django ORM
Declarative models, powerful querysets
[Built-in]
Migrations
Prisma migrate / Knex
Varies by ORM choice
[You decide]
rails db:migrate
Versioned, reversible, generators
[Built-in]
php artisan migrate
Versioned, reversible
[Built-in]
manage.py migrate
Auto-generated from model changes
[Built-in]
Default DB
PostgreSQL or MongoDB
AI often suggests Mongo even when relational fits
SQLite → PostgreSQL
SQLite dev, Postgres prod
MySQL / MariaDB
PostgreSQL also well supported
SQLite → PostgreSQL
Same dev/prod pattern as Rails
Authentication & Authorization
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Auth Solution
NextAuth / Auth0 / Clerk / JWT
AI often generates raw JWT setup
[Must choose]
Devise
Battle-tested gem; email, OAuth, 2FA
[Gem]
Breeze / Jetstream
Official starter kits with full UI
[Built-in]
django.contrib.auth
Built into framework core
[Built-in]
Authorization
Manual middleware or CASL
Often ad-hoc if/else checks
[You decide]
Pundit or CanCanCan
Policy objects or ability classes
[Gem]
Gates & Policies
First-class framework feature
[Built-in]
Permissions + Groups
Built-in; django-guardian for object-level
[Built-in]
Frontend / UI
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Styling
Tailwind CSS
AI default; sometimes styled-components
Tailwind / Bootstrap / CSS
Asset pipeline or import maps
Tailwind or Vite + CSS
Vite bundling built into Laravel
Manual / any CSS framework
No opinion; collectstatic for assets
Interactivity
Full client-side JS
useState, useEffect, React Query — you manage all sync and cleanup
Hotwire (Turbo + Stimulus)
HTML-over-the-wire; minimal JS
Livewire or Alpine.js
Server-driven reactivity
HTMX or Alpine.js
Growing ecosystem; not official
State Mgmt
useState / Redux / Zustand
Client holds copy of server data that can go stale
[Must choose]
Server owns state
Session + DB; no client state
[N/A]
Server owns state
Session + DB
[N/A]
Server owns state
Session + DB
[N/A]
Side Effects / Lifecycle
useEffect
Data fetching, subscriptions, timers. Source of infinite re-renders, stale closures, race conditions.
[Painful]
Not applicable
Server renders on request; no lifecycle
[Non-issue]
Not applicable
Server renders on request; no lifecycle
[Non-issue]
Not applicable
Server renders on request; no lifecycle
[Non-issue]
Data Sync
React Query / SWR / manual
Client cache vs server DB must stay in sync; stale data, optimistic updates on you
[Must solve]
Every request hits DB
Always fresh; no sync problem
[Non-issue]
Every request hits DB
Always fresh; no sync problem
[Non-issue]
Every request hits DB
Always fresh; no sync problem
[Non-issue]
Background Jobs & Email
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Job Queue
BullMQ / custom / none
Often missing from AI output entirely
[Must add]
Active Job + Sidekiq
Unified API, multiple backends
[Built-in]
Laravel Queues
Redis, SQS, DB drivers built in
[Built-in]
Celery
Powerful but separate setup
[Add-on]
Email
Resend / SendGrid / Nodemailer
You wire it up yourself
[You decide]
Action Mailer
Built-in with templates
[Built-in]
Laravel Mail
Mailables with Blade templates
[Built-in]
django.core.mail
Basic but functional
[Built-in]
File Storage & Testing
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Uploads
Multer / UploadThing / S3
Manual integration
[You decide]
Active Storage
S3, GCS, Azure, local — config only
[Built-in]
Laravel Filesystem
Flysystem abstraction
[Built-in]
django-storages
Add-on but nearly universal
[Add-on]
Test Framework
Jest / Vitest / Playwright
AI rarely generates tests at all
[You decide]
Minitest or RSpec
Generators included with scaffolds
[Built-in]
PHPUnit / Pest
First-class testing support
[Built-in]
unittest / pytest
TestCase built into framework
[Built-in]
Admin & Deployment
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Admin Panel
Build from scratch or Retool
Nothing included
[Must build]
ActiveAdmin / Avo
Gems generate full CRUD admin
[Gem]
Nova or Filament
Nova paid; Filament free/OSS
[Add-on]
django.contrib.admin
Auto-generated from models
[Built-in]
CLI / Generators
create-next-app only
No model/controller generators
rails generate scaffold
Model, migration, controller, views, routes, tests
[Built-in]
php artisan make:*
Models, controllers, migrations, policies
[Built-in]
manage.py startapp
App scaffolding; less granular
[Built-in]
Deploy Target
Vercel / Netlify / Cloudflare
Edge-optimized for static + serverless
Render / Fly.io / Heroku
Needs long-running server process
Forge / Vapor / VPS
PHP runs almost anywhere
Render / Railway / VPS
WSGI/ASGI server
Decision Count
React / Next.jsRuby on RailsLaravel (PHP)Django (Python)
Decisions before writing features
12–15+
Router, state mgr, ORM, auth, styling, API, deploy, bundler, testing, validation, forms, error handling…
[High decision load]
2–3
Database, auth gem, deployment target
[Low decision load]
2–3
Database, starter kit, deployment target
[Low decision load]
3–4
Database, DRF if API, deployment, job runner
[Low decision load]

Prepared by

Solutions Cay · solutionscay.com · Plano, TX

See also: The Case for Server-Side MVC — the full argument with evidence from Shopify, Instagram, GitHub, and Pinterest.