If you have ever tried building a fitness tracker, AI diet coach, or calorie counter for Indian users, you run into the same wall on day one: global nutrition APIs fail miserably on Indian food.
USDA FoodData Central has almost zero regional Indian dishes. Commercial APIs like Nutritionix or Edamam charge $50–$200/month with strict rate limits, mix raw dry weights with cooked hydrated weights, ignore tadka (tempering oil/ghee) variations, and have no idea what a katori, phulka, or masala dosai weighs in grams.
While building the Free Indian Food Calorie Calculator & Meal Macro Counter at [TheBarbellCrew(https://www.thebarbellcrew.com),
I decided to solve this properly and open-source both the TypeScript calculation engine and the underlying 5,020-item dataset under the MIT license.
Here is how the data normalization, portion scaling, and zero-latency search engine work under the hood.
Live Demo, npm Package & Open Datasets
- Live Web App (UI Demo): thebarbellcrew.com/indian-food-calorie-calculator
- GitHub Repository: https://github.com/suryachalla/open-nutrition-engine
- npm Package:
npm install open-nutrition-engine - Raw CSV & JSON Dataset (Kaggle 10.0): 5,000+ Indian Foods Nutrition & Macro Dataset
Engineering Problem #1: Raw vs. Cooked Hydration & Tadka Lipids
Why do two calorie apps show 120 kcal vs 340 kcal for the exact same bowl of Moong Dal?
- Dry vs. Cooked Weight Confusion:
100gof dry raw moong dal is ~348 kcal, whereas100gof cooked hydrated dal is ~105–115 kcalbecause cooked lentils absorb roughly2.5x–3xtheir weight in water. - Hidden Tempering (Tadka) Fat: Adding
1 tbsp(14g) of ghee or oil in tempering adds126 kcalof pure lipids across the pot. - Utensil Ambiguity: Real users don't weigh every meal on a kitchen scale—they eat
3 steamed idlis,1 katori sambar,2 phulkas (no oil), or1 plate chicken biryani.
How We Normalized 5,020 Foods
Every single entry in our corpus was standardized to a strict per-100g edible portion baseline (cross-referenced against ICMR-NIN Indian Food Composition Tables, USDA raw baselines, and Atwater 4-4-9 calorie-macro validation), then paired with 13,772 pre-calibrated household serving presets:
```json { "id": "phulka", "name": "Phulka (No Oil / No Ghee)", "hindiName": "Roti / Phulka", "category": "grains", "diet": "veg", "calories": 260, "protein": 9.5, "carbs": 52, "fat": 1.5, "fiber": 7, "servings": [ { "id": "1pc", "label": "1 phulka (30 g)", "amount": 30 }, { "id": "2pc", "label": "2 phulkas (60 g)", "amount": 60 }, { "id": "3pc", "label": "3 phulkas (90 g)", "amount": 90 } ] } ``` Notice also the diet field (2,136 veg and 2,884 non-veg items): in India, lacto-vegetarians strictly exclude eggs, so egg items (Ubla Anda, Egg Bhurji) are explicitly isolated from veg filters.
Engineering Problem #2: Hinglish & Regional Alias Matching
An Indian user searching for boiled eggs or soy protein might type:
* "boiled egg" or "ubla anda"
* "soya chunks" or "soya badi" or "meal maker"
* "curd" or "dahi"
* "पनीर टिक्का" (Devanagari) or "paneer tikka"
To support instant client-side autocomplete without spinning up an external Elasticsearch cluster or paying per-request vector DB costs, open-nutrition-engine ships with 2,311 Hindi/regional names and 698 colloquial aliases directly inside the typed bundle.
Quickstart: Using open-nutrition-engine in TypeScript / React
Install via npm:
npm install open-nutrition-engine Search dishes, scale macros to household servings (katori, piece, plate), and compute daily meal totals completely offline with zero API keys or rate limits:
import { searchFoods, createFoodEntry, computeFoodTotals, } from 'open-nutrition-engine'; // 1. Search vegetarian high-protein staples (supports English & Hinglish) const results = searchFoods({ query: 'Paneer Tikka', category: 'all', diet: 'veg', }); const dish = results[0]; console.log(`${dish.name}: ${dish.calories} kcal, ${dish.protein}g protein per 100g`); // 2. Log 2 servings into a meal slot ('breakfast' | 'lunch' | 'dinner' | 'snack') const lunchEntry = createFoodEntry( dish, dish.servings[0], // e.g., 100g or 1 piece/katori preset 2, // quantity 'lunch' ); // 3. Aggregate full daily macros (kcal, protein, carbs, fat, fiber) const dailyTotals = computeFoodTotals([lunchEntry]); console.log('Meal Totals:', dailyTotals); Because the entire computation runs locally in memory:
- Latency:
< 2msper search keystroke - API Cost:
$0.00whether you have 100 users or 1,000,000 users - Offline-First: Works natively inside PWAs, React Native apps, Electron tools, and LLM tool-calling / RAG agents
Using the Raw Dataset for Python, RAG & Computer Vision
If you are working in Python, Pandas, or building a WhatsApp/Telegram AI dietitian bot, we also published the flat UTF-8 table (indian_foods_5000.csv with 0 null nutrient rows) and the nested serving schema (indian_foods_5000.json) on Kaggle.
You can combine this dataset with:
- Vision-to-Macro Pipelines: Pair a Food-101 / Indian dish classifier with
indian_foods_5000.jsonto convert plate photos intokatori/piecegram macros. - Linear Programming Diet Generators (
SciPy/PuLP): Generate140g+daily protein Indian vegetarian meal plans constrained by a user's TDEE / Maintenance Calories and fiber targets. - Training & Strength Integration: Pair daily nutrition logs with progressive overload tools like our 3D Biomechanics & Exercise 101 Hub.
Try It Live & Feedback Welcome!
If you want to test the search speed and portion scaling right in your browser, check out the live Indian Food Calorie Calculator.
If there are regional dishes from your state (Kerala, Bengali, Maharashtrian, Northeast, Gujarati, Punjabi, Andhra/Tamil) that you want added or refined in the next release, drop a comment below or open a PR on GitHub!


