| Architecture | ||||
|---|---|---|---|---|
| React / Next.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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]
|
|
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.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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.js | Ruby on Rails | Laravel (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]
|
< 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
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.
