Recipe Calorie Calculator — Count Macros in Any Homemade Meal

Calculate the exact calories, protein, carbs, and fat in any homemade meal with our free recipe calorie calculator. Add your ingredients one by one, set your servings, and get instant nutrition totals — no guesswork needed.

🍳 Recipe Calorie Calculator — Count Macros in Any Homemade Meal

Use this free recipe calorie calculator to instantly count the calories, protein, carbs, and fat in any homemade dish. Simply add your ingredients, set your servings, and get a full nutrition breakdown — no apps required. Tracking homemade food calories has never been easier: search from 150+ ingredients, see live macro totals, and save your favourite recipes for next time.

🥗 Add Ingredients
Type to search ingredients above, then click a result to select it.

📊 Ingredient List
🥘 Add your first ingredient above to get started!
My Recipe
Full recipe
Calories
Protein
Carbs
Fat
Macro ratio (by calories)
Protein 0% Carbs 0% Fat 0%
Frequently Asked Questions
To calculate calories in a homemade recipe, add each ingredient with its exact weight or volume into this recipe calorie calculator. The tool converts every quantity to grams, looks up the calorie density per 100 g, and sums everything automatically. For the most accurate result, weigh solid ingredients on a kitchen scale rather than using volume measures like cups. Once all ingredients are added, divide by the number of servings to get per-portion homemade food calories.
This recipe nutrition calculator uses average USDA nutritional values for each ingredient, so results are a close estimate — typically within 5–10% of laboratory-tested figures. Accuracy depends mainly on how precisely you measure quantities. Weighing in grams gives the tightest results. Factors like cooking method (boiling can leach minerals, roasting concentrates calories) and ingredient brand can introduce small variations, but for everyday meal tracking and macro counting this tool is more than sufficient.
To count macros in a meal for meal prep, build your full batch recipe in this meal prep calorie counter, then set the "number of servings" to however many containers you're portioning into. The tool instantly shows calories, protein, carbs, and fat per serving. Save the recipe to your browser so you can reload it next week without re-entering everything. For consistent macros, weigh your batch before portioning and divide by total weight per container.
Homemade food calories differ from restaurant estimates because restaurants often use higher-fat cooking fats, larger portions, and house sauces whose exact composition is unknown. A restaurant "chicken rice bowl" might include 3–4 tbsp of oil for wok cooking and a sugary sauce that adds 200+ hidden calories compared with the home version. Using a calorie calculator for cooking your own meals gives you full control — you know every ingredient that goes in, making it far easier to hit a macro target or calorie deficit.
A calorie calculator for cooking helps with weight loss by making the calorie cost of every ingredient visible before you eat. Research consistently shows that people who track homemade food calories lose significantly more weight than those who estimate. With this tool you can experiment — swap butter for olive oil spray, reduce pasta and add more vegetables — and instantly see how each change affects total calories and macro ratios. Pair it with our Calorie Intake Calculator to set your daily target and know exactly where your meal fits.
` ).join(''); resultsEl._matches = matches; activeIdx = -1; resultsEl.classList.add('rcc-open'); } function closeResults() { resultsEl.classList.remove('rcc-open'); resultsEl.innerHTML = ''; activeIdx = -1; } searchEl.addEventListener('input', () => { selectedIngredient = null; renderSearch(searchEl.value); }); searchEl.addEventListener('keydown', e => { const items = resultsEl.querySelectorAll('.rcc-search-item'); if (!items.length) return; if (e.key === 'ArrowDown') { e.preventDefault(); activeIdx = Math.min(activeIdx+1, items.length-1); highlightItem(items); } else if (e.key === 'ArrowUp') { e.preventDefault(); activeIdx = Math.max(activeIdx-1, 0); highlightItem(items); } else if (e.key === 'Enter' && activeIdx >= 0) { e.preventDefault(); items[activeIdx].click(); } else if (e.key === 'Escape') closeResults(); }); function highlightItem(items) { items.forEach((it, i) => it.classList.toggle('rcc-active', i === activeIdx)); if (activeIdx >= 0) items[activeIdx].scrollIntoView({block:'nearest'}); } resultsEl.addEventListener('mousedown', e => { const item = e.target.closest('.rcc-search-item'); if (!item) return; const matches = resultsEl._matches; const idx = parseInt(item.dataset.idx); selectedIngredient = matches[idx]; searchEl.value = selectedIngredient.name; closeResults(); }); document.addEventListener('click', e => { if (!e.target.closest('.rcc-search-wrap')) closeResults(); }); /* ===================== ADD INGREDIENT ===================== */ addBtn.addEventListener('click', addIngredient); function addIngredient() { if (!selectedIngredient) { // try exact match const q = searchEl.value.trim().toLowerCase(); const exact = DB.find(d => d.name.toLowerCase() === q); if (exact) selectedIngredient = exact; else { showToast('Please select an ingredient from the list 🔍'); searchEl.focus(); return; } } const qty = parseFloat(qtyEl.value); if (!qty || qty <= 0) { showToast('Enter a valid quantity'); qtyEl.focus(); return; } const unit = unitEl.value; const grams = toGrams(qty, unit, selectedIngredient); const factor = grams / 100; ingredients.push({ id: nextId++, ingredient: selectedIngredient, qty, unit, grams, cal: selectedIngredient.cal * factor, pro: selectedIngredient.pro * factor, carb: selectedIngredient.carb * factor, fat: selectedIngredient.fat * factor }); searchEl.value = ''; selectedIngredient = null; qtyEl.value = 100; render(); } /* ===================== REMOVE ===================== */ listEl.addEventListener('click', e => { const btn = e.target.closest('.rcc-ing-remove'); if (!btn) return; const id = parseInt(btn.dataset.id); ingredients = ingredients.filter(i => i.id !== id); render(); }); /* ===================== RENDER ===================== */ function render() { const servings = Math.max(1, parseInt(servingsEl.value) || 1); const totals = ingredients.reduce((acc, i) => { acc.cal += i.cal; acc.pro += i.pro; acc.carb += i.carb; acc.fat += i.fat; return acc; }, {cal:0, pro:0, carb:0, fat:0}); // list if (ingredients.length === 0) { listEl.innerHTML = ''; listEl.appendChild(emptyEl); emptyEl.style.display = ''; pillsEl.style.display = 'none'; resultsDiv.classList.remove('rcc-visible'); return; } emptyEl.style.display = 'none'; listEl.innerHTML = ingredients.map(i => `
${i.ingredient.name} ${i.qty} ${i.unit} ${Math.round(i.cal)} kcal
`).join(''); // pills pillsEl.style.display = 'flex'; document.getElementById('rcc-total-cal').textContent = Math.round(totals.cal); document.getElementById('rcc-total-pro').textContent = Math.round(totals.pro)+'g'; document.getElementById('rcc-total-carb').textContent = Math.round(totals.carb)+'g'; document.getElementById('rcc-total-fat').textContent = Math.round(totals.fat)+'g'; // results card resultsDiv.classList.add('rcc-visible'); const name = recipeNameEl.value.trim() || 'My Recipe'; document.getElementById('rcc-res-name').textContent = '🍳 ' + name; document.getElementById('rcc-res-sub').textContent = `Full recipe • ${ingredients.length} ingredient${ingredients.length!==1?'s':''}`; document.getElementById('rcc-res-cal').textContent = Math.round(totals.cal) + ' kcal'; document.getElementById('rcc-res-pro').textContent = Math.round(totals.pro) + 'g'; document.getElementById('rcc-res-carb').textContent = Math.round(totals.carb) + 'g'; document.getElementById('rcc-res-fat').textContent = Math.round(totals.fat) + 'g'; // per serving const snote = document.getElementById('rcc-serving-note'); if (servings > 1) { snote.style.display = ''; snote.innerHTML = `Per serving (÷${servings}): ${Math.round(totals.cal/servings)} kcal | Protein: ${Math.round(totals.pro/servings)}g | Carbs: ${Math.round(totals.carb/servings)}g | Fat: ${Math.round(totals.fat/servings)}g`; } else { snote.style.display = 'none'; } // macro bar const calFromPro = totals.pro * 4; const calFromCarb = totals.carb * 4; const calFromFat = totals.fat * 9; const calTotal = calFromPro + calFromCarb + calFromFat || 1; const pPct = Math.round(calFromPro / calTotal * 100); const cPct = Math.round(calFromCarb / calTotal * 100); const fPct = 100 - pPct - cPct; document.getElementById('rcc-bar-p').style.width = pPct + '%'; document.getElementById('rcc-bar-c').style.width = cPct + '%'; document.getElementById('rcc-bar-f').style.width = Math.max(0,fPct) + '%'; document.getElementById('rcc-bar-p-pct').textContent = pPct + '%'; document.getElementById('rcc-bar-c-pct').textContent = cPct + '%'; document.getElementById('rcc-bar-f-pct').textContent = Math.max(0,fPct) + '%'; } recipeNameEl.addEventListener('input', render); servingsEl.addEventListener('input', render); /* ===================== SAVE / CLEAR ===================== */ document.getElementById('rcc-save-btn').addEventListener('click', () => { if (!ingredients.length) { showToast('Add some ingredients first! 🥘'); return; } const name = recipeNameEl.value.trim() || 'My Recipe'; const totals = calcTotals(); const saved = getSaved(); saved.unshift({ id: Date.now(), name, cal: Math.round(totals.cal), pro: Math.round(totals.pro), carb: Math.round(totals.carb), fat: Math.round(totals.fat), date: new Date().toLocaleDateString(), ingredients: ingredients.map(i=>({name:i.ingredient.name,qty:i.qty,unit:i.unit})) }); localStorage.setItem('rcc_saved', JSON.stringify(saved)); showToast('💾 Recipe saved!'); renderSaved(); }); document.getElementById('rcc-clear-btn').addEventListener('click', () => { if (!confirm('Clear all ingredients?')) return; ingredients = []; recipeNameEl.value = ''; render(); renderSaved(); }); /* ===================== SHARE ===================== */ document.getElementById('rcc-share-btn').addEventListener('click', () => { const totals = calcTotals(); const name = recipeNameEl.value.trim() || 'my recipe'; const text = `I just calculated ${name} has ${Math.round(totals.cal)} calories using the Recipe Calorie Calculator at FindHealthTips.com 🍳 Try it free: https://findhealthtips.com/recipe-calorie-calculator/`; if (navigator.clipboard) navigator.clipboard.writeText(text); window.open('https://twitter.com/intent/tweet?text=' + encodeURIComponent(text), '_blank'); showToast('🐦 Opening Twitter & copying to clipboard!'); }); /* ===================== SAVED RECIPES ===================== */ function getSaved() { try { return JSON.parse(localStorage.getItem('rcc_saved')) || []; } catch { return []; } } function renderSaved() { const saved = getSaved(); if (!saved.length) { savedSection.style.display = 'none'; return; } savedSection.style.display = ''; savedListEl.innerHTML = saved.map(s => `
🍳 ${s.name}
${s.cal} kcal · P: ${s.pro}g C: ${s.carb}g F: ${s.fat}g · Saved ${s.date}
`).join(''); } savedListEl.addEventListener('click', e => { const loadBtn = e.target.closest('.rcc-saved-load'); const delBtn = e.target.closest('.rcc-saved-del'); if (loadBtn) { const id = parseInt(loadBtn.dataset.id); const saved = getSaved(); const rec = saved.find(s => s.id === id); if (!rec) return; ingredients = []; nextId = 1; rec.ingredients.forEach(ri => { const ing = DB.find(d => d.name === ri.name); if (!ing) return; const grams = toGrams(ri.qty, ri.unit, ing); const f = grams/100; ingredients.push({id:nextId++, ingredient:ing, qty:ri.qty, unit:ri.unit, grams, cal:ing.cal*f, pro:ing.pro*f, carb:ing.carb*f, fat:ing.fat*f}); }); recipeNameEl.value = rec.name; render(); showToast('📂 Recipe loaded!'); } if (delBtn) { const id = parseInt(delBtn.dataset.id); const saved = getSaved().filter(s => s.id !== id); localStorage.setItem('rcc_saved', JSON.stringify(saved)); renderSaved(); } }); /* ===================== HELPERS ===================== */ function calcTotals() { return ingredients.reduce((acc, i) => { acc.cal+=i.cal; acc.pro+=i.pro; acc.carb+=i.carb; acc.fat+=i.fat; return acc; }, {cal:0,pro:0,carb:0,fat:0}); } let toastTimer; function showToast(msg) { toastEl.textContent = msg; toastEl.style.display = 'block'; clearTimeout(toastTimer); toastTimer = setTimeout(() => { toastEl.style.display = 'none'; }, 2800); } /* ===================== FAQ ===================== */ document.querySelectorAll('.rcc-faq-q').forEach(btn => { btn.addEventListener('click', () => { const key = btn.dataset.faq; const answer = document.querySelector(`.rcc-faq-a[data-faq="${key}"]`); const isOpen = btn.classList.contains('rcc-open'); // close all document.querySelectorAll('.rcc-faq-q').forEach(b => b.classList.remove('rcc-open')); document.querySelectorAll('.rcc-faq-a').forEach(a => a.classList.remove('rcc-open')); if (!isOpen) { btn.classList.add('rcc-open'); answer.classList.add('rcc-open'); } }); }); /* ===================== INIT ===================== */ renderSaved(); render(); })(); function rccSocialShare(platform) { var text = (typeof rccShareText !== "undefined" && rccShareText) ? rccShareText : document.title + " — " + window.location.href; var url = encodeURIComponent(window.location.href); var enc = encodeURIComponent(text); var links = { wa: "https://wa.me/?text=" + enc, fb: "https://www.facebook.com/sharer/sharer.php?u=" + url, tw: "https://twitter.com/intent/tweet?text=" + enc, li: "https://www.linkedin.com/shareArticle?mini=true&url=" + url + "&title=" + encodeURIComponent(document.title) }; if (platform === "copy") { var btn = document.getElementById("rcc-copy-btn"); if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(function(){ if(btn){ btn.textContent = "✅ Copied!"; btn.classList.add("rcc-sbtn-copied"); setTimeout(function(){ btn.textContent = "📋 Copy"; btn.classList.remove("rcc-sbtn-copied"); }, 2000); } }); } else { var ta = document.createElement("textarea"); ta.value = text; ta.style.cssText = "position:fixed;opacity:0"; document.body.appendChild(ta); ta.select(); document.execCommand("copy"); document.body.removeChild(ta); if(btn){ btn.textContent = "✅ Copied!"; btn.classList.add("rcc-sbtn-copied"); setTimeout(function(){ btn.textContent = "📋 Copy"; btn.classList.remove("rcc-sbtn-copied"); }, 2000); } } return; } if (links[platform]) window.open(links[platform], "_blank", "width=600,height=450,noopener"); } window.rccSocialShare = rccSocialShare;