.NET remaps "sub" to a long URI claim type by default, causing User.FindFirst("sub") to return null. MapInboundClaims=false preserves the original claim names. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
.NET 8 backend with Zitadel JWT auth, TheMealDB integration, weekly meal plan generation, shopping list aggregation. Vue 3 + Tailwind 4 frontend with dark emerald theme, manual OIDC PKCE auth, all views implemented. Multi-stage Dockerfile with nginx reverse proxy. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>