How to Choose Your Tech Stack: A Decision Framework for Startups
Pick the right tech stack for your startup based on team size, product type, and scaling needs. Covers frontend, backend, database, and infrastructure choices.
The best tech stack is the one your team already knows. Shiny technology choices that nobody on the team understands will slow you down more than any performance bottleneck. The second-best tech stack is the one with the largest hiring pool — because you’ll need to recruit, and “Senior Elixir Developer with LiveView experience” is a harder hire than “Senior Node.js Developer.”
This guide helps you choose a tech stack based on your product type, team skills, company stage, and growth trajectory — not based on Hacker News hype.
Decision Matrix by Product Type
Web Application (SaaS)
| Layer | Budget/MVP | Balanced/Growth | Enterprise-Scale |
|---|---|---|---|
| Frontend | React + Vite | Next.js (App Router) | Next.js + Design System (Radix/shadcn) |
| Backend | Node.js (Express) | Node.js (Fastify) | Go / Rust for hot paths, Node.js for API |
| Database | PostgreSQL (Supabase) | PostgreSQL (RDS/Cloud SQL) | PostgreSQL + Redis + Elasticsearch |
| Auth | Supabase Auth / Clerk | Auth0 / NextAuth.js | Keycloak / Custom OAuth2 |
| Hosting | Vercel / Netlify | AWS ECS / GCP Cloud Run | Kubernetes (EKS/GKE) |
| CI/CD | GitHub Actions | GitHub Actions + Staging | ArgoCD + GitHub Actions |
| Monitoring | Vercel Analytics | Sentry + Datadog (free tier) | Datadog / Grafana Cloud |
| Monthly Cost | $0-$50 | $200-$2,000 | $5,000-$50,000+ |
Mobile App
| Layer | Cross-Platform | Native iOS | Native Android |
|---|---|---|---|
| Framework | React Native / Flutter | SwiftUI | Jetpack Compose |
| State | Zustand / Riverpod | SwiftData / TCA | ViewModel + StateFlow |
| Networking | Axios / Dio | URLSession / Moya | Retrofit / Ktor |
| Backend | Same as web (shared API) | Same | Same |
| Push | Firebase Cloud Messaging | APNs (native) | FCM |
| OTA Updates | CodePush / Shorebird | App Store only | Play Store only |
AI/ML Product
| Layer | Prototype (Week 1) | Production (Month 3+) |
|---|---|---|
| Model Serving | Ollama / Replicate / OpenAI API | vLLM / TGI on GPU instances |
| Vector DB | Chroma (local) / SQLite-VSS | Pinecone / Weaviate / pgvector |
| Orchestration | LangChain / LlamaIndex | Custom pipeline (faster, debuggable) |
| Frontend | Streamlit / Gradio | Next.js + WebSocket streaming |
| GPU Infra | Local M-series Mac / Colab | A100/H100 via Lambda / RunPod / AWS |
| Evaluation | Manual testing | LLM-as-judge + human eval framework |
Step 1: Assess Team Skills
# Skills inventory → stack recommendation
team_skills = {
"javascript": 4, # 1-5 proficiency
"typescript": 3,
"python": 5,
"go": 1,
"react": 4,
"vue": 2,
"postgresql": 4,
"mongodb": 2,
"aws": 3,
"gcp": 1,
"docker": 3,
"kubernetes": 1,
}
# Recommendation: build on strengths, don't chase trends
if team_skills["python"] >= 4 and team_skills["javascript"] >= 3:
backend = "FastAPI (Python)" if team_skills["python"] > team_skills["javascript"] else "Node.js (Fastify)"
frontend = "React" if team_skills["react"] >= 3 else "Vue"
db = "PostgreSQL" if team_skills["postgresql"] >= 3 else "MongoDB"
cloud = "AWS" if team_skills["aws"] >= team_skills["gcp"] else "GCP"
print(f"Recommended Stack:")
print(f" Frontend: {frontend}")
print(f" Backend: {backend}")
print(f" Database: {db}")
print(f" Cloud: {cloud}")
The Hiring Pool Test
Before committing to a technology, check the hiring market:
| Technology | Indeed Job Postings (US) | LinkedIn Candidates | Hiring Difficulty |
|---|---|---|---|
| JavaScript/TypeScript | 300K+ | Very high | Easy |
| Python | 250K+ | Very high | Easy |
| Go | 30K | Medium | Moderate |
| Rust | 5K | Low | Hard |
| Elixir | 2K | Very low | Very hard |
| React | 200K+ | Very high | Easy |
| Vue | 30K | Medium | Moderate |
| Svelte | 3K | Low | Hard |
Rule of thumb: If you can’t find 50 qualified candidates for a role within 2 weeks, your tech choice is too niche for your team size.
Step 2: Choose by Stage
Pre-Product-Market Fit (0-10 Customers)
Priority: Speed of iteration. Nothing else matters. Your product will change dramatically.
Frontend: Next.js (React) — one framework for SSR, API routes, everything
Backend: Next.js API Routes or Supabase (skip custom backend)
Database: Supabase (hosted Postgres + auth + storage + realtime)
Hosting: Vercel (auto-deploy from GitHub, zero config)
CI/CD: Vercel auto-deploy (no pipeline to maintain)
Payments: Stripe Checkout (pre-built, hosted)
Total monthly cost: $0-$50
Time to first deploy: 1 day
Team needed: 1-2 full-stack developers
Growth Stage (10-1,000 Customers)
Priority: Reliability + scalability. You have paying customers. Downtime costs money and trust.
Frontend: Next.js + TypeScript (type safety = fewer bugs)
Backend: Node.js (Fastify) or Python (FastAPI) — dedicated API
Database: PostgreSQL (RDS/Cloud SQL) + Redis (caching + sessions)
Auth: Auth0 or Clerk (don't build auth, ever)
Hosting: AWS ECS or GCP Cloud Run (container-based, auto-scaling)
Queue: SQS or BullMQ for background jobs
CI/CD: GitHub Actions with staging environment
Monitoring: Sentry (errors) + Datadog or Grafana Cloud (metrics)
Total monthly cost: $200-$2,000
Team needed: 3-8 engineers
Scale Stage (1,000+ Customers)
Priority: Performance + cost efficiency + team independence
Frontend: Next.js + CDN + edge caching + design system
Backend: Service-oriented (Node.js + Go for CPU-intensive services)
Database: PostgreSQL + read replicas + Redis + Elasticsearch (search)
Queue: SQS / Kafka for event-driven architecture
Hosting: Kubernetes (EKS/GKE) with auto-scaling + spot instances
CI/CD: ArgoCD + GitHub Actions (GitOps)
Monitoring: Datadog + PagerDuty + distributed tracing (Jaeger)
Feature Flags: LaunchDarkly or Unleash
Total monthly cost: $5,000-$50,000+
Team needed: 15+ engineers with platform team
Step 3: Database Selection
| Database | Best For | Not For | Scale Limit | Managed Options |
|---|---|---|---|---|
| PostgreSQL | Default choice — relational, ACID, extensions (pgvector, PostGIS) | Pure key-value at massive scale | TB with read replicas | RDS, Cloud SQL, Supabase |
| MongoDB | Document-heavy (CMS, catalogs), schema flexibility | Complex joins, financial transactions | PB (Atlas) | Atlas |
| Redis | Caching, sessions, rate limiting, queues | Primary data store | Memory-bound | ElastiCache, Upstash |
| Elasticsearch | Full-text search, log analytics | Primary database | PB | OpenSearch, Elastic Cloud |
| DynamoDB | Key-value at massive scale, single-digit ms latency | Ad-hoc queries, complex joins | Unlimited (AWS) | AWS-only |
| SQLite | Embedded apps, edge, prototyping | Multi-writer, high concurrency | GB | Turso (distributed) |
Default recommendation: Start with PostgreSQL. Add Redis when you need caching. Add Elasticsearch when you need search. You probably don’t need MongoDB.
Common Mistakes to Avoid
| Mistake | Why It Hurts | Better Alternative |
|---|---|---|
| Microservices at day 1 | 10× operational overhead for a 3-person team | Modular monolith — extract later |
| NoSQL for relational data | No joins, consistency nightmares, ad-hoc query pain | PostgreSQL (it handles JSON too) |
| Kubernetes before 20 services | Over-engineering, distraction from product | Docker Compose → ECS → Cloud Run |
| Custom auth system | Security vulnerabilities, OWASP headaches | Auth0, Clerk, Supabase Auth |
| GraphQL for simple CRUD | Complexity without benefit, N+1 query problems | REST + OpenAPI spec |
| Multiple languages in small team | Hiring friction, context switching, doubled tooling | Pick one backend language |
| Premature optimization | Optimizing for 1M users when you have 100 | Ship fast, optimize when you hit bottlenecks |
| Choosing based on Hacker News | Novel tech has small communities and few answers | Choose boring, well-supported technology |
Architecture Decision Records (ADRs)
Document every significant technology decision. When the team grows and someone asks “why are we using Fastify instead of Express?” — the ADR answers it.
# ADR-001: Use Fastify for API Backend
## Status: Accepted (2025-01-15)
## Context
We need a Node.js HTTP framework for our REST API.
Team has experience with Express and Fastify.
## Decision
Use Fastify.
## Rationale
- 2x faster than Express in benchmarks
- Built-in schema validation (JSON Schema)
- Plugin architecture reduces global middleware issues
- TypeScript support is first-class
- Team has 2 developers with Fastify experience
## Consequences
- Smaller ecosystem than Express (fewer middleware options)
- New hires may need onboarding on Fastify-specific patterns
Stack Checklist
- Team skills assessed (build on strengths, not aspirations)
- Hiring pool verified (can you find candidates in your market?)
- Stack matched to product type (web, mobile, AI)
- Complexity matched to stage (MVP ≠ Scale)
- Team can ship a feature end-to-end in < 1 week with this stack
- Monthly infrastructure cost estimated and budgeted
- Architecture Decision Records documented
- Migration path planned (what happens when you outgrow v1?)
- Database choice validated against data model requirements
- Monitoring and error tracking included from day 1
:::note[Source] This guide is derived from operational intelligence at Garnet Grid Consulting. For architecture consulting, visit garnetgrid.com. :::