{% extends "_base.html" %} {% block title %}{{ user.name or user.email }} · Cauldron{% endblock %} {% block content %}
// account

{{ user.name or user.email.split('@')[0] }}

welcome back to the coven.

identity

authentik
email
{{ user.email }}
subject
{{ user.sub }}

mealie

{% if connected %}connected{% else %}not connected{% endif %}
{% if connected and mealie_user %}
logged in as
{{ mealie_user.username or mealie_user.email }}
full name
{{ mealie_user.fullName or '—' }}
role
{{ 'admin' if mealie_user.admin else 'member' }}
{% if mealie_user.household %}
household
{{ mealie_user.household.name or mealie_user.household.slug }} · {{ household_size }} {% if household_size == 1 %}member{% else %}members{% endif %}
{% endif %}
revoking on mealie's side also works.
{% elif connected %}

token stored, but mealie didn't return profile data. probably revoked or rotated.

{% else %}

connect mealie so cauldron can act on your behalf — your recipes, your meal plan, your shopping list. one-time, ~30 seconds.

Connect mealie →

{% endif %}
{% if connected %}

tools

household admin

mealie's parser is per-recipe; this kicks off a bulk pass over your whole library. review proposals, apply the good ones.

🪄 bulk sterilize recipes →

scan your foods table for dupes, ask hecate to pick canonicals, merge in mealie. one-time cleanup; aliases get attached to the survivors so the parser fuzzy-matches variants from now on.

🔮 consolidate foods table →

find duplicate recipes by name + ingredient similarity. hecate picks the canonical to keep; you confirm per cluster before mealie deletes the others. permanent — review carefully.

🌀 dedupe recipes →

have hecate generate per-recipe metadata — cuisine, complexity, macros, primary protein/carb, comfort tier, summary. the plan generator reads this so "high protein week" is a real query, not just a vibe.

✨ enrich recipes →

{% endif %}
{% endblock %}