Skip to main content
Guide Getting started

Choosing your stack: when to use what

A stack is not a personality. It is a set of tradeoffs picked to fit a specific project, a specific team, and a specific amount of time you are willing to spend on ops. This walks through what a stack actually is, the criteria that decide it, why boring usually beats new, and a sensible default for four common kinds of projects, without pretending any of them is the one right answer.

Reference13 min readLast verified August 2026

What you’ll learn

  • Define the four layers people mean by "stack", frontend, backend, database, hosting, and recognize when a project does not need all four.
  • Weigh the criteria that actually decide a stack choice: what you are building, what you already know, docs and community, hosting and ops burden, and team size.
  • Explain the "innovation tokens" argument for boring, proven technology, and why boring does not mean bad.
  • Pick a sensible default stack for a static content site, an interactive app, a data or script task, and an API, and explain why each one fits.
  • Use a short checklist to sanity-check a stack choice before committing real time to it.

Ask ten developers what stack to use for a new project and you will get ten different answers, and most of them will trace back to whatever that person shipped last, or whatever they saw discussed online last week. That is not a knock on anyone. It is just how habit and hype both work, and neither one is a good tie-breaker for a decision that shapes how fast you can ship, what you pay in hosting and maintenance, and how easy the project is for someone else, including future you, to pick back up. This walks through what a stack actually is, the criteria that actually move the needle, the case for picking proven technology over the newest thing, and a concrete starting point for four common kinds of projects.

What a "stack" actually is

A stack is the set of technology layers a project is built on. Most conversations about "the stack" collapse into four pieces, and knowing what each one actually does is the first step to picking correctly instead of by reflex.

  • Frontend: what runs in the visitor's browser, the HTML, CSS, and JavaScript (often through a library like React) that renders what someone actually sees and clicks.
  • Backend: code that runs on a server, handles requests, and enforces rules a browser cannot be trusted to enforce on its own, like checking a password or a payment.
  • Database: where data that needs to persist between visits, and between different visitors, actually lives, so it survives after the request that created it finishes.
  • Hosting: where the code and data physically run, and what handles traffic, uptime, and deploys once the project is live.
New to this? In one line: frontend is what the visitor sees and clicks, backend is the code that decides what to send them, and a database is where the information that has to survive between visits actually lives.

The part people skip past: not every project needs all four. A marketing page with no accounts and nothing that changes per visitor is frontend and hosting, full stop, no backend and no database, and nothing on either of those to secure or patch later. MDN's own framing of the difference is useful here: "a static site is one that returns the same hard coded content from the server whenever a particular resource is requested," while "a dynamic site is one that can generate and return content based on the specific request URL and data."1 If your project fits the static description, a database and a backend framework are not a head start, they are unused surface area sitting there waiting to need patching. A one-off script that reformats a spreadsheet does not have a "frontend" in the browser sense at all. Bolting on layers a project does not need is one of the most common ways a simple task turns into an infrastructure project nobody asked for.

The criteria that actually matter

Once you know which layers a project needs, the actual choice inside each layer comes down to a handful of questions, roughly in this order of importance.

  • What you are building: a portfolio page and a real-time multiplayer app do not belong on the same stack, which sounds obvious until deadline pressure makes "the modern thing" and "the right thing" start to look like the same choice.
  • What you, or your team, already know: shipping in something you already know how to operate beats a theoretically better tool you have to learn under a deadline. The "best" tool on paper loses constantly to the boring tool someone on the team can actually run at 11pm when something breaks.
  • Docs, community, and longevity: can you find the answer to your question in five minutes, or are you the first person to hit this exact bug? A framework with thin documentation and a small community turns every unusual problem into original research instead of a search away.
  • Hosting and ops burden: what does this cost to run, and who is on call when it breaks? A statically hosted site has close to zero ongoing ops burden. A stack with a database, background jobs, and a cache has real operational surface area that someone has to own for the life of the project.
  • Team size: solo and team projects disagree on what counts as "simple." A tool that is simple for one person holding the whole system in their head can be genuinely hard for a five-person team to onboard into, and a heavier, more structured framework that feels like overkill solo can be exactly what keeps five people from stepping on each other's changes.

The case for boring, proven technology

Dan McKinley's widely cited engineering essay "Choose Boring Technology" gives this instinct a name: innovation tokens. The framing is that a team only has a small, fixed number of genuinely novel technology choices it can afford to make and still ship. In his words, "let's say every company gets about three innovation tokens. You can spend these however you want, but the supply is fixed for a long while."2 Every unfamiliar database, unfamiliar framework, or unfamiliar deploy pipeline spends one of those tokens, whether or not the choice was actually necessary for what the project needed to do.

Boring does not mean bad. It means the tradeoffs are already mapped by thousands of people who hit the same failure modes before you did. McKinley's own description of mature tools: "the capabilities of these things are well understood. But more importantly, their failure modes are well understood."2 New technology carries a different, harder-to-plan-for kind of risk, not because it is worse, but because nobody has finished discovering what breaks yet: "for shiny new technology the magnitude of unknown unknowns is significantly larger, and this is important."2

