diff --git a/README.md b/README.md
index e83c7061..8ecb49b2 100644
--- a/README.md
+++ b/README.md
@@ -80,8 +80,28 @@ Sponsor the most comprehensive collection of AI system prompts and reach thousan
## 🚀 Quick Start
-### Browse Tools
-Explore 32+ AI coding tools organized by category below, or use our search tools:
+### 🌐 Web Interface (NEW!)
+
+The easiest way to explore AI prompts is through our modern web interface:
+
+```bash
+cd web
+./setup.sh
+npm run dev
+```
+
+Visit **http://localhost:3000** to explore:
+- 🔍 **Advanced search** and filtering
+- 📊 **Statistics dashboard** with visualizations
+- 🔄 **Compare tools** side-by-side
+- 📱 **Fully responsive** mobile-friendly design
+- 🎨 **Dark mode** support
+
+See [web/README.md](./web/README.md) for full documentation.
+
+### 📟 Command Line Tools
+
+For developers who prefer the terminal:
```bash
# Generate metadata index
@@ -245,15 +265,22 @@ python scripts/search.py --list-companies
### What's New in v2.0 🎉
-**Major enhancements:**
-- ✨ **Searchable Index**: Find tools by category, company, or model
-- 📊 **Analysis Tools**: Generate statistics and comparisons
-- ✅ **Validation**: Automated quality checks
+**🌐 Modern Web Interface:**
+- ✨ **Next.js 15 + React 19** web application
+- 🔍 **Advanced search** with real-time filtering
+- 📊 **Interactive statistics** dashboard
+- 🔄 **Side-by-side comparison** of up to 4 tools
+- 📱 **Fully responsive** mobile design
+- 🎨 **Dark mode** with theme persistence
+- ⚡ **Lightning fast** with Server Components
+
+**📁 Repository Enhancements:**
- 📚 **Better Documentation**: Individual READMEs for key tools
- 🗂️ **Organized by Category**: Browse by IDE, Agent, Assistant, etc.
-- 🔍 **Discovery Tools**: Python scripts for searching and analysis
+- ✅ **Validation**: Automated quality checks
+- 📊 **Analysis Tools**: Generate statistics and comparisons
-**New Scripts:**
+**🛠️ Developer Tools:**
- `generate_metadata.py` - Create searchable index
- `validate.py` - Check repository quality
- `search.py` - Search and filter tools
@@ -262,8 +289,8 @@ python scripts/search.py --list-companies
See [CHANGELOG.md](./CHANGELOG.md) for full details.
### Future Roadmap
-- [ ] Web interface for browsing prompts
-- [ ] Prompt comparison and diff tools
+- [x] Web interface for browsing prompts ✅ **COMPLETED**
+- [x] Prompt comparison and diff tools ✅ **COMPLETED**
- [ ] Community ratings and reviews
- [ ] API for programmatic access
- [ ] More individual tool READMEs
diff --git a/web/.eslintrc.json b/web/.eslintrc.json
new file mode 100644
index 00000000..bffb357a
--- /dev/null
+++ b/web/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/web/.gitignore b/web/.gitignore
new file mode 100644
index 00000000..00bba9bb
--- /dev/null
+++ b/web/.gitignore
@@ -0,0 +1,37 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+.env
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/web/README.md b/web/README.md
new file mode 100644
index 00000000..e93a3021
--- /dev/null
+++ b/web/README.md
@@ -0,0 +1,237 @@
+# AI Prompts Explorer - Web Interface
+
+A modern, responsive web application for exploring AI tool system prompts and configurations. Built with Next.js 15, React 19, and TypeScript.
+
+
+
+
+
+
+## ✨ Features
+
+- 🔍 **Advanced Search & Filtering** - Search by name, company, category, or model
+- 📊 **Statistics Dashboard** - Comprehensive analytics and visualizations
+- 🔄 **Tool Comparison** - Compare up to 4 tools side-by-side
+- 💾 **Favorites** - Save your favorite tools for quick access
+- 🎨 **Dark Mode** - Beautiful dark/light theme support
+- 📱 **Fully Responsive** - Perfect on desktop, tablet, and mobile
+- ⚡ **Lightning Fast** - Built with Next.js 15 and Server Components
+- 🎭 **Smooth Animations** - Polished UX with Framer Motion
+
+## 🚀 Quick Start
+
+### Prerequisites
+
+- Node.js 22+ (recommended: 22.21.1)
+- npm 10+
+
+### Installation
+
+```bash
+# Navigate to the web directory
+cd web
+
+# Install dependencies
+npm install
+
+# Run the development server
+npm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) in your browser.
+
+## 📁 Project Structure
+
+```
+web/
+├── app/ # Next.js App Router pages
+│ ├── page.tsx # Homepage
+│ ├── browse/ # Browse tools page
+│ ├── stats/ # Statistics dashboard
+│ ├── compare/ # Tool comparison
+│ ├── tool/[slug]/ # Individual tool pages
+│ ├── about/ # About page
+│ ├── layout.tsx # Root layout
+│ └── globals.css # Global styles
+├── components/ # Reusable components
+│ ├── ui/ # Base UI components
+│ ├── navbar.tsx # Navigation bar
+│ ├── footer.tsx # Footer
+│ ├── tool-card.tsx # Tool card component
+│ └── theme-provider.tsx # Theme provider
+├── lib/ # Utilities and data
+│ ├── data.ts # Data loading functions
+│ ├── store.ts # Zustand state management
+│ ├── types.ts # TypeScript types
+│ └── utils.ts # Utility functions
+├── data/ # Static data
+│ └── index.json # Generated metadata
+└── public/ # Static assets
+```
+
+## 🛠️ Tech Stack
+
+- **Framework**: [Next.js 15](https://nextjs.org/) with App Router
+- **UI Library**: [React 19](https://react.dev/)
+- **Language**: [TypeScript](https://www.typescriptlang.org/)
+- **Styling**: [Tailwind CSS](https://tailwindcss.com/)
+- **State Management**: [Zustand](https://zustand-demo.pmnd.rs/)
+- **Icons**: [Lucide React](https://lucide.dev/)
+- **Animations**: [Framer Motion](https://www.framer.com/motion/)
+- **Theme**: [next-themes](https://github.com/pacocoursey/next-themes)
+
+## 📦 Available Scripts
+
+```bash
+# Development server
+npm run dev
+
+# Production build
+npm run build
+
+# Start production server
+npm start
+
+# Lint code
+npm run lint
+
+# Type check
+npm run type-check
+```
+
+## 🎨 Features In Detail
+
+### Browse Tools
+- Grid or list view
+- Real-time search
+- Multi-select filters (category, type, company)
+- Sort by name, lines, files, or company
+- Responsive card layout
+
+### Tool Detail Pages
+- Complete tool information
+- File listings with sizes
+- Model information
+- Direct links to GitHub and official websites
+- Add to comparison or favorites
+
+### Statistics Dashboard
+- Total tools, files, and lines
+- Category distribution with visual bars
+- Top tools by complexity
+- Type distribution (proprietary vs open-source)
+- Company breakdown
+
+### Comparison
+- Side-by-side comparison of up to 4 tools
+- Compare all key metrics
+- File listings
+- Quick actions
+
+### Dark Mode
+- System preference detection
+- Manual toggle
+- Persistent preference
+- Smooth transitions
+
+## 🔧 Configuration
+
+### Environment Variables
+
+Create a `.env.local` file (optional):
+
+```env
+# No environment variables required for basic setup
+```
+
+### Updating Data
+
+The app uses `data/index.json` generated from the repository metadata:
+
+```bash
+# From the repository root
+python3 scripts/generate_metadata.py
+
+# Copy to web/data
+cp scripts/index.json web/data/
+```
+
+## 🚀 Deployment
+
+### Vercel (Recommended)
+
+[](https://vercel.com/new/clone?repository-url=https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/web)
+
+```bash
+# Install Vercel CLI
+npm i -g vercel
+
+# Deploy
+vercel
+```
+
+### Other Platforms
+
+Build the static site:
+
+```bash
+npm run build
+```
+
+The output will be in `.next/`. Deploy using:
+- **Netlify**: Supports Next.js
+- **Cloudflare Pages**: Supports Next.js
+- **AWS Amplify**: Supports Next.js
+- **Docker**: Use the included Dockerfile (if created)
+
+## 📱 Browser Support
+
+- Chrome (latest)
+- Firefox (latest)
+- Safari (latest)
+- Edge (latest)
+- Mobile browsers (iOS Safari, Chrome Mobile)
+
+## 🤝 Contributing
+
+Contributions are welcome! Please see the main [CONTRIBUTING.md](../CONTRIBUTING.md) for guidelines.
+
+### Development Workflow
+
+1. Fork the repository
+2. Create a feature branch
+3. Make your changes
+4. Test thoroughly
+5. Submit a pull request
+
+## 📄 License
+
+This project is part of the [AI Prompts and Models Repository](https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools) and follows the same license.
+
+## 🙏 Acknowledgments
+
+- Built with [Next.js](https://nextjs.org/)
+- UI components inspired by [shadcn/ui](https://ui.shadcn.com/)
+- Icons from [Lucide](https://lucide.dev/)
+- Community contributions
+
+## 📞 Support
+
+- 🐛 [Report Issues](https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/issues)
+- 💬 [Discord Community](https://discord.gg/NwzrWErdMU)
+- 📧 Email: lucknitelol@proton.me
+
+## 🎯 Roadmap
+
+- [ ] Advanced filtering (by model, file count, etc.)
+- [ ] Export comparison as PDF/image
+- [ ] Favorites synchronization
+- [ ] Community ratings and reviews
+- [ ] API for programmatic access
+- [ ] Prompt visualization and analysis
+- [ ] Search result highlighting
+- [ ] Keyboard shortcuts
+
+---
+
+**Made with ❤️ by the AI Prompts Explorer community**
diff --git a/web/app/about/page.tsx b/web/app/about/page.tsx
new file mode 100644
index 00000000..ae87b1c4
--- /dev/null
+++ b/web/app/about/page.tsx
@@ -0,0 +1,211 @@
+import Link from 'next/link'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { Github, Heart, Code, Database, Search, BarChart3, GitCompare, Sparkles } from 'lucide-react'
+import { getStats } from '@/lib/data'
+import { formatNumber } from '@/lib/utils'
+
+export default function AboutPage() {
+ const stats = getStats()
+
+ const features = [
+ {
+ icon: Search,
+ title: 'Advanced Search',
+ description: 'Search and filter by category, company, model, or keyword with real-time results',
+ },
+ {
+ icon: GitCompare,
+ title: 'Side-by-Side Comparison',
+ description: 'Compare up to 4 tools simultaneously to analyze differences and similarities',
+ },
+ {
+ icon: BarChart3,
+ title: 'Analytics Dashboard',
+ description: 'Comprehensive statistics and visualizations of all AI tools',
+ },
+ {
+ icon: Code,
+ title: 'Complete Prompts',
+ description: 'Full system prompts and tool configurations, not just excerpts',
+ },
+ {
+ icon: Database,
+ title: 'Structured Data',
+ description: 'Organized metadata with files, models, categories, and companies',
+ },
+ {
+ icon: Sparkles,
+ title: 'Modern Interface',
+ description: 'Beautiful, responsive UI built with Next.js 15, React 19, and Tailwind CSS',
+ },
+ ]
+
+ const techStack = [
+ { name: 'Next.js 15', description: 'React framework with App Router' },
+ { name: 'React 19', description: 'Latest React with Server Components' },
+ { name: 'TypeScript', description: 'Type-safe development' },
+ { name: 'Tailwind CSS', description: 'Utility-first CSS framework' },
+ { name: 'Zustand', description: 'Lightweight state management' },
+ { name: 'Framer Motion', description: 'Animation library' },
+ ]
+
+ return (
+
+ {/* Hero */}
+
+
+
+ Version 2.0
+
+
+ About AI Prompts Explorer
+
+
+ The most comprehensive, searchable collection of AI tool system prompts and configurations.
+ Discover how {stats.total_tools}+ AI coding tools work under the hood.
+
+
+
+ {/* Stats */}
+
+
+
+ {stats.total_tools}+
+ AI Tools Documented
+
+
+
+
+ {stats.total_files}
+ Configuration Files
+
+
+
+
+ {formatNumber(stats.total_lines)}
+ Lines of Prompts
+
+
+
+
+ {Object.keys(stats.by_category).length}
+ Tool Categories
+
+
+
+
+ {/* Features */}
+
+
Features
+
+ {features.map((feature) => {
+ const Icon = feature.icon
+ return (
+
+
+
+ {feature.title}
+ {feature.description}
+
+
+ )
+ })}
+
+
+
+ {/* Tech Stack */}
+
+
Technology Stack
+
+ {techStack.map((tech) => (
+
+
+ {tech.name}
+ {tech.description}
+
+
+ ))}
+
+
+
+ {/* Mission */}
+
+
+ Our Mission
+
+ AI Prompts Explorer aims to provide transparency into how AI coding tools work by collecting,
+ organizing, and presenting their system prompts and configurations in an accessible way.
+
+
+ We believe that understanding how AI tools are configured helps developers:
+
+
+ Choose the right tools for their needs
+ Learn prompt engineering best practices
+ Understand AI tool capabilities and limitations
+ Build better AI-powered applications
+ Contribute to the open-source AI community
+
+
+
+
+ {/* Contributing */}
+
+
+
+
+
+
Contributing
+
+ This project is open source and welcomes contributions from the community. You can help by:
+
+
+ Adding new AI tool prompts and configurations
+ Updating existing tool information
+ Improving documentation
+ Reporting bugs or suggesting features
+ Sharing the project with others
+
+
+
+
+
+
+
+ {/* CTA */}
+
+
+ Start Exploring
+
+ Browse {stats.total_tools}+ AI tools and discover their system prompts
+
+
+ Browse All Tools
+
+
+
+
+ )
+}
diff --git a/web/app/browse/page.tsx b/web/app/browse/page.tsx
new file mode 100644
index 00000000..ac75a1d7
--- /dev/null
+++ b/web/app/browse/page.tsx
@@ -0,0 +1,265 @@
+'use client'
+
+import { useState, useMemo } from 'react'
+import { Filter, Grid, List, X } from 'lucide-react'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { Badge } from '@/components/ui/badge'
+import { Card } from '@/components/ui/card'
+import { ToolCard } from '@/components/tool-card'
+import { getAllTools, getCategories, getCompanies, getModels } from '@/lib/data'
+import { useAppStore } from '@/lib/store'
+import { AITool } from '@/lib/types'
+import { cn } from '@/lib/utils'
+
+export default function BrowsePage() {
+ const tools = getAllTools()
+ const categories = getCategories()
+ const companies = getCompanies()
+ const models = getModels()
+
+ const { viewMode, setViewMode } = useAppStore()
+ const [searchQuery, setSearchQuery] = useState('')
+ const [selectedCategories, setSelectedCategories] = useState([])
+ const [selectedTypes, setSelectedTypes] = useState([])
+ const [selectedCompanies, setSelectedCompanies] = useState([])
+ const [showFilters, setShowFilters] = useState(false)
+
+ // Filter tools
+ const filteredTools = useMemo(() => {
+ return tools.filter((tool) => {
+ // Search filter
+ if (searchQuery) {
+ const query = searchQuery.toLowerCase()
+ const matchesSearch =
+ tool.name.toLowerCase().includes(query) ||
+ tool.description.toLowerCase().includes(query) ||
+ tool.company.toLowerCase().includes(query) ||
+ tool.category.toLowerCase().includes(query) ||
+ tool.models.some((m) => m.toLowerCase().includes(query))
+
+ if (!matchesSearch) return false
+ }
+
+ // Category filter
+ if (selectedCategories.length > 0 && !selectedCategories.includes(tool.category)) {
+ return false
+ }
+
+ // Type filter
+ if (selectedTypes.length > 0 && !selectedTypes.includes(tool.type)) {
+ return false
+ }
+
+ // Company filter
+ if (selectedCompanies.length > 0 && !selectedCompanies.includes(tool.company)) {
+ return false
+ }
+
+ return true
+ })
+ }, [tools, searchQuery, selectedCategories, selectedTypes, selectedCompanies])
+
+ const toggleCategory = (category: string) => {
+ setSelectedCategories((prev) =>
+ prev.includes(category) ? prev.filter((c) => c !== category) : [...prev, category]
+ )
+ }
+
+ const toggleType = (type: string) => {
+ setSelectedTypes((prev) =>
+ prev.includes(type) ? prev.filter((t) => t !== type) : [...prev, type]
+ )
+ }
+
+ const toggleCompany = (company: string) => {
+ setSelectedCompanies((prev) =>
+ prev.includes(company) ? prev.filter((c) => c !== company) : [...prev, company]
+ )
+ }
+
+ const clearFilters = () => {
+ setSearchQuery('')
+ setSelectedCategories([])
+ setSelectedTypes([])
+ setSelectedCompanies([])
+ }
+
+ const hasActiveFilters =
+ searchQuery || selectedCategories.length > 0 || selectedTypes.length > 0 || selectedCompanies.length > 0
+
+ return (
+
+ {/* Header */}
+
+
Browse AI Tools
+
+ Explore {tools.length} AI coding tools and their system prompts
+
+
+
+ {/* Search and Controls */}
+
+
+
setSearchQuery(e.target.value)}
+ className="flex-1"
+ />
+
+
setShowFilters(!showFilters)}
+ className="flex-1 sm:flex-none"
+ >
+
+ Filters
+ {hasActiveFilters && (
+
+ {[selectedCategories, selectedTypes, selectedCompanies]
+ .reduce((acc, arr) => acc + arr.length, 0)}
+
+ )}
+
+
+ setViewMode('grid')}
+ className="rounded-r-none"
+ >
+
+
+ setViewMode('list')}
+ className="rounded-l-none"
+ >
+
+
+
+
+
+
+ {/* Active Filters */}
+ {hasActiveFilters && (
+
+ Active filters:
+ {selectedCategories.map((cat) => (
+
+ {cat}
+ toggleCategory(cat)} />
+
+ ))}
+ {selectedTypes.map((type) => (
+
+ {type}
+ toggleType(type)} />
+
+ ))}
+ {selectedCompanies.map((company) => (
+
+ {company}
+ toggleCompany(company)} />
+
+ ))}
+
+ Clear all
+
+
+ )}
+
+
+ {/* Filters Sidebar */}
+ {showFilters && (
+
+
+ {/* Categories */}
+
+
Categories
+
+ {categories.slice(0, 8).map((category) => (
+
+ toggleCategory(category)}
+ className="rounded"
+ />
+ {category}
+
+ ))}
+
+
+
+ {/* Types */}
+
+
Type
+
+ {['proprietary', 'open-source'].map((type) => (
+
+ toggleType(type)}
+ className="rounded"
+ />
+ {type}
+
+ ))}
+
+
+
+ {/* Companies */}
+
+
Companies
+
+ {companies.slice(0, 10).map((company) => (
+
+ toggleCompany(company)}
+ className="rounded"
+ />
+ {company}
+
+ ))}
+
+
+
+
+ )}
+
+ {/* Results */}
+
+
+ Showing {filteredTools.length} of {tools.length} tools
+
+
+
+ {/* Tools Grid/List */}
+ {filteredTools.length > 0 ? (
+
+ {filteredTools.map((tool) => (
+
+ ))}
+
+ ) : (
+
+ No tools found matching your criteria
+ Clear Filters
+
+ )}
+
+ )
+}
diff --git a/web/app/compare/page.tsx b/web/app/compare/page.tsx
new file mode 100644
index 00000000..b944a97a
--- /dev/null
+++ b/web/app/compare/page.tsx
@@ -0,0 +1,203 @@
+'use client'
+
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { useAppStore } from '@/lib/store'
+import { getToolByDirectory } from '@/lib/data'
+import { formatNumber, formatBytes } from '@/lib/utils'
+import { X, FileText, Code, Package } from 'lucide-react'
+import Link from 'next/link'
+
+export default function ComparePage() {
+ const { comparison, removeFromComparison, clearComparison } = useAppStore()
+
+ const tools = comparison.map((dir) => getToolByDirectory(dir)).filter(Boolean)
+
+ if (tools.length === 0) {
+ return (
+
+
+
+ No Tools Selected
+
+ Add tools to comparison from the browse page to see side-by-side comparison
+
+
+ Browse Tools
+
+
+
+ )
+ }
+
+ const comparisonData = [
+ {
+ label: 'Company',
+ getValue: (tool: any) => tool.company,
+ },
+ {
+ label: 'Category',
+ getValue: (tool: any) => tool.category,
+ },
+ {
+ label: 'Type',
+ getValue: (tool: any) => {tool.type} ,
+ },
+ {
+ label: 'Files',
+ getValue: (tool: any) => tool.file_count,
+ },
+ {
+ label: 'Total Lines',
+ getValue: (tool: any) => formatNumber(tool.total_lines),
+ },
+ {
+ label: 'Models',
+ getValue: (tool: any) => (
+
+ {tool.models.length > 0 ? (
+ tool.models.slice(0, 3).map((model: string) => (
+
+ {model}
+
+ ))
+ ) : (
+ None specified
+ )}
+
+ ),
+ },
+ {
+ label: 'Website',
+ getValue: (tool: any) =>
+ tool.website ? (
+
+ Visit
+
+ ) : (
+ N/A
+ ),
+ },
+ ]
+
+ return (
+
+ {/* Header */}
+
+
+
Compare Tools
+ {tools.length > 0 && (
+
+
+ Clear All
+
+ )}
+
+
+ Comparing {tools.length} of 4 maximum tools
+
+
+
+ {/* Comparison Table */}
+
+
+
+ {/* Header Row */}
+
Tool
+ {tools.map((tool) => (
+
+
+
+
+ {tool!.name}
+
+
removeFromComparison(tool!.directory)}
+ className="h-6 w-6 flex-shrink-0"
+ >
+
+
+
+
+
+ ))}
+
+ {/* Description Row */}
+
Description
+ {tools.map((tool) => (
+
+ ))}
+
+ {/* Comparison Rows */}
+ {comparisonData.map((row, index) => (
+
+
+ {row.label}
+
+ {tools.map((tool) => (
+
+ ))}
+
+ ))}
+
+ {/* Files Row */}
+
Files
+ {tools.map((tool) => (
+
+
+ {tool!.files.slice(0, 5).map((file) => (
+
+
+ {file.name}
+
+ ))}
+ {tool!.files.length > 5 && (
+
+ +{tool!.files.length - 5} more files
+
+ )}
+
+
+ ))}
+
+ {/* Actions Row */}
+
Actions
+ {tools.map((tool) => (
+
+
+
+ View Details
+
+
+
+ ))}
+
+
+
+
+ {/* Add More */}
+ {tools.length < 4 && (
+
+
+ You can compare up to {4 - tools.length} more tool{tools.length < 3 ? 's' : ''}
+
+
+ Add More Tools
+
+
+ )}
+
+ )
+}
diff --git a/web/app/globals.css b/web/app/globals.css
new file mode 100644
index 00000000..aa2623b8
--- /dev/null
+++ b/web/app/globals.css
@@ -0,0 +1,109 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+ --primary: 221.2 83.2% 53.3%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 221.2 83.2% 53.3%;
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --primary: 217.2 91.2% 59.8%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 224.3 76.3% 48%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ font-feature-settings: "rlig" 1, "calt" 1;
+ }
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
+
+/* Custom scrollbar */
+::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+
+::-webkit-scrollbar-track {
+ @apply bg-muted/30;
+}
+
+::-webkit-scrollbar-thumb {
+ @apply bg-muted-foreground/30 rounded-md;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ @apply bg-muted-foreground/50;
+}
+
+/* Gradient backgrounds */
+.gradient-bg {
+ background: linear-gradient(135deg, hsl(var(--primary)) 0%, hsl(var(--accent)) 100%);
+}
+
+.gradient-text {
+ background: linear-gradient(135deg, hsl(var(--primary)) 0%, hsl(var(--accent)) 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+/* Glass morphism */
+.glass {
+ background: rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.dark .glass {
+ background: rgba(0, 0, 0, 0.3);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
diff --git a/web/app/layout.tsx b/web/app/layout.tsx
new file mode 100644
index 00000000..fbc2acf7
--- /dev/null
+++ b/web/app/layout.tsx
@@ -0,0 +1,45 @@
+import type { Metadata } from 'next'
+import { Inter } from 'next/font/google'
+import './globals.css'
+import { Navbar } from '@/components/navbar'
+import { Footer } from '@/components/footer'
+import { ThemeProvider } from '@/components/theme-provider'
+
+const inter = Inter({ subsets: ['latin'] })
+
+export const metadata: Metadata = {
+ title: 'AI Prompts Explorer - System Prompts & AI Tool Configurations',
+ description: 'Explore 32+ AI coding tools, their system prompts, and configurations. The most comprehensive collection of AI tool prompts.',
+ keywords: ['AI', 'prompts', 'system prompts', 'AI tools', 'LLM', 'GPT', 'Claude', 'code assistant'],
+ authors: [{ name: 'AI Prompts Explorer' }],
+ openGraph: {
+ title: 'AI Prompts Explorer',
+ description: 'Explore 32+ AI coding tools and their system prompts',
+ type: 'website',
+ },
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+
+
+
+ {children}
+
+
+
+
+
+ )
+}
diff --git a/web/app/loading.tsx b/web/app/loading.tsx
new file mode 100644
index 00000000..cf8388bc
--- /dev/null
+++ b/web/app/loading.tsx
@@ -0,0 +1,13 @@
+export default function Loading() {
+ return (
+
+ )
+}
diff --git a/web/app/not-found.tsx b/web/app/not-found.tsx
new file mode 100644
index 00000000..839531f0
--- /dev/null
+++ b/web/app/not-found.tsx
@@ -0,0 +1,34 @@
+import Link from 'next/link'
+import { Button } from '@/components/ui/button'
+import { Card } from '@/components/ui/card'
+import { Home, Search } from 'lucide-react'
+
+export default function NotFound() {
+ return (
+
+
+
+ 404
+
+ Page Not Found
+
+ The page you're looking for doesn't exist or has been moved.
+
+
+
+
+
+ Go Home
+
+
+
+
+
+ Browse Tools
+
+
+
+
+
+ )
+}
diff --git a/web/app/page.tsx b/web/app/page.tsx
new file mode 100644
index 00000000..ef311edd
--- /dev/null
+++ b/web/app/page.tsx
@@ -0,0 +1,217 @@
+import Link from 'next/link'
+import { Button } from '@/components/ui/button'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { ArrowRight, Search, BarChart3, GitCompare, Sparkles, Code, Zap, Shield } from 'lucide-react'
+import { getAllTools, getStats, getCategories } from '@/lib/data'
+import { formatNumber } from '@/lib/utils'
+import { ToolCard } from '@/components/tool-card'
+
+export default function HomePage() {
+ const stats = getStats()
+ const tools = getAllTools()
+ const categories = getCategories()
+ const featuredTools = tools.slice(0, 6)
+
+ return (
+
+ {/* Hero Section */}
+
+
+
+
+
+
+ Version 2.0 - Now with Web Interface!
+
+
+
+ Explore AI Tool
+
+ System Prompts
+
+
+
+
+ The most comprehensive collection of AI coding tool system prompts and configurations.
+ Discover how {stats.total_tools}+ AI tools work under the hood.
+
+
+
+
+
+ Browse All Tools
+
+
+
+
+
+ View Statistics
+
+
+
+
+
+ {/* Stats Grid */}
+
+
+
+ {stats.total_tools}+
+
+
AI Tools
+
+
+
+ {stats.total_files}
+
+
Files
+
+
+
+ {formatNumber(stats.total_lines)}
+
+
Lines
+
+
+
+ {categories.length}
+
+
Categories
+
+
+
+
+
+
+ {/* Features Section */}
+
+
+
+ Why AI Prompts Explorer?
+
+
+ Discover, compare, and understand AI tool system prompts
+
+
+
+
+
+
+
+ Advanced Search
+
+ Search and filter by category, company, model, or keyword
+
+
+
+
+
+
+
+ Tool Comparison
+
+ Compare up to 4 tools side-by-side to see differences
+
+
+
+
+
+
+
+ Analytics & Stats
+
+ Visualize trends and statistics across all AI tools
+
+
+
+
+
+
+
+ Complete Prompts
+
+ Full system prompts and tool configurations included
+
+
+
+
+
+
+
+ Regular Updates
+
+ New tools and updates added regularly from the community
+
+
+
+
+
+
+
+ Open Source
+
+ Fully open source with community contributions welcome
+
+
+
+
+
+
+ {/* Featured Tools Section */}
+
+
+
+
+ Featured AI Tools
+
+
+ Explore some of the most popular AI coding tools and their system prompts
+
+
+
+
+ {featuredTools.map((tool) => (
+
+ ))}
+
+
+
+
+
+ View All {stats.total_tools} Tools
+
+
+
+
+
+
+
+ {/* CTA Section */}
+
+
+
+
+ Ready to Explore AI Prompts?
+
+
+ Start browsing our collection of {stats.total_tools}+ AI tools and discover how they work
+
+
+
+
+
+
+ )
+}
diff --git a/web/app/stats/page.tsx b/web/app/stats/page.tsx
new file mode 100644
index 00000000..b1903a2b
--- /dev/null
+++ b/web/app/stats/page.tsx
@@ -0,0 +1,210 @@
+'use client'
+
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { getAllTools, getStats, getCategoryIcon, getCategoryColor } from '@/lib/data'
+import { formatNumber } from '@/lib/utils'
+import { BarChart3, TrendingUp, Package, FileText, Code } from 'lucide-react'
+
+export default function StatsPage() {
+ const stats = getStats()
+ const tools = getAllTools()
+
+ // Calculate additional stats
+ const topByLines = [...tools].sort((a, b) => b.total_lines - a.total_lines).slice(0, 10)
+ const topByFiles = [...tools].sort((a, b) => b.file_count - a.file_count).slice(0, 10)
+
+ // Get max values for scaling
+ const maxByCategory = Math.max(...Object.values(stats.by_category))
+
+ return (
+
+ {/* Header */}
+
+
Statistics & Analytics
+
+ Comprehensive insights into AI tools and their configurations
+
+
+
+ {/* Overview Stats */}
+
+
+
+ Total AI Tools
+ {stats.total_tools}
+
+
+
+
+ Across {Object.keys(stats.by_category).length} categories
+
+
+
+
+
+
+ Total Files
+ {stats.total_files}
+
+
+
+
+ Configuration & prompt files
+
+
+
+
+
+
+ Total Lines
+ {formatNumber(stats.total_lines)}
+
+
+
+
+ Of system prompts & configs
+
+
+
+
+
+
+ Average per Tool
+
+ {Math.round(stats.total_lines / stats.total_tools)}
+
+
+
+
+
+ Lines per tool
+
+
+
+
+
+ {/* Category Distribution */}
+
+
+ Tools by Category
+ Distribution across all categories
+
+
+
+ {Object.entries(stats.by_category)
+ .sort(([, a], [, b]) => b - a)
+ .map(([category, count]) => {
+ const percentage = (count / maxByCategory) * 100
+ return (
+
+
+
+ {getCategoryIcon(category)}
+ {category}
+
+
{count} tools
+
+
+
+ )
+ })}
+
+
+
+
+
+ {/* Top by Lines */}
+
+
+ Most Complex (by lines)
+ Tools with the most lines of code
+
+
+
+ {topByLines.map((tool, index) => (
+
+
+ {index + 1}
+
+
+
{tool.name}
+
{tool.company}
+
+
{formatNumber(tool.total_lines)} lines
+
+ ))}
+
+
+
+
+ {/* Top by Files */}
+
+
+ Most Files
+ Tools with the most configuration files
+
+
+
+ {topByFiles.map((tool, index) => (
+
+
+ {index + 1}
+
+
+
{tool.name}
+
{tool.company}
+
+
{tool.file_count} files
+
+ ))}
+
+
+
+
+
+ {/* Type Distribution */}
+
+
+ Open Source vs Proprietary
+ Distribution by tool type
+
+
+
+ {Object.entries(stats.by_type).map(([type, count]) => {
+ const percentage = (count / stats.total_tools) * 100
+ return (
+
+
+
{type}
+
+ {count} tools
+
+ {percentage.toFixed(1)}%
+
+
+
+
+
+ )
+ })}
+
+
+
+
+ )
+}
diff --git a/web/app/tool/[slug]/page.tsx b/web/app/tool/[slug]/page.tsx
new file mode 100644
index 00000000..f85afb43
--- /dev/null
+++ b/web/app/tool/[slug]/page.tsx
@@ -0,0 +1,225 @@
+import { notFound } from 'next/navigation'
+import Link from 'next/link'
+import { ArrowLeft, ExternalLink, FileText, Code, Calendar, GitCompare, Heart } from 'lucide-react'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { getAllTools, getCategoryIcon, getCategoryColor } from '@/lib/data'
+import { formatNumber, formatBytes, slugify } from '@/lib/utils'
+
+export async function generateStaticParams() {
+ const tools = getAllTools()
+ return tools.map((tool) => ({
+ slug: slugify(tool.directory),
+ }))
+}
+
+export default function ToolDetailPage({ params }: { params: { slug: string } }) {
+ const tools = getAllTools()
+ const tool = tools.find((t) => slugify(t.directory) === params.slug)
+
+ if (!tool) {
+ notFound()
+ }
+
+ return (
+
+ {/* Back Button */}
+
+
+
+ Back to Browse
+
+
+
+ {/* Header */}
+
+
+
{getCategoryIcon(tool.category)}
+
+
+
{tool.name}
+ {tool.category}
+ {tool.type}
+
+
{tool.company}
+
{tool.description}
+
+
+
+ {/* Quick Stats */}
+
+
+
+ Files
+ {tool.file_count}
+
+
+
+
+ Total Lines
+ {formatNumber(tool.total_lines)}
+
+
+
+
+ Models
+ {tool.models.length || '-'}
+
+
+
+
+ Category
+ {tool.category}
+
+
+
+
+
+
+
+ {/* Files */}
+
+
+
+
+ Configuration Files
+
+
+ {tool.file_count} files containing system prompts and configurations
+
+
+
+
+ {tool.files.map((file) => (
+
+
+
{file.name}
+
+ {formatBytes(file.size)}
+ {file.lines && ` • ${formatNumber(file.lines)} lines`}
+
+
+
+ {file.type}
+
+
+ ))}
+
+
+
+
+ {/* Models */}
+ {tool.models.length > 0 && (
+
+
+
+
+ AI Models
+
+ Models used or supported by this tool
+
+
+
+ {tool.models.map((model) => (
+
+ {model}
+
+ ))}
+
+
+
+ )}
+
+ {/* Subcategories */}
+ {tool.subcategories && tool.subcategories.length > 0 && (
+
+
+ Related Tools
+ Other tools in this collection
+
+
+
+ {tool.subcategories.map((sub) => (
+
+ {sub}
+
+ ))}
+
+
+
+ )}
+
+
+ {/* Sidebar */}
+
+ {/* Actions */}
+
+
+ Actions
+
+
+ {tool.website && (
+
+
+
+ Visit Website
+
+
+ )}
+
+
+
+ View on GitHub
+
+
+
+
+ Add to Compare
+
+
+
+
+ {/* Info */}
+
+
+ Information
+
+
+
+
Company
+
{tool.company}
+
+
+
Category
+
{tool.category}
+
+
+
Type
+
+ {tool.type}
+
+
+
+
Total Size
+
+ {formatBytes(tool.files.reduce((acc, f) => acc + f.size, 0))}
+
+
+
+
+
+
+
+ )
+}
diff --git a/web/components/footer.tsx b/web/components/footer.tsx
new file mode 100644
index 00000000..a2294120
--- /dev/null
+++ b/web/components/footer.tsx
@@ -0,0 +1,123 @@
+import Link from 'next/link'
+import { Github, Heart, ExternalLink } from 'lucide-react'
+
+export function Footer() {
+ const currentYear = new Date().getFullYear()
+
+ return (
+
+
+
+ {/* About */}
+
+
AI Prompts Explorer
+
+ The most comprehensive collection of AI tool system prompts and configurations.
+
+
+
+
+
+
+
+
+ {/* Quick Links */}
+
+
Quick Links
+
+
+
+ Home
+
+
+
+
+ Browse Tools
+
+
+
+
+ Statistics
+
+
+
+
+ Compare Tools
+
+
+
+
+
+ {/* Resources */}
+
+
+ {/* Stats */}
+
+
Repository Stats
+
+ 32+ AI Tools
+ 96 Files
+ 20,000+ Lines
+ 11 Categories
+
+
+
+
+
+
+ Built with by the community
+ •
+ © {currentYear} AI Prompts Explorer
+
+
+
+
+ )
+}
diff --git a/web/components/navbar.tsx b/web/components/navbar.tsx
new file mode 100644
index 00000000..b7cdc804
--- /dev/null
+++ b/web/components/navbar.tsx
@@ -0,0 +1,209 @@
+'use client'
+
+import Link from 'next/link'
+import { usePathname } from 'next/navigation'
+import { Search, Moon, Sun, Menu, X, Home, Grid, BarChart3, BookOpen, GitCompare } from 'lucide-react'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { cn } from '@/lib/utils'
+import { useTheme } from 'next-themes'
+import { useState, useEffect } from 'react'
+import { useAppStore } from '@/lib/store'
+
+const navigation = [
+ { name: 'Home', href: '/', icon: Home },
+ { name: 'Browse', href: '/browse', icon: Grid },
+ { name: 'Statistics', href: '/stats', icon: BarChart3 },
+ { name: 'Compare', href: '/compare', icon: GitCompare },
+ { name: 'About', href: '/about', icon: BookOpen },
+]
+
+export function Navbar() {
+ const pathname = usePathname()
+ const { theme, setTheme } = useTheme()
+ const [mounted, setMounted] = useState(false)
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
+ const [searchQuery, setSearchQuery] = useState('')
+ const { filters, setFilters } = useAppStore()
+ const comparison = useAppStore((state) => state.comparison)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ const handleSearch = (e: React.FormEvent) => {
+ e.preventDefault()
+ setFilters({ search: searchQuery })
+ if (pathname !== '/browse') {
+ window.location.href = '/browse'
+ }
+ }
+
+ return (
+
+
+
+ {/* Logo */}
+
+
+
+ Prompts Explorer
+
+
+
+ {/* Desktop Navigation */}
+
+ {navigation.map((item) => {
+ const Icon = item.icon
+ const isActive = pathname === item.href
+ return (
+
+
+ {item.name}
+ {item.name === 'Compare' && comparison.length > 0 && (
+
+ {comparison.length}
+
+ )}
+
+ )
+ })}
+
+
+ {/* Search Bar */}
+
+
+ {/* Right Actions */}
+
+ {/* Theme Toggle */}
+ {mounted && (
+ setTheme(theme === 'dark' ? 'light' : 'dark')}
+ className="hidden sm:inline-flex"
+ >
+ {theme === 'dark' ? (
+
+ ) : (
+
+ )}
+ Toggle theme
+
+ )}
+
+ {/* Mobile Menu Button */}
+ setMobileMenuOpen(!mobileMenuOpen)}
+ className="md:hidden"
+ >
+ {mobileMenuOpen ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {/* Mobile Menu */}
+ {mobileMenuOpen && (
+
+ {/* Mobile Search */}
+
+
+ {/* Mobile Navigation Links */}
+
+ {navigation.map((item) => {
+ const Icon = item.icon
+ const isActive = pathname === item.href
+ return (
+ setMobileMenuOpen(false)}
+ className={cn(
+ 'flex items-center gap-3 px-3 py-2 rounded-md text-base font-medium transition-all',
+ isActive
+ ? 'bg-primary text-primary-foreground'
+ : 'text-muted-foreground hover:text-foreground hover:bg-muted'
+ )}
+ >
+
+ {item.name}
+ {item.name === 'Compare' && comparison.length > 0 && (
+
+ {comparison.length}
+
+ )}
+
+ )
+ })}
+
+
+ {/* Mobile Theme Toggle */}
+ {mounted && (
+
+ setTheme(theme === 'dark' ? 'light' : 'dark')}
+ className="w-full justify-start"
+ >
+ {theme === 'dark' ? (
+ <>
+
+ Light Mode
+ >
+ ) : (
+ <>
+
+ Dark Mode
+ >
+ )}
+
+
+ )}
+
+ )}
+
+
+ )
+}
diff --git a/web/components/theme-provider.tsx b/web/components/theme-provider.tsx
new file mode 100644
index 00000000..d4b4bbfd
--- /dev/null
+++ b/web/components/theme-provider.tsx
@@ -0,0 +1,9 @@
+'use client'
+
+import * as React from 'react'
+import { ThemeProvider as NextThemesProvider } from 'next-themes'
+import { type ThemeProviderProps } from 'next-themes/dist/types'
+
+export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
+ return {children}
+}
diff --git a/web/components/tool-card.tsx b/web/components/tool-card.tsx
new file mode 100644
index 00000000..db659440
--- /dev/null
+++ b/web/components/tool-card.tsx
@@ -0,0 +1,170 @@
+'use client'
+
+import Link from 'next/link'
+import { Heart, GitCompare, ExternalLink, FileText, Code } from 'lucide-react'
+import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { AITool } from '@/lib/types'
+import { getCategoryIcon, getCategoryColor } from '@/lib/data'
+import { useAppStore } from '@/lib/store'
+import { formatNumber, slugify } from '@/lib/utils'
+import { cn } from '@/lib/utils'
+
+interface ToolCardProps {
+ tool: AITool
+ variant?: 'default' | 'compact'
+}
+
+export function ToolCard({ tool, variant = 'default' }: ToolCardProps) {
+ const { favorites, addFavorite, removeFavorite, isFavorite } = useAppStore()
+ const { comparison, addToComparison, removeFromComparison, isInComparison } = useAppStore()
+
+ const favorite = isFavorite(tool.directory)
+ const inComparison = isInComparison(tool.directory)
+
+ const toggleFavorite = (e: React.MouseEvent) => {
+ e.preventDefault()
+ if (favorite) {
+ removeFavorite(tool.directory)
+ } else {
+ addFavorite(tool.directory)
+ }
+ }
+
+ const toggleComparison = (e: React.MouseEvent) => {
+ e.preventDefault()
+ if (inComparison) {
+ removeFromComparison(tool.directory)
+ } else if (comparison.length < 4) {
+ addToComparison(tool.directory)
+ }
+ }
+
+ if (variant === 'compact') {
+ return (
+
+
+
+
+
+
+ {tool.name}
+
+
+ {tool.company}
+
+
+
+ {getCategoryIcon(tool.category)}
+
+
+
+
+
+
+ {tool.category}
+
+ {tool.models.slice(0, 1).map((model) => (
+
+ {model}
+
+ ))}
+
+
+
+
+ )
+ }
+
+ return (
+
+
+
+
+
+
{getCategoryIcon(tool.category)}
+
{tool.category}
+
+
+ {tool.name}
+
+
+ {tool.company}
+
+
+
+
+
+
+ = 4}
+ >
+
+
+
+
+
+
+
+
+ {tool.description}
+
+
+
+ {/* Models */}
+ {tool.models.length > 0 && (
+
+ {tool.models.slice(0, 3).map((model) => (
+
+ {model}
+
+ ))}
+ {tool.models.length > 3 && (
+
+ +{tool.models.length - 3} more
+
+ )}
+
+ )}
+
+ {/* Stats */}
+
+
+
+ {tool.file_count} files
+
+
+
+ {formatNumber(tool.total_lines)} lines
+
+
+
+
+
+
+
+
+ View Details
+
+
+ {tool.website && (
+
+
+
+
+
+ )}
+
+
+ )
+}
diff --git a/web/components/ui/badge.tsx b/web/components/ui/badge.tsx
new file mode 100644
index 00000000..3ecb46eb
--- /dev/null
+++ b/web/components/ui/badge.tsx
@@ -0,0 +1,29 @@
+import * as React from 'react'
+import { cn } from '@/lib/utils'
+
+export interface BadgeProps extends React.HTMLAttributes {
+ variant?: 'default' | 'secondary' | 'destructive' | 'outline'
+}
+
+function Badge({ className, variant = 'default', ...props }: BadgeProps) {
+ return (
+
+ )
+}
+
+export { Badge }
diff --git a/web/components/ui/button.tsx b/web/components/ui/button.tsx
new file mode 100644
index 00000000..30795769
--- /dev/null
+++ b/web/components/ui/button.tsx
@@ -0,0 +1,44 @@
+import * as React from 'react'
+import { cn } from '@/lib/utils'
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes {
+ variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'
+ size?: 'default' | 'sm' | 'lg' | 'icon'
+}
+
+const Button = React.forwardRef(
+ ({ className, variant = 'default', size = 'default', ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Button.displayName = 'Button'
+
+export { Button }
diff --git a/web/components/ui/card.tsx b/web/components/ui/card.tsx
new file mode 100644
index 00000000..4e4835f3
--- /dev/null
+++ b/web/components/ui/card.tsx
@@ -0,0 +1,78 @@
+import * as React from 'react'
+import { cn } from '@/lib/utils'
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Card.displayName = 'Card'
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardHeader.displayName = 'CardHeader'
+
+const CardTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardTitle.displayName = 'CardTitle'
+
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardDescription.displayName = 'CardDescription'
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardContent.displayName = 'CardContent'
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardFooter.displayName = 'CardFooter'
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/web/components/ui/input.tsx b/web/components/ui/input.tsx
new file mode 100644
index 00000000..0b023677
--- /dev/null
+++ b/web/components/ui/input.tsx
@@ -0,0 +1,24 @@
+import * as React from 'react'
+import { cn } from '@/lib/utils'
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = 'Input'
+
+export { Input }
diff --git a/web/data/index.json b/web/data/index.json
new file mode 100644
index 00000000..4967fb85
--- /dev/null
+++ b/web/data/index.json
@@ -0,0 +1,1286 @@
+{
+ "generated": "2025-11-15T02:13:45.665898",
+ "repository": "system-prompts-and-models-of-ai-tools",
+ "version": "2.0",
+ "stats": {
+ "total_tools": 33,
+ "total_files": 98,
+ "total_lines": 20045,
+ "by_category": {
+ "AI Agent": 7,
+ "Foundation Model": 1,
+ "Code Assistant": 10,
+ "AI Assistant": 2,
+ "IDE": 4,
+ "Web Builder": 3,
+ "Document Assistant": 1,
+ "Collection": 1,
+ "Search Assistant": 1,
+ "Cloud IDE": 1,
+ "Terminal": 1,
+ "Unknown": 1
+ },
+ "by_type": {
+ "proprietary": 31,
+ "open-source": 1,
+ "unknown": 1
+ }
+ },
+ "tools": [
+ {
+ "name": "Amp",
+ "company": "Unknown",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "AI coding assistant",
+ "website": null,
+ "models": [],
+ "directory": "Amp",
+ "files": [
+ {
+ "name": "README.md",
+ "path": "Amp/README.md",
+ "size": 614,
+ "type": ".md",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 20
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 20
+ },
+ {
+ "name": "Anthropic",
+ "company": "Anthropic",
+ "category": "Foundation Model",
+ "type": "proprietary",
+ "description": "Claude Sonnet 4.5 and Claude Code 2.0 system prompts",
+ "website": "https://anthropic.com",
+ "models": [
+ "claude-sonnet-4.5",
+ "claude-code-2.0"
+ ],
+ "directory": "Anthropic",
+ "files": [
+ {
+ "name": "Sonnet 4.5 Prompt.txt",
+ "path": "Anthropic/Sonnet 4.5 Prompt.txt",
+ "size": 43200,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 382
+ },
+ {
+ "name": "Claude Code 2.0.txt",
+ "path": "Anthropic/Claude Code 2.0.txt",
+ "size": 57324,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 1150
+ },
+ {
+ "name": "README.md",
+ "path": "Anthropic/README.md",
+ "size": 1091,
+ "type": ".md",
+ "modified": "2025-11-15T02:04:41.177352",
+ "lines": 42
+ }
+ ],
+ "file_count": 3,
+ "total_lines": 1574
+ },
+ {
+ "name": "Augment Code",
+ "company": "Augment",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI-powered code completion and generation",
+ "website": "https://augmentcode.com",
+ "models": [
+ "claude-4-sonnet",
+ "gpt-5"
+ ],
+ "directory": "Augment Code",
+ "files": [
+ {
+ "name": "claude-4-sonnet-agent-prompts.txt",
+ "path": "Augment Code/claude-4-sonnet-agent-prompts.txt",
+ "size": 10836,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 159
+ },
+ {
+ "name": "gpt-5-tools.json",
+ "path": "Augment Code/gpt-5-tools.json",
+ "size": 19181,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "claude-4-sonnet-tools.json",
+ "path": "Augment Code/claude-4-sonnet-tools.json",
+ "size": 28992,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "gpt-5-agent-prompts.txt",
+ "path": "Augment Code/gpt-5-agent-prompts.txt",
+ "size": 15035,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 241
+ }
+ ],
+ "file_count": 4,
+ "total_lines": 400
+ },
+ {
+ "name": "Claude Code",
+ "company": "Anthropic",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "Claude's official coding interface system prompt and tools",
+ "website": "https://claude.ai/code",
+ "models": [
+ "claude-sonnet-4.5"
+ ],
+ "directory": "Claude Code",
+ "files": [
+ {
+ "name": "claude-code-system-prompt.txt",
+ "path": "Claude Code/claude-code-system-prompt.txt",
+ "size": 13019,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 191
+ },
+ {
+ "name": "claude-code-tools.json",
+ "path": "Claude Code/claude-code-tools.json",
+ "size": 48961,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 191
+ },
+ {
+ "name": "Cluely",
+ "company": "Cluely",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI coding assistant with default and enterprise modes",
+ "website": null,
+ "models": [],
+ "directory": "Cluely",
+ "files": [
+ {
+ "name": "Default Prompt.txt",
+ "path": "Cluely/Default Prompt.txt",
+ "size": 4534,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 95
+ },
+ {
+ "name": "Enterprise Prompt.txt",
+ "path": "Cluely/Enterprise Prompt.txt",
+ "size": 21306,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 471
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 566
+ },
+ {
+ "name": "CodeBuddy",
+ "company": "CodeBuddy",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "Chat and Craft mode prompts for code generation",
+ "website": null,
+ "models": [],
+ "directory": "CodeBuddy Prompts",
+ "files": [
+ {
+ "name": "Chat Prompt.txt",
+ "path": "CodeBuddy Prompts/Chat Prompt.txt",
+ "size": 1558,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 35
+ },
+ {
+ "name": "Craft Prompt.txt",
+ "path": "CodeBuddy Prompts/Craft Prompt.txt",
+ "size": 40617,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 678
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 713
+ },
+ {
+ "name": "Comet Assistant",
+ "company": "Comet",
+ "category": "AI Assistant",
+ "type": "proprietary",
+ "description": "General purpose AI coding assistant",
+ "website": null,
+ "models": [],
+ "directory": "Comet Assistant",
+ "files": [
+ {
+ "name": "System Prompt.txt",
+ "path": "Comet Assistant/System Prompt.txt",
+ "size": 10918,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 164
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 164
+ },
+ {
+ "name": "Cursor",
+ "company": "Cursor",
+ "category": "IDE",
+ "type": "proprietary",
+ "description": "AI-first code editor with multiple agent modes",
+ "website": "https://cursor.com",
+ "models": [
+ "claude",
+ "gpt-4"
+ ],
+ "directory": "Cursor Prompts",
+ "files": [
+ {
+ "name": "Chat Prompt.txt",
+ "path": "Cursor Prompts/Chat Prompt.txt",
+ "size": 12569,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 119
+ },
+ {
+ "name": "Memory Rating Prompt.txt",
+ "path": "Cursor Prompts/Memory Rating Prompt.txt",
+ "size": 7152,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 86
+ },
+ {
+ "name": "Agent CLI Prompt 2025-08-07.txt",
+ "path": "Cursor Prompts/Agent CLI Prompt 2025-08-07.txt",
+ "size": 14067,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 206
+ },
+ {
+ "name": "Agent Prompt.txt",
+ "path": "Cursor Prompts/Agent Prompt.txt",
+ "size": 18454,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 62
+ },
+ {
+ "name": "Agent Prompt 2025-09-03.txt",
+ "path": "Cursor Prompts/Agent Prompt 2025-09-03.txt",
+ "size": 19028,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 229
+ },
+ {
+ "name": "Memory Prompt.txt",
+ "path": "Cursor Prompts/Memory Prompt.txt",
+ "size": 5258,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 68
+ },
+ {
+ "name": "Agent Prompt v1.0.txt",
+ "path": "Cursor Prompts/Agent Prompt v1.0.txt",
+ "size": 9023,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 83
+ },
+ {
+ "name": "Agent Tools v1.0.json",
+ "path": "Cursor Prompts/Agent Tools v1.0.json",
+ "size": 23545,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Agent Prompt v1.2.txt",
+ "path": "Cursor Prompts/Agent Prompt v1.2.txt",
+ "size": 32197,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 568
+ },
+ {
+ "name": "README.md",
+ "path": "Cursor Prompts/README.md",
+ "size": 1898,
+ "type": ".md",
+ "modified": "2025-11-15T02:04:41.392355",
+ "lines": 65
+ }
+ ],
+ "file_count": 10,
+ "total_lines": 1486
+ },
+ {
+ "name": "Devin",
+ "company": "Cognition AI",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "Autonomous AI software engineer",
+ "website": "https://devin.ai",
+ "models": [],
+ "directory": "Devin AI",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "Devin AI/Prompt.txt",
+ "size": 34714,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 402
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 402
+ },
+ {
+ "name": "Emergent",
+ "company": "Emergent",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "AI coding agent with tools",
+ "website": null,
+ "models": [],
+ "directory": "Emergent",
+ "files": [
+ {
+ "name": "Tools.json",
+ "path": "Emergent/Tools.json",
+ "size": 7880,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Emergent/Prompt.txt",
+ "size": 37424,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 946
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 946
+ },
+ {
+ "name": "Junie",
+ "company": "Junie",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI coding assistant",
+ "website": null,
+ "models": [],
+ "directory": "Junie",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "Junie/Prompt.txt",
+ "size": 6184,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 120
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 120
+ },
+ {
+ "name": "Kiro",
+ "company": "Kiro",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "Multi-mode AI assistant (Spec, Vibe, Mode Classifier)",
+ "website": null,
+ "models": [],
+ "directory": "Kiro",
+ "files": [
+ {
+ "name": "Mode_Clasifier_Prompt.txt",
+ "path": "Kiro/Mode_Clasifier_Prompt.txt",
+ "size": 2883,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 64
+ },
+ {
+ "name": "Vibe_Prompt.txt",
+ "path": "Kiro/Vibe_Prompt.txt",
+ "size": 14151,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 196
+ },
+ {
+ "name": "Spec_Prompt.txt",
+ "path": "Kiro/Spec_Prompt.txt",
+ "size": 31947,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 515
+ }
+ ],
+ "file_count": 3,
+ "total_lines": 775
+ },
+ {
+ "name": "Leap",
+ "company": "Leap",
+ "category": "Web Builder",
+ "type": "proprietary",
+ "description": "AI-powered web application builder",
+ "website": "https://leap.new",
+ "models": [],
+ "directory": "Leap.new",
+ "files": [
+ {
+ "name": "Prompts.txt",
+ "path": "Leap.new/Prompts.txt",
+ "size": 52456,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 1237
+ },
+ {
+ "name": "tools.json",
+ "path": "Leap.new/tools.json",
+ "size": 16553,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 1237
+ },
+ {
+ "name": "Lovable",
+ "company": "Lovable",
+ "category": "Web Builder",
+ "type": "proprietary",
+ "description": "AI-powered app builder",
+ "website": "https://lovable.dev",
+ "models": [],
+ "directory": "Lovable",
+ "files": [
+ {
+ "name": "Agent Tools.json",
+ "path": "Lovable/Agent Tools.json",
+ "size": 27944,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Agent Prompt.txt",
+ "path": "Lovable/Agent Prompt.txt",
+ "size": 20301,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 304
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 304
+ },
+ {
+ "name": "Manus",
+ "company": "Manus",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "Agent with loop, modules, and tools",
+ "website": null,
+ "models": [],
+ "directory": "Manus Agent Tools & Prompt",
+ "files": [
+ {
+ "name": "Modules.txt",
+ "path": "Manus Agent Tools & Prompt/Modules.txt",
+ "size": 12224,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 206
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Manus Agent Tools & Prompt/Prompt.txt",
+ "size": 10209,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 250
+ },
+ {
+ "name": "Agent loop.txt",
+ "path": "Manus Agent Tools & Prompt/Agent loop.txt",
+ "size": 2147,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 33
+ },
+ {
+ "name": "tools.json",
+ "path": "Manus Agent Tools & Prompt/tools.json",
+ "size": 18501,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ }
+ ],
+ "file_count": 4,
+ "total_lines": 489
+ },
+ {
+ "name": "Notion AI",
+ "company": "Notion",
+ "category": "Document Assistant",
+ "type": "proprietary",
+ "description": "AI assistant integrated into Notion",
+ "website": "https://notion.so",
+ "models": [],
+ "directory": "NotionAi",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "NotionAi/Prompt.txt",
+ "size": 32081,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 474
+ },
+ {
+ "name": "tools.json",
+ "path": "NotionAi/tools.json",
+ "size": 34889,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 474
+ },
+ {
+ "name": "Open Source AI Tools",
+ "company": "Various",
+ "category": "Collection",
+ "type": "open-source",
+ "description": "Collection of open-source AI coding tools",
+ "website": null,
+ "models": [],
+ "subcategories": [
+ "Bolt",
+ "Cline",
+ "Codex CLI",
+ "Gemini CLI",
+ "Lumo",
+ "RooCode"
+ ],
+ "directory": "Open Source prompts",
+ "files": [
+ {
+ "name": "README.md",
+ "path": "Open Source prompts/README.md",
+ "size": 2142,
+ "type": ".md",
+ "modified": "2025-11-15T02:04:41.602358",
+ "lines": 77
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Open Source prompts/Bolt/Prompt.txt",
+ "size": 21945,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 470
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Open Source prompts/Cline/Prompt.txt",
+ "size": 47083,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 607
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Open Source prompts/Lumo/Prompt.txt",
+ "size": 8253,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 172
+ },
+ {
+ "name": "google-gemini-cli-system-prompt.txt",
+ "path": "Open Source prompts/Gemini CLI/google-gemini-cli-system-prompt.txt",
+ "size": 18976,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 188
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Open Source prompts/RooCode/Prompt.txt",
+ "size": 43961,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 665
+ },
+ {
+ "name": "openai-codex-cli-system-prompt-20250820.txt",
+ "path": "Open Source prompts/Codex CLI/openai-codex-cli-system-prompt-20250820.txt",
+ "size": 23864,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 342
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Open Source prompts/Codex CLI/Prompt.txt",
+ "size": 4848,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 46
+ }
+ ],
+ "file_count": 8,
+ "total_lines": 2567
+ },
+ {
+ "name": "Orchids",
+ "company": "Orchids",
+ "category": "AI Assistant",
+ "type": "proprietary",
+ "description": "AI assistant with decision-making capabilities",
+ "website": "https://orchids.app",
+ "models": [],
+ "directory": "Orchids.app",
+ "files": [
+ {
+ "name": "Decision-making prompt.txt",
+ "path": "Orchids.app/Decision-making prompt.txt",
+ "size": 6820,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 103
+ },
+ {
+ "name": "System Prompt.txt",
+ "path": "Orchids.app/System Prompt.txt",
+ "size": 58779,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 1014
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 1117
+ },
+ {
+ "name": "Perplexity",
+ "company": "Perplexity AI",
+ "category": "Search Assistant",
+ "type": "proprietary",
+ "description": "AI-powered search and answer engine",
+ "website": "https://perplexity.ai",
+ "models": [],
+ "directory": "Perplexity",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "Perplexity/Prompt.txt",
+ "size": 9585,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 195
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 195
+ },
+ {
+ "name": "Poke",
+ "company": "Poke",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "Multi-part agent system (6 parts + agent)",
+ "website": null,
+ "models": [],
+ "directory": "Poke",
+ "files": [
+ {
+ "name": "Poke_p1.txt",
+ "path": "Poke/Poke_p1.txt",
+ "size": 10153,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 130
+ },
+ {
+ "name": "Poke_p6.txt",
+ "path": "Poke/Poke_p6.txt",
+ "size": 1783,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 20
+ },
+ {
+ "name": "Poke_p3.txt",
+ "path": "Poke/Poke_p3.txt",
+ "size": 5493,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 54
+ },
+ {
+ "name": "Poke_p5.txt",
+ "path": "Poke/Poke_p5.txt",
+ "size": 1158,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 24
+ },
+ {
+ "name": "Poke_p4.txt",
+ "path": "Poke/Poke_p4.txt",
+ "size": 5890,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 55
+ },
+ {
+ "name": "Poke agent.txt",
+ "path": "Poke/Poke agent.txt",
+ "size": 12159,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 194
+ },
+ {
+ "name": "Poke_p2.txt",
+ "path": "Poke/Poke_p2.txt",
+ "size": 2440,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 26
+ }
+ ],
+ "file_count": 7,
+ "total_lines": 503
+ },
+ {
+ "name": "Qoder",
+ "company": "Qoder",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "Quest-based code assistant (Design, Action)",
+ "website": null,
+ "models": [],
+ "directory": "Qoder",
+ "files": [
+ {
+ "name": "Quest Action.txt",
+ "path": "Qoder/Quest Action.txt",
+ "size": 12357,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 190
+ },
+ {
+ "name": "prompt.txt",
+ "path": "Qoder/prompt.txt",
+ "size": 18620,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 377
+ },
+ {
+ "name": "Quest Design.txt",
+ "path": "Qoder/Quest Design.txt",
+ "size": 26165,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 504
+ }
+ ],
+ "file_count": 3,
+ "total_lines": 1071
+ },
+ {
+ "name": "Replit Agent",
+ "company": "Replit",
+ "category": "Cloud IDE",
+ "type": "proprietary",
+ "description": "AI agent for Replit cloud development environment",
+ "website": "https://replit.com",
+ "models": [],
+ "directory": "Replit",
+ "files": [
+ {
+ "name": "Tools.json",
+ "path": "Replit/Tools.json",
+ "size": 25003,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Replit/Prompt.txt",
+ "size": 8110,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 137
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 137
+ },
+ {
+ "name": "Same",
+ "company": "Same",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI coding assistant",
+ "website": "https://same.dev",
+ "models": [],
+ "directory": "Same.dev",
+ "files": [
+ {
+ "name": "Tools.json",
+ "path": "Same.dev/Tools.json",
+ "size": 22357,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "Same.dev/Prompt.txt",
+ "size": 34890,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 315
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 315
+ },
+ {
+ "name": "Trae",
+ "company": "Trae",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "Builder and chat modes for development",
+ "website": null,
+ "models": [],
+ "directory": "Trae",
+ "files": [
+ {
+ "name": "Chat Prompt.txt",
+ "path": "Trae/Chat Prompt.txt",
+ "size": 8443,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 112
+ },
+ {
+ "name": "Builder Prompt.txt",
+ "path": "Trae/Builder Prompt.txt",
+ "size": 18569,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 266
+ },
+ {
+ "name": "Builder Tools.json",
+ "path": "Trae/Builder Tools.json",
+ "size": 8264,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ }
+ ],
+ "file_count": 3,
+ "total_lines": 378
+ },
+ {
+ "name": "Traycer",
+ "company": "Traycer",
+ "category": "AI Agent",
+ "type": "proprietary",
+ "description": "Multi-mode agent (Phase, Plan)",
+ "website": null,
+ "models": [],
+ "directory": "Traycer AI",
+ "files": [
+ {
+ "name": "phase_mode_prompts.txt",
+ "path": "Traycer AI/phase_mode_prompts.txt",
+ "size": 3842,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 46
+ },
+ {
+ "name": "phase_mode_tools.json",
+ "path": "Traycer AI/phase_mode_tools.json",
+ "size": 18618,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "plan_mode_tools.json",
+ "path": "Traycer AI/plan_mode_tools.json",
+ "size": 16752,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "plan_mode_prompts.txt",
+ "path": "Traycer AI/plan_mode_prompts.txt",
+ "size": 6143,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 92
+ }
+ ],
+ "file_count": 4,
+ "total_lines": 138
+ },
+ {
+ "name": "VSCode Copilot Agent",
+ "company": "Microsoft/GitHub",
+ "category": "IDE",
+ "type": "proprietary",
+ "description": "GitHub Copilot agent for VSCode",
+ "website": "https://code.visualstudio.com",
+ "models": [
+ "gpt-4",
+ "gpt-4.1",
+ "gpt-5",
+ "gpt-5-mini",
+ "claude-sonnet-4",
+ "gemini-2.5-pro"
+ ],
+ "directory": "VSCode Agent",
+ "files": [
+ {
+ "name": "chat-titles.txt",
+ "path": "VSCode Agent/chat-titles.txt",
+ "size": 765,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 12
+ },
+ {
+ "name": "gemini-2.5-pro.txt",
+ "path": "VSCode Agent/gemini-2.5-pro.txt",
+ "size": 9909,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 144
+ },
+ {
+ "name": "gpt-4.1.txt",
+ "path": "VSCode Agent/gpt-4.1.txt",
+ "size": 11082,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 141
+ },
+ {
+ "name": "gpt-5.txt",
+ "path": "VSCode Agent/gpt-5.txt",
+ "size": 25579,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 233
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "VSCode Agent/Prompt.txt",
+ "size": 21032,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 404
+ },
+ {
+ "name": "gpt-5-mini.txt",
+ "path": "VSCode Agent/gpt-5-mini.txt",
+ "size": 25257,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 216
+ },
+ {
+ "name": "nes-tab-completion.txt",
+ "path": "VSCode Agent/nes-tab-completion.txt",
+ "size": 8910,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 167
+ },
+ {
+ "name": "gpt-4o.txt",
+ "path": "VSCode Agent/gpt-4o.txt",
+ "size": 7876,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 95
+ },
+ {
+ "name": "claude-sonnet-4.txt",
+ "path": "VSCode Agent/claude-sonnet-4.txt",
+ "size": 9910,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 130
+ }
+ ],
+ "file_count": 9,
+ "total_lines": 1542
+ },
+ {
+ "name": "Warp",
+ "company": "Warp",
+ "category": "Terminal",
+ "type": "proprietary",
+ "description": "AI-powered terminal",
+ "website": "https://warp.dev",
+ "models": [],
+ "directory": "Warp.dev",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "Warp.dev/Prompt.txt",
+ "size": 14595,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 163
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 163
+ },
+ {
+ "name": "Windsurf",
+ "company": "Codeium",
+ "category": "IDE",
+ "type": "proprietary",
+ "description": "AI-powered code editor (Wave 11)",
+ "website": "https://codeium.com/windsurf",
+ "models": [],
+ "directory": "Windsurf",
+ "files": [
+ {
+ "name": "Tools Wave 11.txt",
+ "path": "Windsurf/Tools Wave 11.txt",
+ "size": 32843,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 382
+ },
+ {
+ "name": "Prompt Wave 11.txt",
+ "path": "Windsurf/Prompt Wave 11.txt",
+ "size": 11699,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 125
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 507
+ },
+ {
+ "name": "Xcode AI",
+ "company": "Apple",
+ "category": "IDE",
+ "type": "proprietary",
+ "description": "AI features in Xcode (Document, Explain, Message, Playground, Preview)",
+ "website": "https://developer.apple.com/xcode/",
+ "models": [],
+ "directory": "Xcode",
+ "files": [
+ {
+ "name": "System.txt",
+ "path": "Xcode/System.txt",
+ "size": 4009,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 69
+ },
+ {
+ "name": "MessageAction.txt",
+ "path": "Xcode/MessageAction.txt",
+ "size": 235,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 13
+ },
+ {
+ "name": "ExplainAction.txt",
+ "path": "Xcode/ExplainAction.txt",
+ "size": 245,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 15
+ },
+ {
+ "name": "PlaygroundAction.txt",
+ "path": "Xcode/PlaygroundAction.txt",
+ "size": 414,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 20
+ },
+ {
+ "name": "PreviewAction.txt",
+ "path": "Xcode/PreviewAction.txt",
+ "size": 1938,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 58
+ },
+ {
+ "name": "DocumentAction.txt",
+ "path": "Xcode/DocumentAction.txt",
+ "size": 374,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 18
+ }
+ ],
+ "file_count": 6,
+ "total_lines": 193
+ },
+ {
+ "name": "Z.ai Code",
+ "company": "Z.ai",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI coding assistant",
+ "website": null,
+ "models": [],
+ "directory": "Z.ai Code",
+ "files": [
+ {
+ "name": "prompt.txt",
+ "path": "Z.ai Code/prompt.txt",
+ "size": 9592,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 237
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 237
+ },
+ {
+ "name": "Dia",
+ "company": "Dia",
+ "category": "Code Assistant",
+ "type": "proprietary",
+ "description": "AI coding assistant",
+ "website": null,
+ "models": [],
+ "directory": "dia",
+ "files": [
+ {
+ "name": "Prompt.txt",
+ "path": "dia/Prompt.txt",
+ "size": 17194,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 196
+ }
+ ],
+ "file_count": 1,
+ "total_lines": 196
+ },
+ {
+ "name": "v0",
+ "company": "Vercel",
+ "category": "Web Builder",
+ "type": "proprietary",
+ "description": "AI-powered UI generation tool",
+ "website": "https://v0.dev",
+ "models": [],
+ "directory": "v0 Prompts and Tools",
+ "files": [
+ {
+ "name": "Tools.json",
+ "path": "v0 Prompts and Tools/Tools.json",
+ "size": 28452,
+ "type": ".json",
+ "modified": "2025-11-11T21:18:55"
+ },
+ {
+ "name": "Prompt.txt",
+ "path": "v0 Prompts and Tools/Prompt.txt",
+ "size": 39171,
+ "type": ".txt",
+ "modified": "2025-11-11T21:18:55",
+ "lines": 925
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 925
+ },
+ {
+ "name": "web",
+ "company": "Unknown",
+ "category": "Unknown",
+ "type": "unknown",
+ "description": "No description available",
+ "website": null,
+ "models": [],
+ "directory": "web",
+ "files": [
+ {
+ "name": "package.json",
+ "path": "web/package.json",
+ "size": 985,
+ "type": ".json",
+ "modified": "2025-11-15T02:12:11.410808"
+ },
+ {
+ "name": "tsconfig.json",
+ "path": "web/tsconfig.json",
+ "size": 598,
+ "type": ".json",
+ "modified": "2025-11-15T02:12:11.631811"
+ }
+ ],
+ "file_count": 2,
+ "total_lines": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/web/lib/data.ts b/web/lib/data.ts
new file mode 100644
index 00000000..6b6e2c50
--- /dev/null
+++ b/web/lib/data.ts
@@ -0,0 +1,101 @@
+import { AITool, ToolIndex } from './types'
+import indexData from '../data/index.json'
+
+export function getToolIndex(): ToolIndex {
+ return indexData as ToolIndex
+}
+
+export function getAllTools(): AITool[] {
+ const index = getToolIndex()
+ return index.tools
+}
+
+export function getToolByDirectory(directory: string): AITool | undefined {
+ const tools = getAllTools()
+ return tools.find(tool => tool.directory === directory)
+}
+
+export function getToolsByCategory(category: string): AITool[] {
+ const tools = getAllTools()
+ return tools.filter(tool => tool.category === category)
+}
+
+export function getToolsByCompany(company: string): AITool[] {
+ const tools = getAllTools()
+ return tools.filter(tool => tool.company === company)
+}
+
+export function searchTools(query: string): AITool[] {
+ if (!query) return getAllTools()
+
+ const lowercaseQuery = query.toLowerCase()
+ const tools = getAllTools()
+
+ return tools.filter(tool => {
+ return (
+ tool.name.toLowerCase().includes(lowercaseQuery) ||
+ tool.description.toLowerCase().includes(lowercaseQuery) ||
+ tool.company.toLowerCase().includes(lowercaseQuery) ||
+ tool.category.toLowerCase().includes(lowercaseQuery) ||
+ tool.models.some(model => model.toLowerCase().includes(lowercaseQuery))
+ )
+ })
+}
+
+export function getCategories(): string[] {
+ const index = getToolIndex()
+ return Object.keys(index.stats.by_category).sort()
+}
+
+export function getCompanies(): string[] {
+ const tools = getAllTools()
+ const companies = new Set(tools.map(tool => tool.company))
+ return Array.from(companies).sort()
+}
+
+export function getModels(): string[] {
+ const tools = getAllTools()
+ const models = new Set()
+ tools.forEach(tool => {
+ tool.models.forEach(model => models.add(model))
+ })
+ return Array.from(models).sort()
+}
+
+export function getStats() {
+ const index = getToolIndex()
+ return index.stats
+}
+
+export function getCategoryIcon(category: string): string {
+ const icons: Record = {
+ 'Code Assistant': '💻',
+ 'IDE': '🏢',
+ 'AI Agent': '🤖',
+ 'Web Builder': '🌐',
+ 'Terminal': '🖥️',
+ 'Cloud IDE': '🏭',
+ 'Document Assistant': '📝',
+ 'Search Assistant': '🔍',
+ 'Foundation Model': '🧠',
+ 'Collection': '📚',
+ 'Unknown': '❓',
+ }
+ return icons[category] || '📦'
+}
+
+export function getCategoryColor(category: string): string {
+ const colors: Record = {
+ 'Code Assistant': 'from-blue-500 to-cyan-500',
+ 'IDE': 'from-purple-500 to-pink-500',
+ 'AI Agent': 'from-green-500 to-emerald-500',
+ 'Web Builder': 'from-orange-500 to-red-500',
+ 'Terminal': 'from-gray-500 to-slate-500',
+ 'Cloud IDE': 'from-indigo-500 to-blue-500',
+ 'Document Assistant': 'from-yellow-500 to-orange-500',
+ 'Search Assistant': 'from-pink-500 to-rose-500',
+ 'Foundation Model': 'from-violet-500 to-purple-500',
+ 'Collection': 'from-teal-500 to-cyan-500',
+ }
+ return colors[category] || 'from-gray-500 to-slate-500'
+}
diff --git a/web/lib/store.ts b/web/lib/store.ts
new file mode 100644
index 00000000..61ffb45a
--- /dev/null
+++ b/web/lib/store.ts
@@ -0,0 +1,89 @@
+import { create } from 'zustand'
+import { persist } from 'zustand/middleware'
+import { AITool, FilterState } from './types'
+
+interface AppState {
+ // Favorites
+ favorites: string[]
+ addFavorite: (toolDirectory: string) => void
+ removeFavorite: (toolDirectory: string) => void
+ isFavorite: (toolDirectory: string) => boolean
+
+ // Comparison
+ comparison: string[]
+ addToComparison: (toolDirectory: string) => void
+ removeFromComparison: (toolDirectory: string) => void
+ clearComparison: () => void
+ isInComparison: (toolDirectory: string) => boolean
+
+ // Filters
+ filters: FilterState
+ setFilters: (filters: Partial) => void
+ resetFilters: () => void
+
+ // View preferences
+ viewMode: 'grid' | 'list'
+ setViewMode: (mode: 'grid' | 'list') => void
+}
+
+const defaultFilters: FilterState = {
+ search: '',
+ categories: [],
+ types: [],
+ companies: [],
+ models: [],
+ sortBy: 'name',
+ sortOrder: 'asc',
+}
+
+export const useAppStore = create()(
+ persist(
+ (set, get) => ({
+ // Favorites
+ favorites: [],
+ addFavorite: (toolDirectory) =>
+ set((state) => ({
+ favorites: [...state.favorites, toolDirectory],
+ })),
+ removeFavorite: (toolDirectory) =>
+ set((state) => ({
+ favorites: state.favorites.filter((dir) => dir !== toolDirectory),
+ })),
+ isFavorite: (toolDirectory) => get().favorites.includes(toolDirectory),
+
+ // Comparison
+ comparison: [],
+ addToComparison: (toolDirectory) =>
+ set((state) => {
+ if (state.comparison.length >= 4) return state
+ return { comparison: [...state.comparison, toolDirectory] }
+ }),
+ removeFromComparison: (toolDirectory) =>
+ set((state) => ({
+ comparison: state.comparison.filter((dir) => dir !== toolDirectory),
+ })),
+ clearComparison: () => set({ comparison: [] }),
+ isInComparison: (toolDirectory) =>
+ get().comparison.includes(toolDirectory),
+
+ // Filters
+ filters: defaultFilters,
+ setFilters: (filters) =>
+ set((state) => ({
+ filters: { ...state.filters, ...filters },
+ })),
+ resetFilters: () => set({ filters: defaultFilters }),
+
+ // View preferences
+ viewMode: 'grid',
+ setViewMode: (mode) => set({ viewMode: mode }),
+ }),
+ {
+ name: 'ai-prompts-storage',
+ partialize: (state) => ({
+ favorites: state.favorites,
+ viewMode: state.viewMode,
+ }),
+ }
+ )
+)
diff --git a/web/lib/types.ts b/web/lib/types.ts
new file mode 100644
index 00000000..c0d38116
--- /dev/null
+++ b/web/lib/types.ts
@@ -0,0 +1,60 @@
+export interface AITool {
+ name: string
+ company: string
+ category: string
+ type: 'proprietary' | 'open-source' | 'unknown'
+ description: string
+ website: string | null
+ models: string[]
+ directory: string
+ files: ToolFile[]
+ file_count: number
+ total_lines: number
+ subcategories?: string[]
+}
+
+export interface ToolFile {
+ name: string
+ path: string
+ size: number
+ type: string
+ lines?: number
+ modified?: string
+}
+
+export interface ToolIndex {
+ generated: string
+ repository: string
+ version: string
+ stats: {
+ total_tools: number
+ total_files: number
+ total_lines: number
+ by_category: Record
+ by_type: Record
+ }
+ tools: AITool[]
+}
+
+export type Category =
+ | 'Code Assistant'
+ | 'IDE'
+ | 'AI Agent'
+ | 'Web Builder'
+ | 'Terminal'
+ | 'Cloud IDE'
+ | 'Document Assistant'
+ | 'Search Assistant'
+ | 'Foundation Model'
+ | 'Collection'
+ | 'Unknown'
+
+export interface FilterState {
+ search: string
+ categories: Category[]
+ types: ('proprietary' | 'open-source')[]
+ companies: string[]
+ models: string[]
+ sortBy: 'name' | 'lines' | 'files' | 'company'
+ sortOrder: 'asc' | 'desc'
+}
diff --git a/web/lib/utils.ts b/web/lib/utils.ts
new file mode 100644
index 00000000..0686803d
--- /dev/null
+++ b/web/lib/utils.ts
@@ -0,0 +1,43 @@
+import { type ClassValue, clsx } from 'clsx'
+import { twMerge } from 'tailwind-merge'
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
+
+export function formatNumber(num: number): string {
+ return new Intl.NumberFormat('en-US').format(num)
+}
+
+export function formatBytes(bytes: number): string {
+ if (bytes === 0) return '0 Bytes'
+ const k = 1024
+ const sizes = ['Bytes', 'KB', 'MB', 'GB']
+ const i = Math.floor(Math.log(bytes) / Math.log(k))
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i]
+}
+
+export function slugify(str: string): string {
+ return str
+ .toLowerCase()
+ .replace(/[^\w\s-]/g, '')
+ .replace(/\s+/g, '-')
+ .replace(/-+/g, '-')
+ .trim()
+}
+
+export function truncate(str: string, length: number): string {
+ if (str.length <= length) return str
+ return str.slice(0, length) + '...'
+}
+
+export function debounce any>(
+ func: T,
+ wait: number
+): (...args: Parameters) => void {
+ let timeout: NodeJS.Timeout | null = null
+ return (...args: Parameters) => {
+ if (timeout) clearTimeout(timeout)
+ timeout = setTimeout(() => func(...args), wait)
+ }
+}
diff --git a/web/next.config.ts b/web/next.config.ts
new file mode 100644
index 00000000..28083131
--- /dev/null
+++ b/web/next.config.ts
@@ -0,0 +1,22 @@
+import type { NextConfig } from 'next'
+
+const nextConfig: NextConfig = {
+ reactStrictMode: true,
+ poweredByHeader: false,
+
+ experimental: {
+ optimizePackageImports: ['lucide-react'],
+ },
+
+ async redirects() {
+ return [
+ {
+ source: '/tools',
+ destination: '/browse',
+ permanent: true,
+ },
+ ]
+ },
+}
+
+export default nextConfig
diff --git a/web/package.json b/web/package.json
new file mode 100644
index 00000000..e746a51b
--- /dev/null
+++ b/web/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "ai-prompts-explorer",
+ "version": "2.0.0",
+ "description": "Modern web interface for exploring AI tool system prompts",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "type-check": "tsc --noEmit"
+ },
+ "dependencies": {
+ "next": "^15.0.3",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "framer-motion": "^11.5.4",
+ "lucide-react": "^0.446.0",
+ "clsx": "^2.1.1",
+ "tailwind-merge": "^2.5.2",
+ "next-themes": "^0.3.0",
+ "zustand": "^4.5.5",
+ "react-wrap-balancer": "^1.1.1"
+ },
+ "devDependencies": {
+ "@types/node": "^22.7.5",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "typescript": "^5.6.3",
+ "tailwindcss": "^3.4.13",
+ "postcss": "^8.4.47",
+ "autoprefixer": "^10.4.20",
+ "eslint": "^8.57.1",
+ "eslint-config-next": "^15.0.3"
+ },
+ "engines": {
+ "node": ">=22.0.0",
+ "npm": ">=10.0.0"
+ }
+}
diff --git a/web/postcss.config.mjs b/web/postcss.config.mjs
new file mode 100644
index 00000000..d0c615b3
--- /dev/null
+++ b/web/postcss.config.mjs
@@ -0,0 +1,9 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
+
+export default config
diff --git a/web/setup.sh b/web/setup.sh
new file mode 100755
index 00000000..da467338
--- /dev/null
+++ b/web/setup.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# AI Prompts Explorer - Web Setup Script
+# This script sets up the Next.js web application
+
+set -e
+
+echo "🚀 AI Prompts Explorer - Web Setup"
+echo "=================================="
+echo ""
+
+# Check Node version
+echo "📦 Checking Node.js version..."
+NODE_VERSION=$(node -v)
+echo "Found Node.js: $NODE_VERSION"
+
+if [[ ! "$NODE_VERSION" =~ ^v(22|23|24|25) ]]; then
+ echo "⚠️ Warning: Node.js 22+ is recommended (found $NODE_VERSION)"
+fi
+
+echo ""
+
+# Check if we're in the web directory
+if [ ! -f "package.json" ]; then
+ echo "❌ Error: package.json not found"
+ echo "Please run this script from the web/ directory"
+ exit 1
+fi
+
+# Install dependencies
+echo "📥 Installing dependencies..."
+npm install
+
+echo ""
+
+# Generate metadata if needed
+if [ ! -f "data/index.json" ]; then
+ echo "📊 Generating metadata..."
+ cd ..
+ python3 scripts/generate_metadata.py
+ mkdir -p web/data
+ cp scripts/index.json web/data/
+ cd web
+ echo "✓ Metadata generated"
+else
+ echo "✓ Metadata already exists"
+fi
+
+echo ""
+echo "✅ Setup complete!"
+echo ""
+echo "🎉 You can now run the development server:"
+echo " npm run dev"
+echo ""
+echo "📖 The app will be available at:"
+echo " http://localhost:3000"
+echo ""
+echo "📚 Other commands:"
+echo " npm run build - Build for production"
+echo " npm start - Start production server"
+echo " npm run lint - Lint code"
+echo ""
diff --git a/web/tailwind.config.ts b/web/tailwind.config.ts
new file mode 100644
index 00000000..cd287c6b
--- /dev/null
+++ b/web/tailwind.config.ts
@@ -0,0 +1,86 @@
+import type { Config } from 'tailwindcss'
+
+const config: Config = {
+ content: [
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ darkMode: 'class',
+ theme: {
+ extend: {
+ colors: {
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))',
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))',
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))',
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))',
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))',
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))',
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))',
+ },
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)',
+ },
+ animation: {
+ 'fade-in': 'fade-in 0.5s ease-in-out',
+ 'slide-in': 'slide-in 0.3s ease-out',
+ 'slide-up': 'slide-up 0.3s ease-out',
+ 'scale-in': 'scale-in 0.2s ease-out',
+ 'shimmer': 'shimmer 2s linear infinite',
+ },
+ keyframes: {
+ 'fade-in': {
+ '0%': { opacity: '0' },
+ '100%': { opacity: '1' },
+ },
+ 'slide-in': {
+ '0%': { transform: 'translateX(-100%)' },
+ '100%': { transform: 'translateX(0)' },
+ },
+ 'slide-up': {
+ '0%': { transform: 'translateY(20px)', opacity: '0' },
+ '100%': { transform: 'translateY(0)', opacity: '1' },
+ },
+ 'scale-in': {
+ '0%': { transform: 'scale(0.95)', opacity: '0' },
+ '100%': { transform: 'scale(1)', opacity: '1' },
+ },
+ 'shimmer': {
+ '0%': { backgroundPosition: '-1000px 0' },
+ '100%': { backgroundPosition: '1000px 0' },
+ },
+ },
+ },
+ },
+ plugins: [],
+}
+
+export default config
diff --git a/web/tsconfig.json b/web/tsconfig.json
new file mode 100644
index 00000000..5ddf5a50
--- /dev/null
+++ b/web/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}