Loading...
Choosing the right technology stack is one of the most consequential decisions in any web project. This guide walks you through the key considerations and tradeoffs to help you make an informed choice.
Before comparing specific technologies, establish your constraints:
| Factor | Questions to Ask |
|---|---|
| Team size | Solo developer or large team? |
| Timeline | MVP in weeks or enterprise project over months? |
| Scale | Hundreds or millions of users? |
| Budget | Bootstrap or well-funded? |
| Talent pool | Can you hire for this stack? |
Dan McKinley's famous essay argues that every company gets roughly three "innovation tokens" to spend. Choose proven technology for most things, and only innovate where it creates a real competitive advantage.
Rule of thumb: If you are unsure, pick the most popular option. It will have better documentation, more Stack Overflow answers, and a larger hiring pool.
Best for: Most web applications, especially those needing SSR/SSG.
React dominates the market with the largest ecosystem. Next.js adds server-side rendering, file-based routing, and API routes out of the box.
Strengths:
- Largest ecosystem and community
- Excellent TypeScript support
- Server Components reduce client-side JS
- Vercel deployment is seamless
Weaknesses:
- Frequent major changes (App Router vs Pages)
- Can be over-engineered for simple sites
- Bundle size requires attention
Best for: Teams that prefer a gentler learning curve and a more opinionated framework.
Vue offers a progressive adoption model. Nuxt provides the same SSR/SSG capabilities as Next.js but with Vue's composition API.
Best for: Performance-critical applications and developers who dislike virtual DOM overhead.
Svelte compiles components at build time, producing minimal JavaScript. SvelteKit handles routing and SSR.
| Scenario | Recommendation |
|---|---|
| Large team, enterprise | React + Next.js |
| Small team, rapid prototyping | Vue + Nuxt or Svelte + SvelteKit |
| Static site / blog | Astro |
| Highly interactive dashboard | React or Svelte |
The natural choice when your frontend is JavaScript/TypeScript. Sharing types across the stack eliminates a whole class of bugs.
Python excels at data-heavy applications. Django provides an admin panel, ORM, and authentication out of the box. FastAPI is ideal for building high-performance APIs with automatic OpenAPI documentation.
For services where raw performance and low memory usage matter. Go's standard library is remarkably complete for building HTTP servers. Ideal for microservices and CLI tools.
Maximum performance at the cost of development speed. Choose Rust when you need predictable latency and minimal resource usage.
PostgreSQL is the default choice for most applications. It handles JSON, full-text search, geospatial queries, and more.
Best for applications with highly variable schemas. Be cautious -- many projects that start with MongoDB eventually migrate to PostgreSQL.
Use Redis as a caching layer, session store, or message broker.
| Use Case | Recommendation |
|---|---|
| General web app | PostgreSQL |
| Rapid prototyping with flexible schema | MongoDB |
| Session storage / caching | Redis |
| Time-series data | TimescaleDB or InfluxDB |
| Full-text search | PostgreSQL (pg_trgm) or Elasticsearch |
| Tool | Language | Style | Type Safety |
|---|---|---|---|
| Drizzle | TypeScript | SQL-like | Excellent |
| Prisma | TypeScript | Schema-first | Excellent |
| TypeORM | TypeScript | Decorator-based | Good |
| SQLAlchemy | Python | Both patterns | Good |
| GORM | Go | Active Record | Moderate |
Recommendation: Drizzle ORM for TypeScript projects. It stays close to SQL, provides excellent type inference, and generates efficient queries.
| Platform | Best For | Free Tier |
|---|---|---|
| Vercel | Next.js / frontend | Generous |
| Railway | Full-stack apps | Limited |
| Fly.io | Docker containers | Limited |
| Render | General purpose | Limited |
| Service | Best For |
|---|---|
| Supabase | PostgreSQL + Auth + Realtime |
| Firebase | Rapid prototyping, mobile apps |
| Neon | Serverless PostgreSQL |
| PlanetScale | MySQL with branching |
Frontend: Next.js + TypeScript + Tailwind CSS
Backend: Next.js API Routes or Hono
Database: Supabase (PostgreSQL)
ORM: Drizzle
Auth: Better Auth or Supabase Auth
Deploy: Vercel
Frontend: Next.js + TypeScript + Tailwind CSS
Backend: Hono or Fastify
Database: PostgreSQL (Neon or RDS)
ORM: Drizzle or Prisma
Auth: Better Auth
Deploy: Vercel + Railway
Frontend: React + TypeScript
Backend: NestJS or Go
Database: PostgreSQL (RDS/Cloud SQL)
ORM: TypeORM or Prisma
Auth: Auth0 or Keycloak
Infra: AWS/GCP + Kubernetes
CI/CD: GitHub Actions
Before finalizing your stack, verify:
The best stack is the one your team can ship with. Avoid "resume-driven development" -- picking technologies because they look good on a CV rather than because they solve your problem. Ship early, gather feedback, and refactor later when you understand your real requirements.
Comments