Scout Meal Planner generates a balanced, randomized multi-day camp menu and a fully scaled grocery shopping list tailored for scout groups cooking over open campfire embers. No oven, no complex equipment, no spreadsheets, and no two trips ever the same.
git clone https://github.com/mirconegri/ScoutMealPlanner.git
Configure headcount, trip duration, and dietary parameters below. Our client-side implementation of main.py scales grams and calculates portions instantly.
No cloud login, no database servers, no pip dependencies. Pure Python engineering designed to survive offline in mountain refuges.
Unlike web-heavy catering platforms, Scout Meal Planner relies solely on modules that have shipped with Python for over two decades: random, collections.defaultdict, and csv. It runs on a 15-year-old laptop without an active Wi-Fi connection, inside an offline mountain hut, or directly in a terminal.
Every recipe combination is vetted for campfire preparation. No oven baking required, no delicate cream sauces that spoil in the sun, and minimal pots used to conserve dishwashing water collected from mountain springs.
Ingredient portions are defined in grams per person inside meals_data.py (e.g. 140g pasta, 100g tuna, 250ml milk). The engine performs linear scaling with zero rounding error drift across days.
total_grams = portion[item] * headcount
One single run creates: a formatted menu.txt for the bulletin board, a left-padded shopping_list.txt for the supermarket patrol, and a clean shopping_list.csv for camp treasurer books.
Need to generate a menu right from a smartphone while standing in the grocery aisle? Open the public Replit container and run the CLI directly in any mobile browser with zero terminal installations.
Follow the trail path our algorithm travels on every execution to assemble your camp menu without human planning fatigue.
The user inputs camp days and headcount via CLI prompts. That's all the engine needs.
days = int(input()); people = int(input())
Randomly samples: Bread with Nutella, Bread with Jam, or Tea with bread and jam. Each modifies the grocery tally differently.
breakfast_choice = random.choice(base_meals["breakfast"])
Carbs, protein, and vegetables independently combine into fresh campfire meals, plus two fresh fruits per day.
lunch = (choice(carbs), choice(proteins), choice(veggies))
Every ingredient has a baseline gram portion in meals_data.py, multiplied by headcount and days.
shopping_list[item] += quantities.get(item, 100) * people
Writes clean UTF-8 text menus, aligned shopping list text, and a CSV table ready for spreadsheet software.
save_results(menu, shopping_list) # writes 3 files
No magic abstractions. Every ingredient option and gram specification is fully exposed for quick inspection and customization.
#!/usr/bin/env python3
# main.py — Scout Meal Planner CLI entrypoint
import random
from collections import defaultdict
from meals_data import base_meals, quantities
import csv
def generate_menu(days, people):
"""
Generates the camp menu and shopping list.
Parameters:
days (int): number of camp days
people (int): number of participants
Returns:
menu (list), shopping_list (dict)
"""
menu = []
shopping_list = defaultdict(int) # initializes with default value = 0
for day in range(1, days + 1):
# --- Breakfast selection ---
breakfast_choice = random.choice(base_meals["breakfast"])
if "Nutella" in breakfast_choice:
shopping_list["bread"] += quantities["bread"] * people
shopping_list["Nutella"] += quantities["Nutella"] * people
shopping_list["milk"] += quantities["milk"] * people
elif "jam" in breakfast_choice and "tea" not in breakfast_choice:
shopping_list["bread"] += quantities["bread"] * people
shopping_list["jam"] += quantities["jam"] * people
shopping_list["milk"] += quantities["milk"] * people
elif "tea" in breakfast_choice:
shopping_list["bread"] += quantities["bread"] * people
shopping_list["jam"] += quantities["jam"] * people
shopping_list["tea soluble"] += quantities["tea soluble"] * people
# --- Lunch and Dinner selections ---
lunch_carbs = random.choice(base_meals["carbs"])
lunch_protein = random.choice(base_meals["proteins"])
lunch_veggie = random.choice(base_meals["veggies"])
lunch_fruit = random.choice(base_meals["fruits"])
dinner_carbs = random.choice(base_meals["carbs"])
dinner_protein = random.choice(base_meals["proteins"])
dinner_veggie = random.choice(base_meals["veggies"])
dinner_fruit = random.choice(base_meals["fruits"])
# Format menu for the day
menu.append(
f"Day {day}:\n"
f" 🍞 Breakfast: {breakfast_choice}\n"
f" 🍽️ Lunch: {lunch_carbs.capitalize()} with {lunch_protein} and {lunch_veggie}\n"
f" 🍽️ Dinner: {dinner_carbs.capitalize()} with {dinner_protein} and {dinner_veggie}\n"
f" 🍎 Fruits: {lunch_fruit}, {dinner_fruit}\n"
)
# Add items to shopping list with fallback 100g
for item in [lunch_carbs, lunch_protein, lunch_veggie,
dinner_carbs, dinner_protein, dinner_veggie,
lunch_fruit, dinner_fruit]:
shopping_list[item] += quantities.get(item, 100) * people
return menu, shopping_list
How Scout Meal Planner compares against standard planning methods for non-profit scout groups
| Capability | Scout Meal Planner | Manual Excel Sheet | Commercial Catering SaaS |
|---|---|---|---|
| Prep Time per Trip | 1.4 seconds | ~2.5 hours | 30-45 minutes |
| Offline in Mountain Hut | 100% Native Offline | Offline if saved locally | Fails (requires cloud API) |
| External Dependencies | 0 bytes (StdLib only) | Microsoft Office / Calc | Docker, Postgres, Node |
| Campfire Cooking Feasibility | Guaranteed (1-2 pots) | Prone to human oversight | Requires commercial ovens |
| License & Cost | MIT (Free Forever) | Office 365 License | €29–€99 / month |
Experience the console application just like running it in macOS Terminal, Linux bash, or Windows PowerShell.
Exact screenshots from github.com/mirconegri/ScoutMealPlanner/screenshot
Console prompt: Headcount and days prompt returning verified camp outputs.
When deploying to Cloudflare Pages, include the screenshot/ subfolder containing terminal.png, shopping_list.png, and menu.png. The page includes graceful fallback to raw GitHub repository assets.
Zero setup friction. If you have Python 3 installed on your machine, you are already ready to roll.
Download the lightweight repository (~150 KB) containing the complete algorithm and recipe database.
git clone ...
Execute main.py. Answer the two prompt questions: camp days, then participant count.
python3 main.py
Open shopping_list.csv in Excel or print menu.txt directly for the campfire shelter.
cat menu.txt
Open meals_data.py in any text editor. Add your ingredient to the base_meals dictionary and specify its per-person gram portion in quantities. No configuration schemas or migrations needed.