The 1-Click Weekly Meal Plan

Generate a simple 3-day meal prep plan based on your calories, diet style, and food dislikes.

Choose your settings, generate your plan, then print it, save it as a PDF, or copy it to your phone for grocery shopping.

Customize Your Plan

Quick Tips

  • Batch prep basics: Cook proteins, carbs, and vegetables ahead so meals are easier to assemble.
  • Check your pantry first: Compare the generated plan with what you already have before shopping.
  • Store it properly: Meal prep containers, a kitchen scale, and airtight storage can make weekly prep easier.

FAQ

How many calories should I select?

Use your current calorie target if you already know it. If not, calculate your TDEE first, then choose a deficit for weight loss or a slight surplus for muscle gain.

Are the meals beginner-friendly?

Yes. The tool is designed to create practical meals with accessible ingredients and simple prep steps.

How do I buy the groceries?

After generating your plan, use the Amazon Fresh button where available, copy the list to your phone, print the plan, or shop at your local supermarket. Amazon Fresh availability, prices, and delivery options depend on your location.

`; }function printMealPlan() { const printArea = document.getElementById("print-area"); if (!printArea) { alert("Please generate a meal plan first."); return; }const dietName = dietSelect.value.replace(/\s+/g, "_"); const calTarget = calSlider.value; const printTitle = `Foodarina_${dietName}_Meal_Plan_${calTarget}kcal`; const printWindow = window.open("", "_blank", "width=900,height=700");if (!printWindow) { alert("Your browser blocked the print window. Please allow pop-ups for Foodarina and try again."); return; }printWindow.document.open(); printWindow.document.write(getPrintDocumentHtml(printArea.innerHTML, printTitle)); printWindow.document.close(); printWindow.focus();setTimeout(() => { printWindow.print(); }, 400); }generateBtn.addEventListener("click", async () => { const calories = calSlider.value; const diet = dietSelect.value; const allergies = allergiesInput.value.trim() || "None";if (!diet || diet === "none") { alert("Please select a Diet Profile before generating your plan."); return; }const hiddenPrompt = `Act as an expert nutritionist. Create a complete 3-day ${diet} meal plan hitting roughly ${calories} calories per day. Exclude these ingredients: ${allergies}.Return ONLY the meal plan. Do not include an intro title, closing summary, disclaimer, horizontal rules, or markdown separators.Use this exact structure:## Day 1 ### Breakfast - Meal Name: ... - Ingredients: ... - Macros: ...### Lunch - Meal Name: ... - Ingredients: ... - Macros: ...### Dinner - Meal Name: ... - Ingredients: ... - Macros: ...### Snacks - Meal Name: ... - Ingredients: ... - Macros: ...### Daily Macros - Calories: ... - Protein: ... - Carbs: ... - Fat: ...## Day 2 Use the same structure.## Day 3 Use the same structure.Important: You must include Day 1, Day 2, and Day 3. Do not stop after Day 1.`;outputBox.innerHTML = `
0%
Calculating macros & writing recipes...
`;actionArea.style.display = "none"; generateBtn.disabled = true; generateBtn.innerText = "Cooking up your plan...";const progressText = document.getElementById("mp-progress-text"); let progress = 0; let progressInterval = setInterval(() => { let increment = progress < 60 ? 4 : (progress < 85 ? 1.5 : (progress < 98 ? 0.3 : 0)); progress += increment; if (progress > 99) progress = 99; if (progressText) progressText.innerText = Math.floor(progress) + "%"; }, 150);try { const response = await fetch("https://foodarina-mealplan.moridztech.workers.dev/", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ prompt: hiddenPrompt }) });const data = await response.json(); let text = data?.choices?.[0]?.message?.content || "No response generated.";text = text .replace(/^#\s*.*meal plan.*$/gim, "") .replace(/^3[-\s]?day\s+.*meal plan.*$/gim, "") .replace(/^\s*---\s*$/gim, "") .replace(/This meal plan provides[\s\S]*$/im, "") .trim();let rawHtml = markdownToHtml(text); let parts = rawHtml.split(/(?=

)/i); let cardsHtml = parts.map(part => { if (!part.trim()) return ""; return ``; }).join("");clearInterval(progressInterval); outputBox.innerHTML = ``; actionArea.style.display = "block";} catch (error) { clearInterval(progressInterval); outputBox.innerHTML = `
Error: Unable to generate meal plan. Please try again.
`; } finally { generateBtn.disabled = false; generateBtn.innerText = "Generate My Meal Plan"; } });document.getElementById("meal-print").addEventListener("click", printMealPlan); document.getElementById("meal-pdf").addEventListener("click", printMealPlan);document.getElementById("meal-copy").addEventListener("click", () => { const printArea = document.getElementById("print-area"); if (!printArea) return;const text = printArea.innerText; navigator.clipboard.writeText(text).then(() => { const btn = document.getElementById("meal-copy"); btn.innerText = "✅ Copied!"; setTimeout(() => btn.innerText = "📋 Copy Text", 2000); }); }); });