{% extends "base.html" %} {% block content %} {% set mk = masked_keys|default({}) %} {% set st = stats|default({}) %}
{{ (current_user.username|default('??'))[:2]|upper }}

{{ current_user.username|default('User') }}

{{ current_user.email|default('') }} {% if current_user.created_at is defined and current_user.created_at %} · Member since {{ current_user.created_at.strftime('%B %Y') }} {% endif %} {% if current_user.zip_code|default('') %} · {{ current_user.zip_code }} {% endif %}
{{ st.get('favorites', 0) }}
Favorites
{{ st.get('collections', 0) }}
Collections
{{ st.get('ratings', 0) }}
Ratings
{{ st.get('cooked', 0) }}
Cooked
{{ st.get('meal_plans', 0) }}
Meal Plans
{{ st.get('photos', 0) }}
Photos
Favorite Recipes
My Collections
My Photos
Meal History
Recently Rated
Loading…
Recently Favorited
Loading…
Recently Cooked
Loading…
Profile
Used for local grocery pricing and store suggestions.
Used for Today's Meals and meal planning accuracy.
AI API Keys

Keys are encrypted before storage. Leave blank to keep current key. You only need one provider.

{% for prov, label, hint in [ ('claude', 'Claude API Key', 'sk-ant-api03-...'), ('openai', 'OpenAI API Key', 'sk-...'), ('gemini', 'Gemini API Key', 'AI...') ] %}
{% if mk.get(prov) %} {% endif %}
{% if mk.get(prov) %} Saved: {{ mk[prov] }} — leave blank to keep {% else %} No key configured {% endif %}
{% endfor %}
Change Password

Leave blank to keep your current password.

{% endblock %}