Tech Stack Recommendations
Complete guide for choosing opinionated technology stacks for new projects and migrations. Read this first to pick your runtime, then load the appropriate reference guides below.
When to Use This Skill
- New projects: Starting from scratch and need stack guidance
- Stack migrations: Moving from Node → Bun, rewriting in Deno, etc.
- Framework selection: Choosing between SvelteKit, Next.js, Angular, Nuxt, etc.
- Architecture decisions: Building monorepos, multi-platform apps, or complex systems
- Infrastructure choices: Selecting databases, auth, hosting, styling, mobile frameworks
NOT for: Existing projects with established stacks (unless actively migrating).
This Skill Has a Shelf Life
Framework ecosystems drift fast. The specific names in this skill (Bun, SvelteKit, Elysia, Neon, Drizzle, Clerk, etc.) reflect 2026-era tooling and will age. Before recommending any named tool:
- If the user's request is recent and the skill hasn't been updated in a while, flag the age — e.g., "this was written against 2026 tooling; double-check pricing/status for [vendor] before committing."
- For syntax or API details, defer to the project's current docs, not a snippet pasted from here.
- If a named framework is clearly deprecated or superseded, say so instead of recommending it.
The shape of the advice (pick one runtime, name the override factors, prefer what the team can debug) ages more slowly than the specific names. Prefer the shape over the names when the two disagree.
This Skill Is Opinionated. Override When the Context Says So.
The defaults here (Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk) are one person's taste, not universal truth. Before applying them, surface the context that should shift the recommendation, and say so out loud rather than silently enforcing the default.
Override the default runtime or framework when any of these apply:
| Factor |
Example override |
| Team expertise |
Team has deep Angular/NestJS background → use Node + Next.js/Angular + Nx, not Bun. |
| Hiring pool |
Hiring at scale in a market where Node is dominant → Node > Bun, even for greenfield. |
| Compliance / data residency |
SOC 2, HIPAA, GDPR with strict self-hosting or region pinning → prefer self-hostable auth (Ory, Supabase Auth, Lucia) over Clerk; prefer regionally-pinned DB over serverless Neon by default. |
| Vendor / third-party policy |
Org forbids third-party auth providers → custom JWT (e.g. @elysiajs/jwt) or self-hosted Kratos. |
| Ecosystem maturity |
A required SDK is Node-only → use Node; don't contort Bun. |
| Runtime constraints |
Target is edge / deno-only platforms, or strictly AWS Lambda Node runtime → choose accordingly, not Bun by default. |
| Existing infra |
Monorepo already on pnpm + Nx, or org-wide CI assumes Node → extending that is usually cheaper than forking the toolchain. |
| Cost profile at scale |
Clerk's per-MAU pricing breaks at your scale → self-host. Neon autoscaling costs > a single RDS → switch. |
| Realtime / collaborative features |
Supabase (realtime channels) > Neon. Worth breaking the default DB choice. |
| Latency-sensitive global apps |
Deno Deploy / edge-first frameworks (Fresh, Hono on edge) > Bun+SvelteKit on a single region. |
Rules of thumb when applying this skill:
- State the override factors that apply before recommending a stack. Don't just output the default and hope no one notices.
- Name the trade-off. "Bun is faster, but your team is Node-fluent — picking Bun costs you ~2 weeks of ramp."
- Prefer the stack the team can debug over the one with the best benchmark. Developer fluency beats synthetic performance in almost every real project.
- Compliance and policy are vetoes, not tiebreakers. If self-hosting is mandatory, Clerk is out — don't argue.
- If you can't tell which factors apply, ask one crisp question (team makeup, compliance, deployment target, scale) rather than assuming the default is safe.
The default exists so small-team greenfield projects don't burn a week on stack selection. It is not a recommendation for every project that could technically run on it.
Platform Inference: What Should You Build?
If business requirements don't specify platforms, infer from the application's nature:
| Signal |
Suggests |
Example |
| On-the-go usage, notifications, offline |
Mobile (Expo) |
Ride-sharing, delivery, fitness tracking |
| Data-heavy dashboards, complex workflows |
Web (SvelteKit / Next.js) |
Analytics, CRM, project management |
| Consumer-facing product with users everywhere |
Web + Mobile |
Social media, messaging, banking |
| Internal tool for staff only |
Web only |
Admin dashboards, internal workflows |
Rule: When in doubt, build web first. Mobile can be added later via Expo (Bun/Node) or Capacitor (Deno).
Runtime Selection: Bun vs. Deno vs. Node
Default: Bun for all new TypeScript/JavaScript projects.
| Runtime |
Use When |
Strengths |
Trade-offs |
| Bun (default) |
Fast builds, modern stacks |
Lightning-fast, native TS, built-in test runner, smallest footprint |
Limited ecosystem maturity; some packages missing |
| Deno |
Sandbox security, edge-first, no node_modules |
Secure by default, direct TS imports, explicit permissions |
Some npm package incompatibility; smaller ecosystem |
| Node 22 LTS |
Legacy compatibility, team expertise |
Mature ecosystem, stable, battle-tested tooling |
Slower than Bun, heavier |
Decision tree:
- Is this a new greenfield project? → Use Bun (default)
- Do you need sandboxed security or edge deployment? → Use Deno
- Do you have legacy dependencies or Angular/NestJS expertise? → Use Node 22 LTS
Pin your runtime version in .tool-versions or package.json → engines field.
Quick Stack Selection Matrix
Choose based on your primary use case and platform target:
| Use Case |
Recommended Stack |
Load Guide |
| New web + API (default) |
Bun + SvelteKit + Elysia + Neon + Drizzle |
stacks/bun.md |
| Sandbox security or edge-first |
Deno + Fresh + Hono + Deno KV |
stacks/deno.md |
| Large ecosystem or Angular/NestJS |
Node + Next.js + NestJS + Nx + Neon + Drizzle |
stacks/node.md |
| Need to choose a frontend framework |
Load guides below |
guides/frontend-frameworks.md |
| Choosing deployment platform |
Load guides below |
guides/hosting.md |
| Setting up database + auth |
Load guides below |
guides/database-auth.md |
| Adding mobile support |
Load guides below |
guides/mobile.md |
Step 1: Choose Your Runtime
Load exactly one of these based on your signals:
| File |
When to Load |
Stack Includes |
| references/stacks/bun.md |
Most new projects (default) |
Bun + SvelteKit + Elysia + Eden RPC + Neon + Drizzle + Clerk + Tailwind |
| references/stacks/deno.md |
Sandbox security, edge, no node_modules |
Deno + Fresh + Hono + Deno KV + Clerk + Tailwind |
| references/stacks/node.md |
Legacy compat, Angular, team expertise |
Node 22 LTS + Next.js/Angular + NestJS + Nx + Neon + Drizzle + Clerk + Tailwind |
Each file includes:
- Complete layer-by-layer stack overview
- Monorepo setup (Bun Workspaces, Deno Workspaces, or Nx)
- Standard project structure (apps/, packages/)
- Quick-start commands
Step 2: Load Topic Guides On-Demand
After selecting a runtime, load any of these guides that apply to your project:
| Guide |
Load When |
File |
| Frontend Frameworks |
Choosing between SvelteKit, Next.js, Astro, Remix, Angular, etc. |
references/guides/frontend-frameworks.md |
| Backend Hosting |
Selecting deployment platform (Cloud Run, Railway, Vercel, Deno Deploy, etc.) |
references/guides/hosting.md |
| Database & Auth |
Setting up Postgres + Clerk (or Supabase, Turso alternatives) |
references/guides/database-auth.md |
| Styling & UI |
Setting up Tailwind + component systems (shadcn/ui, shadcn-svelte, etc.) |
references/guides/styling.md |
| Mobile Support |
Adding Expo, Capacitor, Flutter, or Dioxus to your monorepo |
references/guides/mobile.md |
| Internationalization |
Setting up i18n (translations, locales, RTL support) |
references/guides/i18n.md |
| Font Awesome |
Using Font Awesome v7 icons in your stack |
references/guides/font-awesome.md |
| AI Coding Assistant Config |
Setting up Claude Code / skills / MCP for your repo (context files, .ai/ folder, tool definitions) |
references/guides/ai-agents.md |
| Building AI Agent Products |
Out of scope for this skill. This skill covers the web / backend / DB layer for an agent app, but NOT the agent framework itself. Use Claude Agent SDK, MCP, LangChain, or LlamaIndex per project needs. |
— |
Monorepo Patterns: Pick One
All three runtimes support monorepos with the same logical structure. Pick based on your runtime:
Bun Monorepos: Native Workspaces
{
"name": "my-monorepo",
"workspaces": ["apps/*", "packages/*"]
}
Command: bun install (installs all workspaces)
Deno Monorepos: Native Workspaces
{
"workspace": [
"./apps/web",
"./apps/api",
"./packages/shared"
]
}
Command: deno run --allow-all deno.json (runs workspace)
Node Monorepos: Nx + pnpm Workspaces
npx create-nx-workspace@latest my-monorepo --preset=apps
Command: pnpm install && nx serve web (runs specific app)
Standard App Structure
All monorepos follow this logical layout:
my-monorepo/
├── apps/
│ ├── web/ # Customer-facing web (SvelteKit / Next.js)
│ ├── mobile/ # Mobile app (Expo / Capacitor)
│ ├── admin/ # Internal admin dashboard
│ └── api/ # Backend API (Elysia / Hono / NestJS)
└── packages/ # Bun/Deno workspaces use this name
└── shared/ # Shared types, utils, components
Workspace directory naming: Bun and Deno workspaces use packages/ (shown above). Nx (Node) uses libs/ instead — this is Nx's own default, and references/stacks/node.md follows it. Do not mix the two within one monorepo; pick the convention that matches your runtime's tooling.
When to include each app:
| App |
Include When |
api |
Always — backend is required |
admin |
Almost always — manage users, data, content |
web |
Most customer-facing projects |
mobile |
When users need on-the-go access (infer from signals above) |
Rule: When in doubt, include admin — it's easier to remove later than add.
Decision Flow: Pick a Stack in 3 Steps
Step 1: Does your project need security/edge features?
- Yes → Use Deno → load stacks/deno.md
- No → Go to Step 2
Step 2: Do you need large Node ecosystem or Angular/NestJS?
- Yes → Use Node 22 LTS → load stacks/node.md
- No → Go to Step 3
Step 3: Proceed with default
- Use Bun → load stacks/bun.md
After You Pick Your Stack
- Read your runtime stack file (Bun, Deno, or Node)
- Load topic guides on-demand as you make specific choices
- Initialize your monorepo using the command from your stack file
- Build your first app (usually
api or web)
- Deploy using the hosting guide
Platform-Specific Rules
For Web Apps
- Default frontend: SvelteKit (Bun) / Next.js (Node)
- Default styling: Tailwind + Plain CSS
- Load guides/frontend-frameworks.md if you want alternatives
For Backend APIs
- Default (Bun): Elysia + Eden RPC (end-to-end types)
- Default (Deno): Hono or Oak
- Default (Node): NestJS with modules and DI
- All use Neon + Drizzle by default
For Databases
- Default: Neon (serverless Postgres) + Drizzle ORM
- Alternative: Supabase, Turso, Prisma
- Load guides/database-auth.md for detailed comparisons
For Authentication
- Default: Clerk (best auth DX, 10k MAU free)
- Override when: self-hosting is mandatory, strict data-residency rules apply, or policy bars third-party vendors. Alternatives: Supabase Auth (self-hostable), Ory Kratos, Lucia, Auth.js, or custom JWT (e.g.
@elysiajs/jwt).
- Load guides/database-auth.md for setup
For Deployment
- Web frontends: Vercel (Next.js) or Cloud Run (SvelteKit)
- APIs: Cloud Run (default) or Railway (MVP)
- Deno apps: Deno Deploy or Cloud Run
- Load guides/hosting.md for deployment commands
For Mobile
- Bun/Node: Use Expo for native feel
- Deno: Use Capacitor (wraps your web app)
- Load guides/mobile.md for integration steps
Signals → Stack Recommendation Table
Use this table if you're given conflicting requirements:
| Signal |
Recommendation |
Rationale |
| "We're a startup building fast" |
Bun + SvelteKit + Railway |
Fastest iteration, smallest bundles |
| "We have legacy Angular code" |
Node + Angular + Nx + NestJS |
Leverage existing team expertise |
| "We need global edge deployment" |
Deno + Fresh + Deno Deploy |
Built for edge, instant deploys |
| "We're migrating from Node to TypeScript" |
Bun + SvelteKit + Elysia |
10x faster builds, native TS |
| "We need OAuth + complex auth flows" |
Clerk + [any stack] |
Pre-built, battle-tested components |
| "We're building an admin dashboard" |
[Any stack] + Tailwind + shadcn |
Fast, accessible component library |
| "We need real-time or collaborative features" |
Supabase (realtime) instead of Neon |
Built-in realtime subscriptions |
Summary
- New TypeScript/JavaScript projects: Start with Bun (unless you have specific signals)
- Monorepos: Use native workspaces (Bun/Deno) or Nx (Node)
- Defaults rule: Use Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk unless you have a reason not to
- Scope rule: Recommend only what the user asked for. If the ask is narrow — a CLI, a script, an AI agent, a library, a microservice — do NOT auto-scaffold the full-stack default. Name only the pieces needed; mention additional layers (persistence, auth, UI) as optional "when you need X."
- Load topic guides as needed: Backend hosting, frontend frameworks, mobile, etc.
- Build fast: This stack prioritizes developer experience and iteration speed
Reference Map
tech-stack-recommendations/
├── SKILL.md (you are here)
├── references/
│ ├── stacks/
│ │ ├── bun.md # Bun + SvelteKit + Elysia + Neon + Drizzle
│ │ ├── deno.md # Deno + Fresh + Hono + Deno KV
│ │ └── node.md # Node + Next.js/Angular + NestJS + Nx
│ └── guides/
│ ├── frontend-frameworks.md # SvelteKit vs Next.js vs Remix vs Angular
│ ├── hosting.md # Cloud Run vs Railway vs Vercel vs Deno Deploy
│ ├── database-auth.md # Neon + Clerk vs Supabase vs Turso
│ ├── styling.md # Tailwind + Plain CSS + component systems
│ ├── mobile.md # Expo vs Capacitor vs Flutter
│ ├── i18n.md # Internationalization setup
│ ├── font-awesome.md # Font Awesome v7 reference
│ └── ai-agents.md # AI coding assistant config (skills, MCP, context files)
Need Help?
- New project: Load your runtime stack file first (Bun / Deno / Node)
- Migrating: Decide on new runtime, then load stack file
- Specific choice (frontend, DB, auth, mobile): Load the matching topic guide
- Unsure? Default to Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk
Cross-Skill Integration
| Skill |
When to Use |
mcp-builder (Anthropic) |
When the stack decision includes building an MCP server — whether to expose tools from the chosen backend, or to author a custom connector. This skill picks the runtime/framework; mcp-builder owns MCP authoring conventions (FastMCP for Python, MCP SDK for Node/TS) and tool-design best practices. |
web-artifacts-builder (Anthropic) |
When the recommendation is "prototype first, commit later" — e.g., a claude.ai artifact with React + shadcn/ui before scaffolding a full Next.js repo. This skill advises the long-term stack; web-artifacts-builder ships a same-day prototype against which the stack decision can be tested. |
doc-coauthoring (Anthropic) |
When the founder/team wants the recommendation written up as an ADR (architecture decision record) or decision doc rather than a raw chat summary. Hand off after the choice is made; don't attempt long-form co-authoring inline. |
team-composer (our own) |
When the stack decision is entangled with product, org, or operational constraints and a single-role recommendation isn't enough — e.g., @senior_software_architect + @platform_engineer + @security_engineer should weigh in together. Prefer team-composer when the question is "what stack fits this org" vs. "what's the best stack for this workload". |
engineering:architecture (official) |
When the downstream need is a formal ADR with trade-offs and consequences. This skill's recommendation is upstream — a sharp-ended opinion — and feeds into that ADR. |
Graceful degradation: if mcp-builder, web-artifacts-builder, or doc-coauthoring aren't installed, the stack recommendations in this skill still stand. The referenced skills are handoff destinations, not hard dependencies.
1---2name: tech-stack-recommendations3description: Opinionated technology stack guidance for new projects and migrations. **You MUST use this skill whenever the user is starting a new project, picking a runtime (Bun/Deno/Node), choosing a frontend framework, database, auth provider, hosting platform, styling system, mobile stack, i18n library, or AI-agent framework that the project doesn't yet have, setting up a monorepo, or migrating between stacks.** Do not assume a stack decision is too obvious to need this skill — consult it before recommending any specific technology. Does NOT trigger on: debugging existing code, maintaining or extending the current stack's existing components, library-version or package-manager migrations within the same stack, configuring tools already installed, or 'how do I do X in [framework I already use]' questions.4---56# Tech Stack Recommendations78Complete guide for choosing opinionated technology stacks for new projects and migrations. **Read this first to pick your runtime, then load the appropriate reference guides below.**910---1112## When to Use This Skill1314- **New projects:** Starting from scratch and need stack guidance15- **Stack migrations:** Moving from Node → Bun, rewriting in Deno, etc.16- **Framework selection:** Choosing between SvelteKit, Next.js, Angular, Nuxt, etc.17- **Architecture decisions:** Building monorepos, multi-platform apps, or complex systems18- **Infrastructure choices:** Selecting databases, auth, hosting, styling, mobile frameworks1920**NOT for:** Existing projects with established stacks (unless actively migrating).2122---2324## This Skill Has a Shelf Life2526Framework ecosystems drift fast. The specific names in this skill (Bun, SvelteKit, Elysia, Neon, Drizzle, Clerk, etc.) reflect 2026-era tooling and *will* age. Before recommending any named tool:2728- If the user's request is recent and the skill hasn't been updated in a while, flag the age — e.g., "this was written against 2026 tooling; double-check pricing/status for [vendor] before committing."29- For syntax or API details, defer to the project's current docs, not a snippet pasted from here.30- If a named framework is clearly deprecated or superseded, say so instead of recommending it.3132The *shape* of the advice (pick one runtime, name the override factors, prefer what the team can debug) ages more slowly than the specific names. Prefer the shape over the names when the two disagree.3334---3536## This Skill Is Opinionated. Override When the Context Says So.3738The defaults here (Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk) are one person's taste, not universal truth. Before applying them, surface the context that should shift the recommendation, and say so out loud rather than silently enforcing the default.3940**Override the default runtime or framework when any of these apply:**4142| Factor | Example override |43|---|---|44| **Team expertise** | Team has deep Angular/NestJS background → use Node + Next.js/Angular + Nx, not Bun. |45| **Hiring pool** | Hiring at scale in a market where Node is dominant → Node > Bun, even for greenfield. |46| **Compliance / data residency** | SOC 2, HIPAA, GDPR with strict self-hosting or region pinning → prefer self-hostable auth (Ory, Supabase Auth, Lucia) over Clerk; prefer regionally-pinned DB over serverless Neon by default. |47| **Vendor / third-party policy** | Org forbids third-party auth providers → custom JWT (e.g. `@elysiajs/jwt`) or self-hosted Kratos. |48| **Ecosystem maturity** | A required SDK is Node-only → use Node; don't contort Bun. |49| **Runtime constraints** | Target is edge / deno-only platforms, or strictly AWS Lambda Node runtime → choose accordingly, not Bun by default. |50| **Existing infra** | Monorepo already on pnpm + Nx, or org-wide CI assumes Node → extending that is usually cheaper than forking the toolchain. |51| **Cost profile at scale** | Clerk's per-MAU pricing breaks at your scale → self-host. Neon autoscaling costs > a single RDS → switch. |52| **Realtime / collaborative features** | Supabase (realtime channels) > Neon. Worth breaking the default DB choice. |53| **Latency-sensitive global apps** | Deno Deploy / edge-first frameworks (Fresh, Hono on edge) > Bun+SvelteKit on a single region. |5455**Rules of thumb when applying this skill:**56571. **State the override factors that apply** before recommending a stack. Don't just output the default and hope no one notices.582. **Name the trade-off.** "Bun is faster, but your team is Node-fluent — picking Bun costs you ~2 weeks of ramp."593. **Prefer the stack the team can debug over the one with the best benchmark.** Developer fluency beats synthetic performance in almost every real project.604. **Compliance and policy are vetoes, not tiebreakers.** If self-hosting is mandatory, Clerk is out — don't argue.615. **If you can't tell which factors apply, ask one crisp question** (team makeup, compliance, deployment target, scale) rather than assuming the default is safe.6263The default exists so small-team greenfield projects don't burn a week on stack selection. It is not a recommendation for every project that could technically run on it.6465---6667## Platform Inference: What Should You Build?6869If business requirements don't specify platforms, infer from the application's nature:7071| Signal | Suggests | Example |72|--------|----------|---------|73| On-the-go usage, notifications, offline | **Mobile** (Expo) | Ride-sharing, delivery, fitness tracking |74| Data-heavy dashboards, complex workflows | **Web** (SvelteKit / Next.js) | Analytics, CRM, project management |75| Consumer-facing product with users everywhere | **Web + Mobile** | Social media, messaging, banking |76| Internal tool for staff only | **Web only** | Admin dashboards, internal workflows |7778**Rule:** When in doubt, build web first. Mobile can be added later via Expo (Bun/Node) or Capacitor (Deno).7980---8182## Runtime Selection: Bun vs. Deno vs. Node8384**Default: Bun** for all new TypeScript/JavaScript projects.8586| Runtime | Use When | Strengths | Trade-offs |87|---------|----------|-----------|------------|88| **Bun** (default) | Fast builds, modern stacks | Lightning-fast, native TS, built-in test runner, smallest footprint | Limited ecosystem maturity; some packages missing |89| **Deno** | Sandbox security, edge-first, no node_modules | Secure by default, direct TS imports, explicit permissions | Some npm package incompatibility; smaller ecosystem |90| **Node 22 LTS** | Legacy compatibility, team expertise | Mature ecosystem, stable, battle-tested tooling | Slower than Bun, heavier |9192**Decision tree:**931. **Is this a new greenfield project?** → Use **Bun** (default)942. **Do you need sandboxed security or edge deployment?** → Use **Deno**953. **Do you have legacy dependencies or Angular/NestJS expertise?** → Use **Node 22 LTS**9697> **Pin your runtime version** in `.tool-versions` or `package.json` → `engines` field.9899---100101## Quick Stack Selection Matrix102103Choose based on your primary use case and platform target:104105| Use Case | Recommended Stack | Load Guide |106|----------|------------------|-----------|107| **New web + API** (default) | Bun + SvelteKit + Elysia + Neon + Drizzle | [stacks/bun.md](references/stacks/bun.md) |108| **Sandbox security or edge-first** | Deno + Fresh + Hono + Deno KV | [stacks/deno.md](references/stacks/deno.md) |109| **Large ecosystem or Angular/NestJS** | Node + Next.js + NestJS + Nx + Neon + Drizzle | [stacks/node.md](references/stacks/node.md) |110| **Need to choose a frontend framework** | Load guides below | [guides/frontend-frameworks.md](references/guides/frontend-frameworks.md) |111| **Choosing deployment platform** | Load guides below | [guides/hosting.md](references/guides/hosting.md) |112| **Setting up database + auth** | Load guides below | [guides/database-auth.md](references/guides/database-auth.md) |113| **Adding mobile support** | Load guides below | [guides/mobile.md](references/guides/mobile.md) |114115---116117## Step 1: Choose Your Runtime118119Load **exactly one** of these based on your signals:120121| File | When to Load | Stack Includes |122|------|--------------|---|123| **[references/stacks/bun.md](references/stacks/bun.md)** | **Most new projects (default)** | Bun + SvelteKit + Elysia + Eden RPC + Neon + Drizzle + Clerk + Tailwind |124| **[references/stacks/deno.md](references/stacks/deno.md)** | Sandbox security, edge, no node_modules | Deno + Fresh + Hono + Deno KV + Clerk + Tailwind |125| **[references/stacks/node.md](references/stacks/node.md)** | Legacy compat, Angular, team expertise | Node 22 LTS + Next.js/Angular + NestJS + Nx + Neon + Drizzle + Clerk + Tailwind |126127Each file includes:128- Complete layer-by-layer stack overview129- Monorepo setup (Bun Workspaces, Deno Workspaces, or Nx)130- Standard project structure (apps/, packages/)131- Quick-start commands132133---134135## Step 2: Load Topic Guides On-Demand136137After selecting a runtime, load **any of these guides** that apply to your project:138139| Guide | Load When | File |140|-------|-----------|------|141| **Frontend Frameworks** | Choosing between SvelteKit, Next.js, Astro, Remix, Angular, etc. | [references/guides/frontend-frameworks.md](references/guides/frontend-frameworks.md) |142| **Backend Hosting** | Selecting deployment platform (Cloud Run, Railway, Vercel, Deno Deploy, etc.) | [references/guides/hosting.md](references/guides/hosting.md) |143| **Database & Auth** | Setting up Postgres + Clerk (or Supabase, Turso alternatives) | [references/guides/database-auth.md](references/guides/database-auth.md) |144| **Styling & UI** | Setting up Tailwind + component systems (shadcn/ui, shadcn-svelte, etc.) | [references/guides/styling.md](references/guides/styling.md) |145| **Mobile Support** | Adding Expo, Capacitor, Flutter, or Dioxus to your monorepo | [references/guides/mobile.md](references/guides/mobile.md) |146| **Internationalization** | Setting up i18n (translations, locales, RTL support) | [references/guides/i18n.md](references/guides/i18n.md) |147| **Font Awesome** | Using Font Awesome v7 icons in your stack | [references/guides/font-awesome.md](references/guides/font-awesome.md) |148| **AI Coding Assistant Config** | Setting up Claude Code / skills / MCP for your repo (context files, `.ai/` folder, tool definitions) | [references/guides/ai-agents.md](references/guides/ai-agents.md) |149| **Building AI Agent Products** | *Out of scope for this skill.* This skill covers the web / backend / DB layer for an agent app, but NOT the agent framework itself. Use Claude Agent SDK, MCP, LangChain, or LlamaIndex per project needs. | — |150151---152153## Monorepo Patterns: Pick One154155All three runtimes support monorepos with the same logical structure. **Pick based on your runtime:**156157### Bun Monorepos: Native Workspaces158159```json160{161 "name": "my-monorepo",162 "workspaces": ["apps/*", "packages/*"]163}164```165166**Command:** `bun install` (installs all workspaces)167168### Deno Monorepos: Native Workspaces169170```json171{172 "workspace": [173 "./apps/web",174 "./apps/api",175 "./packages/shared"176 ]177}178```179180**Command:** `deno run --allow-all deno.json` (runs workspace)181182### Node Monorepos: Nx + pnpm Workspaces183184```bash185npx create-nx-workspace@latest my-monorepo --preset=apps186```187188**Command:** `pnpm install && nx serve web` (runs specific app)189190---191192## Standard App Structure193194All monorepos follow this logical layout:195196```197my-monorepo/198├── apps/199│ ├── web/ # Customer-facing web (SvelteKit / Next.js)200│ ├── mobile/ # Mobile app (Expo / Capacitor)201│ ├── admin/ # Internal admin dashboard202│ └── api/ # Backend API (Elysia / Hono / NestJS)203└── packages/ # Bun/Deno workspaces use this name204 └── shared/ # Shared types, utils, components205```206207> **Workspace directory naming:** Bun and Deno workspaces use `packages/` (shown above). **Nx (Node) uses `libs/` instead** — this is Nx's own default, and `references/stacks/node.md` follows it. Do not mix the two within one monorepo; pick the convention that matches your runtime's tooling.208209**When to include each app:**210211| App | Include When |212|-----|--------------|213| `api` | **Always** — backend is required |214| `admin` | **Almost always** — manage users, data, content |215| `web` | Most customer-facing projects |216| `mobile` | When users need on-the-go access (infer from signals above) |217218> **Rule:** When in doubt, include `admin` — it's easier to remove later than add.219220---221222## Decision Flow: Pick a Stack in 3 Steps223224**Step 1: Does your project need security/edge features?**225- Yes → Use **Deno** [→ load stacks/deno.md](references/stacks/deno.md)226- No → Go to Step 2227228**Step 2: Do you need large Node ecosystem or Angular/NestJS?**229- Yes → Use **Node 22 LTS** [→ load stacks/node.md](references/stacks/node.md)230- No → Go to Step 3231232**Step 3: Proceed with default**233- Use **Bun** [→ load stacks/bun.md](references/stacks/bun.md)234235---236237## After You Pick Your Stack2382391. **Read your runtime stack file** (Bun, Deno, or Node)2402. **Load topic guides on-demand** as you make specific choices2413. **Initialize your monorepo** using the command from your stack file2424. **Build your first app** (usually `api` or `web`)2435. **Deploy** using the hosting guide244245---246247## Platform-Specific Rules248249### For Web Apps250- **Default frontend:** SvelteKit (Bun) / Next.js (Node)251- **Default styling:** Tailwind + Plain CSS252- Load [guides/frontend-frameworks.md](references/guides/frontend-frameworks.md) if you want alternatives253254### For Backend APIs255- **Default (Bun):** Elysia + Eden RPC (end-to-end types)256- **Default (Deno):** Hono or Oak257- **Default (Node):** NestJS with modules and DI258- All use Neon + Drizzle by default259260### For Databases261- **Default:** Neon (serverless Postgres) + Drizzle ORM262- Alternative: Supabase, Turso, Prisma263- Load [guides/database-auth.md](references/guides/database-auth.md) for detailed comparisons264265### For Authentication266- **Default:** Clerk (best auth DX, 10k MAU free)267- **Override when:** self-hosting is mandatory, strict data-residency rules apply, or policy bars third-party vendors. Alternatives: Supabase Auth (self-hostable), Ory Kratos, Lucia, Auth.js, or custom JWT (e.g. `@elysiajs/jwt`).268- Load [guides/database-auth.md](references/guides/database-auth.md) for setup269270### For Deployment271- **Web frontends:** Vercel (Next.js) or Cloud Run (SvelteKit)272- **APIs:** Cloud Run (default) or Railway (MVP)273- **Deno apps:** Deno Deploy or Cloud Run274- Load [guides/hosting.md](references/guides/hosting.md) for deployment commands275276### For Mobile277- **Bun/Node:** Use Expo for native feel278- **Deno:** Use Capacitor (wraps your web app)279- Load [guides/mobile.md](references/guides/mobile.md) for integration steps280281---282283## Signals → Stack Recommendation Table284285Use this table if you're given conflicting requirements:286287| Signal | Recommendation | Rationale |288|--------|----------------|-----------|289| "We're a startup building fast" | Bun + SvelteKit + Railway | Fastest iteration, smallest bundles |290| "We have legacy Angular code" | Node + Angular + Nx + NestJS | Leverage existing team expertise |291| "We need global edge deployment" | Deno + Fresh + Deno Deploy | Built for edge, instant deploys |292| "We're migrating from Node to TypeScript" | Bun + SvelteKit + Elysia | 10x faster builds, native TS |293| "We need OAuth + complex auth flows" | Clerk + [any stack] | Pre-built, battle-tested components |294| "We're building an admin dashboard" | [Any stack] + Tailwind + shadcn | Fast, accessible component library |295| "We need real-time or collaborative features" | Supabase (realtime) instead of Neon | Built-in realtime subscriptions |296297---298299## Summary3003011. **New TypeScript/JavaScript projects:** Start with **Bun** (unless you have specific signals)3022. **Monorepos:** Use native workspaces (Bun/Deno) or Nx (Node)3033. **Defaults rule:** Use Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk unless you have a reason not to3044. **Scope rule:** Recommend only what the user asked for. If the ask is narrow — a CLI, a script, an AI agent, a library, a microservice — do NOT auto-scaffold the full-stack default. Name only the pieces needed; mention additional layers (persistence, auth, UI) as optional "when you need X."3055. **Load topic guides as needed:** Backend hosting, frontend frameworks, mobile, etc.3066. **Build fast:** This stack prioritizes developer experience and iteration speed307308---309310## Reference Map311312```313tech-stack-recommendations/314├── SKILL.md (you are here)315├── references/316│ ├── stacks/317│ │ ├── bun.md # Bun + SvelteKit + Elysia + Neon + Drizzle318│ │ ├── deno.md # Deno + Fresh + Hono + Deno KV319│ │ └── node.md # Node + Next.js/Angular + NestJS + Nx320│ └── guides/321│ ├── frontend-frameworks.md # SvelteKit vs Next.js vs Remix vs Angular322│ ├── hosting.md # Cloud Run vs Railway vs Vercel vs Deno Deploy323│ ├── database-auth.md # Neon + Clerk vs Supabase vs Turso324│ ├── styling.md # Tailwind + Plain CSS + component systems325│ ├── mobile.md # Expo vs Capacitor vs Flutter326│ ├── i18n.md # Internationalization setup327│ ├── font-awesome.md # Font Awesome v7 reference328│ └── ai-agents.md # AI coding assistant config (skills, MCP, context files)329```330331---332333## Need Help?334335- **New project:** Load your runtime stack file first (Bun / Deno / Node)336- **Migrating:** Decide on new runtime, then load stack file337- **Specific choice (frontend, DB, auth, mobile):** Load the matching topic guide338- **Unsure?** Default to Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk339340---341342## Cross-Skill Integration343344| Skill | When to Use |345|-------|-------------|346| `mcp-builder` (Anthropic) | When the stack decision includes building an MCP server — whether to expose tools from the chosen backend, or to author a custom connector. This skill picks the runtime/framework; `mcp-builder` owns MCP authoring conventions (FastMCP for Python, MCP SDK for Node/TS) and tool-design best practices. |347| `web-artifacts-builder` (Anthropic) | When the recommendation is "prototype first, commit later" — e.g., a claude.ai artifact with React + shadcn/ui before scaffolding a full Next.js repo. This skill advises the long-term stack; `web-artifacts-builder` ships a same-day prototype against which the stack decision can be tested. |348| `doc-coauthoring` (Anthropic) | When the founder/team wants the recommendation written up as an ADR (architecture decision record) or decision doc rather than a raw chat summary. Hand off after the choice is made; don't attempt long-form co-authoring inline. |349| `team-composer` (our own) | When the stack decision is entangled with product, org, or operational constraints and a single-role recommendation isn't enough — e.g., `@senior_software_architect` + `@platform_engineer` + `@security_engineer` should weigh in together. Prefer `team-composer` when the question is "what stack fits this org" vs. "what's the best stack for this workload". |350| `engineering:architecture` (official) | When the downstream need is a formal ADR with trade-offs and consequences. This skill's recommendation is upstream — a sharp-ended opinion — and feeds into that ADR. |351352**Graceful degradation:** if `mcp-builder`, `web-artifacts-builder`, or `doc-coauthoring` aren't installed, the stack recommendations in this skill still stand. The referenced skills are handoff destinations, not hard dependencies.