CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
NutriAves is a complete poultry farm management system built for small to medium-scale chicken farms in Southern Chile. The application handles feed calculations, inventory management, egg production tracking, health/vaccination scheduling, and financial profitability analysis.
Tech Stack:
- Flask 3.0.0 (Python web framework)
- Pandas 2.1.4 for CSV data manipulation
- Chart.js 4.4.0 for interactive visualizations
- Jinja2 templates with inheritance pattern
- CSV-based data storage (no database)
Running the Application
# Initial setup (first time only)
python3 -m venv venv
source venv/bin/activate # macOS/Linux
# venv\Scripts\activate # Windows
pip install -r requirements.txt
# Start development server
source venv/bin/activate
python app.py
# Access at: http://localhost:5000
Important: The application requires numpy<2.0.0 due to pandas 2.1.4 compatibility. This is already specified in requirements.txt.
Data Storage Architecture
All application data is stored in CSV files under /data/ directory:
data/
├── inventory/
│ ├── flocks.csv # Bird flocks (lotes)
│ ├── movements.csv # Mortality/sales tracking
│ └── backups/ # Auto-generated backups
├── production/
│ ├── egg_production.csv # Daily egg collection records
│ └── backups/
├── health/
│ ├── vaccinations.csv # Vaccination schedule
│ ├── treatments.csv # Medical treatments
│ └── backups/
└── finance/
├── expenses.csv # Operating expenses
├── income.csv # Sales income
└── backups/
Key Points:
- CSV files are created automatically on first access
- Automatic backups are created before writes (timestamp-based)
- All CSV operations go through
DataManagerclass inutils/data_manager.py - Never directly use pandas I/O on CSV files - always use DataManager methods
Core Architecture
1. BREED_DATA Dictionary (app.py)
The central data structure that drives breed-specific calculations. Contains consumption rates (grams/day), descriptions, and feeding recommendations for 11+ chicken breeds common in Southern Chile.
BREED_DATA = {
'lohmann': {'name': 'Lohmann Brown', 'consumption': 115, ...},
'araucana': {'name': 'Araucana / Mapuche', 'consumption': 120, ...},
# ... 9 more breeds
}
This dictionary is used across:
- Feed calculator (original functionality)
- Inventory module (breed selection)
- Dashboard (consumption calculations)
- Health module (vaccine recommendations)
2. Flask Route Structure
18 routes organized by module:
/ → Redirect to dashboard
/dashboard → Main KPI dashboard
/calculator → Feed calculator (original feature)
/inventory/flocks → List all flocks (GET)
/inventory/add-flock → Add new flock (GET/POST)
/inventory/movements → Record mortality/sales (GET/POST)
/production/record → Daily egg entry (GET/POST)
/production/report → Production reports with Chart.js (GET)
/health/calendar → Vaccination calendar (GET)
/health/add-vaccination → Register vaccination (GET/POST)
/health/treatments → Medical treatments log (GET/POST)
/finance/expenses → Expense tracking (GET/POST)
/finance/income → Income tracking (GET/POST)
/finance/profitability → P&L analysis with charts (GET)
3. Utils Module Organization
utils/data_manager.py - CSV abstraction layer
read_csv_safe(): Safe reading with auto-creationwrite_csv(): Writes with automatic backupappend_row(): Add single row to CSVget_next_id(): Generate sequential IDs (F001, P002, etc.)get_active_flocks(): Query active flocksupdate_flock_count(): Update bird counts after movements
utils/calculators.py - Business logic
calculate_laying_rate(): Egg production % by flock/periodget_production_timeline(): Format data for Chart.js line graphscalculate_profit_for_period(): Net profit calculationget_overdue_vaccinations(): Alert system for health module
utils/validators.py - Input validation
validate_positive_number(): Ensures quantities > 0validate_date_not_future(): Prevents future datesvalidate_flock_data(): Multi-field flock validation- All validators raise
ValidationErrorexceptions
4. Template Inheritance Pattern
base.html # Sidebar navigation, common structure
├── dashboard.html # KPI cards, alerts, recent flocks table
├── calculator.html # Original feed calculator (migrated)
├── inventory/
│ ├── flocks.html # Flock list table
│ ├── add_flock.html # Flock creation form
│ └── movements.html # Mortality/sales form
├── production/
│ ├── record_eggs.html # Daily egg entry form
│ └── production_report.html # Chart.js line graph + stats
├── health/
│ ├── calendar.html # Vaccination table with alerts
│ ├── add_vaccination.html
│ └── treatments.html
└── finance/
├── expenses.html # Expense entry + history table
├── income.html # Income entry + history table
└── profitability.html # Pie + Doughnut charts, P&L analysis
All templates extend base.html which provides:
- Sidebar navigation with module links
- Common CSS variables (
--primary,--secondary, etc.) - Block structure:
{% block title %},{% block content %},{% block extra_js %}
Key Development Patterns
Adding a New CSV-backed Feature
- Define CSV structure in DataManager with
default_columns - Create route in app.py (GET for display, POST for submission)
- Use
validators.pyfunctions for input validation - If calculations needed, add to
calculators.py - Create template extending
base.html - Follow existing form patterns (see
expenses.htmlorrecord_eggs.html)
Dashboard KPI Calculation Pattern
The dashboard aggregates data from all modules:
# Example: Total active birds
flocks_df = DataManager.read_csv_safe('inventory/flocks.csv', ...)
active_flocks = flocks_df[flocks_df['status'] == 'active']
total_birds = active_flocks['current_count'].sum()
All KPIs follow: read CSV → filter → aggregate → pass to template.
Alert System Pattern
Dashboard alerts are generated by checking thresholds:
# Overdue vaccinations
vaccinations_df = DataManager.read_csv_safe('health/vaccinations.csv', ...)
overdue = vaccinations_df[vaccinations_df['next_due_date'] < today]
if len(overdue) > 0:
alerts.append({'type': 'danger', 'icon': '⚠️', 'message': '...'})
Alert types: danger (red), warning (yellow), success (green), info (blue).
Chart.js Integration
Production and finance modules use Chart.js for visualization:
// In template {% block extra_js %}
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<script>
const ctx = document.getElementById('chartId').getContext('2d');
new Chart(ctx, {
type: 'line', // or 'pie', 'doughnut', 'bar'
data: {
labels: {{ labels|tojson|safe }},
datasets: [...]
}
});
</script>
Data is prepared in Flask route using calculators.py functions, then passed via Jinja2's tojson filter.
Regional Context: Southern Chile
The application is optimized for Los Lagos and Los Ríos regions:
Breeds Prioritized:
- Lohmann Brown (commercial layers, 280-300 eggs/year)
- Araucana (blue eggs, heritage breed, 180-200 eggs/year)
- Brahma (extreme cold resistance)
- Criolla (rustic local breeds)
Suppliers Referenced:
- Fundo El Peumo (Puerto Montt) - feed
- Avícola Los Maitenes (Osorno) - chicks
- Cooprinsem - veterinary supplies
Climate Considerations:
- Feed calculator includes cold-weather adjustments
- Health module emphasizes respiratory disease alerts (high humidity)
- Production module tracks temperature correlation
CSV File Schemas
flocks.csv
flock_id,name,breed_key,initial_count,current_count,birth_date,acquisition_date,status,notes
F001,Ponedoras A,lohmann,50,48,2025-01-01,2025-02-15,active,Compradas Los Maitenes
egg_production.csv
record_id,flock_id,date,eggs_collected,eggs_broken,eggs_dirty,temperature_c,notes
P001,F001,2026-01-21,42,1,2,18,Día lluvioso
vaccinations.csv
vaccination_id,flock_id,vaccine_name,date_applied,next_due_date,vet_name,cost,notes
V001,F001,Newcastle,2025-02-15,2025-08-15,Cooprinsem,0,Incluida compra pollitas
expenses.csv
expense_id,date,category,description,quantity,unit_cost,total_cost,supplier,flock_id
E001,2026-01-10,feed,Alimento Ponedora 16%,8,13000,104000,Fundo El Peumo,F001
income.csv
income_id,date,product_type,quantity,unit_price,total_income,client,flock_id,notes
I001,2026-01-20,eggs_regular,60,250,15000,Feria local,F001,Docenas maple
Troubleshooting
Port 5000 already in use
# Use alternate port
python app.py --port 5001
# Or kill existing process
lsof -i :5000
kill <PID>
NumPy compatibility error
# Force reinstall with correct version
pip install 'numpy<2.0.0' --force-reinstall
CSV corruption
Auto-backups are in data/*/backups/ with timestamp filenames. Restore by copying:
cp data/inventory/backups/flocks_backup_20260122_103045.csv data/inventory/flocks.csv
Chart.js not rendering
- Check browser console (F12) for errors
- Verify internet connection (CDN dependency)
- Ensure data is properly formatted with
|tojson|safefilter
Code Style Notes
- Spanish is used for UI text, comments, and user-facing messages
- Variable names in English (PEP-8 style)
- All forms validate on both client-side (HTML5) and server-side (validators.py)
- Emojis are used extensively in UI for visual categorization (🌾 feed, 💊 medicine, etc.)
- Color scheme: Blue primary (#2563eb), Green secondary (#10b981)
- Date format: YYYY-MM-DD (ISO 8601) throughout
Related Documents
Claude AI Git Workflow Integration
When working with git repositories and suggesting commit workflows, always recommend using the `git-ai-commit` CLI tool for creating commit messages.
Code indexing for AI agents: summarization strategies and evaluation systems
**The most effective code indexing systems combine hierarchical LLM-generated summaries with AST structural data and vector embeddings through hybrid retrieval—achieving up to 80% codebase reduction while maintaining high accuracy for AI coding agents.** Leading tools like Cursor, Sourcegraph Cody, and Continue.dev demonstrate that no single retrieval method suffices; production systems require semantic search, keyword matching, and structural queries working together. For evaluation, the field
Missing Business Agents Research — FLUXION 2026
> Deep Research CoVe 2026 | Date: 2026-03-23
write-script
Write a full video script for @SketchySurvival101 following all rules in CLAUDE.md.