DishNow v2

An AI-powered recipe management and meal planning application that generates recipes, plans meals, and creates shopping lists automatically. Built with Nuxt 4, TypeScript, and Mistral AI integration.
🚀 Key Features
- 🤖 AI Recipe Creation: Conversational AI interface for generating custom recipes using Mistral AI
- 🖼️ AI Recipe Extraction: Automatically extract recipes from URLs and images using AI vision
- 📝 Recipe Management: Create, edit, and organize recipes with detailed ingredients and instructions
- 🛒 AI Shopping Lists: Generate shopping lists from recipes with intelligent ingredient aggregation
- 📅 AI Meal Planning: Plan meals with AI-powered suggestions and automatic shopping list generation
- 🔍 AI-Powered Search: Find recipes using AI-powered filters and smart matching
- 📚 Recipe Collections: Organize recipes into custom collections
- 🔐 User Authentication: Secure user management with PocketBase
- 💚 Supporter System: Pay-what-you-want contributions to support development
- 📱 Mobile Apps: iOS and Android apps via Capacitor
🏗️ Architecture Highlights
Frontend
- Nuxt 4: Modern Vue framework with SSR/SPA capabilities
- Vue 3 Composition API: Modern reactive programming with TypeScript
- Nuxt UI: Beautiful, accessible UI components with Tailwind CSS
- TanStack Vue Query: Advanced data fetching and caching
- Pinia: Client state management
- Zod Schemas: Type-safe data validation and inference
Backend
- PocketBase: Self-hosted backend with real-time database, authentication, and file storage
- SQLite: Database engine via PocketBase
- Real-time Subscriptions: Live data updates
AI Integration
- Vercel AI SDK: AI model integration
- Mistral AI: Large language model for recipe generation
- Google AI: Additional AI model support
Development & Deployment
- TypeScript: Full type safety across the entire stack
- Turborepo: Optimized monorepo build system
- Bun: High-performance package manager and runtime
- Capacitor: Cross-platform mobile apps (iOS/Android)
- Docker: Containerized deployment
⚖️ Trade-offs
PocketBase over Supabase
Went with PocketBase mainly for self-host simplicity — one binary, no managed infra to run. This wasn’t a rigorous PocketBase-vs-Supabase comparison; it was the faster path to shipping. If query complexity outgrows what a SQLite-backed store handles comfortably, or I want managed infra instead of babysitting a VPS, Supabase is the natural re-evaluation.
Mistral over OpenAI/Gemini
Cost (free tier) plus genuinely strong OCR quality for recipe extraction from URLs and images — this one held up in practice, not just on price. The extraction path sits behind the Vercel AI SDK, so swapping providers if the free tier limits get hit is cheap.
Monolith, not microservices
Deliberate choice to avoid premature optimization: one Nuxt app talking to PocketBase, no service boundaries. The first thing likely to need splitting out is AI recipe extraction — it’s synchronous and blocking today, and would become its own service or queue before anything else does (auth and CRUD have no reason to move first).
PWA first, Capacitor as packaging — not native
PWA is an underrated fit here: install-to-homescreen covers most of what users need, and shipping updates isn’t gated behind app store review cycles. Capacitor wraps the same web app for store presence rather than being a parallel native codebase to maintain. Trade-off is no deep native API access — not a bottleneck for a recipe app, but the first thing that would push toward a real native layer if that changed.