type: decision
status: active
timestamp: 2026-06-21
tags: [architecture, framework, stack, runtime, astro, vite, esbuild, tsup, wxt]

Per-runtime framework matrix locked

Astro 6 for sites, Vite+React+WXT for extensions extensions; esbuild+TS for VS Code extensions; tsup+Node 22 for CLIs and MCP servers. Each runtime gets the framework that ships best to its target.

Per-runtime framework matrix locked

Decision

One framework per runtime. Astro can’t compile to chrome extensions or .vsix packages, so those need different tools. Within each runtime, the family picks ONE framework and uses it everywhere.

RuntimeFrameworkBuildUI libHosting
Astro site (25+ family sites)Astro 6astro buildReact 19 islandsCloudflare Pages
Browser extension (*-ext)WXTwxt buildReact 19Chrome / Firefox / Edge stores
VS Code extension (*-vsc-ext)(none)esbuildTS only, no UI libVS Code Marketplace + Open VSX
VSC companion site (<name>-vsc-ext/site/)Astro 6astro buildReact 19 islandsGitHub Pages (unlimited free projects)
CLI (*-cli)(none)tsupTS, no UInpm + bin entry
MCP server (*-mcp)@modelcontextprotocol/sdktsupTS, no UInpm bin + stdio transport
CLI/MCP doc page (*-cli/docs/)Astro 6astro buildReact 19 islandsCloudflare Pages
npm package (@chirag127/*)(none)tsup OR astro-buildTSnpm registry

Why this split

VSC extension companion site mechanics

The *-vsc-ext repo holds two artifacts:

Single .github/workflows/deploy.yml:

Keeps repo count low (one per extension, not two) while preserving the family rule “every project has a marketing site.” Any free unlimited-repos host equivalent works (Netlify Drop, Surge, Render static); GH Pages preferred to keep CF Pages free-tier 1-concurrent-build slot for the 24+ primary sites.

Astro integration set locked in @chirag127/astro-shell

Nine integrations ship as peer-deps; every consumer adds them at workspace level:

IntegrationPurpose
@astrojs/sitemapAuto-generates sitemap.xml
@astrojs/mdxMDX for content
@astrojs/rssRSS feed helper
@astrojs/reactReact 19 islands
@tailwindcss/viteTailwind v4 via Vite plugin (NOT the deprecated @astrojs/tailwind)
astro-iconSVG icon component
astro-compressCSS/HTML/JS minification
@vite-pwa/astroPWA per distribution-and-queues-locked.md
vite-plugin-wasm + vite-plugin-top-level-awaitWASM for tool sites

Rejected


Edit on GitHub · Back to index