A Full-Stack JavaScript Tech Stack Builder that helps developers select compatible tools for building modern web applications with intelligent recommendations and real-time validation.
- π― Smart Tool Selection: Choose from curated categories of modern JavaScript tools
- β‘ Real-Time Validation: Instant compatibility checking with explainable scoring
- π‘ Intelligent Suggestions: Context-aware recommendations based on your selections
- π¦ Recipe-Based Export: Generate working project configurations with proper setup guides
- π¨ Clean UI: Built with React, TypeScript, and Tailwind CSS
- βΏ Accessible: WCAG 2.1 AA compliant with keyboard navigation
- Frontend: React 18 + TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS + shadcn/ui
- State Management: React Context API
- Performance: Web Workers for rules evaluation
- Testing: Vitest + React Testing Library
- Validation: Zod
- Node.js 18+ or Bun
- npm, yarn, or pnpm
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
# Start development server
npm run devnpm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm test- Run tests oncenpm run test:watch- Run tests in watch modenpm run type-check- Check TypeScript typesnpm run lint- Lint code
stackfast-full-stack-builder/
βββ src/
β βββ components/ # React UI components
β βββ engine/ # Rules engine, suggestion engine, export generator
β βββ data/ # TypeScript modules (recipes, suggestions)
β βββ templates/ # Export templates
β βββ context/ # React Context providers
β βββ hooks/ # Custom React hooks
β βββ lib/ # Utility functions
β βββ types/ # TypeScript type definitions
βββ tests/
β βββ unit/ # Unit tests
β βββ integration/ # Integration tests
β βββ snapshots/ # Snapshot tests
β βββ performance/ # Performance benchmarks
βββ public/
β βββ catalog/ # Static catalog data (JSON)
βββ package.json
StackFast is a client-side only application with no backend dependencies:
- Data-Driven: All compatibility rules and tool metadata are defined in JSON
- Web Workers: Performance-critical rule evaluation runs in a Web Worker
- Local Storage: User selections persist in browser localStorage
- Static Catalog: Tool catalog is versioned and cached for offline use
- Choose from 10 categories: Frontend, Runtime, Hosting, Database, ORM, Auth, Payments, Email, Storage, Styling
- Each category has cardinality rules (exactly-one, at-most-one, zero-or-one)
- UI prevents invalid selections at the interaction layer
- Rules engine evaluates 30+ compatibility rules in real-time
- Scoring algorithm: Base 50, +40 max bonus, -70 max penalty, clamped to [0-100]
- Rule types: conflicts, synergies, requirements, capability compatibility, category coverage
- All diagnostics include rule provenance (ruleId, ruleVersion)
- Context-aware recommendations based on current selections
- Priority levels: High, Medium, Low
- Examples: Frontend β Database, Database β ORM, Next.js β Vercel
- Recipe-based system generates working project configurations
- Outputs: package.json, .env.example, README.md, config files, export-log.json
- Deterministic recipe ordering ensures consistent results
- Includes setup instructions and caveats for warnings
- Update Tool Catalog (
public/catalog/v1/tools.json):
{
"id": "my-tool",
"name": "My Tool",
"categoryId": "database",
"description": "A great database",
"languages": ["javascript", "typescript"],
"supports": {
"runtime": ["node", "bun"]
},
"integrations": ["prisma", "drizzle"],
"pricing": {
"model": "free-tier",
"note": "Free up to 1GB",
"lastVerified": "2024-01-15"
},
"docsUrl": "https://example.com/docs"
}- Add Compatibility Rules (
public/catalog/v1/rules.json):
{
"id": "my-tool-synergy",
"version": "1.0.0",
"kind": "synergy",
"toolA": "my-tool",
"toolB": "prisma",
"reason": "First-class integration with Prisma",
"weight": 8
}- Create Export Recipe (
src/data/recipes/my-tool.ts):
import type { ExportRecipe } from '@/types';
export const myToolRecipe: ExportRecipe = {
id: 'my-tool',
version: '1.0.0',
appliesWhen: (tools) => tools.some(t => t.id === 'my-tool'),
targets: {
packageJson: {
deps: { 'my-tool': '^1.0.0' },
devDeps: {},
scripts: { 'db:start': 'my-tool start' },
},
files: [
{
path: 'my-tool.config.js',
templateId: 'my-tool-config',
mergeStrategy: 'create',
},
],
env: {
example: {
MY_TOOL_URL: 'postgresql://localhost:5432/mydb',
},
},
postInstallSteps: [
'Run `npm run db:start` to start the database',
],
},
};- Register Recipe (
src/data/recipes/index.ts):
import { myToolRecipe } from './my-tool';
export const recipes = [
// ... existing recipes
myToolRecipe,
];The catalog is versioned and cached for 24 hours. To update:
- Modify files in
public/catalog/v1/ - Update
manifest.jsonwith newupdatedAttimestamp - Users can click "Refresh Catalog" to clear cache and reload
# Run all tests
npm test
# Run specific test file
npm test -- rules-engine.test.ts
# Run with coverage
npm test -- --coverage
# Run in watch mode during development
npm run test:watch# Run performance tests
npm test -- performance/benchmarks.test.tsExpected targets:
- Rule evaluation: <50ms (laptop), <100ms (mobile)
- Export generation: <200ms
- Bundle size: <500KB gzipped
# Run accessibility tests
npm test -- integration/user-flows.test.tsxManual testing:
- Keyboard navigation (Tab, Enter, Escape)
- Screen reader (NVDA, JAWS, VoiceOver)
- High contrast mode
- Zoom to 200%
See DEPLOYMENT.md for detailed deployment instructions.
Quick deploy to Vercel:
npm install -g vercel
vercel --prod- No backend maintenance or costs
- Instant deployment to static hosting
- Works offline after initial load
- Privacy-first (no data leaves browser)
- Keeps UI responsive during rule evaluation
- Handles 40+ tools without blocking main thread
- Graceful fallback to main thread if unavailable
- Type-safe recipe definitions
- Function-based
appliesWhenlogic for flexibility - Easy to test and maintain
- May migrate to JSON with DSL post-MVP
- Runtime validation of catalog data
- Type inference for TypeScript
- Clear error messages for invalid data
Error: Cannot find module '@/components/...'
- Solution: Check
tsconfig.jsonhas correct path aliases
Error: Worker is not defined
- Solution: Ensure
typeof window !== 'undefined'guards are in place
Error: Catalog fails to load
- Solution: Check
public/catalog/v1/manifest.jsonexists and is valid - Solution: Clear browser cache and localStorage
Error: Export fails with "No recipes found"
- Solution: Ensure selected tools have corresponding recipes
- Solution: Check recipe
appliesWhenlogic
Slow rule evaluation
- Check if Web Worker is loading (should see worker file in Network tab)
- Verify no excessive re-renders with React DevTools
- Profile with Chrome DevTools Performance tab
We welcome contributions! Please follow these guidelines:
- Code Style: Follow TypeScript strict mode and ESLint rules
- Testing: Add tests for new features (unit + integration)
- Accessibility: Ensure WCAG 2.1 AA compliance
- Documentation: Update README and inline comments
- Standards: See
.kiro/steering/stackfast-standards.mdfor detailed guidelines
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests (
npm test) - Run type check (
npm run type-check) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Add more tools and categories
- Migrate recipes to JSON with declarative DSL
- Add stack presets (e.g., "E-commerce", "SaaS")
- Add global undo/redo
- Add dark mode
- Add internationalization (i18n)
- Add analytics dashboard for popular stacks
- Add community-contributed recipes
Q: Can I use this for production projects? A: Yes! The exported configurations are production-ready with proper setup instructions.
Q: How often is the catalog updated? A: The catalog is versioned and can be updated independently of the app. Check the header for the last update date.
Q: Can I add my own tools? A: Yes! Fork the repo and add your tools to the catalog. See "Adding New Tools" above.
Q: Does this work offline? A: Yes, after the initial load. The catalog is cached in localStorage for 24 hours.
Q: Is my data private? A: Yes! All data stays in your browser. No selections or exports are sent to any server.
Q: Can I export to other formats besides ZIP? A: Currently only ZIP is supported. TAR support is planned for a future release.
MIT License - see LICENSE for details
- π Documentation
- π Report Bug
- π‘ Request Feature
- π¬ Discussions