A web app for storing and organizing your recipe collection. Import recipes from URLs or add them manually, then browse, search, and share with others.
Built with React, Firebase, and Firestore.
- Recipe Import: Import recipes from any URL with structured recipe data (schema.org/Recipe)
- AI Recipe Generation: Generate new recipes from a text description using Claude
- Automatic Enrichment: AI-powered descriptions and tags for imported recipes
- Cooking Log: Track when you make recipes with optional notes
- Recipe Boxes: Organize recipes into collections
- Sharing: Share recipes or entire boxes with other users
- Search & Tags: Full-text search and tag-based filtering
- Wake Lock: Keep screen on while cooking
- React with TypeScript
- Styled Components + Ant Design
- Firebase Auth for authentication
- Firestore for real-time data sync
getRecipes: Fetches and parses recipe data from URLsgenerateRecipe: Generates recipes using Claude AIaddRecipeOwner/addBoxOwner: Manages recipe/box sharingenrichRecipes: Scheduled function for automatic AI enrichment
Recipes are automatically enriched with AI-generated descriptions and tags:
- When a recipe is created/imported, it gets
enrichmentStatus: "needed" - A scheduled Cloud Function runs every 10 minutes
- It finds recipes with status "needed" that are at least 5 minutes old (delay allows user to finish editing)
- Claude generates a description and suggested tags
- These are saved as
pendingEnrichmentfor user review - User can accept (applies changes) or reject (skips)
- If user edits a recipe, status resets to "needed" for re-enrichment
needed: Awaiting AI processingpending: AI suggestions ready for user reviewdone: User accepted enrichmentskipped: User rejected, or recipe already had content
- Node.js 20+
- Firebase CLI (
npm install -g firebase-tools) - Firebase project with Firestore, Auth, and Functions enabled
-
Clone the repository
-
Install dependencies:
cd app && npm install cd ../functions && npm install
-
Set up Firebase:
firebase login firebase use <your-project-id>
-
Set the Anthropic API key for AI features:
firebase functions:secrets:set ANTHROPIC_API_KEY
cd app
npm run dev# Deploy everything
firebase deploy
# Deploy only hosting
firebase deploy --only hosting
# Deploy only functions
firebase deploy --only functionsSet up Cloud Monitoring alerts for function errors:
- Go to GCP Console → Monitoring → Alerting
- Create a notification channel for your email
- Create alert policy for
cloudfunctions.googleapis.com/function/execution_countwherestatus = error
├── app/ # React frontend
│ ├── src/
│ │ ├── Buttons/ # Action button components
│ │ ├── BoxTable/ # Box list view
│ │ ├── Header/ # Navigation header
│ │ ├── Modals/ # Modal dialogs
│ │ ├── RecipeCard/ # Recipe detail view
│ │ ├── RecipeTable/ # Recipe list view
│ │ ├── context.tsx # React context for state
│ │ ├── reducer.ts # State reducer
│ │ ├── firestore.ts # Firestore operations
│ │ ├── storage.tsx # Data models and converters
│ │ └── types.ts # TypeScript types
│ └── build/ # Production build output
├── functions/ # Cloud Functions
│ └── src/
│ └── index.ts # All function definitions
├── firestore.rules # Security rules
├── firestore.indexes.json # Firestore indexes
└── firebase.json # Firebase configuration