Ask HN: If you were to build a web app today what tech stack would you choose?
Choosing a tech stack for a new web app today often comes down to a tradeoff between developer productivity, long-term stability, and how interactive the app needs to be. Many engineers favor “boring,” well-established monolithic stacks like Rails, Django, Laravel, Go, or .NET with server-side rendering, often paired with tools like HTMX or Hotwire and backed by Postgres or SQLite, citing ease of deployment and maintenance on simple VPS hosting. Others opt for modern JavaScript ecosystems such as Next.js, SvelteKit, or React-based stacks for richer client-side experiences, while warning about framework churn and emphasizing that the best choice is usually whatever you already know well enough to ship quickly.
Overall decision criteria
- Most advice: pick the stack you’re already fast and comfortable with, especially for passion projects or solo work.
- Secondary concern: choose “boring”, stable, well‑documented tech that’s easy to maintain and hire for, rather than the latest trend.
- Distinction between goals:
- Shipping/finishing something: use familiar monolithic frameworks.
- Learning: deliberately pick new stacks (Rust, Go, HTMX, etc.).
- Type of app matters:
- Simple “websites”: lean server‑rendered stacks with minimal JS.
- Highly interactive “apps”: SPA or richer client frameworks.
Backends and full‑stack frameworks
- Strong clusters around:
- Ruby on Rails (+ Hotwire/Turbo), often with Kamal or similar for deployment.
- Django / Flask / other Python frameworks, frequently paired with HTMX or classic templates.
- Laravel / PHP stacks, often praised for batteries‑included SaaS features.
- Elixir + Phoenix + LiveView, valued for concurrency and functional style.
- Go with minimal frameworks (Gin, stdlib, small routers) for simplicity and performance.
- .NET (ASP.NET, Blazor) and Java/Spring/Quarkus/Jakarta EE as “boring but solid” typed options.
- Node/TypeScript backends (Express, Nest.js, Fastify, Deno, Bun, SST).
Frontends and interaction models
- Split between:
- React (often with Next.js, Remix, or T3) as “industry standard” or at least dominant.
- Svelte/SvelteKit, Vue, Angular as popular alternatives.
- HTMX, Hotwire, LiveView, classic templates + light JS (Alpine, Stimulus, jQuery) to avoid heavy SPAs.
- Some prefer WASM‑based or desktop‑like models (Blazor, Yew, Go+WASM, Pascal→WASM).
Databases and persistence
- PostgreSQL is the most commonly cited default.
- SQLite is frequently recommended for early stages or even fairly heavy read‑mostly loads.
- Others: MySQL/MariaDB, Redis, DynamoDB, Typesense, Meilisearch, LMDB, libsql/Turso, TiDB/YugabyteDB, etc.
Infrastructure and deployment
- Many favor simple VPS / bare metal with Docker or basic scripts over complex cloud setups.
- Mixed views on serverless:
- Pro: effortless scaling, great for tiny early user bases.
- Con: costs can explode at scale, migrations back to monoliths/microservices are painful.
Sentiment on modern web development
- Significant frustration with JavaScript ecosystem churn and build tooling; seen as “patching the browser/JS”.
- Counterpoint: modern tools (React, Svelte, Vite, TypeScript) do improve DX when used judiciously.
- Nostalgia for simpler eras (LAMP, Drupal, VB6/Delphi) and desire for integrated, long‑lived, monolithic solutions.
- AI coding tools are seen as lowering the barrier to adopting unfamiliar stacks.