tech-stack-recommendations
Skill2 starsChanged 5 months agoMITView on GitHub
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.
- Installs packages
In this repository26 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- ai-eval-reviewSkill
- ai-ux-reviewSkill
- brand-workshopSkill
- defineSkill
- gamification-fitSkill
- ghostwriterSkill
- gtmSkill
- handshakeSkill
- i18nSkill
- pitch-deckSkill
- pixel-artSkill
- plain-englishSkill
- riskiest-assumption-testSkill
- screenwrightSkill
- skill-evaluatorSkill
- startup-auditSkill
- startup-grillSkill
- startup-launch-kitSkill
- stormSkill
- sub-agent-coordinatorSkill
- team-composerSkill
- validation-canvasSkill
- wear-the-hatSkill
- whoamiSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. About 0 are common, 16 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈16
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 30
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.
- Distinctive: line 32
If a named framework is clearly deprecated or superseded, say so instead of recommending it.
- Distinctive: line 59
State the override factors that apply: before recommending a stack.
- Distinctive: line 62
Compliance and policy are vetoes, not tiebreakers: If self-hosting is mandatory, Clerk is out — don't argue.
- Distinctive: line 71
If business requirements don't specify platforms, infer from the application's nature:
- Distinctive: line 80
Rule: When in doubt, build web first.
- Distinctive: line 147
After selecting a runtime, load any of these guides that apply to your project:
- Distinctive: line 190
All monorepos follow this logical layout:
- Very specific: line 231
Use Bun → load stacks/bun.md
- Distinctive: line 256
All use Neon + Drizzle by default
- Distinctive: line 275
Bun/Node: Use Expo for native feel
- Distinctive: line 276
Web-first apps: Use Capacitor (wraps your web app)
- Distinctive: line 283
Use this table if you're given conflicting requirements:
- Distinctive: line 300
New TypeScript/JavaScript projects: Start with Bun (unless you have specific signals)
- Distinctive: line 301
Monorepos: Use native workspaces (Bun) or Nx (Node)
- Distinctive: line 302
Defaults rule: Use Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk unless you have a reason not to
- Distinctive: line 337
Unsure?: Default to Bun + SvelteKit + Elysia + Neon + Drizzle + Clerk
- Very specific: line 351
Graceful degradation: if mcp-builder, web-artifacts-builder, or doc-coauthoring aren't installed, the stack recommendations in this skill …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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, moving off 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 (Cloudflare Workers), 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 | Cloudflare Workers + Hono on the 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 (wraps any web build).
Runtime Selection: Bun vs. Cloudflare Workers 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 |
| Cloudflare Workers | Edge-first, global low latency | Runs in every Cloudflare region, Hono runs natively, D1/KV bindings | Per-request CPU and memory limits; not every Node API; bindings tie you to Cloudflare |
| Node (Active LTS) | Legacy compatibility, team expertise | Mature ecosystem, stable, battle-tested tooling | Slower than Bun, heavier |
Decision tree (ask in this order; the first "yes" wins):
- Do you need edge deployment? → Use Cloudflare Workers + Hono
- Do you have legacy dependencies or Angular/NestJS expertise? → Use Node (Active LTS)
- Otherwise → Use Bun (default)
Do not recommend Deno for new projects. Cloudflare acquired Deno on 2026-10-09. Deno Deploy closes about six months later; the runtime gets about one year of security fixes, then active development ends. For a project already on Deno, load stacks/deno.md — it is a migration page, not a stack. If Deno's permission sandbox was the reason for choosing it, say plainly that no stack here replaces it: Node's
--permissionmodel guards trusted code against mistakes but its own docs say it is not a sandbox for untrusted code.
Pin your runtime version in
.tool-versionsorpackage.json→enginesfield.
Which Node version: the current Active LTS line, never one already in maintenance. That is Node 26 from 2026-10-28 (Node 24 enters maintenance on 2026-10-20). Check the Node release schedule before pinning.
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 |
| Edge-first, global low latency | Cloudflare Workers + Hono + SvelteKit + Neon or D1 + Drizzle | stacks/bun.md for tooling, then guides/hosting.md § Cloudflare Workers |
| Already on Deno | Migrate off Deno | stacks/deno.md (migration page) |
| 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/node.md | Legacy compat, Angular, team expertise | Node (Active LTS) + Next.js/Angular + NestJS + Nx + Neon + Drizzle + Clerk + Tailwind |
Edge-first projects load bun.md (Bun is the local package manager and test runner), then swap the API and hosting layers using guides/hosting.md § Cloudflare Workers: Hono instead of Elysia, Workers instead of Cloud Run.
Projects already on Deno load references/stacks/deno.md — a migration page with the shutdown timeline and a layer-by-layer move to Workers or Bun. Never load it to start a new project.
Each stack file includes:
- Complete layer-by-layer stack overview
- Monorepo setup (Bun 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, Cloudflare Workers, 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
Bun and Node both support monorepos with the same logical structure; edge-first (Workers) projects use Bun workspaces. Pick based on your runtime:
Bun Monorepos: Native Workspaces
{
"name": "my-monorepo",
"workspaces": ["apps/*", "packages/*"]
}Command: bun install (installs all workspaces)
Node Monorepos: Nx + pnpm Workspaces
npx create-nx-workspace@latest my-monorepo --preset=appsCommand: 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 workspaces use this name
└── shared/ # Shared types, utils, componentsWorkspace directory naming: Bun workspaces use
packages/(shown above). Nx (Node) useslibs/instead — this is Nx's own default, andreferences/stacks/node.mdfollows 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 edge deployment?
- Yes → Use Cloudflare Workers + Hono → load stacks/bun.md, then guides/hosting.md § Cloudflare Workers
- No → Go to Step 2
(Already on Deno? Load stacks/deno.md to plan the move, then pick a destination with these steps.)
Step 2: Do you need large Node ecosystem or Angular/NestJS?
- Yes → Use Node (Active 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 or Node; edge-first projects use Bun)
- 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
apiorweb) - 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 (Workers): Hono
- 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)
- Edge-first apps: Cloudflare Workers
- Load guides/hosting.md for deployment commands
For Mobile
- Bun/Node: Use Expo for native feel
- Web-first apps: 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" | Cloudflare Workers + Hono + SvelteKit | Built for edge, global deploys |
| "We're on Deno today" | Migrate — see stacks/deno.md | Deno Deploy closes ~2027-04; runtime fixes end ~2027-10 |
| "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) 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 # Migration only — moving existing Deno projects off Deno
│ │ └── 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 Cloudflare Workers
│ ├── 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 / 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.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