The essay's sharpest line reframes "best tool for the job" thinking entirely: "your job is keeping the company in business... and the 'best' tool is the one that occupies the 'least worst' position for as many of your problems as possible."2 Picking the locally best tool for every individual piece of a project adds up to a system nobody fully understands, running on five things the team has to separately keep current, patched, and staffed for. Picking boring defaults everywhere except the one part that is genuinely new keeps that list short.

This is not an argument for never using anything new. It is an argument for spending that choice on purpose. If the interesting, differentiating part of your project is a real-time collaborative editor, spend an innovation token there. Do not also spend one on the database, the deploy pipeline, and the logging setup for the parts of the app that are, underneath, a solved problem thousands of other projects have already shipped.

A default by project type

None of this tells you the one correct stack, because there is not one. What follows is a sensible starting point for four common shapes of project, not a rule. Treat the "why" column as the reasoning to check against your own project, not as a verdict.

Project typeSensible defaultWhy
Static content site (marketing page, portfolio, blog)Plain HTML/CSS, or a content-focused framework like AstroAstro's own docs describe it as "the web framework for building content-driven websites like blogs, marketing, and e-commerce,"<sup><a href="#source-3">3</a></sup> and if nothing on the page changes per visitor, there is no backend or database to add in the first place.
Interactive app (dashboard, tool with accounts and state)A component-based UI library like React, often paired with a full-stack framework like Next.jsReact's docs describe an app as built from components, each "a piece of the UI... [with] its own logic and appearance,"<sup><a href="#source-4">4</a></sup> and Next.js is described as "a React framework for building full-stack web applications,"<sup><a href="#source-5">5</a></sup> handling the routing, data fetching, and backend glue an app with real state actually needs.
Data or script task (one-off analysis, automation, a CLI)A plain script, Python or Node, no framework, and no database unless the data genuinely needs to persistThe job is a sequence of steps that runs once and exits. A framework built for handling concurrent web requests solves a problem this task does not have, and adds setup time it does not need.
API (a service other software calls)A small, boring backend framework in a language your team already knows, backed by a proven relational database, Postgres, MySQL, or SQLite for something smallReceive a request, check it, read or write data, respond, is about as well-trodden a path as software gets, exactly the kind of solved problem the innovation-tokens argument says to spend zero new tokens on.<sup><a href="#source-2">2</a></sup>
A starting point by project type, not a universal answer

These are starting points, not laws, and real projects blend categories constantly. A content site with one interactive comment widget does not need a full app framework bolted on for that single feature, a small script that runs on a schedule and needs to remember what it did last time might genuinely need a lightweight database, even though the "script" row above usually skips one. Read the "why" column, check it against what your project actually does, and diverge on purpose when it does not fit.

A short checklist before you commit

Before you scaffold anything, work through these in order. Most stack regrets trace back to skipping one of them, usually the second or the fourth.

  1. 1What are you actually building?Static content, an interactive app, a script, or an API decides which layers you even need
  2. 2What do you or your team already know?A stack you can move fast in beats a theoretically better one you have to learn under a deadline
  3. 3Can you find help when it breaks?Real docs and a real community mean your bug is probably not a novel one
  4. 4Who runs this, and for how long?A weekend demo and a product with paying users need different answers here
  5. 5Default to boringSpend a new-technology choice only on the part of the project that is actually your differentiator
Work through these before you pick anything
Going further: once you are shipping more than one thing, a marketing site plus an app plus a couple of internal tools, the stack question widens into a repo question. A monorepo keeps shared code, design tokens, a component library, shared types, in one place instead of copy-pasted across projects, at the cost of more setup up front. Stack choice also feeds back into hiring: a widely known stack widens your hiring pool and shortens onboarding, while a rare or bespoke one narrows it. That is a real tradeoff worth naming honestly before you build on it, not something to discover a year in.

There is rarely one right answer

Plenty of teams build the same kind of app successfully on completely different stacks, and plenty of stacks that look identical on paper produce very different outcomes depending on who is running them. The goal here was never to hand you the one correct answer, because there is not one to hand you. The goal is avoiding the two failure modes that actually cause regret: picking by habit alone, never once checking whether last project's default still fits this one, and picking by hype alone, chasing whatever framework is loudest this month without asking what problem it actually solves for you. Between those two, almost any deliberately reasoned choice holds up fine.

Key idea
A stack is frontend, backend, database, and hosting, and not every project needs all four. Choose based on what you are building, what you already know, how good the docs and community are, what it costs to run, and how big your team is, roughly in that order. Default to boring, proven tools, and save your limited supply of new-technology choices for the one part of the project that is genuinely new. There is no universal right stack, only a reasoned one and an unreasoned one.
Read next: How to start building a website picks up right after this, turning a chosen stack into an actual live site. Set up a development environment covers the editor, runtime, and Git setup you need regardless of which stack you land on.

Sources

Verified against primary sources: August 2026.

  1. Client-Server Overview. MDN Web Docs. https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Server-side/First_steps/Client-Server_overview
  2. Choose Boring Technology. Dan McKinley (mcfunley.com). https://mcfunley.com/choose-boring-technology
  3. Why Astro?. Astro Docs (official). https://docs.astro.build/en/concepts/why-astro/
  4. Quick Start. React Docs (official). https://react.dev/learn
  5. Introduction. Next.js Docs (official). https://nextjs.org/docs
Read nextHow to start building a website