A recipe management app for organizing recipes, planning meals, and building shopping lists. Single-user, self-hosted with no authentication.
Built with .NET 10 and React 19, orchestrated by .NET Aspire.
┌─────────────────────────────────────────────────────────────┐
│ Aspire AppHost │
│ (Orchestration Layer) │
└─────────────────────────────────────────────────────────────┘
│ │ │
┌─────────┐ ┌──────────┐ ┌─────────┐
│ Server │◄───────►│ Frontend │ │ MinIO │
│ (API) │ (REST) │ (React) │ │ (S3) │
└─────────┘ └──────────┘ └─────────┘
│
┌──────────┐
│PostgreSQL│
└──────────┘
- Cooklyn.AppHost — Aspire orchestration, defines all resources
- Cooklyn.Server — .NET 10 API (CQRS, MediatR, vertical slices)
- frontend — React 19 SPA (TanStack Router, React Query, Tailwind v4)
- Recipes — create, edit, import from URL, image uploads via S3
- Collections — organize recipes into groups
- Meal Plans — weekly meal planning with drag-and-drop
- Shopping Lists — auto-generated from meal plans or manual entry
- Stores & Sections — map items to store aisles for organized shopping
- Saved Filters — persist advanced filter/sort configurations
cd Cooklyn.AppHost
aspire runThis starts the Aspire Dashboard, backend API, React dev server, PostgreSQL, and MinIO.
- .NET 10 SDK
- Aspire CLI
- Node.js with pnpm
- Docker (for PostgreSQL and MinIO containers)
- .NET 10, CQRS with MediatR, vertical slice architecture
- PostgreSQL with EF Core, soft delete, audit fields
- MinIO (S3-compatible) for image storage
- Mapperly for compile-time DTO mapping
- QueryKit for filtering/sorting
- OpenTelemetry observability
- API versioning (
/api/v1/...)
- React 19, TypeScript, Tailwind CSS v4
- TanStack Router (file-based), React Query, React Table
- Base UI + React Aria components
- React Hook Form + Zod validation
- Motion for animations, dnd-kit for drag-and-drop
- Keyboard shortcuts throughout
MIT