AI Stack is a web application designed to help developers and teams discover, compare, and share AI technology stacks. Whether you're building a new AI-powered application or looking to optimize your existing stack, AI Stack provides a curated collection of tools, frameworks, and libraries to make informed decisions.
- Discover AI tools and frameworks organized by stack
- Compare different stacks side by side and cut costs for your own usage
- Share your own AI stacks with the community
- Add Missing Tools inline during stack creation or in batch mode
- Stay Updated with the latest AI technology trends
- Authentication via email/password and Google SSO
- Framework: TanStack Start - Full-stack React framework
- UI Library: React 19 - Latest React with concurrent features
- Styling: Tailwind CSS v4 - Utility-first CSS framework
- Icons: Lucide React - Beautiful & consistent icons
- Animations: Motion & GSAP - Smooth animations
- Components: Radix UI - Accessible component primitives
- Backend: Convex - Serverless database and backend functions
- Authentication: Better Auth - Modern authentication solution
- State Management: TanStack Query - Server state management
- Forms: TanStack Forms - Type-safe form handling
- Language: TypeScript - Type-safe JavaScript
- Build Tool: Vite - Fast build tool and dev server
- Package Manager: pnpm - Fast, disk space efficient package manager
- Linting/Formatting: Biome - All-in-one toolchain
- Testing: Vitest - Fast unit testing framework
- Analytics: PostHog - Product analytics suite
aistack/ # Main web application
βββ convex/ # Convex backend functions & schema
βββ public/ # Static assets
βββ src/ # React application source
β βββ components/ # Shared UI primitives and cross-feature components
β βββ features/ # Feature-scoped modules (landing, stack-editor, etc.)
β βββ integrations/ # Third-party integrations
β βββ routes/ # File-based routing
βββ README.md # You are here
- Route files should stay composition-focused (data fetch + section orchestration).
- Landing page is organized under
src/features/landing/*. - Stack editor is organized under
src/features/stack-editor/*with:- section components in
sections/* - reducer/selectors/hooks in
state/* - status computation in
editor-status.ts
- section components in
- Reusable visual wrappers live under
src/components/system/*.
- Node.js (v18 or higher)
- pnpm (recommended) or npm
- Git
-
Clone the repository
git clone https://github.com/alp82/aistack.git cd aistack -
Install dependencies
pnpm install
-
Set up environment variables
# Copy the example environment file cp .env.example .env.local # Configure your environment variables # VITE_CONVEX_URL and CONVEX_DEPLOYMENT are required
-
Initialize Convex
pnpm convex dev
This will automatically set up your Convex deployment and update your environment variables.
-
Start the development server
pnpm dev
The application will be available at:
- Frontend: http://localhost:3019
- Convex Dashboard: http://localhost:3210
# Development
pnpm dev # Start development server
pnpm convex dev # Start Convex backend server
# Building
pnpm build # Build for production
pnpm preview # Preview production build
# Code Quality
pnpm lint # Run Biome linter
pnpm format # Format code with Biome
pnpm check # Run all Biome checks
# Testing
pnpm test # Run unit tests with VitestThe project uses Vitest for unit testing. Tests are located in the src/**/__tests__ directories.
Vitest is configured in vite.config.ts with:
test.environment = "jsdom"test.setupFiles = ["./src/test/setup.ts"]
src/test/setup.ts loads @testing-library/jest-dom/vitest matchers for DOM assertions.
# Run all tests
pnpm test
# Run a single test file
pnpm vitest run src/features/stack-editor/state/__tests__/editor-reducer.test.ts
# Run tests in watch mode
pnpm test --watch
# Generate coverage report
pnpm test --coverageThis project uses Shadcn UI components. Add new components with:
pnpm dlx shadcn@latest add [component-name]- The development server runs on
http://localhost:3019 - The Convex backend runs on
http://localhost:3210 - Both servers should remain running during development
- Use Chrome DevTools MCP for debugging and reviewing code updates
- Dev Admin Access: In development mode, a "Dev Admin Login" button appears on the login page. It signs in as
dev-admin@example.comwith admin privileges. This requires the Convex env varIS_DEV=trueto be set (email verification is also skipped whenIS_DEV=true)
Migration scripts are located in convex/migrations/. Run them via the Convex Dashboard or CLI.
- Open your Convex Dashboard at https://dashboard.convex.dev
- Navigate to your project β Functions tab
- Find the migration function under
migrations/ - Click on the function and use Run Function to execute it
# Run an internal query (read-only, for previews)
npx convex run migrations/backup:exportStackDescriptions
# Run an internal mutation (makes changes)
npx convex run migrations/populateShortIds:populateAllShortIds| Function | Type | Description |
|---|---|---|
exportStackDescriptions |
Query | Export all stack descriptions as JSON backup |
exportShortIdMappings |
Query | Export tool/model/bundle shortId mappings |
restoreStackDescription |
Mutation | Restore a single stack from backup |
restoreStackDescriptionsBatch |
Mutation | Restore multiple stacks from backup array |
| Function | Type | Description |
|---|---|---|
getMissingCounts |
Query | Check how many records are missing shortId |
populateAllShortIds |
Mutation | Populate shortIds for all tools, models, bundles |
populateToolShortIds |
Mutation | Populate shortIds for tools only |
populateModelShortIds |
Mutation | Populate shortIds for models only |
populateBundleShortIds |
Mutation | Populate shortIds for bundles only |
| Function | Type | Description |
|---|---|---|
getStackCounts |
Query | Count stacks with legacy blocks (iconurl attributes) |
dryRunMigration |
Query | Preview what would be migrated without changes |
previewStackMigration |
Query | Preview migration for a single stack |
migrateAllStackDescriptions |
Mutation | Run the actual migration on all stacks |
Before running migrations on production, always create a backup first!
# Step 1: Backup existing stack descriptions
npx convex run migrations/backup:exportStackDescriptions > backup-stacks.json
# Step 2: Check how many records need shortId population
npx convex run migrations/populateShortIds:getMissingCounts
# Step 3: Populate shortIds for tools, models, and bundles
npx convex run migrations/populateShortIds:populateAllShortIds
# Step 4: Preview description migration (dry run)
npx convex run migrations/migrateStackDescriptions:dryRunMigration
# Step 5: Run the actual description migration
npx convex run migrations/migrateStackDescriptions:migrateAllStackDescriptionsIf something goes wrong, restore from your backup:
# For a single stack
npx convex run migrations/backup:restoreStackDescription \
'{"stackId": "k1234...", "description": "<p>Original content...</p>"}'
# For multiple stacks (pass JSON array)
npx convex run migrations/backup:restoreStackDescriptionsBatch \
'{"backups": [{"stackId": "k1234...", "description": "..."}]}'Contributions are welcome! Please read our contributing guidelines and submit pull requests to the main branch.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
If you have any questions or need help, please open an issue on GitHub.
