{"items":[{"id":"1TOxM5OgjxCl65Rcp1xI","notes":"Ingredients (4 servings)\n1.5 lb chicken breast\n2 cups cooked white or jasmine rice\n3 cups broccoli\n2 tbsp olive oil\nJuice of 1 lemon\nGarlic powder, salt, pepper\nHow to make\nSeason chicken with garlic, salt, pepper, lemon juice + olive oil\nBake at 400°F for ~20–25 min or pan cook\nSteam or roast broccoli (salt + olive oil)\nCook rice (or use your pre-cooked rice)","linkedProjectId":"","createdAt":{"_seconds":1774539217,"_nanoseconds":33000000},"published":true,"sodium":"","cholesterol":"","nextAvailableDate":"","sugar":"","carbs":"10","protein":"40","fat":"10","calories":"500","menuIngredients":"chicken, rice, lemons, garlic","availableThisWeek":true,"servingSize":"1 Meal","satFat":"10","packOptions":[],"weeklySpecial":false,"hideCalories":false,"fanFavorite":false,"mealType":"Entrée","menuCategory":"Entrée","skuBase":"TDC-0009","owner":"omar","sortOrder":0,"menuDescription":"dry-brined for 24 hours so every bite is seasoned all the way through. butterflied and pounded to an even thickness so every piece cooks identically, no dry edges, no undercooked center. roasted until golden, glazed with honey and lemon right at the end, then rested to lock every drop of moisture in. finished with a bright lemon squeeze and a rich pan sauce from the real drippings. fresh every week, and  even better the next day.​​​​​​​​​​​​​​​​","nutritionTags":[],"instructionsHtml":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Tandoco — Lemon Garlic Chicken</title>\n<link href=\"https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;1,9..144,300;1,9..144,400&family=Outfit:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  :root {\n    --navy: #1B1A6B;\n    --blue-mid: #2D2FA8;\n    --blue-light: #4F51D4;\n    --blue-pale: #C8C9F5;\n    --cream: #FAF8F3;\n    --gold: #C8A96E;\n    --terra: #C87555;\n    --ink: #1a1a1a;\n    --muted: #666;\n    --border: rgba(0,0,0,0.08);\n  }\n\n  body {\n    font-family: 'Outfit', sans-serif;\n    background: var(--cream);\n    color: var(--ink);\n    min-height: 100vh;\n  }\n\n  /* ── Hero ── */\n  .hero {\n    background: var(--navy);\n    padding: 3.5rem 2rem 0;\n    text-align: center;\n    position: relative;\n    overflow: hidden;\n  }\n  .hero::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    background:\n      radial-gradient(ellipse 60% 50% at 20% 80%, rgba(79,81,212,0.35) 0%, transparent 70%),\n      radial-gradient(ellipse 50% 60% at 80% 20%, rgba(200,169,110,0.2) 0%, transparent 70%);\n    pointer-events: none;\n  }\n  .hero-eyebrow {\n    font-family: 'Outfit', sans-serif;\n    font-size: 11px;\n    font-weight: 500;\n    letter-spacing: 0.14em;\n    text-transform: uppercase;\n    color: var(--gold);\n    margin-bottom: 1rem;\n    position: relative;\n  }\n  .hero-title {\n    font-family: 'Fraunces', serif;\n    font-size: clamp(2.6rem, 7vw, 4.5rem);\n    font-weight: 400;\n    color: #fff;\n    line-height: 1.05;\n    margin-bottom: 0.5rem;\n    position: relative;\n  }\n  .hero-title em {\n    font-style: italic;\n    color: var(--blue-pale);\n  }\n  .hero-sub {\n    font-size: 14px;\n    color: rgba(255,255,255,0.55);\n    margin-bottom: 2.5rem;\n    position: relative;\n  }\n  .hero-tags {\n    display: flex;\n    justify-content: center;\n    gap: 8px;\n    flex-wrap: wrap;\n    margin-bottom: 2.5rem;\n    position: relative;\n  }\n  .tag {\n    font-size: 11px;\n    font-weight: 500;\n    letter-spacing: 0.06em;\n    padding: 5px 12px;\n    border-radius: 100px;\n    border: 1px solid rgba(255,255,255,0.15);\n    color: rgba(255,255,255,0.7);\n    background: rgba(255,255,255,0.06);\n  }\n  .hero-divider {\n    width: 100%;\n    height: 48px;\n    background: var(--cream);\n    border-radius: 48px 48px 0 0;\n    position: relative;\n    z-index: 1;\n  }\n\n  /* ── Layout ── */\n  .wrap { max-width: 720px; margin: 0 auto; padding: 0 1.5rem 4rem; }\n\n  /* ── Section header ── */\n  .section-head {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    margin: 2.5rem 0 1.25rem;\n  }\n  .section-num {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    background: var(--navy);\n    color: #fff;\n    font-size: 13px;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n  }\n  .section-title {\n    font-family: 'Fraunces', serif;\n    font-size: 1.35rem;\n    font-weight: 400;\n    color: var(--navy);\n  }\n  .section-sub {\n    font-size: 12.5px;\n    color: var(--muted);\n    margin-left: auto;\n    white-space: nowrap;\n  }\n\n  /* ── Timing bar ── */\n  .timing-bar {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 1px;\n    background: var(--border);\n    border-radius: 12px;\n    overflow: hidden;\n    border: 1px solid var(--border);\n    margin: 2rem 0;\n  }\n  .timing-item {\n    background: #fff;\n    padding: 1rem;\n    text-align: center;\n  }\n  .timing-val {\n    font-family: 'Fraunces', serif;\n    font-size: 1.6rem;\n    font-weight: 400;\n    color: var(--navy);\n    line-height: 1;\n    margin-bottom: 4px;\n  }\n  .timing-label { font-size: 11px; color: var(--muted); letter-spacing: 0.06em; text-transform: uppercase; }\n\n  /* ── Cards ── */\n  .card {\n    background: #fff;\n    border-radius: 14px;\n    border: 1px solid var(--border);\n    overflow: hidden;\n    margin-bottom: 1rem;\n  }\n  .card-header {\n    padding: 1rem 1.25rem;\n    background: #f7f5f0;\n    border-bottom: 1px solid var(--border);\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n  }\n  .card-header-title {\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    color: var(--navy);\n  }\n  .card-header-note {\n    font-size: 11.5px;\n    color: var(--gold);\n    font-weight: 500;\n  }\n  .card-body { padding: 1.25rem; }\n\n  /* ── Ingredients ── */\n  .ingredient-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }\n  .ingredient {\n    display: flex;\n    align-items: baseline;\n    gap: 10px;\n    font-size: 14px;\n    line-height: 1.4;\n  }\n  .ing-amount {\n    font-weight: 600;\n    color: var(--navy);\n    min-width: 80px;\n    text-align: right;\n    flex-shrink: 0;\n    font-size: 13px;\n  }\n  .ing-name { color: var(--ink); }\n  .ing-note { font-size: 12px; color: var(--muted); margin-left: 4px; }\n  .ing-divider {\n    height: 1px;\n    background: var(--border);\n    margin: 6px 0 6px 90px;\n  }\n  .ing-group-label {\n    font-size: 10.5px;\n    font-weight: 600;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n    color: var(--muted);\n    padding: 8px 0 4px 90px;\n  }\n\n  /* ── Steps ── */\n  .steps { display: flex; flex-direction: column; gap: 0; }\n  .step {\n    display: flex;\n    gap: 16px;\n    padding: 1.25rem 1.25rem;\n    border-bottom: 1px solid var(--border);\n    position: relative;\n  }\n  .step:last-child { border-bottom: none; }\n  .step-left { display: flex; flex-direction: column; align-items: center; gap: 0; flex-shrink: 0; }\n  .step-dot {\n    width: 28px;\n    height: 28px;\n    border-radius: 50%;\n    background: var(--navy);\n    color: #fff;\n    font-size: 12px;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n  }\n  .step-line {\n    width: 1.5px;\n    flex: 1;\n    background: var(--border);\n    margin-top: 6px;\n    min-height: 20px;\n  }\n  .step-content { flex: 1; padding-top: 2px; }\n  .step-title {\n    font-family: 'Fraunces', serif;\n    font-size: 1rem;\n    font-weight: 400;\n    color: var(--navy);\n    margin-bottom: 6px;\n  }\n  .step-body {\n    font-size: 14px;\n    color: var(--ink);\n    line-height: 1.65;\n  }\n  .step-body strong { font-weight: 600; }\n  .step-callout {\n    margin-top: 10px;\n    padding: 10px 14px;\n    background: #EEF0FF;\n    border-radius: 8px;\n    border-left: 3px solid var(--navy);\n    font-size: 13px;\n    color: var(--navy);\n    line-height: 1.5;\n  }\n  .step-callout.gold {\n    background: #FFF8EC;\n    border-left-color: var(--gold);\n    color: #7A5C1E;\n  }\n  .step-callout.terra {\n    background: #FFF2EE;\n    border-left-color: var(--terra);\n    color: #7A3520;\n  }\n  .step-timing {\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n    font-size: 11px;\n    font-weight: 500;\n    color: var(--muted);\n    background: #f5f3ee;\n    padding: 3px 10px;\n    border-radius: 100px;\n    margin-top: 8px;\n  }\n  .step-timing svg { width: 11px; height: 11px; }\n\n  /* ── Temp target ── */\n  .temp-target {\n    display: flex;\n    align-items: center;\n    gap: 16px;\n    background: var(--navy);\n    border-radius: 12px;\n    padding: 1.25rem 1.5rem;\n    margin: 1.5rem 0;\n    color: #fff;\n  }\n  .temp-val {\n    font-family: 'Fraunces', serif;\n    font-size: 2.5rem;\n    font-weight: 400;\n    color: var(--blue-pale);\n    line-height: 1;\n    flex-shrink: 0;\n  }\n  .temp-text { font-size: 13.5px; line-height: 1.55; color: rgba(255,255,255,0.8); }\n  .temp-text strong { color: #fff; }\n\n  /* ── Science aside ── */\n  .science-box {\n    border: 1px solid var(--blue-pale);\n    background: #F4F4FD;\n    border-radius: 12px;\n    padding: 1.25rem;\n    margin: 1rem 0;\n  }\n  .science-label {\n    font-size: 10.5px;\n    font-weight: 600;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n    color: var(--blue-light);\n    margin-bottom: 6px;\n  }\n  .science-text { font-size: 13px; color: #444; line-height: 1.6; }\n\n  /* ── Flavor profiles ── */\n  .profiles-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 10px;\n    margin-top: 1rem;\n  }\n  .profile-card {\n    background: #fff;\n    border: 1px solid var(--border);\n    border-radius: 10px;\n    padding: 1rem;\n  }\n  .profile-name { font-size: 13.5px; font-weight: 600; color: var(--ink); margin-bottom: 4px; }\n  .profile-note { font-size: 12px; color: var(--muted); line-height: 1.5; }\n\n  /* ── Footer note ── */\n  .footer-note {\n    margin-top: 2.5rem;\n    padding: 1.5rem;\n    background: var(--navy);\n    border-radius: 14px;\n    color: rgba(255,255,255,0.75);\n    font-size: 13px;\n    line-height: 1.65;\n    text-align: center;\n  }\n  .footer-note strong { color: #fff; }\n  .tandoco-logo {\n    font-family: 'Fraunces', serif;\n    font-size: 1.1rem;\n    color: var(--blue-pale);\n    font-style: italic;\n    font-weight: 300;\n    display: block;\n    margin-bottom: 8px;\n  }\n\n  @media (max-width: 540px) {\n    .timing-bar { grid-template-columns: repeat(3, 1fr); }\n    .profiles-grid { grid-template-columns: 1fr; }\n    .ing-amount { min-width: 70px; }\n  }\n</style>\n</head>\n<body>\n\n<div class=\"hero\">\n  <p class=\"hero-eyebrow\">tandoco recipe guide</p>\n  <h1 class=\"hero-title\">Lemon <em>Garlic</em><br>Chicken</h1>\n  <p class=\"hero-sub\">10 servings · high-protein meal prep</p>\n  <div class=\"hero-tags\">\n    <span class=\"tag\">50g+ protein</span>\n    <span class=\"tag\">dry brine method</span>\n    <span class=\"tag\">convection roast</span>\n    <span class=\"tag\">batch-optimized</span>\n  </div>\n  <div class=\"hero-divider\"></div>\n</div>\n\n<div class=\"wrap\">\n\n  <div class=\"timing-bar\">\n    <div class=\"timing-item\">\n      <div class=\"timing-val\">15<span style=\"font-size:1rem\">m</span></div>\n      <div class=\"timing-label\">Day-Before Prep</div>\n    </div>\n    <div class=\"timing-item\">\n      <div class=\"timing-val\">12–24<span style=\"font-size:1rem\">h</span></div>\n      <div class=\"timing-label\">Brine Time</div>\n    </div>\n    <div class=\"timing-item\">\n      <div class=\"timing-val\">45<span style=\"font-size:1rem\">m</span></div>\n      <div class=\"timing-label\">Cook Day Active</div>\n    </div>\n  </div>\n\n  <!-- ══ WEIGHT CALCULATOR ══ -->\n  <div class=\"card\" style=\"margin-bottom:2rem;\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Batch Calculator</span>\n      <span class=\"card-header-note\">enter your batch details</span>\n    </div>\n    <div class=\"card-body\">\n\n      <!-- Row 1: Weight input -->\n      <div style=\"margin-bottom:12px;\">\n        <div style=\"font-size:11px; font-weight:600; letter-spacing:0.08em; text-transform:uppercase; color:var(--muted); margin-bottom:8px;\">Raw chicken weight</div>\n        <div style=\"display:flex; align-items:center; gap:12px; flex-wrap:wrap;\">\n          <div style=\"position:relative; flex:1; min-width:180px;\">\n            <input id=\"meatWeight\" type=\"number\" min=\"100\" max=\"10000\" placeholder=\"e.g. 1590\"\n              style=\"width:100%; padding:10px 48px 10px 14px; border-radius:8px; border:1.5px solid var(--blue-pale); background:#fff; font-size:16px; font-family:'Outfit',sans-serif; color:var(--ink); outline:none;\"\n              oninput=\"calcIngredients()\" onfocus=\"this.style.borderColor='var(--navy)'\" onblur=\"this.style.borderColor='var(--blue-pale)'\">\n            <span style=\"position:absolute; right:14px; top:50%; transform:translateY(-50%); font-size:12px; color:var(--muted); pointer-events:none;\">g</span>\n          </div>\n          <div style=\"display:flex; gap:8px;\">\n            <button onclick=\"setUnit('g')\" id=\"btnG\" style=\"padding:8px 16px; border-radius:8px; border:1.5px solid var(--navy); background:var(--navy); color:#fff; font-size:13px; font-family:'Outfit',sans-serif; font-weight:500; cursor:pointer;\">grams</button>\n            <button onclick=\"setUnit('lbs')\" id=\"btnLbs\" style=\"padding:8px 16px; border-radius:8px; border:1.5px solid var(--border); background:#fff; color:var(--ink); font-size:13px; font-family:'Outfit',sans-serif; font-weight:500; cursor:pointer;\">lbs</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Row 2: Protein goal -->\n      <div style=\"margin-bottom:16px;\">\n        <div style=\"font-size:11px; font-weight:600; letter-spacing:0.08em; text-transform:uppercase; color:var(--muted); margin-bottom:8px;\">Protein goal per serving</div>\n        <div style=\"display:flex; align-items:center; gap:10px; flex-wrap:wrap;\">\n          <div style=\"position:relative; width:140px;\">\n            <input id=\"proteinGoal\" type=\"number\" min=\"20\" max=\"100\" value=\"50\"\n              style=\"width:100%; padding:10px 40px 10px 14px; border-radius:8px; border:1.5px solid var(--blue-pale); background:#fff; font-size:16px; font-family:'Outfit',sans-serif; color:var(--ink); outline:none;\"\n              oninput=\"calcIngredients()\" onfocus=\"this.style.borderColor='var(--navy)'\" onblur=\"this.style.borderColor='var(--blue-pale)'\">\n            <span style=\"position:absolute; right:14px; top:50%; transform:translateY(-50%); font-size:12px; color:var(--muted); pointer-events:none;\">g</span>\n          </div>\n          <div style=\"display:flex; gap:8px; flex-wrap:wrap;\">\n            <button onclick=\"setProteinGoal(40)\" class=\"protein-preset\" id=\"pp40\" style=\"padding:6px 12px; border-radius:8px; border:1.5px solid var(--border); background:#fff; color:var(--ink); font-size:12px; font-family:'Outfit',sans-serif; font-weight:500; cursor:pointer;\">40g</button>\n            <button onclick=\"setProteinGoal(50)\" class=\"protein-preset\" id=\"pp50\" style=\"padding:6px 12px; border-radius:8px; border:1.5px solid var(--navy); background:var(--navy); color:#fff; font-size:12px; font-family:'Outfit',sans-serif; font-weight:500; cursor:pointer;\">50g</button>\n            <button onclick=\"setProteinGoal(60)\" class=\"protein-preset\" id=\"pp60\" style=\"padding:6px 12px; border-radius:8px; border:1.5px solid var(--border); background:#fff; color:var(--ink); font-size:12px; font-family:'Outfit',sans-serif; font-weight:500; cursor:pointer;\">60g</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Serving output -->\n      <div id=\"servingResult\" style=\"display:none; background:#EEF0FF; border-radius:10px; padding:1.25rem; margin-bottom:1.25rem; border:1px solid var(--blue-pale);\">\n        <div style=\"font-size:11px; font-weight:600; letter-spacing:0.08em; text-transform:uppercase; color:var(--blue-light); margin-bottom:12px;\">Serving recommendation</div>\n        <div style=\"display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin-bottom:12px;\">\n          <div style=\"background:#fff; border-radius:8px; padding:10px; text-align:center;\">\n            <div style=\"font-family:'Fraunces',serif; font-size:1.6rem; color:var(--navy); line-height:1;\" id=\"portionCount\">—</div>\n            <div style=\"font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:4px;\">portions</div>\n          </div>\n          <div style=\"background:#fff; border-radius:8px; padding:10px; text-align:center;\">\n            <div style=\"font-family:'Fraunces',serif; font-size:1.6rem; color:var(--navy); line-height:1;\" id=\"rawPerPortion\">—</div>\n            <div style=\"font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:4px;\">g raw / portion</div>\n          </div>\n          <div style=\"background:#fff; border-radius:8px; padding:10px; text-align:center;\">\n            <div style=\"font-family:'Fraunces',serif; font-size:1.6rem; color:var(--navy); line-height:1;\" id=\"proteinPerPortion\">—</div>\n            <div style=\"font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:4px;\">g protein / portion</div>\n          </div>\n        </div>\n        <div id=\"servingNote\" style=\"font-size:12px; color:#3a3a8a; line-height:1.55;\"></div>\n      </div>\n\n      <!-- Ingredients grid -->\n      <div id=\"calcResult\" style=\"display:none; margin-top:1.25rem;\">\n        <div style=\"font-size:11px; font-weight:600; letter-spacing:0.08em; text-transform:uppercase; color:var(--muted); margin-bottom:10px;\">Scaled ingredients</div>\n        <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:8px;\" id=\"calcGrid\"></div>\n        <div style=\"margin-top:10px; font-size:12px; color:var(--muted);\">All ingredient amounts below update automatically.</div>\n      </div>\n\n    </div>\n  </div>\n\n  <!-- ══ PHASE 0: PREP ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">1</div>\n    <h2 class=\"section-title\">Prep the Chicken</h2>\n    <span class=\"section-sub\">before anything else</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">If starting from frozen — thaw in the fridge</div>\n          <div class=\"step-body\">Move frozen chicken from the freezer to the fridge <strong>24 hours before brine day</strong>. It thaws slowly at a safe temperature the whole time and arrives cold and ready to prep. This is the only method that fits the Tandoco workflow — it adds zero active time and slots naturally into the night-before routine. <strong>Never thaw on the counter or in hot water</strong> — the outer surface enters the danger zone (40–140°F) while the center is still frozen. If you're short on time, submerge the sealed bag in cold water, changing the water every 30 minutes — a full batch takes 2–3 hours and must go straight to brining after, no refreezing.</div>\n          <div class=\"step-callout gold\">If starting fresh (never frozen), skip this step entirely.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Do not rinse</div>\n          <div class=\"step-body\">Take the chicken straight from the package — <strong>do not rinse it under water.</strong> Rinsing spreads bacteria to your sink, counter, and surrounding surfaces via water splatter. It does nothing to make the chicken safer. This is non-negotiable per USDA/FDA food safety guidance.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Pat completely dry</div>\n          <div class=\"step-body\">Use paper towels to pat every surface of each breast <strong>completely dry</strong> — top, bottom, and sides. Surface moisture is the enemy of browning. Wet chicken steams in the oven instead of roasting, and the dry brine can't adhere properly to a wet surface. Don't rush this step — thorough drying makes a visible difference in the final crust.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">4</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Trim excess fat and tendons</div>\n          <div class=\"step-body\">Remove any large pockets of fat or dangling tendons with kitchen shears or a sharp knife. Small fat deposits are fine — they render during cooking. You're just cleaning up anything that would cook unevenly or affect the texture of a meal-prep portion.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">5</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Check your workspace</div>\n          <div class=\"step-body\">Raw chicken contaminates every surface it touches. Keep a dedicated cutting board for raw protein. Wash hands thoroughly after handling. Have your sheet pans, wire racks, scale, and salt ready to go before you start — you want to move from prep straight to brining without stopping to find equipment.</div>\n          <div class=\"step-callout gold\">For Tandoco production batches: set up a raw side and a clean side of your workspace before you start. Never let raw chicken come into contact with equipment or surfaces that will touch cooked food.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 1: DRY BRINE ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">3</div>\n    <h2 class=\"section-title\">Day Before — Dry Brine</h2>\n    <span class=\"section-sub\">15 min active</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Ingredients</span>\n      <span class=\"card-header-note\">per 10 breasts (~5–6 lbs)</span>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\">\n          <span class=\"ing-amount\" id=\"saltAmt\">35–40g</span>\n          <span class=\"ing-name\">Diamond Crystal kosher salt <span class=\"ing-note\" id=\"saltNote\">~3 tbsp + 1 tsp</span></span>\n        </li>\n        <li class=\"ingredient\">\n          <span class=\"ing-amount\">10</span>\n          <span class=\"ing-name\">chicken breasts <span class=\"ing-note\">~8–10 oz each</span></span>\n        </li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Steps</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Butterfly large breasts, then pound to uniform thickness</div>\n          <div class=\"step-body\">For any breast over <strong>8–10oz</strong> (most large breasts), butterfly first — use a sharp knife to cut horizontally through the center of the breast, stopping just before you cut all the way through, then open it flat like a book. This halves the thickness mechanically before you ever pick up the mallet, so you're doing a light finishing pound rather than a full breakdown. <strong>Keep your cut centered</strong> — an off-center butterfly gives you one thick half and one thin half, which defeats the purpose. Then using the <strong>flat side</strong> of a meat mallet (not the spiked side), lightly pound each half to <strong>¾-inch even thickness</strong>. For smaller breasts (under 8oz), skip the butterfly and pound directly.</div>\n          <div class=\"step-callout\">Butterflying large breasts also improves portioning — you can separate the two halves into individual portions for more consistent serving sizes across the batch. Note: butterflied breasts lay wider and flatter, so you'll fit fewer per pan — plan on <strong>two sheet pans</strong> for most batches. This also means two wire racks. The tradeoff is worth it: cook time drops and doneness becomes consistent across the entire batch.</div>\n          <div class=\"step-callout gold\"><strong>Short on time?</strong> Skip the pre-chill — take the chicken straight from the fridge and pound immediately. Chilling first helps fibers resist tearing, but at small batch sizes the difference is minimal. What you can't skip is the pounding itself.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Weigh and calculate your salt</div>\n          <div class=\"step-body\">Place all breasts on the scale together and note the <strong>total raw weight in grams</strong>. Multiply by <strong>0.015</strong> — that's your exact salt amount. Weigh that salt into a small bowl. This takes 30 seconds and eliminates all guesswork.</div>\n          <div class=\"step-callout\">Example: 10 breasts at 1,400g total → 1,400 × 0.015 = <strong>21g salt</strong>. Always weigh, never eyeball — over-salting is the most common dry brine mistake.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Apply dry brine</div>\n          <div class=\"step-body\">Lay each breast flat on the rack. Pinch-sprinkle the salt from <strong>6–8 inches above</strong> the breast — the height disperses the salt as it falls for more even coverage than dumping from close up. Season both sides, dividing your bowl of salt roughly equally across all breasts. Don't rush this — even coverage matters.</div>\n          <div class=\"step-callout gold\">⚑ Do not rinse the chicken at any point. No exceptions. Rinsing spreads bacteria to your sink, counter, and hands (USDA/FDA guidance). The dry brine does the work — no washing needed.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">4</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Refrigerate uncovered overnight</div>\n          <div class=\"step-body\">Arrange breasts on <strong>wire racks over sheet pans</strong>. Leave uncovered. Refrigerate for <strong>12–24 hours</strong> — overnight is optimal; 1 hour is the minimum. The three-phase process: salt draws moisture out → dissolves into a natural brine → reabsorbs deep into the meat overnight. The result is more flavorful, more juicy chicken that holds moisture through cooking and reheating.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> 12–24 hours</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 3: FLAVOR COATING ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">3</div>\n    <h2 class=\"section-title\">Cook Day — Flavor Coating</h2>\n    <span class=\"section-sub\">20–30 min before oven</span>\n  </div>\n\n  <div class=\"science-box\">\n    <div class=\"science-label\">why this formula works</div>\n    <div class=\"science-text\">Lemon juice (pH 2.0–2.5) denatures surface proteins within 2–3 hours, turning the exterior mushy. So: lemon <strong>zest</strong> carries the fat-soluble essential oils for intense citrus flavor with zero acid damage. A restrained amount of juice goes in the coating. Fresh lemon is squeezed <em>after</em> cooking for the bright punch — heat destroys volatile aromatics, so pre-cook lemon loses most of its vibrancy.</div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Flavor Coating Ingredients</span>\n      <span class=\"card-header-note\">10 breasts</span>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"oilAmt\">½ cup</span><span class=\"ing-name\">extra-virgin olive oil</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"zestAmt\">~3 tbsp</span><span class=\"ing-name\">lemon zest <span class=\"ing-note\">zest of <span id=\"zestLemons\">4</span> lemons — the key flavor driver</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"juiceAmt\">3 tbsp</span><span class=\"ing-name\">fresh lemon juice <span class=\"ing-note\">~<span id=\"juiceLemons\">1.5</span> lemons — restrained on purpose</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"garlicAmt\">10 cloves</span><span class=\"ing-name\">garlic, microplaned <span class=\"ing-note\">~3 tbsp</span></span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"oreganoAmt\">2 tbsp</span><span class=\"ing-name\">dried oregano</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"thymeAmt\">1 tbsp</span><span class=\"ing-name\">fresh thyme leaves</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"pepperAmt\">2 tsp</span><span class=\"ing-name\">black pepper</span></li>\n        <div class=\"ing-divider\"></div>\n        <div class=\"ing-group-label\">Optional</div>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"paprikaAmt\">1 tsp</span><span class=\"ing-name\">smoked paprika <span class=\"ing-note\">for color</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"chilliAmt\">1 tsp</span><span class=\"ing-name\">red pepper flakes</span></li>\n        <div class=\"ing-divider\"></div>\n        <div class=\"ing-group-label\">Finishing (after cooking)</div>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"finishLemonAmt\">2 lemons</span><span class=\"ing-name\">fresh juice, squeezed over sliced chicken</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" id=\"parsleyAmt\">3 tbsp</span><span class=\"ing-name\">flat-leaf parsley, chopped</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Steps</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Zest lemons first — then mix the coating</div>\n          <div class=\"step-body\">Before doing anything else with the coating, <strong>zest all lemons in one dedicated pass</strong> — it's the most time-consuming step and goes faster when done without context-switching. Hold each lemon at an angle against the microplane and rotate for even coverage, stopping before you hit the white pith. For large batches, a Y-peeler to remove strips then a quick knife mince is faster than a microplane. Once zesting is done, juice the same lemons with a citrus press — much faster than hand-squeezing. Then combine everything: olive oil, lemon zest, lemon juice, microplaned garlic, oregano, thyme, black pepper, and paprika (if using). The olive oil carries the fat-soluble flavor compounds from garlic, herbs, and zest; creates a protective barrier reducing surface moisture loss; and conducts heat for better browning.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Coat and temper</div>\n          <div class=\"step-body\">Remove chicken from the fridge. Toss all breasts in the coating until evenly covered. Let sit at room temperature for <strong>20–30 minutes</strong>. This accomplishes two things: flavors begin adhering to the surface, and the meat tempers slightly for more even cooking from edge to center. <strong>Do not skip the room temp rest</strong> — cold chicken straight from the fridge into the oven extends cook time and causes uneven cooking, especially in a home oven that may already be running cool.</div>\n          <div class=\"step-callout terra\">⚑ Do not exceed 2 hours of contact time with this coating. The lemon juice will begin degrading the surface texture beyond that window.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> 20–30 min rest at room temp</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 3: COOK ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">4</div>\n    <h2 class=\"section-title\">Roast</h2>\n    <span class=\"section-sub\">18–22 min</span>\n  </div>\n\n  <div class=\"temp-target\">\n    <div class=\"temp-val\">435–440°F</div>\n    <div class=\"temp-text\"><strong>Conventional oven with 10–15°F cool offset.</strong> The base target for this recipe is 425°F conventional (equivalent to 400°F convection). If your oven runs 10–15°F cool, set it to 435–440°F to hit the actual target. Always verify with an oven thermometer — not the dial.</div>\n  </div>\n  <div class=\"step-callout terra\" style=\"margin-bottom:1rem;\">⚑ <strong>Minimize oven door openings.</strong> Every time you open the door, the oven drops 25–50°F and takes several minutes to recover — this is a major source of extended and unpredictable cook times. The fix: use a <strong>leave-in probe thermometer</strong> with an external display so you can read the internal temp without opening the door at all. Insert the probe before the chicken goes in, run the wire out the door crack, and monitor from outside. Once your oven is calibrated and you've done one successful batch, you'll know your window — trust it and stay out.</div>\n\n  <div class=\"card\">\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Set up your pans</div>\n          <div class=\"step-body\">Line half sheet pans (13×18\") with parchment paper. Place wire racks inside. Arrange <strong>6–8 breasts per pan</strong>, leaving 1–2 inches of space between each. Do not crowd — pooling steam drops the surface temperature below the 300°F threshold needed for browning. Place the <strong>thickest breasts in the corners and along the edges</strong> (hottest zones), thinner pieces in the center.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Add steam (optional but effective)</div>\n          <div class=\"step-body\">Place a cast iron pan with <strong>1 cup hot water</strong> on the bottom rack for the first 10 minutes. The initial steam preserves surface moisture during the critical early phase. Remove it for the final minutes to allow browning.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Rotate at the halfway mark — one time only</div>\n          <div class=\"step-body\">At <strong>10–12 minutes</strong>, rotate each pan 180° (front to back) and swap rack positions if cooking two pans. Do this <strong>quickly and deliberately</strong> — get in and out fast to minimize heat loss. This is the only planned door opening during the cook. If your oven heats relatively evenly after calibration, you can skip this entirely and avoid the temp drop. When running multiple pans, expect cook time to increase by approximately 15%.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">4</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Pull at 160°F internal — not by time</div>\n          <div class=\"step-body\">Use a probe thermometer in the <strong>thickest part of the thickest breast on each pan</strong>. Pull when it reads <strong>160°F</strong>. Never cook by time alone — oven variance, breast size, and starting temp all shift the window. Total cook time is typically 18–22 minutes.</div>\n          <div class=\"step-callout\">The science: 160°F with a 5-minute rest achieves full food safety via pasteurization (time + temperature). The USDA 165°F instant-kill standard doesn't account for carryover hold time. Pulling at 160°F gives you dramatically juicier chicken — and it will hit 165°F on the customer's reheat anyway.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 4: REST & FINISH ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">7</div>\n    <h2 class=\"section-title\">Rest, Slice & Finish</h2>\n    <span class=\"section-sub\">5–10 min rest</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Rest loosely tented</div>\n          <div class=\"step-body\">Remove from oven. Tent loosely with foil and rest on the wire rack for <strong>5–10 minutes</strong>. During cooking, muscle fibers contract and push juices to the center. Resting lets them relax and reabsorb. Cutting immediately sends that juice onto the cutting board. Expect <strong>3–5°F of carryover</strong> during rest, bringing final internal temp to 163–165°F.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Slice against the grain</div>\n          <div class=\"step-body\">Slice each breast against the grain. This shortens the muscle fibers, making each bite noticeably more tender. If meal prepping for the week, you can also <strong>store whole and slice per portion at serving</strong> to maximize moisture retention in the container.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Finishing squeeze — this is the lemon moment</div>\n          <div class=\"step-body\">Squeeze <strong>2 fresh lemons</strong> over the hot sliced chicken. Scatter <strong>3 tablespoons chopped flat-leaf parsley</strong>. This is where the bright citrus punch comes from. Heat destroys the volatile aromatic compounds in lemon juice — anything added before cooking loses most of its vibrancy. The post-cook lemon is not optional if you want that signature brightness.</div>\n          <div class=\"step-callout gold\">The big principle: lemon <em>zest</em> in the coating (fat-soluble flavor, no acid damage) + minimal juice in the marinade + fresh lemon <em>after</em> cooking = bright citrus hit without chalky texture.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ PAN SAUCE ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">8</div>\n    <h2 class=\"section-title\">Pan Sauce — Two Ways</h2>\n    <span class=\"section-sub\">don't waste the drippings</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Option A — Deglaze the Pan</span>\n      <span class=\"card-header-note\">fastest, uses drippings directly</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Deglaze immediately off the heat</div>\n          <div class=\"step-body\">While the chicken is resting, pour <strong>¼–½ cup chicken broth</strong> directly into the hot sheet pan. Use a wooden spoon or silicone spatula to scrape up all the fond (the browned bits stuck to the pan) — that's where the flavor is concentrated. The liquid will sizzle and loosen everything immediately.</div>\n          <div class=\"step-callout terra\">⚑ <strong>Skip the parchment on this pan.</strong> Fond forms on the bare metal surface — parchment sits between the drippings and the pan, so you get minimal fond and nothing meaningful to scrape. If you want the pan sauce, line one pan with parchment and leave the other bare. More cleanup on that pan, but proper drippings. If you want parchment on both pans for easy cleanup, use Option B instead.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Finish and pour over portions</div>\n          <div class=\"step-body\">Squeeze in a little fresh lemon juice, taste for salt, and pour the sauce over the sliced chicken before portioning into containers. The drippings are concentrated and flavorful — this extends them just enough to coat all portions. Adds a moisture barrier during storage too.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Option B — Matching Lemon Garlic Sauce</span>\n      <span class=\"card-header-note\">scalable, made separately, tastes the same</span>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\" style=\"margin-bottom:1rem;\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">¼ cup</span><span class=\"ing-name\">extra-virgin olive oil</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">3 tbsp</span><span class=\"ing-name\">fresh lemon juice <span class=\"ing-note\">~1.5 lemons</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">3 cloves</span><span class=\"ing-name\">garlic, microplaned</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp</span><span class=\"ing-name\">honey</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">¼ tsp</span><span class=\"ing-name\">kosher salt</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tbsp</span><span class=\"ing-name\">flat-leaf parsley, finely chopped</span></li>\n      </ul>\n      <div class=\"step-body\" style=\"font-size:14px; line-height:1.65;\">Warm olive oil in a small pan over low heat. Add garlic and cook 60 seconds until fragrant — do not brown. Off the heat, whisk in lemon juice, honey, and salt. Stir in parsley. This sauce mirrors the dripping flavor profile exactly and scales to any batch size. Spoon over portioned chicken before sealing containers. <strong>This is the Tandoco-scale solution</strong> — consistent, repeatable, and doesn't depend on dripping volume.</div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 7: HONEY LEMON GLAZE ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">8</div>\n    <h2 class=\"section-title\">Optional — Honey Lemon Glaze</h2>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Glaze Formula</span>\n      <span class=\"card-header-note\">brush on last 5–8 min</span>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"step-body\" style=\"font-size:14px; line-height:1.65; margin-bottom:1rem;\">Mix honey, fresh lemon juice, and a pinch of salt to taste. Ratio: approximately <strong>2 parts honey : 1 part lemon juice</strong>. Thin with a little olive oil if needed for brushability.</div>\n      <div class=\"step-callout\">Timing is everything with honey. Cook chicken <strong>mostly through</strong> (~18–20 min), then pull the pan out, brush glaze generously on top, and return to oven for <strong>5–8 more minutes</strong>. For more char, hit the broiler for the <strong>last 1–2 minutes only</strong> — watch it closely, it goes from perfect to burnt fast. Adding honey earlier at 425°F gives you bitter, dark, overcooked glaze instead of glossy and caramelized.</div>\n    </div>\n  </div>\n\n  <!-- ══ PHASE 8: STORAGE ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">9</div>\n    <h2 class=\"section-title\">Storage & Reheating</h2>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Cold-Chain Protocol</span>\n    </div>\n    <div class=\"card-body\" style=\"display:flex; flex-direction:column; gap:12px;\">\n      <div class=\"step-body\" style=\"font-size:14px;line-height:1.65;\"><strong>Store whole, unsliced</strong> when possible — slicing increases surface area and accelerates moisture loss during refrigeration. Pour <strong>accumulated pan juices over the chicken</strong> before sealing containers. That liquid acts as a moisture barrier and partially reabsorbs during storage.</div>\n      <div class=\"step-body\" style=\"font-size:14px;line-height:1.65;\">Begin cooling within <strong>2 hours</strong> of leaving the oven. Use <strong>shallow containers</strong> (no deeper than 2 inches) — deep stacking traps heat in the danger zone (40–140°F). Refrigerate promptly; the old \"let it cool on the counter\" advice is more dangerous, not safer.</div>\n      <div style=\"display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:4px;\">\n        <div style=\"background:#f7f5f0; border-radius:10px; padding:1rem; text-align:center;\">\n          <div style=\"font-family:'Fraunces',serif; font-size:1.5rem; color:var(--navy);\">3–4 days</div>\n          <div style=\"font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:4px;\">Refrigerated (standard)</div>\n        </div>\n        <div style=\"background:#f7f5f0; border-radius:10px; padding:1rem; text-align:center;\">\n          <div style=\"font-family:'Fraunces',serif; font-size:1.5rem; color:var(--navy);\">7 days</div>\n          <div style=\"font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:0.06em; margin-top:4px;\">Vacuum sealed</div>\n        </div>\n      </div>\n      <div class=\"step-callout\" style=\"margin-top:4px;\"><strong>Reheating:</strong> Place chicken in a baking dish with ½ cup chicken broth, cover tightly with foil, heat at 300–350°F for 15–20 min. For microwave: cover with a damp paper towel, heat at medium power in 1-minute increments. A drizzle of olive oil or broth before microwaving helps significantly.</div>\n    </div>\n  </div>\n\n  <!-- ══ EQUIPMENT ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">10</div>\n    <h2 class=\"section-title\">Non-Negotiable Equipment</h2>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-body\" style=\"display:flex;flex-direction:column;gap:12px;\">\n      <div class=\"ingredient\" style=\"font-size:14px; align-items:flex-start; padding: 4px 0;\">\n        <span class=\"ing-amount\" style=\"color:var(--navy); min-width:90px;\">Probe therm.</span>\n        <span>Instant-read probe thermometer (ThermoWorks Thermapen) for spot checks. For production, add a <strong>leave-in probe with external display</strong> — insert before the chicken goes in, read temp from outside without opening the door. Eliminates the single biggest source of extended cook times.</span>\n      </div>\n      <div class=\"ingredient\" style=\"font-size:14px; align-items:flex-start; padding: 4px 0;\">\n        <span class=\"ing-amount\" style=\"color:var(--navy); min-width:90px;\">Oven therm.</span>\n        <span>A $10 oven thermometer hanging on the rack. Most ovens run 25–50°F off from the dial — know your offset before your first batch and set your oven accordingly. Document it for consistent production results.</span>\n      </div>\n      <div class=\"ingredient\" style=\"font-size:14px; align-items:flex-start; padding: 4px 0;\">\n        <span class=\"ing-amount\" style=\"color:var(--navy); min-width:90px;\">Sheet pans</span>\n        <span>Two half sheet pans (13×18\") with fitted wire racks. Butterflied breasts lay wider — you need two pans for most batches. Wire rack eliminates soggy bottoms and allows air circulation on all sides.</span>\n      </div>\n      <div class=\"ingredient\" style=\"font-size:14px; align-items:flex-start; padding: 4px 0;\">\n        <span class=\"ing-amount\" style=\"color:var(--navy); min-width:90px;\">Kitchen scale</span>\n        <span>For accurate dry brine measurements and consistent portion weights. Eyeballing is the #1 source of batch-to-batch inconsistency.</span>\n      </div>\n      <div class=\"ingredient\" style=\"font-size:14px; align-items:flex-start; padding: 4px 0;\">\n        <span class=\"ing-amount\" style=\"color:var(--navy); min-width:90px;\">Rice cooker</span>\n        <span>Runs hands-off in parallel with the chicken. Start it when the chicken goes in the oven and both finish at the same time.</span>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ VEGGIES ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">11</div>\n    <h2 class=\"section-title\">Side — Broccoli</h2>\n    <span class=\"section-sub\">oven or stovetop</span>\n  </div>\n\n  <div class=\"science-box\">\n    <div class=\"science-label\">oven space reality check</div>\n    <div class=\"science-text\">Two pans of chicken fill a standard home oven. Adding a broccoli pan means either crowding racks (which hurts everything) or running broccoli sequentially after chicken comes out. The stovetop method below frees the oven entirely and produces excellent results — char from a hot pan, not the oven.</div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Ingredients</span>\n      <span class=\"card-header-note\">7 portions (~150g cooked each)</span>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">~1,300g</span><span class=\"ing-name\">broccoli, raw <span class=\"ing-note\">~2 large heads, cut into golf ball-sized florets</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">2–3 tbsp</span><span class=\"ing-name\">olive oil</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">to taste</span><span class=\"ing-name\">kosher salt & black pepper</span></li>\n        <div class=\"ing-divider\"></div>\n        <div class=\"ing-group-label\">Optional (ties to the chicken)</div>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp</span><span class=\"ing-name\">lemon zest</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1–2 cloves</span><span class=\"ing-name\">garlic, minced</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Option A — Blanch + Broil (recommended)</span>\n      <span class=\"card-header-note\">best for large batches, hands-off char</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Start blanch water when chicken goes in the oven</div>\n          <div class=\"step-body\">Bring a <strong>12–16qt stockpot</strong> of water to a rolling boil, salted generously. Starting it when the chicken goes in means the water is boiling and ready by the time you need it — no waiting. A larger pot handles more volume per batch and comes back to boil faster between batches.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> ~10 min to boil</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Blanch in batches, spread immediately to dry</div>\n          <div class=\"step-body\">Add florets in batches of ~500g — don't overload the pot or the water temp drops and you lose the bright green color. Blanch each batch <strong>3–4 minutes</strong>, pull with a spider strainer, and spread immediately in a single layer on sheet pans. Don't pile them — steam trapped in a pile makes them go soft. The pot stays hot between batches so turnaround is fast. For 1,300g total expect 3 batches running back to back while the chicken finishes in the oven.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> 3–4 min per batch</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Let surface dry while chicken rests</div>\n          <div class=\"step-body\">Chicken pulls from the oven and rests 5–10 min. Use that window to let the blanched broccoli dry on the sheet pans — surface moisture is the enemy of char. Pat dry with paper towels if needed. Toss with olive oil, lemon zest, garlic, salt, and pepper.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">4</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Broil 4–6 min — hands off</div>\n          <div class=\"step-body\">Switch oven to <strong>broil on high</strong> as soon as chicken comes out. Slide broccoli pans in — run two pans simultaneously if your oven fits them. Broil <strong>4–6 minutes</strong>, no flipping, no checking. The broiler hits every piece at once across the whole pan. Done when edges are charred and stems are tender. While broccoli broils you're slicing chicken, making sauce, and portioning rice — zero active attention needed on the broccoli.</div>\n          <div class=\"step-callout gold\">This is the large-batch method — blanch handles the volume, broiler handles the char hands-off, and it all runs in parallel with the rest of the workflow. For Tandoco scale, a countertop convection oven running broccoli simultaneously with the main oven eliminates the sequencing entirely.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> 4–6 min broil</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Option B — Blanch + Stovetop Sear (small batches only)</span>\n      <span class=\"card-header-note\">good for 1–2 portions, not practical at scale</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Blanch same as above</div>\n          <div class=\"step-body\">Same blanch method — salted boiling water, 3–4 minutes, spread immediately to dry.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Sear in a hot pan</div>\n          <div class=\"step-body\">Heat a heavy skillet over high heat. Add a thin layer of olive oil, then broccoli in a single layer. Let sit undisturbed <strong>2–3 minutes</strong> until charred on the flat side, toss once. Add garlic and lemon zest in the last 30 seconds. Work in batches — crowding kills the char. <strong>Not recommended for large batches</strong> — too many rounds, too much active management alongside everything else.</div>\n          <div class=\"step-timing\"><svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"6.5\"/><path d=\"M8 4.5V8l2.5 2.5\"/></svg> 2–3 min per batch</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ RICE ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">12</div>\n    <h2 class=\"section-title\">Side — White Rice</h2>\n    <span class=\"section-sub\">rice cooker</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Ingredients</span>\n      <span class=\"card-header-note\">7 portions (~125g cooked each)</span>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">~500g</span><span class=\"ing-name\">white rice, dry <span class=\"ing-note\">yields ~1,000g cooked</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">to ratio</span><span class=\"ing-name\">water <span class=\"ing-note\">follow your rice cooker's markings</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp</span><span class=\"ing-name\">kosher salt <span class=\"ing-note\">optional but recommended</span></span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <span class=\"card-header-title\">Steps</span>\n    </div>\n    <div class=\"steps\">\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Rinse the rice</div>\n          <div class=\"step-body\">Rinse rice in cold water until the water runs mostly clear — 2–3 rinses. This removes excess surface starch that makes rice gummy. Drain well before adding to the cooker.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Cook — start with the chicken</div>\n          <div class=\"step-body\">Add rinsed rice, water to your cooker's markings, and salt. Start the rice cooker <strong>at the same time as the chicken goes in the oven</strong> — most rice cookers take 25–35 minutes, which lines up with the chicken cook and rest window. Everything finishes together.</div>\n          <div class=\"step-callout gold\">Timing the rice cooker to start with the oven is the key move — it runs hands-off in parallel and lands at the same time as the chicken without any coordination effort.</div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-left\"><div class=\"step-dot\">3</div></div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Fluff and portion</div>\n          <div class=\"step-body\">When the cooker switches to warm, let it sit for 5–10 minutes then fluff with a fork. Portion into containers immediately — rice portions cleanly when warm and slightly sticky. At ~125g cooked per serving, one scoop from a standard rice paddle is roughly right; weigh the first portion and use that as your visual reference for the rest.</div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"footer-note\">\n    <span class=\"tandoco-logo\">tandoco.</span>\n    <strong>eat well. feel good.</strong><br>\n    your cravings are valid. your body is a temple.\n  </div>\n\n</div>\n<script>\n  // Base recipe is for 1000g of chicken\n  const BASE_G = 1000;\n  let currentUnit = 'g';\n\n  // Kirkland organic chicken breast: 25g protein per 112g raw\n  const PROTEIN_PER_G_RAW = 25 / 112;\n\n  const BASE = {\n    salt: 15,\n    oil: 120,\n    zestTbsp: 3,\n    zestLemons: 4,\n    juiceTbsp: 3,\n    juiceLemons: 1.5,\n    garlicCloves: 10,\n    oreganoTbsp: 2,\n    thymeTbsp: 1,\n    pepperTsp: 2,\n    paprikaTsp: 1,\n    chilliTsp: 1,\n    finishLemons: 2,\n    parsleyTbsp: 3,\n  };\n\n  function setUnit(unit) {\n    currentUnit = unit;\n    const input = document.getElementById('meatWeight');\n    const btnG = document.getElementById('btnG');\n    const btnLbs = document.getElementById('btnLbs');\n    if (unit === 'g') {\n      btnG.style.background = 'var(--navy)'; btnG.style.color = '#fff'; btnG.style.borderColor = 'var(--navy)';\n      btnLbs.style.background = '#fff'; btnLbs.style.color = 'var(--ink)'; btnLbs.style.borderColor = 'var(--border)';\n      input.placeholder = 'e.g. 1590';\n    } else {\n      btnLbs.style.background = 'var(--navy)'; btnLbs.style.color = '#fff'; btnLbs.style.borderColor = 'var(--navy)';\n      btnG.style.background = '#fff'; btnG.style.color = 'var(--ink)'; btnG.style.borderColor = 'var(--border)';\n      input.placeholder = 'e.g. 3.5';\n    }\n    calcIngredients();\n  }\n\n  function setProteinGoal(val) {\n    document.getElementById('proteinGoal').value = val;\n    document.querySelectorAll('.protein-preset').forEach(btn => {\n      const isActive = btn.id === 'pp' + val;\n      btn.style.background = isActive ? 'var(--navy)' : '#fff';\n      btn.style.color = isActive ? '#fff' : 'var(--ink)';\n      btn.style.borderColor = isActive ? 'var(--navy)' : 'var(--border)';\n    });\n    calcIngredients();\n  }\n\n  function fmt(val, unit) {\n    if (unit === 'tbsp') {\n      if (val < 1) return Math.round(val * 3) + ' tsp';\n      const whole = Math.floor(val);\n      const frac = val - whole;\n      let f = '';\n      if (frac >= 0.875) return (whole + 1) + ' tbsp';\n      if (frac >= 0.625) f = ' + 2 tsp';\n      else if (frac >= 0.375) f = ' + 1 tsp';\n      else if (frac >= 0.125) f = ' + ¼ tsp';\n      return (whole > 0 ? whole : '') + f + ' tbsp';\n    }\n    if (unit === 'tsp') {\n      if (val < 0.25) return '⅛ tsp';\n      if (val < 0.5) return '¼ tsp';\n      if (val < 0.75) return '½ tsp';\n      if (val < 1) return '¾ tsp';\n      return Math.round(val * 4) / 4 + ' tsp';\n    }\n    if (unit === 'ml') {\n      if (val <= 30) return Math.round(val) + ' ml';\n      if (val <= 60) return '¼ cup';\n      if (val <= 90) return '⅓ cup';\n      if (val <= 120) return '½ cup';\n      if (val <= 160) return '⅔ cup';\n      if (val <= 180) return '¾ cup';\n      return Math.round(val / 15) / (1/15) + ' ml';\n    }\n    if (unit === 'g') return Math.round(val) + 'g';\n    return Math.round(val * 10) / 10;\n  }\n\n  function calcIngredients() {\n    const input = document.getElementById('meatWeight');\n    let raw = parseFloat(input.value);\n    const proteinGoal = parseFloat(document.getElementById('proteinGoal').value) || 50;\n\n    if (!raw || raw <= 0) {\n      document.getElementById('calcResult').style.display = 'none';\n      document.getElementById('servingResult').style.display = 'none';\n      resetToDefaults();\n      return;\n    }\n\n    const grams = currentUnit === 'lbs' ? raw * 453.592 : raw;\n    const ratio = grams / BASE_G;\n\n    // ── Serving calculator ──\n    const totalProtein = grams * PROTEIN_PER_G_RAW;\n    const idealPortions = Math.floor(totalProtein / proteinGoal);\n    const actualPortions = Math.max(1, idealPortions);\n    const rawPerPortion = Math.round(grams / actualPortions);\n    const proteinPerPortion = Math.round(rawPerPortion * PROTEIN_PER_G_RAW);\n    const hitsGoal = proteinPerPortion >= proteinGoal;\n\n    document.getElementById('portionCount').textContent = actualPortions;\n    document.getElementById('rawPerPortion').textContent = rawPerPortion + 'g';\n    document.getElementById('proteinPerPortion').textContent = '~' + proteinPerPortion + 'g';\n    document.getElementById('servingResult').style.display = 'block';\n\n    const noteEl = document.getElementById('servingNote');\n    if (hitsGoal) {\n      noteEl.innerHTML = `✓ <strong>${actualPortions} portions</strong> from this batch hits your ${proteinGoal}g protein goal — ${rawPerPortion}g raw chicken per portion. Broccoli adds ~2–3g on top.`;\n    } else {\n      const neededG = Math.ceil(proteinGoal / PROTEIN_PER_G_RAW);\n      const shortfall = proteinGoal - proteinPerPortion;\n      noteEl.innerHTML = `⚠ This batch can't hit ${proteinGoal}g protein per portion at any split. Each portion gives ~${proteinPerPortion}g — ${shortfall}g short. You'd need at least <strong>${Math.ceil(proteinGoal / PROTEIN_PER_G_RAW * actualPortions)}g raw chicken</strong> for ${actualPortions} portions at this goal.`;\n    }\n\n    // ── Salt ──\n    const saltG = Math.round(grams * 0.015);\n    const saltTsp = saltG / 2.8;\n    document.getElementById('saltAmt').textContent = saltG + 'g';\n    document.getElementById('saltNote').textContent = '~' + (saltTsp < 1 ? '¾' : Math.round(saltTsp * 2) / 2) + ' tsp';\n\n    // ── Coating ──\n    document.getElementById('oilAmt').textContent = fmt(BASE.oil * ratio, 'ml');\n    const zestT = BASE.zestTbsp * ratio;\n    document.getElementById('zestAmt').textContent = '~' + fmt(zestT, 'tbsp');\n    document.getElementById('zestLemons').textContent = Math.max(1, Math.round(BASE.zestLemons * ratio));\n    const juiceT = BASE.juiceTbsp * ratio;\n    document.getElementById('juiceAmt').textContent = fmt(juiceT, 'tbsp');\n    document.getElementById('juiceLemons').textContent = Math.max(1, Math.round(BASE.juiceLemons * ratio * 2)) / 2;\n    document.getElementById('garlicAmt').textContent = Math.max(1, Math.round(BASE.garlicCloves * ratio)) + ' cloves';\n    document.getElementById('oreganoAmt').textContent = fmt(BASE.oreganoTbsp * ratio, 'tbsp');\n    document.getElementById('thymeAmt').textContent = fmt(BASE.thymeTbsp * ratio, 'tbsp');\n    document.getElementById('pepperAmt').textContent = fmt(BASE.pepperTsp * ratio, 'tsp');\n    document.getElementById('paprikaAmt').textContent = fmt(BASE.paprikaTsp * ratio, 'tsp');\n    document.getElementById('chilliAmt').textContent = fmt(BASE.chilliTsp * ratio, 'tsp');\n    document.getElementById('finishLemonAmt').textContent = Math.max(1, Math.round(BASE.finishLemons * ratio)) + ' lemons';\n    document.getElementById('parsleyAmt').textContent = fmt(BASE.parsleyTbsp * ratio, 'tbsp');\n\n    // ── Summary grid ──\n    document.getElementById('calcResult').style.display = 'block';\n    document.getElementById('calcGrid').innerHTML = [\n      ['Kosher salt', saltG + 'g'],\n      ['Olive oil', fmt(BASE.oil * ratio, 'ml')],\n      ['Lemon zest', '~' + fmt(zestT, 'tbsp')],\n      ['Lemon juice', fmt(juiceT, 'tbsp')],\n      ['Garlic', Math.max(1, Math.round(BASE.garlicCloves * ratio)) + ' cloves'],\n      ['Dried oregano', fmt(BASE.oreganoTbsp * ratio, 'tbsp')],\n    ].map(([label, val]) => `\n      <div style=\"background:#f7f5f0; border-radius:8px; padding:10px 12px;\">\n        <div style=\"font-size:11px; color:var(--muted); margin-bottom:3px;\">${label}</div>\n        <div style=\"font-size:15px; font-weight:600; color:var(--navy);\">${val}</div>\n      </div>`).join('');\n  }\n\n  function resetToDefaults() {\n    document.getElementById('saltAmt').textContent = '35–40g';\n    document.getElementById('saltNote').textContent = '~3 tbsp + 1 tsp';\n    document.getElementById('oilAmt').textContent = '½ cup';\n    document.getElementById('zestAmt').textContent = '~3 tbsp';\n    document.getElementById('zestLemons').textContent = '4';\n    document.getElementById('juiceAmt').textContent = '3 tbsp';\n    document.getElementById('juiceLemons').textContent = '1.5';\n    document.getElementById('garlicAmt').textContent = '10 cloves';\n    document.getElementById('oreganoAmt').textContent = '2 tbsp';\n    document.getElementById('thymeAmt').textContent = '1 tbsp';\n    document.getElementById('pepperAmt').textContent = '2 tsp';\n    document.getElementById('paprikaAmt').textContent = '1 tsp';\n    document.getElementById('chilliAmt').textContent = '1 tsp';\n    document.getElementById('finishLemonAmt').textContent = '2 lemons';\n    document.getElementById('parsleyAmt').textContent = '3 tbsp';\n  }\n</script>\n</body>\n</html>","servingsPerBatch":14,"packMins":0,"activeMins":60,"sellQty":5,"supplies":[{"supplyId":"FDvZuV0n5gnfmmouvfmP","name":"Parchment paper","qty":1,"unit":"each","costPerUnit":0.05}],"thumbURL":"","dietaryTags":[],"isChefPick":true,"isTopSeller":false,"isFanFavorite":false,"isNewThisWeek":false,"photoFocal":{"x":50,"y":50},"weeklyLimitRemaining":null,"unitName":"","weeklyLimit":null,"category":"Approved","qtyPicker":"auto","substitutions":[{"id":"s_mogifm9f1uvfw","label":"rice or no?","required":false,"defaultId":"o_mogifm9fm7u0a","options":[{"id":"o_mogifm9fm7u0a","name":"rice","delta":0},{"id":"o_mogk1acczyrre","name":"cubed potatoes","delta":0},{"id":"o_mogk4ey0qp3zf","name":"extra broccoli","delta":2}]}],"pairsWith":[],"storage":"keep refrigerated. best within 3–4 days. do not freeze after pickup.","heating":"microwave: remove lid, cover with a damp paper towel, heat at medium power in 1-minute increments until warmed through. oven: place in a baking dish with a splash of chicken broth, cover with foil, heat at 300°F for 15–20 min.","_validation":{"ok":true,"errors":[],"warnings":[{"field":"stripeTaxCode","code":"tax_code_unset","msg":"No Stripe tax code set — Stripe Tax will use its default."}],"lastValidatedAt":{"_seconds":1777753460,"_nanoseconds":411000000}},"photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F1TOxM5OgjxCl65Rcp1xI%2F1778110542710_Gemini_Generated_Image_kqlmaekqlmaekqlm.png?alt=media&token=458f7390-8912-4d44-8a15-653f3fbb5455"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F1TOxM5OgjxCl65Rcp1xI%2F1778167629876_Gemini_Generated_Image_s2geb7s2geb7s2ge.png?alt=media&token=127f0314-cf45-4828-815b-082420a6790a","createdByName":"Omar Yusuf","name":"lemon honey chicken","menuPrice":"11.50","ingredients":[{"ingredientId":"1DXJKxixvEQKm5AJjE3e","name":"Lemons","qty":250,"unit":"g"},{"ingredientId":"tUyqh3urNM2I9VxQ7Cog","name":"Kosher Salt","qty":18,"unit":"g"},{"ingredientId":"5cZW6s0QOcInEIt1altE","name":"Olive Oil","qty":90,"unit":"ml"},{"ingredientId":"NSO7FwcAeay6uXyqz69n","name":"Garlic Cloves","qty":30,"unit":"g"},{"ingredientId":"lBwRx8dHQJovKwCJojfI","name":"Dried Oregano","qty":4,"unit":"g"},{"ingredientId":"MHJGoGhJw34LeZ5uHKj8","name":"Dried Thyme","qty":2,"unit":"g"},{"ingredientId":"rMwpamjAUuANkIcV9n3a","name":"Broccoli","qty":750,"unit":"g"},{"ingredientId":"NWQ1sBGBdXNwQRhltX05","name":"Kirkland Enriched White Rice Long Grain","qty":310,"unit":"g"},{"ingredientId":"i5ZW2I3w9rMT3nFZXykc","name":"Kirkland Chicken Breasts Boneless Skinless","qty":2.6,"unit":"lb"}],"fiber":"4","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"recipeYield":1,"unitsPerYield":10,"packaging":[],"updatedAt":{"_seconds":1779125296,"_nanoseconds":644000000}},{"id":"36Aq04lUCwGqP8WoChao","category":"Refining","mealType":"Bakery","servingSize":"","calories":"","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"menuIngredients":"","notes":"","weeklySpecial":false,"fanFavorite":false,"hideCalories":false,"packOptions":[],"menuPrice":"10","menuCategory":"Bakery","linkedProjectId":"","createdAt":{"_seconds":1774847580,"_nanoseconds":966000000},"published":true,"nextAvailableDate":"2026-04-29","skuBase":"TDC-0001","servingsPerBatch":10,"sellQty":4,"owner":"tommy","instructionsHtml":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>high-protein sourdough bread — tandoco</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,700&family=Inter:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n  --navy:      #1B1A6B;\n  --navy-dk:   #12114A;\n  --navy-lt:   #2D2FA8;\n  --accent:    #4F51D4;\n  --gold:      #C8A96E;\n  --gold-lt:   #E8C87A;\n  --cream:     #FAF8F3;\n  --sand:      #EDE8DC;\n  --border:    #E8E4DC;\n  --text:      #1A1A2E;\n  --muted:     #6B6B7B;\n  --bakery:    #be185d;\n}\n\nhtml { font-size: 16px; scroll-behavior: smooth; }\n\nbody {\n  font-family: 'Inter', sans-serif;\n  background: var(--cream);\n  color: var(--text);\n  -webkit-font-smoothing: antialiased;\n}\n\n/* ── TOP STRIPE ── */\n.top-stripe {\n  height: 5px;\n  background: linear-gradient(90deg, var(--navy) 0%, var(--navy-lt) 55%, var(--gold) 100%);\n}\n\n/* ── NAV ── */\nnav {\n  background: var(--cream);\n  border-bottom: 1px solid var(--border);\n  padding: 0 32px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: sticky;\n  top: 0;\n  z-index: 100;\n}\n\n.nav-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 20px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.04em;\n  text-decoration: none;\n}\n\n.nav-tag {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  color: var(--muted);\n}\n\n/* ── HERO ── */\n.hero {\n  background: var(--navy);\n  padding: 72px 32px 64px;\n  position: relative;\n  overflow: hidden;\n}\n\n.hero-inner {\n  max-width: 760px;\n  margin: 0 auto;\n  position: relative;\n  z-index: 2;\n}\n\n.hero-eyebrow {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  background: rgba(200,169,110,.15);\n  border: 1px solid rgba(200,169,110,.3);\n  border-radius: 99px;\n  padding: 5px 14px 5px 10px;\n  margin-bottom: 28px;\n}\n\n.hero-eyebrow-dot {\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background: var(--gold);\n}\n\n.hero-eyebrow-text {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--gold);\n}\n\n.hero-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: clamp(36px, 6vw, 56px);\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.04em;\n  line-height: 1.05;\n  margin-bottom: 20px;\n}\n\n.hero-title span {\n  color: var(--gold);\n}\n\n.hero-desc {\n  font-size: 16px;\n  color: rgba(255,255,255,.65);\n  line-height: 1.7;\n  max-width: 520px;\n  margin-bottom: 40px;\n}\n\n.hero-stats {\n  display: flex;\n  gap: 32px;\n  flex-wrap: wrap;\n}\n\n.hero-stat {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n}\n\n.hero-stat-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 28px;\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.03em;\n  line-height: 1;\n}\n\n.hero-stat-val span {\n  color: var(--gold);\n}\n\n.hero-stat-label {\n  font-size: 11px;\n  font-weight: 600;\n  color: rgba(255,255,255,.45);\n  text-transform: uppercase;\n  letter-spacing: .08em;\n}\n\n.hero-orb {\n  position: absolute;\n  border-radius: 50%;\n  pointer-events: none;\n}\n\n.hero-orb-1 {\n  width: 500px;\n  height: 500px;\n  background: radial-gradient(circle, rgba(79,81,212,.25) 0%, transparent 70%);\n  top: -150px;\n  right: -100px;\n}\n\n.hero-orb-2 {\n  width: 300px;\n  height: 300px;\n  background: radial-gradient(circle, rgba(200,169,110,.12) 0%, transparent 70%);\n  bottom: -50px;\n  right: 200px;\n}\n\n/* ── CATEGORY STRIPE ── */\n.cat-stripe {\n  height: 4px;\n  background: var(--bakery);\n}\n\n/* ── MAIN LAYOUT ── */\n.main {\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 56px 32px 80px;\n}\n\n/* ── SECTION HEADING ── */\n.section-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .12em;\n  text-transform: uppercase;\n  color: var(--gold);\n  margin-bottom: 14px;\n}\n\n.section-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 22px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.02em;\n  margin-bottom: 24px;\n}\n\n/* ── CALL-OUT BOX ── */\n.callout {\n  background: var(--navy);\n  border-radius: 16px;\n  padding: 28px 32px;\n  margin-bottom: 48px;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 20px;\n}\n\n.callout-item {}\n\n.callout-item-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: rgba(200,169,110,.7);\n  margin-bottom: 6px;\n}\n\n.callout-item-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 15px;\n  font-weight: 700;\n  color: #fff;\n  line-height: 1.4;\n}\n\n/* ── INGREDIENT TABLE ── */\n.ingredient-section {\n  margin-bottom: 48px;\n}\n\n.ingredient-table {\n  width: 100%;\n  border-collapse: collapse;\n}\n\n.ingredient-table th {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--muted);\n  text-align: left;\n  padding: 8px 16px;\n  border-bottom: 2px solid var(--border);\n}\n\n.ingredient-table td {\n  padding: 13px 16px;\n  font-size: 14px;\n  border-bottom: 1px solid var(--border);\n  vertical-align: middle;\n}\n\n.ingredient-table tr:last-child td {\n  border-bottom: none;\n}\n\n.ingredient-table tr:hover td {\n  background: var(--sand);\n}\n\n.ing-name {\n  font-weight: 600;\n  color: var(--text);\n}\n\n.ing-amount {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-weight: 800;\n  color: var(--navy);\n  white-space: nowrap;\n}\n\n.ing-note {\n  font-size: 12px;\n  color: var(--muted);\n  line-height: 1.5;\n}\n\n.ing-tag {\n  display: inline-block;\n  background: rgba(190,24,93,.1);\n  color: var(--bakery);\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .06em;\n  text-transform: uppercase;\n  padding: 3px 9px;\n  border-radius: 99px;\n}\n\n.ing-tag.gold {\n  background: rgba(200,169,110,.15);\n  color: #a07840;\n}\n\n.table-note {\n  margin-top: 12px;\n  background: var(--sand);\n  border-radius: 10px;\n  padding: 14px 18px;\n  font-size: 13px;\n  color: var(--muted);\n  line-height: 1.6;\n  display: flex;\n  gap: 10px;\n  align-items: flex-start;\n}\n\n.table-note-icon {\n  font-size: 15px;\n  flex-shrink: 0;\n  margin-top: 1px;\n}\n\n/* ── WHY IT WORKS ── */\n.why-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 48px;\n}\n\n.why-card {\n  background: #fff;\n  border: 1px solid var(--border);\n  border-radius: 14px;\n  padding: 22px 22px 20px;\n}\n\n.why-card-icon {\n  font-size: 20px;\n  margin-bottom: 10px;\n  display: block;\n}\n\n.why-card-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 7px;\n}\n\n.why-card-text {\n  font-size: 13px;\n  color: var(--muted);\n  line-height: 1.65;\n}\n\n/* ── STEPS ── */\n.steps-section {\n  margin-bottom: 48px;\n}\n\n.step {\n  display: grid;\n  grid-template-columns: 52px 1fr;\n  gap: 20px;\n  margin-bottom: 8px;\n  padding-bottom: 8px;\n}\n\n.step:not(:last-child) {\n  position: relative;\n}\n\n.step:not(:last-child)::after {\n  content: '';\n  position: absolute;\n  left: 25px;\n  top: 52px;\n  bottom: -8px;\n  width: 2px;\n  background: var(--border);\n}\n\n.step-num {\n  width: 52px;\n  height: 52px;\n  border-radius: 50%;\n  background: var(--navy);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  z-index: 1;\n}\n\n.step-num-text {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 16px;\n  font-weight: 900;\n  color: var(--gold);\n  letter-spacing: -.02em;\n}\n\n.step-body {\n  padding-top: 12px;\n  padding-bottom: 28px;\n}\n\n.step-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 16px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 8px;\n}\n\n.step-text {\n  font-size: 14px;\n  color: var(--text);\n  line-height: 1.75;\n}\n\n.step-text strong {\n  color: var(--navy);\n  font-weight: 600;\n}\n\n.step-timing {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  margin-top: 12px;\n  background: rgba(27,26,107,.06);\n  border-radius: 99px;\n  padding: 5px 12px;\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--navy);\n}\n\n/* ── MACROS ── */\n.macro-section {\n  margin-bottom: 48px;\n}\n\n.macro-compare {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 16px;\n  margin-bottom: 16px;\n}\n\n.macro-col {}\n\n.macro-col-head {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  padding: 10px 16px;\n  border-radius: 10px 10px 0 0;\n  margin-bottom: 0;\n}\n\n.macro-col-head.original {\n  background: var(--sand);\n  color: var(--muted);\n}\n\n.macro-col-head.tandoco {\n  background: var(--navy);\n  color: var(--gold);\n}\n\n.macro-rows {\n  border: 1px solid var(--border);\n  border-radius: 0 0 12px 12px;\n  overflow: hidden;\n}\n\n.macro-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--border);\n  font-size: 14px;\n}\n\n.macro-row:last-child { border-bottom: none; }\n\n.macro-row.tandoco-row {\n  background: rgba(27,26,107,.03);\n}\n\n.macro-label { color: var(--muted); font-size: 13px; }\n\n.macro-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-weight: 800;\n  color: var(--navy);\n  font-size: 15px;\n  letter-spacing: -.01em;\n}\n\n.macro-val.highlight { color: var(--bakery); }\n\n/* ── PRO TIP ── */\n.pro-tip {\n  background: linear-gradient(135deg, rgba(200,169,110,.12), rgba(200,169,110,.05));\n  border: 1px solid rgba(200,169,110,.3);\n  border-left: 4px solid var(--gold);\n  border-radius: 0 12px 12px 0;\n  padding: 20px 24px;\n  margin-bottom: 48px;\n}\n\n.pro-tip-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: #a07840;\n  margin-bottom: 8px;\n}\n\n.pro-tip-text {\n  font-size: 14px;\n  color: var(--text);\n  line-height: 1.7;\n}\n\n/* ── VARIANT ── */\n.variant-box {\n  background: var(--sand);\n  border-radius: 16px;\n  padding: 28px;\n  margin-bottom: 48px;\n}\n\n.variant-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 16px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 8px;\n}\n\n.variant-text {\n  font-size: 14px;\n  color: var(--muted);\n  line-height: 1.7;\n}\n\n.variant-mods {\n  margin-top: 16px;\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n\n.variant-mod {\n  display: flex;\n  align-items: flex-start;\n  gap: 10px;\n  font-size: 14px;\n  color: var(--text);\n}\n\n.variant-mod::before {\n  content: '→';\n  color: var(--navy);\n  font-weight: 700;\n  flex-shrink: 0;\n  margin-top: 1px;\n}\n\n/* ── CTA ── */\n.cta-box {\n  background: var(--navy);\n  border-radius: 20px;\n  padding: 40px;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n\n.cta-box::before {\n  content: '';\n  position: absolute;\n  width: 400px;\n  height: 400px;\n  border-radius: 50%;\n  background: radial-gradient(circle, rgba(79,81,212,.3) 0%, transparent 70%);\n  top: -150px;\n  right: -100px;\n  pointer-events: none;\n}\n\n.cta-eyebrow {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--gold);\n  opacity: .8;\n  margin-bottom: 12px;\n}\n\n.cta-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 26px;\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.03em;\n  line-height: 1.15;\n  margin-bottom: 14px;\n}\n\n.cta-text {\n  font-size: 15px;\n  color: rgba(255,255,255,.6);\n  line-height: 1.6;\n  max-width: 400px;\n  margin: 0 auto 28px;\n}\n\n.cta-btn {\n  display: inline-block;\n  background: linear-gradient(135deg, var(--gold), var(--gold-lt));\n  color: #1A1508;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 800;\n  padding: 14px 32px;\n  border-radius: 99px;\n  text-decoration: none;\n  letter-spacing: -.01em;\n  box-shadow: 0 4px 20px rgba(200,169,110,.35);\n  position: relative;\n  z-index: 1;\n}\n\n/* ── FOOTER ── */\nfooter {\n  border-top: 1px solid var(--border);\n  padding: 24px 32px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  max-width: 760px;\n  margin: 0 auto;\n}\n\n.footer-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.03em;\n}\n\n.footer-meta {\n  font-size: 12px;\n  color: var(--muted);\n}\n\n/* ── DIVIDER ── */\n.divider {\n  height: 1px;\n  background: var(--border);\n  margin: 48px 0;\n}\n\n/* ── RESPONSIVE ── */\n@media (max-width: 600px) {\n  .hero { padding: 48px 20px 48px; }\n  .hero-stats { gap: 20px; }\n  .main { padding: 40px 20px 60px; }\n  .callout { grid-template-columns: 1fr; gap: 16px; }\n  .why-grid { grid-template-columns: 1fr; }\n  .macro-compare { grid-template-columns: 1fr; }\n  nav { padding: 0 20px; }\n  .cta-box { padding: 32px 24px; }\n  footer { padding: 20px; flex-direction: column; gap: 8px; text-align: center; }\n}\n</style>\n</head>\n<body>\n\n<div class=\"top-stripe\"></div>\n\n<nav>\n  <a href=\"https://tandoco.com\" class=\"nav-brand\">tandoco</a>\n  <span class=\"nav-tag\">bakery recipe</span>\n</nav>\n\n<!-- HERO -->\n<section class=\"hero\">\n  <div class=\"hero-orb hero-orb-1\"></div>\n  <div class=\"hero-orb hero-orb-2\"></div>\n  <div class=\"hero-inner\">\n    <div class=\"hero-eyebrow\">\n      <div class=\"hero-eyebrow-dot\"></div>\n      <span class=\"hero-eyebrow-text\">high-protein bakery</span>\n    </div>\n    <h1 class=\"hero-title\">high-protein<br><span>sourdough bread</span></h1>\n    <p class=\"hero-desc\">everything you love about a crusty artisan boule — open crumb, deep tang, crackly crust — rebuilt from the flour up to actually hit your macros.</p>\n    <div class=\"hero-stats\">\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">9–11<span>g</span></div>\n        <div class=\"hero-stat-label\">protein / slice</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">~145</div>\n        <div class=\"hero-stat-label\">cal / slice</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">12</div>\n        <div class=\"hero-stat-label\">slices per loaf</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">36<span>h</span></div>\n        <div class=\"hero-stat-label\">total time</div>\n      </div>\n    </div>\n  </div>\n</section>\n<div class=\"cat-stripe\"></div>\n\n<!-- MAIN -->\n<main class=\"main\">\n\n  <!-- WHAT'S DIFFERENT -->\n  <div class=\"callout\">\n    <div class=\"callout-item\">\n      <div class=\"callout-item-label\">the base</div>\n      <div class=\"callout-item-val\">Alexandra Cooks' artisan sourdough — one of the most-made recipes on the internet. process unchanged.</div>\n    </div>\n    <div class=\"callout-item\">\n      <div class=\"callout-item-label\">the difference</div>\n      <div class=\"callout-item-val\">a three-ingredient flour swap doubles the protein without touching the method or killing the crumb.</div>\n    </div>\n    <div class=\"callout-item\">\n      <div class=\"callout-item-label\">hands-on time</div>\n      <div class=\"callout-item-val\">~25 minutes. the rest is waiting.</div>\n    </div>\n    <div class=\"callout-item\">\n      <div class=\"callout-item-label\">gear needed</div>\n      <div class=\"callout-item-val\">dutch oven, kitchen scale, banneton or towel-lined bowl.</div>\n    </div>\n  </div>\n\n  <!-- INGREDIENTS -->\n  <div class=\"ingredient-section\">\n    <div class=\"section-label\">ingredients</div>\n    <div class=\"section-title\">the flour blend</div>\n\n    <table class=\"ingredient-table\">\n      <thead>\n        <tr>\n          <th>ingredient</th>\n          <th>amount</th>\n          <th>original</th>\n          <th>notes</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td class=\"ing-name\">bread flour</td>\n          <td class=\"ing-amount\">400g</td>\n          <td class=\"ing-note\">was 500g</td>\n          <td class=\"ing-note\">higher baseline protein than all-purpose (12–13g per 100g dry)</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">vital wheat gluten <span class=\"ing-tag\">key swap</span></td>\n          <td class=\"ing-amount\">60g</td>\n          <td class=\"ing-note\">new</td>\n          <td class=\"ing-note\">adds direct protein + strengthens gluten structure. improves chew.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">Nutricoast unflavored casein <span class=\"ing-tag gold\">tandoco protein</span></td>\n          <td class=\"ing-amount\">40g</td>\n          <td class=\"ing-note\">new</td>\n          <td class=\"ing-note\">slow-absorbing protein that integrates cleanly during long cold proof</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">water</td>\n          <td class=\"ing-amount\">360g</td>\n          <td class=\"ing-note\">was 325g</td>\n          <td class=\"ing-note\">increased hydration (~72%) — casein absorbs more than flour. do not reduce.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">active sourdough starter</td>\n          <td class=\"ing-amount\">100g</td>\n          <td class=\"ing-note\">same</td>\n          <td class=\"ing-note\">use 4–6 hrs after feeding, when doubled and bubbly</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">fine sea salt</td>\n          <td class=\"ing-amount\">11g</td>\n          <td class=\"ing-note\">same</td>\n          <td class=\"ing-note\">dissolve in water before adding starter</td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div class=\"table-note\">\n      <span class=\"table-note-icon\">⚖️</span>\n      <span>always measure by weight, not volume. sourdough is sensitive to flour ratios and a gram scale makes the difference between a good loaf and a great one.</span>\n    </div>\n  </div>\n\n  <!-- WHY IT WORKS -->\n  <div class=\"section-label\">the science</div>\n  <div class=\"section-title\" style=\"margin-bottom:16px;\">why this blend works</div>\n  <div class=\"why-grid\">\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">💪</span>\n      <div class=\"why-card-title\">vital wheat gluten</div>\n      <div class=\"why-card-text\">pure concentrated gluten protein. it actually strengthens dough structure rather than weakening it — unlike most protein additions. improves chew, lift, and crumb openness. the safest protein upgrade for any bread recipe.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🥛</span>\n      <div class=\"why-card-title\">casein at 8% flour weight</div>\n      <div class=\"why-card-text\">conservative on purpose. casein is slow-absorbing and needs time to hydrate fully — which is exactly what the 18–24 hour cold proof gives it. rush it with a quick yeasted loaf and you get a gummy crumb. give it time and it integrates cleanly.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🍞</span>\n      <div class=\"why-card-title\">bread flour baseline</div>\n      <div class=\"why-card-text\">a simple swap from all-purpose — 12–13g protein per 100g vs 10–11g. adds protein at the foundation without any trade-off. always use bread flour as your base when protein is the goal.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🔬</span>\n      <div class=\"why-card-title\">sourdough bioavailability</div>\n      <div class=\"why-card-text\">long fermentation improves protein digestibility and amino acid availability. at the same gram count, sourdough protein is more bioavailable than commercial yeasted bread. the process itself is part of the nutrition story.</div>\n    </div>\n  </div>\n\n  <div class=\"divider\"></div>\n\n  <!-- STEPS -->\n  <div class=\"steps-section\">\n    <div class=\"section-label\">method</div>\n    <div class=\"section-title\">how to make it</div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">01</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">mix the dough</div>\n        <div class=\"step-text\">dissolve salt in the 360g water. add starter and stir to combine. whisk together the bread flour, vital wheat gluten, and casein in a separate bowl, then add all at once to the water mixture. mix until no dry flour remains. the dough will feel slightly stiffer than a standard sourdough — that's expected. cover and rest.</div>\n        <div class=\"step-timing\">⏱ rest 30 minutes</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">02</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">stretch and fold — 4 rounds</div>\n        <div class=\"step-text\">perform 4 sets of stretch and folds, one every 30 minutes. for each set: wet your hand, grab one side of the dough, stretch it up and fold it over to the opposite side. rotate the bowl 90° and repeat until you've gone around the full bowl. the dough will become noticeably smoother and stronger with each round.</div>\n        <div class=\"step-timing\">⏱ 2 hours total</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">03</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">bulk ferment</div>\n        <div class=\"step-text\">cover and let rise at room temperature until the dough has <strong>nearly doubled</strong> and feels airy and domed on top. timing depends heavily on your kitchen temperature — warmer rooms ferment faster. don't go by the clock; go by the dough.</div>\n        <div class=\"step-timing\">⏱ 5–12 hours depending on temp</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">04</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">shape</div>\n        <div class=\"step-text\">turn the dough out onto an unfloured surface. use a bench scraper to fold the edges in and create surface tension, shaping it into a tight ball. rest uncovered for 20–40 minutes (bench rest), then do your final shaping into a batard or boule. transfer to a floured banneton or towel-lined bowl seam-side up.</div>\n        <div class=\"step-timing\">⏱ 20–40 minute bench rest</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">05</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">cold proof</div>\n        <div class=\"step-text\">cover the banneton with plastic wrap or a shower cap and transfer to the fridge. <strong>give it the full 18–24 hours.</strong> this step is even more important with casein in the dough — the slow cold proof is what lets it fully hydrate and integrate. it also develops flavor and makes scoring easier.</div>\n        <div class=\"step-timing\">⏱ 18–24 hours in fridge</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">06</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">bake</div>\n        <div class=\"step-text\">preheat oven to 500°F (260°C) with your dutch oven inside for at least 45 minutes. turn the dough out onto parchment, score with a razor or sharp knife, and lower carefully into the hot dutch oven. bake covered for 30 minutes, then remove the lid and bake uncovered for 15 minutes. <strong>watch the crust at 25 minutes</strong> — casein can cause browning to accelerate. your real signal is internal temp: <strong>205–210°F.</strong></div>\n        <div class=\"step-timing\">⏱ 45 minutes bake time</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">07</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">cool completely</div>\n        <div class=\"step-text\">transfer to a wire rack and wait at least 1 hour before slicing. cutting into hot sourdough collapses the crumb structure and makes it gummy. it's worth the wait.</div>\n        <div class=\"step-timing\">⏱ minimum 1 hour cool</div>\n      </div>\n    </div>\n\n  </div>\n\n  <!-- PRO TIP -->\n  <div class=\"pro-tip\">\n    <div class=\"pro-tip-label\">pro tip — browning</div>\n    <div class=\"pro-tip-text\">casein browns faster than flour due to its milk protein composition. if your crust looks dark at the 25-minute mark of the uncovered bake, pull it. use an instant-read thermometer to confirm doneness — 205°F is your target. the color is a suggestion; the internal temp is the truth.</div>\n  </div>\n\n  <!-- MACROS -->\n  <div class=\"macro-section\">\n    <div class=\"section-label\">nutrition</div>\n    <div class=\"section-title\">per slice (1/12 loaf)</div>\n\n    <div class=\"macro-compare\">\n      <div class=\"macro-col\">\n        <div class=\"macro-col-head original\">original artisan sourdough</div>\n        <div class=\"macro-rows\">\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">protein</span>\n            <span class=\"macro-val\">4–5g</span>\n          </div>\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">calories</span>\n            <span class=\"macro-val\">~130</span>\n          </div>\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">carbs</span>\n            <span class=\"macro-val\">~26g</span>\n          </div>\n        </div>\n      </div>\n      <div class=\"macro-col\">\n        <div class=\"macro-col-head tandoco\">tandoco high-protein</div>\n        <div class=\"macro-rows\">\n          <div class=\"macro-row tandoco-row\">\n            <span class=\"macro-label\">protein</span>\n            <span class=\"macro-val highlight\">9–11g</span>\n          </div>\n          <div class=\"macro-row tandoco-row\">\n            <span class=\"macro-label\">calories</span>\n            <span class=\"macro-val\">~145</span>\n          </div>\n          <div class=\"macro-row tandoco-row\">\n            <span class=\"macro-label\">carbs</span>\n            <span class=\"macro-val\">~23g</span>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"table-note\">\n      <span class=\"table-note-icon\">📊</span>\n      <span>estimates based on USDA data for bread flour, vital wheat gluten, and unflavored casein. actual macros vary with starter hydration and exact slice weight. weigh your slices for precise tracking.</span>\n    </div>\n  </div>\n\n  <!-- VARIANT -->\n  <div class=\"variant-box\">\n    <div class=\"variant-title\">want to push higher? the dense version.</div>\n    <div class=\"variant-text\">if 9–11g isn't enough and you're ok with a denser, chewier loaf that leans more sandwich bread than boule, there's a second version worth testing:</div>\n    <div class=\"variant-mods\">\n      <div class=\"variant-mod\">swap 50g more bread flour for additional vital wheat gluten (total 110g VWG, 350g bread flour)</div>\n      <div class=\"variant-mod\">increase water by 15g to compensate (375g total)</div>\n      <div class=\"variant-mod\">keep casein the same at 40g</div>\n      <div class=\"variant-mod\">target protein: ~12–13g per slice</div>\n    </div>\n    <div style=\"margin-top:16px;font-size:13px;color:var(--muted);line-height:1.6;\">the crumb will be tighter and the texture chewier — less open boule, more structured sandwich loaf. different but not bad. start with the standard version first and test from there.</div>\n  </div>\n\n  <!-- CTA -->\n  <div class=\"cta-box\">\n    <div class=\"cta-eyebrow\">made in minneapolis</div>\n    <div class=\"cta-title\">we do the prep.<br>you get the results.</div>\n    <div class=\"cta-text\">fresh high-protein meals and scratch-made protein bakery. orders close thursday. pickup sunday in minneapolis.</div>\n    <a href=\"https://tandoco.com/store\" class=\"cta-btn\">see this week's menu →</a>\n  </div>\n\n</main>\n\n<footer>\n  <div class=\"footer-brand\">tandoco</div>\n  <div class=\"footer-meta\">hello@tandoco.com · tandoco.com · @tandocohq</div>\n</footer>\n\n</body>\n</html>","menuDescription":"everything you love about a crusty sourdough bread — open crumb, deep tang, crackly crust — rebuilt from the flour up to actually hit your macros.","availableNextWeek":false,"supplies":[],"ingredients":[],"availableThisWeek":true,"photos":[],"protein":"12","name":"sour power bread","sortOrder":6,"isChefPick":false,"isTopSeller":false,"isFanFavorite":false,"dietaryTags":["Savory"],"photoFocal":{"x":50,"y":50},"isNewThisWeek":false,"weeklyLimitRemaining":null,"weeklyLimit":null,"collections":["fiber","savory"],"substitutions":[],"pairsWith":[],"unitName":"loaf","storage":"","heating":"","qtyPicker":"auto","_validation":{"ok":true,"errors":[],"warnings":[{"field":"stripeTaxCode","code":"tax_code_unset","msg":"No Stripe tax code set — Stripe Tax will use its default."}],"lastValidatedAt":{"_seconds":1777756830,"_nanoseconds":647000000}},"createdByName":"Tommy","thumbURL":"","photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F36Aq04lUCwGqP8WoChao%2F1778110590992_Gemini_Generated_Image_53hoh953hoh953ho.png?alt=media&token=f4d9fc9a-2ebb-4c27-8779-b2515a996ba8","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"3U7juLAy49hFUGoiQaOS","servingSize":"10 slices","instructionsHtml":"<ol style=\"padding-left:20px;line-height:1.7;\"><li><strong>stovetop reduction.</strong> mash the bananas. simmer over medium-low heat for 8–12 minutes until deep amber jam. deglaze with orange juice. cool.</li><li><strong>fat-coat the dry.</strong> whisk flour, casein, sugar, cornstarch, pudding mix, baking powder, baking soda, salt, and spices. pour browned butter into the dry mix. cut with a fork until it looks like damp sand.</li><li><strong>liquid emulsion.</strong> whisk the cooled banana-OJ mixture with whole egg, yolks, sour cream, yogurt, and vanilla until smooth.</li><li><strong>marriage and rest.</strong> fold wet into dry with a spatula until just combined. rest 10 minutes.</li><li><strong>center-set bake.</strong> bake at 325°F in a lined 9x5 pan. tent with foil at 30 minutes. pull at 65–75 minutes when center reads 200°F.</li><li><strong>final seal.</strong> cool in pan 10 minutes. wrap tightly in plastic while still warm.</li></ol>","menuIngredients":"3 large blackened bananas · 1/4 cup unsalted butter (56g), browned and cooled · 1/4 cup orange juice · 1/2 cup granulated sugar (100g) · 1/4 cup sour cream (60g) · 1/4 cup plain Greek yogurt (60g) · 1/2 cup Nutricoast unflavored casein (60g) · 1 1/8 cups all-purpose flour (140g) · 2 tbsp cornstarch · 2 tbsp dry vanilla pudding mix · 1 whole egg plus 2 yolks · 1 tsp baking powder · 1/2 tsp baking soda · 1/2 tsp fine sea salt · 1.5 tsp vanilla extract · 0.75 tsp cinnamon · 1/4 tsp fresh-grated nutmeg","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","createdAt":{"_seconds":1777314658,"_nanoseconds":680000000},"packMins":0,"activeMins":0,"createdByName":"Tommy","weeklySpecial":false,"notes":"high protein banana bread, casein banana loaf, protein bakery, reverse creaming, anti-rubber protein loaf\ncuisine: American\nprep: 25 min\ncook: 70 min","weeklyLimitRemaining":null,"isFanFavorite":false,"photoFocal":{"x":50,"y":50},"substitutions":[],"supplies":[],"hideCalories":false,"weeklyLimit":null,"fanFavorite":false,"owner":"tommy","isChefPick":false,"linkedProjectId":"","isTopSeller":false,"nutritionTags":[],"qtyPicker":"auto","name":"bananabolic bread","nextAvailableDate":"","category":"Approved","dietaryTags":[],"isNewThisWeek":false,"menuPrice":"8.99","menuDescription":"protein banana bread, done right. blackened bananas reduced to jam, browned butter, a hit of fresh orange, and 11g of protein per slice. baked low and slow until the center sets perfect. tastes like the banana bread your grandma made, builds like the one your trainer wishes existed.","published":true,"availableThisWeek":true,"thumbURL":"","protein":"12","mealType":"","calories":"234","pairsWith":["LyXHpBhh3guXibmPbuTx"],"menuCategory":"Bakery","collections":["fan"],"unitName":"slice","storage":"","heating":"","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F3U7juLAy49hFUGoiQaOS%2F1778111541665_Gemini_Generated_Image_edr0mnedr0mnedr0.png?alt=media&token=d7d85eb5-e25a-41c3-87a5-61b3e6547d42"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F3U7juLAy49hFUGoiQaOS%2F1778167888048_Gemini_Generated_Image_9xnozr9xnozr9xno.png?alt=media&token=8f69131f-c30b-4df8-9ca2-8c2d302c3d15","ingredients":[{"ingredientId":"6Q1IruXmFoVAOhX3q7pF","name":"cornstarch","qty":24,"unit":"g"},{"ingredientId":"QflNPQztRlMchEERkNYw","name":"granulated sugar","qty":67,"unit":"g"},{"ingredientId":"eVoI98scSnPsLw7cPTnI","name":"baking powder","qty":4,"unit":"g"},{"ingredientId":"LoNMuTlqmIasYXi2xKd6","name":"baking soda","qty":3,"unit":"g"},{"ingredientId":"0dNxHgi786bZNoGbqE3x","name":"cinnamon","qty":2,"unit":"g"},{"ingredientId":"b9j19jDBI9faAhBsLMQF","name":"light brown sugar","qty":73,"unit":"g"},{"ingredientId":null,"name":"honey","qty":42,"unit":"g"},{"ingredientId":"iJnYvCXTyy4MEXePnF3w","name":"orange juice","qty":62,"unit":"g"},{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla extract","qty":15,"unit":"g"},{"ingredientId":"to6Ng7UOPm5vFAylJc6m","name":"All Purpose Flour","qty":156,"unit":"g"},{"ingredientId":"tUyqh3urNM2I9VxQ7Cog","name":"Kosher Salt","qty":3,"unit":"g"},{"ingredientId":"dZeM4mOorzXD0vmRNkBS","name":"Eggs Large","qty":3,"unit":"ea"},{"ingredientId":"bC1WFCfpPUk6LcqsrlN1","name":"Dry Milk Powder","qty":8,"unit":"g"},{"ingredientId":"2XobXRgfheLYjtOb4qTb","name":"Vegetable Oil","qty":73,"unit":"g"},{"ingredientId":"RhaBwHoiTIvXOV1gXuSC","name":"Cottage Cheese","qty":150,"unit":"g"},{"ingredientId":"jwjYl7gL9ZGWK45eJFgm","name":"plain Greek yogurt","qty":61,"unit":"g"},{"ingredientId":"sQcBqjuGqXeiz6A4xF70","name":"large blackened bananas","qty":480,"unit":"g"},{"ingredientId":"jfKfdp7xrhcYzes8iRlg","name":"Dark Rum","qty":14,"unit":"g"},{"ingredientId":"D6I1SlFBWUkhWUR7Sy0D","name":"Nutmeg","qty":0.5,"unit":"g"},{"ingredientId":"Jk9xb1OqPp5rBV4TzNBo","name":"Whole Milk","qty":122,"unit":"g"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"Unsalted Butter Kirkland","qty":56,"unit":"g"},{"ingredientId":"HVJwdYvzIfiGhAGIhdij","name":"Nutricost Casein Protein Unflavored","qty":45,"unit":"g"}],"ladderId":"custom","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"packOptions":[{"qty":2,"label":"2 slices","price":3.5,"tierKey":"custom-1778460209191-7iv7","ladderId":"custom","allowStepper":false,"note":""},{"qty":5,"label":"half loaf","price":8,"tierKey":"custom-1778461043483-v28q","ladderId":"custom","allowStepper":false,"note":""},{"qty":10,"label":"full loaf","price":15.5,"tierKey":"custom-1778461045734-br3v","ladderId":"custom","allowStepper":false,"note":""}],"customPackOptions":[{"key":"custom-1778460209191-7iv7","label":"2 slices","qty":2,"price":3.5,"note":""},{"key":"custom-1778461043483-v28q","label":"half loaf","qty":5,"price":8,"note":""},{"key":"custom-1778461045734-br3v","label":"full loaf","qty":10,"price":15.5,"note":""}],"unitsPerYield":"10","recipeYield":"1","updatedAt":{"_seconds":1779068383,"_nanoseconds":257000000}},{"id":"6ke5pFBT1X6LggI3UfK7","description":"Soft, chewy, chocolate chip cookies.","servings":1,"instructions":"","feedback":[],"createdAt":{"_seconds":1774404201,"_nanoseconds":925000000},"status":"approved","macros":{"calories":0,"protein":9,"carbs":0,"fat":0,"fiber":0},"notes":"","linkedProjectId":"","category":"Approved","protein":"9","published":true,"nextAvailableDate":"","availableThisWeek":true,"menuIngredients":"flour, water, chocolate chips, butter, sugar","menuPrice":".50","createdByName":"Tommy","calories":"190","sodium":"20","fiber":"1","carbs":"20","fat":"5","cholesterol":"3","satFat":"0","sugar":"30","sellQty":6,"servingsPerBatch":20,"servingSize":"1 Cookie","mealType":"Bakery","menuCategory":"Bakery","weeklySpecial":false,"hideCalories":false,"fanFavorite":false,"menuDescription":"the cookie that started arguments. people didn't believe it until they tasted it. packed with protein, made with real whole ingredients, and somehow still the best chocolate chip cookie you've ever had. no chalky aftertaste. no weird texture. just a cookie that actually delivers — on flavor and on your goals.","nutritionTags":[],"skuBase":"TDC-0012","sortOrder":3,"owner":"tommy","instructionsHtml":"","availableNextWeek":false,"supplies":[],"name":"macro chip cookie","dietaryTags":[],"collections":["fan"],"isChefPick":false,"weeklyLimitRemaining":null,"unitName":"cookie","pairsWith":[],"isTopSeller":false,"storage":"","qtyPicker":"auto","isFanFavorite":false,"photoFocal":{"x":50,"y":50},"substitutions":[],"weeklyLimit":null,"heating":"","isNewThisWeek":false,"thumbURL":"","photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F6ke5pFBT1X6LggI3UfK7%2F1778111660092_Gemini_Generated_Image_fp4plhfp4plhfp4p.png?alt=media&token=26b71467-88ab-49ee-9339-55094c52dd22","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2F6ke5pFBT1X6LggI3UfK7%2F1778111660835_Gemini_Generated_Image_48tnpo48tnpo48tn.png?alt=media&token=8aa9291d-66d2-48e2-ad12-77982bc74cf3"],"ingredients":[{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"salted butter","qty":226,"unit":"g"},{"ingredientId":"b9j19jDBI9faAhBsLMQF","name":"light brown sugar","qty":200,"unit":"g"},{"ingredientId":"oLjj8JDIlVivGh8bsE86","name":"white sugar","qty":100,"unit":"g"},{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla extract","qty":2,"unit":"tbsp"},{"ingredientId":"LoNMuTlqmIasYXi2xKd6","name":"baking soda","qty":1.25,"unit":"tsp"},{"ingredientId":"eVoI98scSnPsLw7cPTnI","name":"baking powder","qty":0.75,"unit":"tsp"},{"ingredientId":"to6Ng7UOPm5vFAylJc6m","name":"All Purpose Flour","qty":220,"unit":"g"},{"ingredientId":"HVJwdYvzIfiGhAGIhdij","name":"Nutricost Casein Protein Unflavored","qty":150,"unit":"g"},{"ingredientId":"dZeM4mOorzXD0vmRNkBS","name":"Eggs Large","qty":2,"unit":"ea"},{"ingredientId":"ywtOtoFnh6EL8hRtLgM9","name":"Chocolate Chips Kirkland","qty":1.5,"unit":"cup"}],"ladderId":"custom","recipeYield":2,"packOptions":[{"qty":12,"label":"dozen","price":41.99,"tierKey":"custom-1778464011233-oa0x","ladderId":"custom","allowStepper":false},{"qty":6,"label":"half dozen","price":20.99,"tierKey":"custom-1778464011908-h6ko","ladderId":"custom","allowStepper":false}],"customPackOptions":[{"key":"custom-1778464011233-oa0x","label":"dozen","qty":12,"price":41.99},{"key":"custom-1778464011908-h6ko","label":"half dozen","qty":6,"price":20.99}],"backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"ArGstRq0trJeg9FTrkIY","mealType":"Bakery","servingSize":"4","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"menuIngredients":"","notes":"","nextAvailableDate":"","linkedProjectId":"","createdAt":{"_seconds":1774816808,"_nanoseconds":784000000},"weeklySpecial":false,"hideCalories":false,"fanFavorite":false,"published":true,"availableThisWeek":true,"menuCategory":"Bakery","skuBase":"TDC-0004","photoAlt":"scratch-made chocolate protein donuts with colorful sprinkles and rich chocolate glaze, piled on a white plate, baked fresh weekly at tandoco in minneapolis","seoDescription":"fudgy baked chocolate protein donuts with 14g protein each. scratch-made in minneapolis, no fillers, no shortcuts. order thu · pickup sun. tandoco.com","menuDescription":"deep chocolate, fudgy baked crumb, 15g of protein. everything a donut should be, nothing it shouldn't. baked fresh, made with real ingredients, and actually built to fuel you.","protein":"15","ingredients":[{"id":"HVJwdYvzIfiGhAGIhdij","name":"Nutricost Casein Protein Unflavored","qty":100,"unit":"g","costPerUnit":0.03667,"currentStock":0,"restockThreshold":0,"libraryId":"HVJwdYvzIfiGhAGIhdij"},{"id":"to6Ng7UOPm5vFAylJc6m","name":"All Purpose Flour","qty":100,"unit":"g","costPerUnit":0.001984,"currentStock":0,"restockThreshold":0,"libraryId":"to6Ng7UOPm5vFAylJc6m"},{"id":"eVoI98scSnPsLw7cPTnI","name":"Baking Powder","qty":100,"unit":"g","costPerUnit":0.012346,"currentStock":0,"restockThreshold":0,"libraryId":"eVoI98scSnPsLw7cPTnI"},{"id":"tUyqh3urNM2I9VxQ7Cog","name":"Sea Salt","qty":100,"unit":"g","costPerUnit":0.005427,"currentStock":0,"restockThreshold":0,"libraryId":"tUyqh3urNM2I9VxQ7Cog"}],"calories":"230","category":"Approved","owner":"tommy","instructionsHtml":"<!--\n  tandoco — Chocolate Protein Donuts Recipe\n  Embeddable snippet. Drop inside any page container.\n  Scoped to .tandoco-recipe — won't bleed into surrounding styles.\n  Requires: Plus Jakarta Sans + Inter from Google Fonts (or already loaded).\n-->\n\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@700;800;900&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n.tandoco-recipe {\n  --navy:    #1B1A6B;\n  --navy-dk: #12114A;\n  --navy-lt: #2D2FA8;\n  --gold:    #C8A96E;\n  --gold-lt: #E8C87A;\n  --cream:   #FAF8F3;\n  --sand:    #EDE8DC;\n  --text:    #1A1A2E;\n  --muted:   #6B6B7B;\n  --border:  #E8E4DC;\n  --bakery:  #be185d;\n  --choc:    #2c1810;\n\n  font-family: 'Inter', sans-serif;\n  color: var(--text);\n  -webkit-font-smoothing: antialiased;\n}\n\n/* ── HERO ── */\n.tandoco-recipe .recipe-hero {\n  background: linear-gradient(135deg, var(--choc) 0%, #4a2518 60%, #6b3420 100%);\n  border-radius: 20px 20px 0 0;\n  padding: 52px 56px 44px;\n  position: relative;\n  overflow: hidden;\n}\n\n.tandoco-recipe .recipe-hero::before {\n  content: '';\n  position: absolute;\n  width: 400px; height: 400px;\n  border-radius: 50%;\n  background: radial-gradient(circle, rgba(200,169,110,.12) 0%, transparent 70%);\n  top: -120px; right: -80px;\n  pointer-events: none;\n}\n\n.tandoco-recipe .recipe-hero::after {\n  content: '';\n  position: absolute;\n  width: 200px; height: 200px;\n  border-radius: 50%;\n  background: radial-gradient(circle, rgba(190,24,93,.15) 0%, transparent 70%);\n  bottom: -40px; left: 40px;\n  pointer-events: none;\n}\n\n.tandoco-recipe .hero-badge {\n  display: inline-flex;\n  align-items: center;\n  background: var(--bakery);\n  color: #fff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: .12em;\n  text-transform: uppercase;\n  padding: 5px 14px;\n  border-radius: 99px;\n  margin-bottom: 20px;\n}\n\n.tandoco-recipe .recipe-hero h1 {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: clamp(28px, 4vw, 44px);\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.03em;\n  line-height: 1.05;\n  margin-bottom: 10px;\n}\n\n.tandoco-recipe .recipe-hero h1 em {\n  color: var(--gold-lt);\n  font-style: normal;\n}\n\n.tandoco-recipe .recipe-tagline {\n  font-size: 14px;\n  color: rgba(255,255,255,.5);\n  font-weight: 500;\n  letter-spacing: .01em;\n  margin-bottom: 32px;\n}\n\n.tandoco-recipe .recipe-stats {\n  display: flex;\n  gap: 0;\n  flex-wrap: wrap;\n}\n\n.tandoco-recipe .stat-pill {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 14px 24px;\n  border-right: 1px solid rgba(255,255,255,.1);\n  min-width: 90px;\n}\n\n.tandoco-recipe .stat-pill:last-child { border-right: none; }\n.tandoco-recipe .stat-pill:first-child { padding-left: 0; }\n\n.tandoco-recipe .stat-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 22px;\n  font-weight: 900;\n  color: var(--gold-lt);\n  letter-spacing: -.02em;\n  line-height: 1;\n  margin-bottom: 4px;\n}\n\n.tandoco-recipe .stat-lbl {\n  font-size: 10px;\n  color: rgba(255,255,255,.45);\n  font-weight: 600;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  white-space: nowrap;\n}\n\n/* ── BODY ── */\n.tandoco-recipe .recipe-body {\n  background: var(--cream);\n  padding: 48px 56px;\n  display: grid;\n  grid-template-columns: 1fr 1.6fr;\n  gap: 48px;\n  align-items: start;\n}\n\n/* ── INGREDIENTS ── */\n.tandoco-recipe .ing-section {\n  display: flex;\n  flex-direction: column;\n  gap: 24px;\n}\n\n.tandoco-recipe .ing-group {\n  background: var(--sand);\n  border-radius: 14px;\n  padding: 20px 22px;\n}\n\n.tandoco-recipe .ing-group-title {\n  font-size: 9px;\n  font-weight: 800;\n  letter-spacing: .14em;\n  text-transform: uppercase;\n  color: var(--gold);\n  margin-bottom: 14px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.tandoco-recipe .ing-group-title::after {\n  content: '';\n  flex: 1;\n  height: 1px;\n  background: var(--border);\n}\n\n.tandoco-recipe .ing-list {\n  list-style: none;\n  display: flex;\n  flex-direction: column;\n  gap: 9px;\n}\n\n.tandoco-recipe .ing-list li {\n  font-size: 13px;\n  color: var(--text);\n  line-height: 1.4;\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n  gap: 8px;\n}\n\n.tandoco-recipe .ing-list li::after {\n  content: '';\n  flex: 1;\n  border-bottom: 1px dotted var(--border);\n  margin: 0 6px;\n  order: 1;\n}\n\n.tandoco-recipe .ing-amount {\n  font-weight: 700;\n  color: var(--navy);\n  white-space: nowrap;\n  order: 2;\n}\n\n.tandoco-recipe .ing-name { order: 0; }\n\n.tandoco-recipe .ing-group.glaze {\n  background: var(--navy-dk);\n}\n\n.tandoco-recipe .ing-group.glaze .ing-group-title {\n  color: var(--gold);\n}\n\n.tandoco-recipe .ing-group.glaze .ing-group-title::after {\n  background: rgba(255,255,255,.1);\n}\n\n.tandoco-recipe .ing-group.glaze li {\n  color: rgba(255,255,255,.8);\n}\n\n.tandoco-recipe .ing-group.glaze .ing-amount {\n  color: var(--gold-lt);\n}\n\n.tandoco-recipe .ing-group.glaze .ing-list li::after {\n  border-color: rgba(255,255,255,.1);\n}\n\n/* ── INSTRUCTIONS ── */\n.tandoco-recipe .steps-section {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n}\n\n.tandoco-recipe .step {\n  display: flex;\n  gap: 16px;\n  align-items: flex-start;\n}\n\n.tandoco-recipe .step-num {\n  width: 34px;\n  height: 34px;\n  border-radius: 50%;\n  background: linear-gradient(135deg, var(--gold), var(--gold-lt));\n  color: #1A1508;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 12px;\n  font-weight: 900;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  margin-top: 1px;\n}\n\n.tandoco-recipe .step-content {}\n\n.tandoco-recipe .step-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 4px;\n}\n\n.tandoco-recipe .step-body {\n  font-size: 13px;\n  color: var(--muted);\n  line-height: 1.65;\n}\n\n.tandoco-recipe .step-body strong {\n  color: var(--text);\n  font-weight: 600;\n}\n\n/* ── NOTES ── */\n.tandoco-recipe .recipe-notes {\n  background: var(--navy-dk);\n  border-radius: 0 0 20px 20px;\n  padding: 32px 56px;\n}\n\n.tandoco-recipe .notes-title {\n  font-size: 9px;\n  font-weight: 800;\n  letter-spacing: .14em;\n  text-transform: uppercase;\n  color: var(--gold);\n  margin-bottom: 18px;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n\n.tandoco-recipe .notes-title::after {\n  content: '';\n  flex: 1;\n  height: 1px;\n  background: rgba(255,255,255,.08);\n}\n\n.tandoco-recipe .notes-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 10px;\n}\n\n.tandoco-recipe .note-item {\n  display: flex;\n  gap: 10px;\n  align-items: flex-start;\n  background: rgba(255,255,255,.04);\n  border: 1px solid rgba(255,255,255,.06);\n  border-radius: 10px;\n  padding: 12px 14px;\n}\n\n.tandoco-recipe .note-dot {\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background: var(--gold);\n  flex-shrink: 0;\n  margin-top: 5px;\n}\n\n.tandoco-recipe .note-text {\n  font-size: 12px;\n  color: rgba(255,255,255,.65);\n  line-height: 1.55;\n}\n\n.tandoco-recipe .note-text strong {\n  color: rgba(255,255,255,.9);\n  font-weight: 600;\n}\n\n/* ── FOOTER ── */\n.tandoco-recipe .recipe-footer {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 18px 56px;\n  border-top: 1px solid rgba(255,255,255,.07);\n  flex-wrap: wrap;\n  gap: 10px;\n}\n\n.tandoco-recipe .recipe-footer-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 900;\n  color: rgba(255,255,255,.4);\n  letter-spacing: -.02em;\n}\n\n.tandoco-recipe .recipe-footer-meta {\n  font-size: 11px;\n  color: rgba(255,255,255,.25);\n}\n\n/* ── RESPONSIVE ── */\n@media (max-width: 680px) {\n  .tandoco-recipe .recipe-hero  { padding: 36px 24px 32px; border-radius: 16px 16px 0 0; }\n  .tandoco-recipe .recipe-body  { grid-template-columns: 1fr; padding: 32px 24px; gap: 32px; }\n  .tandoco-recipe .recipe-notes { padding: 28px 24px; border-radius: 0 0 16px 16px; }\n  .tandoco-recipe .recipe-footer { padding: 16px 24px; }\n  .tandoco-recipe .notes-grid   { grid-template-columns: 1fr; }\n  .tandoco-recipe .stat-pill    { padding: 12px 16px; min-width: 70px; }\n}\n</style>\n\n<!-- ═══════════════════════════════════════\n     TANDOCO RECIPE — embeddable content block\n════════════════════════════════════════ -->\n<div class=\"tandoco-recipe\">\n\n  <!-- HERO -->\n  <div class=\"recipe-hero\">\n    <div class=\"hero-badge\">Bakery · Recipe Guide</div>\n    <h1>chocolate<br><em>protein donuts</em></h1>\n    <div class=\"recipe-tagline\">moist · fudgy · baked · real ingredients · nutricoast casein</div>\n    <div class=\"recipe-stats\">\n      <div class=\"stat-pill\">\n        <div class=\"stat-val\">12</div>\n        <div class=\"stat-lbl\">donuts</div>\n      </div>\n      <div class=\"stat-pill\">\n        <div class=\"stat-val\">~20</div>\n        <div class=\"stat-lbl\">minutes</div>\n      </div>\n      <div class=\"stat-pill\">\n        <div class=\"stat-val\">~230</div>\n        <div class=\"stat-lbl\">cal each</div>\n      </div>\n      <div class=\"stat-pill\">\n        <div class=\"stat-val\">14g+</div>\n        <div class=\"stat-lbl\">protein</div>\n      </div>\n    </div>\n  </div>\n\n  <!-- BODY: ingredients + steps -->\n  <div class=\"recipe-body\">\n\n    <!-- INGREDIENTS -->\n    <div class=\"ing-section\">\n\n      <div class=\"ing-group\">\n        <div class=\"ing-group-title\">Dry</div>\n        <ul class=\"ing-list\">\n          <li><span class=\"ing-name\">Nutricoast casein powder</span><span class=\"ing-amount\">1 cup</span></li>\n          <li><span class=\"ing-name\">All-purpose flour</span><span class=\"ing-amount\">1 cup</span></li>\n          <li><span class=\"ing-name\">Baking powder</span><span class=\"ing-amount\">2 tsp</span></li>\n          <li><span class=\"ing-name\">Salt</span><span class=\"ing-amount\">¼ tsp</span></li>\n        </ul>\n      </div>\n\n      <div class=\"ing-group\">\n        <div class=\"ing-group-title\">Wet</div>\n        <ul class=\"ing-list\">\n          <li><span class=\"ing-name\">Coconut or brown sugar</span><span class=\"ing-amount\">¾ cup</span></li>\n          <li><span class=\"ing-name\">Full-fat Greek yogurt</span><span class=\"ing-amount\">½ cup</span></li>\n          <li><span class=\"ing-name\">Sour cream</span><span class=\"ing-amount\">¼ cup</span></li>\n          <li><span class=\"ing-name\">Whole egg</span><span class=\"ing-amount\">1</span></li>\n          <li><span class=\"ing-name\">Neutral oil</span><span class=\"ing-amount\">3 tbsp</span></li>\n          <li><span class=\"ing-name\">Vanilla extract</span><span class=\"ing-amount\">1 tsp</span></li>\n          <li><span class=\"ing-name\">Whole milk</span><span class=\"ing-amount\">¾ cup</span></li>\n        </ul>\n      </div>\n\n      <div class=\"ing-group\">\n        <div class=\"ing-group-title\">Cocoa Bloom</div>\n        <ul class=\"ing-list\">\n          <li><span class=\"ing-name\">Unsweetened cocoa, sifted</span><span class=\"ing-amount\">½ cup</span></li>\n          <li><span class=\"ing-name\">Hot water</span><span class=\"ing-amount\">12 tbsp</span></li>\n        </ul>\n      </div>\n\n      <div class=\"ing-group glaze\">\n        <div class=\"ing-group-title\">Casein Glaze</div>\n        <ul class=\"ing-list\">\n          <li><span class=\"ing-name\">Powdered sugar</span><span class=\"ing-amount\">1½ cup</span></li>\n          <li><span class=\"ing-name\">Nutricoast casein powder</span><span class=\"ing-amount\">2 tbsp</span></li>\n          <li><span class=\"ing-name\">Unsweetened cocoa</span><span class=\"ing-amount\">3 tbsp</span></li>\n          <li><span class=\"ing-name\">Cornstarch</span><span class=\"ing-amount\">2 tsp</span></li>\n          <li><span class=\"ing-name\">Milk of choice</span><span class=\"ing-amount\">4 tbsp</span></li>\n        </ul>\n      </div>\n\n    </div>\n\n    <!-- INSTRUCTIONS -->\n    <div class=\"steps-section\">\n\n      <div class=\"step\">\n        <div class=\"step-num\">01</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Preheat & prep</div>\n          <div class=\"step-body\">Preheat oven to <strong>350°F</strong>. Grease a 12-count donut pan with cooking spray.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">02</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Bloom the cocoa</div>\n          <div class=\"step-body\">Whisk cocoa with all <strong>12 tbsp hot water</strong> until fully smooth. Let sit 2–3 min. Don't reduce the water.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">03</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Mix dry ingredients</div>\n          <div class=\"step-body\">Whisk casein, flour, baking powder, and salt in a large bowl. <strong>Break up every casein clump</strong> before continuing.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">04</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Mix wet ingredients</div>\n          <div class=\"step-body\"><strong>Whisk sugar into yogurt and sour cream first</strong> until fully dissolved. Then add egg, oil, vanilla, milk, and bloomed cocoa. Whisk until smooth.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">05</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Combine & rest</div>\n          <div class=\"step-body\">Fold wet into dry until just combined. Rest 2–3 min for casein to absorb. Should be thick but pipeable. Add milk 1 tbsp at a time if needed.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">06</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Fill & bake</div>\n          <div class=\"step-body\">Pipe into all 12 cavities. Bake <strong>13–15 min</strong>. Pull at moist crumbs — not wet, not clean. Casein sets hard as it cools.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">07</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Cool</div>\n          <div class=\"step-body\">Rest in pan <strong>10 min</strong>. Move to wire rack and cool fully before glazing.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">08</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Make the casein glaze</div>\n          <div class=\"step-body\">Whisk powdered sugar, casein, cocoa, and cornstarch <strong>dry first</strong>. Drizzle in milk slowly. Sets fast with 2 tsp cornstarch — <strong>work quickly</strong>.</div>\n        </div>\n      </div>\n\n      <div class=\"step\">\n        <div class=\"step-num\">09</div>\n        <div class=\"step-content\">\n          <div class=\"step-title\">Glaze & set</div>\n          <div class=\"step-body\">Dip each cooled donut into the glaze. Return to rack. Sets firm in <strong>5–10 min</strong> before stacking.</div>\n        </div>\n      </div>\n\n    </div>\n  </div>\n\n  <!-- NOTES -->\n  <div class=\"recipe-notes\">\n    <div class=\"notes-title\">Baker's Notes</div>\n    <div class=\"notes-grid\">\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>Sugar goes in wet.</strong> Dissolve into yogurt and sour cream first. Undissolved sugar = gritty texture.</div>\n      </div>\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>Don't skip the sugar.</strong> It holds moisture and tenderizes. Skipping = dense, dry donuts.</div>\n      </div>\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>12 tbsp bloom water is correct</strong> for ½ cup cocoa. Don't reduce it.</div>\n      </div>\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>Glaze: mix all dry first</strong> before any milk. Sets fast with 2 tsp cornstarch — work quickly.</div>\n      </div>\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>Pull at moist crumbs.</strong> Clean toothpick = overdone. Casein sets hard as it cools.</div>\n      </div>\n      <div class=\"note-item\">\n        <div class=\"note-dot\"></div>\n        <div class=\"note-text\"><strong>Storage:</strong> airtight fridge 1 week · freeze 6 months, thaw overnight.</div>\n      </div>\n    </div>\n\n    <div class=\"recipe-footer\">\n      <div class=\"recipe-footer-brand\">tandoco</div>\n      <div class=\"recipe-footer-meta\">tandoco.com · @tandocohq · Minneapolis, MN</div>\n    </div>\n  </div>\n\n</div>\n<!-- end .tandoco-recipe -->","dietaryTags":[],"availableNextWeek":false,"supplies":[],"name":"glaze & gain donut","sortOrder":5,"packMins":0,"activeMins":0,"isChefPick":false,"isTopSeller":false,"isFanFavorite":false,"photoFocal":{"x":50,"y":50},"isNewThisWeek":false,"weeklyLimitRemaining":null,"weeklyLimit":null,"substitutions":[],"unitName":"donut","packOptions":[],"pairsWith":[],"qtyPicker":"auto","createdByName":"Tommy","menuPrice":"6.99","storage":"","heating":"","thumbURL":"","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FArGstRq0trJeg9FTrkIY%2F1778111564247_Gemini_Generated_Image_a6cpq8a6cpq8a6cp.png?alt=media&token=299cfcfb-a231-4693-9c9f-656e86353066"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FArGstRq0trJeg9FTrkIY%2F1778167849043_Gemini_Generated_Image_48bfod48bfod48bf.png?alt=media&token=5093b3cf-2392-4741-b66a-84eb1fb3c490","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"FXnQSLSLYg0RKJvN4K28","name":"golden orange chicken","menuCategory":"Entrée","dietaryTags":[],"nutritionTags":[],"ingredients":[],"pairsWith":[],"createdByName":"Omar Yusuf","createdAt":{"_seconds":1778902326,"_nanoseconds":588000000},"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FFXnQSLSLYg0RKJvN4K28%2F1778902387538-orange_chicken.png?alt=media&token=2b3cce5f-a57b-4d0d-b13c-a15afdff9e01","servingSize":"1","unitName":"","recipeYield":"1","owner":"omar","calories":"670","protein":"50","carbs":"72","fat":"18","menuDescription":"crispy pan-fried chicken in a scratch orange marmalade glaze, over jasmine rice with charred broccoli. sauce packed separate so it stays crisp. 50g protein.","menuIngredients":"chicken breast, jasmine rice, broccoli, orange juice, orange marmalade, egg, cornstarch, low-sodium soy sauce (wheat, soy), scallion, honey, brown sugar, rice vinegar, garlic, fresh ginger, toasted sesame oil (sesame), neutral oil, kosher salt, spices.","heating":"remove the sauce cup first, do not microwave it. microwave the bowl 90 seconds, stir the rice, heat 30–45 seconds more if needed. pour the sauce over the hot chicken right before eating. for a crisper result, finish the chicken 3–4 min in a 400F oven or air fryer instead.","storage":"keep refrigerated. best within 4 days of your sunday pickup. do not freeze the assembled bowl. sauce cup keeps separately up to 5 days.","published":true,"availableThisWeek":true,"photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FFXnQSLSLYg0RKJvN4K28%2F1778903129354-orange_chcicken_angle_2.png?alt=media&token=e4af1e09-aafd-40ec-a4eb-4ec5070cb6f4"],"menuPrice":"","isChefPick":true,"containsAllergens":["gluten","eggs","soy"],"isNewThisWeek":true,"updatedAt":{"_seconds":1778967232,"_nanoseconds":764000000},"mealType":"Entrée"},{"id":"FY5UQmOBkbHe7IVWrbvF","name":"egg bites","category":"Ideation","mealType":"","protein":"42","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"dietaryTags":[],"supplies":[],"notes":"","instructionsHtml":"","weeklyLimit":null,"weeklyLimitRemaining":null,"weeklySpecial":false,"fanFavorite":false,"isTopSeller":false,"isNewThisWeek":false,"isFanFavorite":false,"hideCalories":false,"qtyPicker":"auto","substitutions":[],"nextAvailableDate":"","pairsWith":[],"unitName":"","photoFocal":{"x":50,"y":50},"linkedProjectId":"","createdAt":{"_seconds":1777605950,"_nanoseconds":794000000},"owner":"omar","published":true,"availableThisWeek":true,"thumbURL":"","menuCategory":"Breakfast","menuDescription":"silky baked egg bites with crispy canadian bacon and aged gruyère. 21g of clean protein, 12 real ingredients, no gums or stabilizers. same dopamine as starbucks — twice the protein.","storage":"keep refrigerated at or below 38°F. best within 5-7 days from pickup.\n\nfreezer: flash-freeze on a tray uncovered for 1 hour first, then transfer to airtight container or freezer bag. holds quality 1-2 months.\n\nthaw in fridge overnight before reheating, or reheat from frozen using the two-stage method (add 30 seconds to the microwave step).","heating":"best: microwave 60 sec, then 325°F in the air fryer or oven for 3 min.\n\nquick: microwave at 50% power for 90 sec. lower power keeps them from getting rubbery.","menuIngredients":"cottage cheese (cultured skim milk, cream, salt), eggs, egg whites, canadian bacon, gruyère cheese, cream cheese, monterey jack cheese, butter, cornstarch, garlic powder, smoked paprika, kosher salt, black pepper, hot sauce (distilled vinegar, red pepper, salt)","calories":"400","_validation":{"ok":true,"errors":[],"warnings":[{"field":"stripeTaxCode","code":"tax_code_unset","msg":"No Stripe tax code set — Stripe Tax will use its default."}],"lastValidatedAt":{"_seconds":1777753510,"_nanoseconds":711000000}},"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FFY5UQmOBkbHe7IVWrbvF%2F1778111711380_Gemini_Generated_Image_x12fkdx12fkdx12f.png?alt=media&token=f79108d9-8cec-4b94-98c1-a008d4910804","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FFY5UQmOBkbHe7IVWrbvF%2F1778111712152_Gemini_Generated_Image_zgu4rszgu4rszgu4.png?alt=media&token=d882e866-d5ca-46c2-a0ef-141396ecf4af"],"createdByName":"Omar Yusuf","menuPrice":"11.50","ingredients":[{"ingredientId":"RhaBwHoiTIvXOV1gXuSC","name":"Cottage Cheese","qty":336,"unit":"g"},{"ingredientId":"dZeM4mOorzXD0vmRNkBS","name":"Eggs Large","qty":6,"unit":"ea"},{"ingredientId":"Mpwji18sUpXg6TAWByw3","name":"Cage Free Egg Whites","qty":4,"unit":"oz"},{"ingredientId":"CWGHRWmTseI5P2PFX4Jk","name":"Cream Cheese","qty":56,"unit":"g"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"Unsalted Butter Kirkland","qty":20,"unit":"g"},{"ingredientId":"6Q1IruXmFoVAOhX3q7pF","name":"cornstarch","qty":12,"unit":"g"},{"ingredientId":"0ZJHcnhtGe4v8XtUmjeT","name":"Gruyère","qty":56,"unit":"g"},{"ingredientId":"2EL9hShs1k1x2jPbXsfE","name":"Monterey Jack","qty":32,"unit":"g"}],"recipeYield":2,"servingSize":"6","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"isChefPick":true,"updatedAt":{"_seconds":1778907041,"_nanoseconds":392000000}},{"id":"GGDwzrEygziFdfXekSuq","name":"korean hot honey beef","category":"Approved","mealType":"Entrée","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"dietaryTags":[],"menuIngredients":"","ingredients":[],"supplies":[],"notes":"","instructionsHtml":"","published":true,"availableThisWeek":true,"weeklyLimit":null,"weeklyLimitRemaining":null,"weeklySpecial":false,"fanFavorite":false,"isTopSeller":false,"isNewThisWeek":false,"isFanFavorite":false,"hideCalories":false,"qtyPicker":"auto","substitutions":[],"nextAvailableDate":"","menuPrice":"11.50","menuCategory":"Entrée","pairsWith":[],"unitName":"","photoFocal":{"x":50,"y":50},"owner":"omar","menuDescription":"gochujang-glazed ground beef on caramelized sweet potato and charred broccoli, with cool cottage-cucumber-lime on the side and a drizzle of hot honey. fire on top, calm underneath.","heating":"","storage":"","linkedProjectId":"","createdByName":"Omar Yusuf","packOptions":[],"createdAt":{"_seconds":1778206307,"_nanoseconds":512000000},"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FGGDwzrEygziFdfXekSuq%2F1778206307334_Gemini_Generated_Image_o7r2rxo7r2rxo7r2.png?alt=media&token=85743cfd-171a-434f-93fe-9ac09f794bd9","thumbURL":"","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FGGDwzrEygziFdfXekSuq%2F1778206309998_Gemini_Generated_Image_aesx2jaesx2jaesx.png?alt=media&token=c5e4ae0f-c6f1-4fc5-9f91-ba6a924a546d"],"protein":"53","calories":"600","servingSize":"1","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"isChefPick":true,"updatedAt":{"_seconds":1778907056,"_nanoseconds":7000000}},{"id":"GyiMmU6Tmv9uNEojCU0L","name":"Green Smoothie","category":"Ideation","servingSize":"","protein":"20","calories":"200","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"menuIngredients":"","ingredients":[],"notes":"","published":true,"availableThisWeek":true,"nextAvailableDate":"","menuPrice":"6","menuDescription":"","linkedProjectId":"","createdByName":"Omar Yusuf","createdAt":{"_seconds":1774809134,"_nanoseconds":405000000},"mealType":"Smoothie","menuCategory":"Smoothie","skuBase":"TDC-0005","sortOrder":8,"owner":"omar","packOptions":[],"weeklySpecial":false,"photoURL":"","instructionsHtml":"","supplies":[],"hideCalories":false,"fanFavorite":false,"thumbURL":"","dietaryTags":[],"photos":[],"backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"substitutions":[],"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"KGOv4bJNqhM8NUVsfRdy","description":"Protein packed, antioxidant rich, soft bueberry muffins","servingSize":"1 muffin","servings":1,"status":"refining","macros":{"calories":0,"protein":13,"carbs":0,"fat":0,"fiber":0},"ingredients":[],"instructions":"","feedback":[],"createdAt":{"_seconds":1774393304,"_nanoseconds":527000000},"createdByName":"Tommy","notes":"Make more aesthetic","carbs":"","linkedProjectId":"","protein":"13","fat":"","calories":"","category":"Refining","menuPrice":"7.99","mealType":"Bakery","nutritionTags":[],"published":true,"menuIngredients":"","menuCategory":"Bakery","sodium":"","cholesterol":"","satFat":"","nextAvailableDate":"","availableThisWeek":true,"sugar":"","weeklySpecial":true,"hideCalories":false,"fanFavorite":false,"skuBase":"TDC-0015","owner":"tommy","instructionsHtml":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>blueberry protein bran muffins — tandoco</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,700&family=Inter:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n  --navy:      #1B1A6B;\n  --navy-dk:   #12114A;\n  --navy-lt:   #2D2FA8;\n  --accent:    #4F51D4;\n  --gold:      #C8A96E;\n  --gold-lt:   #E8C87A;\n  --cream:     #FAF8F3;\n  --sand:      #EDE8DC;\n  --border:    #E8E4DC;\n  --text:      #1A1A2E;\n  --muted:     #6B6B7B;\n  --bakery:    #be185d;\n  --bakery-lt: #fbcfe8;\n  --bakery-dk: #9d174d;\n  --berry:     #4c1d95;\n  --berry-lt:  #ede9fe;\n}\n\nhtml { font-size: 16px; scroll-behavior: smooth; }\nbody {\n  font-family: 'Inter', sans-serif;\n  background: var(--cream);\n  color: var(--text);\n  -webkit-font-smoothing: antialiased;\n}\n\n/* ── TOP STRIPE ── */\n.top-stripe {\n  height: 5px;\n  background: linear-gradient(90deg, var(--navy) 0%, var(--navy-lt) 50%, var(--bakery) 100%);\n}\n\n/* ── NAV ── */\nnav {\n  background: var(--cream);\n  border-bottom: 1px solid var(--border);\n  padding: 0 32px;\n  height: 56px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: sticky;\n  top: 0;\n  z-index: 100;\n  backdrop-filter: blur(12px);\n}\n\n.nav-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 20px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.04em;\n  text-decoration: none;\n}\n\n.nav-crumb {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  color: var(--muted);\n}\n\n.nav-crumb-sep { color: var(--border); }\n.nav-crumb-active { color: var(--navy); font-weight: 600; }\n\n/* ── HERO ── */\n.hero {\n  background: var(--navy);\n  padding: 64px 32px 56px;\n  position: relative;\n  overflow: hidden;\n}\n\n.hero-inner {\n  max-width: 760px;\n  margin: 0 auto;\n  position: relative;\n  z-index: 2;\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: 40px;\n  align-items: center;\n}\n\n.hero-left {}\n\n.hero-eyebrow {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  background: rgba(190,24,93,.18);\n  border: 1px solid rgba(190,24,93,.35);\n  border-radius: 99px;\n  padding: 5px 14px 5px 10px;\n  margin-bottom: 24px;\n}\n\n.hero-eyebrow-dot {\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background: var(--bakery);\n}\n\n.hero-eyebrow-text {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: #f472b6;\n}\n\nh1.hero-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: clamp(32px, 5vw, 50px);\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.04em;\n  line-height: 1.05;\n  margin-bottom: 16px;\n}\n\nh1.hero-title em {\n  font-style: normal;\n  color: var(--gold);\n}\n\n.hero-desc {\n  font-size: 15px;\n  color: rgba(255,255,255,.6);\n  line-height: 1.7;\n  max-width: 460px;\n  margin-bottom: 32px;\n}\n\n.hero-badges {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n\n.hero-badge {\n  background: rgba(255,255,255,.08);\n  border: 1px solid rgba(255,255,255,.14);\n  border-radius: 99px;\n  padding: 6px 14px;\n  font-size: 12px;\n  font-weight: 600;\n  color: rgba(255,255,255,.8);\n}\n\n/* stat pill stack */\n.hero-stats {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  flex-shrink: 0;\n}\n\n.stat-pill {\n  background: rgba(255,255,255,.07);\n  border: 1px solid rgba(255,255,255,.12);\n  border-radius: 14px;\n  padding: 14px 20px;\n  text-align: center;\n  min-width: 110px;\n}\n\n.stat-pill-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 26px;\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.03em;\n  line-height: 1;\n}\n\n.stat-pill-val.pink { color: #f9a8d4; }\n.stat-pill-val.gold { color: var(--gold); }\n\n.stat-pill-label {\n  font-size: 10px;\n  font-weight: 600;\n  color: rgba(255,255,255,.4);\n  text-transform: uppercase;\n  letter-spacing: .08em;\n  margin-top: 4px;\n}\n\n/* orbs */\n.hero-orb {\n  position: absolute;\n  border-radius: 50%;\n  pointer-events: none;\n}\n.orb1 { width: 480px; height: 480px; background: radial-gradient(circle, rgba(190,24,93,.18) 0%, transparent 70%); top: -160px; right: -80px; }\n.orb2 { width: 280px; height: 280px; background: radial-gradient(circle, rgba(200,169,110,.1) 0%, transparent 70%); bottom: -80px; left: 200px; }\n\n/* ── CAT STRIPE ── */\n.cat-stripe { height: 4px; background: var(--bakery); }\n\n/* ── MAIN ── */\n.main {\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 56px 32px 80px;\n}\n\n/* ── LABELS ── */\n.section-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .12em;\n  text-transform: uppercase;\n  color: var(--bakery);\n  margin-bottom: 10px;\n}\n\nh2.section-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 22px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.02em;\n  margin-bottom: 20px;\n}\n\n/* ── QUICK FACTS ── */\n.quick-facts {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 12px;\n  margin-bottom: 48px;\n}\n\n.fact-card {\n  background: var(--navy);\n  border-radius: 14px;\n  padding: 20px 16px;\n  text-align: center;\n}\n\n.fact-card-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 22px;\n  font-weight: 900;\n  color: var(--gold);\n  letter-spacing: -.02em;\n  line-height: 1;\n  margin-bottom: 5px;\n}\n\n.fact-card-label {\n  font-size: 11px;\n  font-weight: 600;\n  color: rgba(255,255,255,.5);\n  text-transform: uppercase;\n  letter-spacing: .07em;\n}\n\n/* ── INGREDIENT TABLE ── */\n.ingredient-section { margin-bottom: 48px; }\n\n.ing-table {\n  width: 100%;\n  border-collapse: collapse;\n  margin-bottom: 12px;\n}\n\n.ing-table th {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--muted);\n  text-align: left;\n  padding: 8px 14px;\n  border-bottom: 2px solid var(--border);\n}\n\n.ing-table td {\n  padding: 12px 14px;\n  font-size: 14px;\n  border-bottom: 1px solid var(--border);\n  vertical-align: middle;\n  line-height: 1.5;\n}\n\n.ing-table tr:last-child td { border-bottom: none; }\n.ing-table tbody tr:hover td { background: var(--sand); transition: background .15s; }\n\n.ing-name { font-weight: 600; color: var(--text); }\n.ing-amount {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-weight: 800;\n  color: var(--navy);\n  white-space: nowrap;\n}\n\n.ing-orig { font-size: 12px; color: var(--muted); }\n.ing-note { font-size: 12px; color: var(--muted); line-height: 1.5; }\n\n.tag {\n  display: inline-block;\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .06em;\n  text-transform: uppercase;\n  padding: 3px 9px;\n  border-radius: 99px;\n  white-space: nowrap;\n}\n.tag-new { background: rgba(190,24,93,.1); color: var(--bakery-dk); }\n.tag-gold { background: rgba(200,169,110,.15); color: #8a6530; }\n.tag-fiber { background: rgba(76,29,149,.1); color: var(--berry); }\n.tag-same { background: var(--sand); color: var(--muted); }\n\n.table-note {\n  background: var(--sand);\n  border-radius: 10px;\n  padding: 13px 16px;\n  font-size: 13px;\n  color: var(--muted);\n  line-height: 1.6;\n  display: flex;\n  gap: 10px;\n  align-items: flex-start;\n}\n.table-note-icon { font-size: 15px; flex-shrink: 0; margin-top: 1px; }\n\n/* ── CALLOUT CARD ── */\n.callout-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 48px;\n}\n\n.callout-card {\n  border-radius: 14px;\n  padding: 22px;\n  border: 1px solid var(--border);\n}\n\n.callout-card.dark {\n  background: var(--navy);\n  border-color: transparent;\n}\n\n.callout-card-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--muted);\n  margin-bottom: 7px;\n}\n\n.callout-card.dark .callout-card-label { color: rgba(200,169,110,.65); }\n\n.callout-card-text {\n  font-size: 14px;\n  color: var(--text);\n  line-height: 1.6;\n  font-weight: 500;\n}\n\n.callout-card.dark .callout-card-text { color: rgba(255,255,255,.85); }\n\n/* ── PROTEIN + FIBER BREAKDOWN ── */\n.pf-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 16px;\n  margin-bottom: 48px;\n}\n\n.pf-card {\n  border-radius: 14px;\n  overflow: hidden;\n  border: 1px solid var(--border);\n}\n\n.pf-card-head {\n  padding: 14px 18px;\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n}\n\n.pf-card-head.protein { background: var(--bakery); color: #fff; }\n.pf-card-head.fiber { background: var(--berry); color: #fff; }\n\n.pf-sources {\n  background: #fff;\n}\n\n.pf-source {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 11px 18px;\n  border-bottom: 1px solid var(--border);\n  font-size: 13px;\n}\n\n.pf-source:last-child { border-bottom: none; }\n.pf-source-name { color: var(--muted); }\n.pf-source-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-weight: 800;\n  color: var(--navy);\n  font-size: 14px;\n}\n\n.pf-source-val.pink { color: var(--bakery); }\n.pf-source-val.purple { color: var(--berry); }\n\n.pf-total {\n  background: var(--sand);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 13px 18px;\n}\n\n.pf-total-label {\n  font-size: 12px;\n  font-weight: 700;\n  color: var(--navy);\n  text-transform: uppercase;\n  letter-spacing: .06em;\n}\n\n.pf-total-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 20px;\n  font-weight: 900;\n  letter-spacing: -.02em;\n}\n\n.pf-total-val.pink { color: var(--bakery); }\n.pf-total-val.purple { color: var(--berry); }\n\n/* ── WHY IT WORKS ── */\n.why-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n  margin-bottom: 48px;\n}\n\n.why-card {\n  background: #fff;\n  border: 1px solid var(--border);\n  border-radius: 14px;\n  padding: 20px;\n}\n\n.why-card-icon { font-size: 20px; margin-bottom: 10px; display: block; }\n\n.why-card-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 7px;\n}\n\n.why-card-text { font-size: 13px; color: var(--muted); line-height: 1.65; }\n\n/* ── STEPS ── */\n.steps-section { margin-bottom: 48px; }\n\n.step {\n  display: grid;\n  grid-template-columns: 50px 1fr;\n  gap: 18px;\n  margin-bottom: 4px;\n  position: relative;\n}\n\n.step:not(:last-child)::after {\n  content: '';\n  position: absolute;\n  left: 24px;\n  top: 50px;\n  bottom: -4px;\n  width: 2px;\n  background: var(--border);\n}\n\n.step-num {\n  width: 50px;\n  height: 50px;\n  border-radius: 50%;\n  background: var(--navy);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  z-index: 1;\n}\n\n.step-num-text {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 15px;\n  font-weight: 900;\n  color: var(--gold);\n}\n\n.step-body { padding-top: 10px; padding-bottom: 28px; }\n\n.step-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 15px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  margin-bottom: 8px;\n}\n\n.step-text { font-size: 14px; color: var(--text); line-height: 1.75; }\n.step-text strong { color: var(--navy); font-weight: 600; }\n\n.step-timing {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  margin-top: 10px;\n  background: rgba(27,26,107,.06);\n  border-radius: 99px;\n  padding: 5px 12px;\n  font-size: 12px;\n  font-weight: 600;\n  color: var(--navy);\n}\n\n/* ── PRO TIP ── */\n.pro-tip {\n  background: linear-gradient(135deg, rgba(190,24,93,.07), rgba(190,24,93,.02));\n  border: 1px solid rgba(190,24,93,.2);\n  border-left: 4px solid var(--bakery);\n  border-radius: 0 12px 12px 0;\n  padding: 18px 22px;\n  margin-bottom: 16px;\n}\n\n.pro-tip-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: var(--bakery-dk);\n  margin-bottom: 7px;\n}\n\n.pro-tip-text { font-size: 14px; color: var(--text); line-height: 1.7; }\n\n/* ── MACRO COMPARE ── */\n.macro-section { margin-bottom: 48px; }\n\n.macro-compare {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 14px;\n}\n\n.macro-col-head {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  padding: 10px 16px;\n  border-radius: 10px 10px 0 0;\n}\n\n.macro-col-head.original { background: var(--sand); color: var(--muted); }\n.macro-col-head.tandoco { background: var(--navy); color: var(--gold); }\n\n.macro-rows {\n  border: 1px solid var(--border);\n  border-radius: 0 0 12px 12px;\n  overflow: hidden;\n  background: #fff;\n}\n\n.macro-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--border);\n  font-size: 14px;\n}\n\n.macro-row:last-child { border-bottom: none; }\n.macro-row.highlighted { background: rgba(190,24,93,.04); }\n\n.macro-label { color: var(--muted); font-size: 13px; }\n.macro-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-weight: 800;\n  color: var(--navy);\n  font-size: 15px;\n  letter-spacing: -.01em;\n}\n\n.macro-val.pink { color: var(--bakery); }\n.macro-val.purple { color: var(--berry); }\n\n/* ── STORAGE ── */\n.storage-row {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 12px;\n  margin-bottom: 48px;\n}\n\n.storage-card {\n  background: var(--sand);\n  border-radius: 12px;\n  padding: 18px;\n  text-align: center;\n}\n\n.storage-card-icon { font-size: 22px; margin-bottom: 8px; display: block; }\n\n.storage-card-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 800;\n  color: var(--navy);\n  margin-bottom: 4px;\n}\n\n.storage-card-text { font-size: 12px; color: var(--muted); line-height: 1.5; }\n\n/* ── DIVIDER ── */\n.divider { height: 1px; background: var(--border); margin: 40px 0; }\n\n/* ── CTA ── */\n.cta-box {\n  background: var(--navy);\n  border-radius: 20px;\n  padding: 44px 40px;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n\n.cta-box::before {\n  content: '';\n  position: absolute;\n  width: 360px;\n  height: 360px;\n  border-radius: 50%;\n  background: radial-gradient(circle, rgba(190,24,93,.2) 0%, transparent 70%);\n  top: -120px;\n  right: -80px;\n  pointer-events: none;\n}\n\n.cta-eyebrow {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  color: rgba(200,169,110,.7);\n  margin-bottom: 12px;\n}\n\n.cta-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 26px;\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.03em;\n  line-height: 1.15;\n  margin-bottom: 12px;\n}\n\n.cta-text {\n  font-size: 15px;\n  color: rgba(255,255,255,.55);\n  line-height: 1.65;\n  max-width: 420px;\n  margin: 0 auto 28px;\n}\n\n.cta-btn {\n  display: inline-block;\n  background: linear-gradient(135deg, var(--gold), var(--gold-lt));\n  color: #1A1508;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 800;\n  padding: 14px 34px;\n  border-radius: 99px;\n  text-decoration: none;\n  letter-spacing: -.01em;\n  box-shadow: 0 4px 20px rgba(200,169,110,.3);\n  position: relative;\n  z-index: 1;\n}\n\n/* ── FOOTER ── */\nfooter {\n  border-top: 1px solid var(--border);\n  padding: 22px 32px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  max-width: 760px;\n  margin: 0 auto;\n}\n\n.footer-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.03em;\n}\n\n.footer-meta { font-size: 12px; color: var(--muted); }\n\n/* ── RESPONSIVE ── */\n@media (max-width: 620px) {\n  nav { padding: 0 20px; }\n  .hero { padding: 48px 20px 44px; }\n  .hero-inner { grid-template-columns: 1fr; }\n  .hero-stats { flex-direction: row; flex-wrap: wrap; }\n  .stat-pill { min-width: 0; flex: 1; }\n  .main { padding: 40px 20px 60px; }\n  .quick-facts { grid-template-columns: repeat(2, 1fr); }\n  .callout-grid { grid-template-columns: 1fr; }\n  .pf-grid { grid-template-columns: 1fr; }\n  .why-grid { grid-template-columns: 1fr; }\n  .macro-compare { grid-template-columns: 1fr; }\n  .storage-row { grid-template-columns: 1fr; }\n  .cta-box { padding: 32px 24px; }\n  footer { flex-direction: column; gap: 6px; text-align: center; padding: 20px; }\n}\n</style>\n</head>\n<body>\n\n<div class=\"top-stripe\"></div>\n\n<nav>\n  <a href=\"https://tandoco.com\" class=\"nav-brand\">tandoco</a>\n  <div class=\"nav-crumb\">\n    <span>bakery</span>\n    <span class=\"nav-crumb-sep\">/</span>\n    <span class=\"nav-crumb-active\">blueberry protein bran muffin</span>\n  </div>\n</nav>\n\n<!-- HERO -->\n<section class=\"hero\">\n  <div class=\"hero-orb orb1\"></div>\n  <div class=\"hero-orb orb2\"></div>\n  <div class=\"hero-inner\">\n    <div class=\"hero-left\">\n      <div class=\"hero-eyebrow\">\n        <div class=\"hero-eyebrow-dot\"></div>\n        <span class=\"hero-eyebrow-text\">protein bakery</span>\n      </div>\n      <h1 class=\"hero-title\">blueberry<br>protein<br><em>bran muffin</em></h1>\n      <p class=\"hero-desc\">sally's classic bran muffin — rebuilt with casein, greek yogurt, and ground flaxseed to hit both protein and fiber goals without turning it into a health food brick.</p>\n      <div class=\"hero-badges\">\n        <span class=\"hero-badge\">🫐 fresh blueberries</span>\n        <span class=\"hero-badge\">💪 high protein</span>\n        <span class=\"hero-badge\">🌾 high fiber</span>\n        <span class=\"hero-badge\">⏱ 30 min</span>\n        <span class=\"hero-badge\">yields 12</span>\n      </div>\n    </div>\n    <div class=\"hero-stats\">\n      <div class=\"stat-pill\">\n        <div class=\"stat-pill-val pink\">12g</div>\n        <div class=\"stat-pill-label\">protein</div>\n      </div>\n      <div class=\"stat-pill\">\n        <div class=\"stat-pill-val gold\">7g</div>\n        <div class=\"stat-pill-label\">fiber</div>\n      </div>\n      <div class=\"stat-pill\">\n        <div class=\"stat-pill-val\">~210</div>\n        <div class=\"stat-pill-label\">calories</div>\n      </div>\n    </div>\n  </div>\n</section>\n<div class=\"cat-stripe\"></div>\n\n<!-- MAIN -->\n<main class=\"main\">\n\n  <!-- QUICK FACTS -->\n  <div class=\"quick-facts\">\n    <div class=\"fact-card\">\n      <div class=\"fact-card-val\">30</div>\n      <div class=\"fact-card-label\">minutes total</div>\n    </div>\n    <div class=\"fact-card\">\n      <div class=\"fact-card-val\">12</div>\n      <div class=\"fact-card-label\">muffins</div>\n    </div>\n    <div class=\"fact-card\">\n      <div class=\"fact-card-val\">425°</div>\n      <div class=\"fact-card-label\">then 350°F</div>\n    </div>\n    <div class=\"fact-card\">\n      <div class=\"fact-card-val\">1 bowl</div>\n      <div class=\"fact-card-label\">no mixer</div>\n    </div>\n  </div>\n\n  <!-- INGREDIENTS -->\n  <div class=\"ingredient-section\">\n    <div class=\"section-label\">ingredients</div>\n    <h2 class=\"section-title\">dry ingredients</h2>\n\n    <table class=\"ing-table\">\n      <thead>\n        <tr>\n          <th>ingredient</th>\n          <th>amount</th>\n          <th>original</th>\n          <th>role</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td class=\"ing-name\">whole wheat flour</td>\n          <td class=\"ing-amount\">¾ cup (90g)</td>\n          <td class=\"ing-orig\">was 1 cup</td>\n          <td class=\"ing-note\">reduced to make room for casein without making batter too dense</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">Nutricoast unflavored casein <span class=\"tag tag-gold\">tandoco protein</span></td>\n          <td class=\"ing-amount\">¼ cup (30g)</td>\n          <td class=\"ing-orig\">new</td>\n          <td class=\"ing-note\">slow-absorbing protein that stays moist — better than whey for baked goods</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">wheat bran <span class=\"tag tag-fiber\">fiber</span></td>\n          <td class=\"ing-amount\">1½ cups (90g)</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\">the foundation — insoluble fiber, nutty flavor, classic bran texture</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">ground flaxseed <span class=\"tag tag-new\">new</span> <span class=\"tag tag-fiber\">fiber</span></td>\n          <td class=\"ing-amount\">2 tbsp (14g)</td>\n          <td class=\"ing-orig\">new</td>\n          <td class=\"ing-note\">adds soluble fiber + omega-3s. blends invisibly into batter. use golden flax for mildest flavor.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">baking powder</td>\n          <td class=\"ing-amount\">1 tsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\"></td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">baking soda</td>\n          <td class=\"ing-amount\">1 tsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\"></td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">ground cinnamon</td>\n          <td class=\"ing-amount\">1 tsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\"></td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">fine sea salt</td>\n          <td class=\"ing-amount\">¼ tsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\"></td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div style=\"height:24px;\"></div>\n    <h2 class=\"section-title\">wet ingredients</h2>\n\n    <table class=\"ing-table\">\n      <thead>\n        <tr>\n          <th>ingredient</th>\n          <th>amount</th>\n          <th>original</th>\n          <th>role</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td class=\"ing-name\">eggs</td>\n          <td class=\"ing-amount\">2 large</td>\n          <td class=\"ing-orig\">was 1</td>\n          <td class=\"ing-note\">extra egg adds ~6g protein across the batch and improves structure with the heavier batter</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">plain greek yogurt <span class=\"tag tag-new\">new</span></td>\n          <td class=\"ing-amount\">½ cup (120g)</td>\n          <td class=\"ing-orig\">new</td>\n          <td class=\"ing-note\">replaces some milk — adds ~10g protein to the batch, keeps muffins moist and tender</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">whole milk</td>\n          <td class=\"ing-amount\">¼ cup (60ml)</td>\n          <td class=\"ing-orig\">was ¾ cup</td>\n          <td class=\"ing-note\">reduced because greek yogurt replaces most of the liquid. don't skip it entirely.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">unsweetened applesauce</td>\n          <td class=\"ing-amount\">½ cup (120g)</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\">moisture and natural sweetness. the reason these muffins aren't dry.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">honey</td>\n          <td class=\"ing-amount\">3 tbsp</td>\n          <td class=\"ing-orig\">was ¼ cup</td>\n          <td class=\"ing-note\">slightly reduced — greek yogurt and blueberries add natural sweetness</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">coconut oil, melted</td>\n          <td class=\"ing-amount\">2 tbsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\">fat for moisture and crumb tenderness. don't remove it.</td>\n        </tr>\n        <tr>\n          <td class=\"ing-name\">vanilla extract</td>\n          <td class=\"ing-amount\">1 tsp</td>\n          <td class=\"ing-orig\">same</td>\n          <td class=\"ing-note\"></td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div style=\"height:24px;\"></div>\n    <h2 class=\"section-title\">fold-ins</h2>\n\n    <table class=\"ing-table\">\n      <thead>\n        <tr>\n          <th>ingredient</th>\n          <th>amount</th>\n          <th>note</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td class=\"ing-name\">fresh blueberries</td>\n          <td class=\"ing-amount\">1 cup (150g)</td>\n          <td class=\"ing-note\">fresh preferred. if using frozen, do not thaw — fold in straight from frozen to prevent bleeding.</td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div style=\"height:12px;\"></div>\n    <div class=\"table-note\">\n      <span class=\"table-note-icon\">⚖️</span>\n      <span>casein absorbs liquid differently than flour — the batter will look thicker than Sally's original. that's correct. don't add extra milk to thin it out; it will bake correctly as-is.</span>\n    </div>\n  </div>\n\n  <!-- PROTEIN + FIBER BREAKDOWN -->\n  <div class=\"section-label\">where it comes from</div>\n  <h2 class=\"section-title\">protein + fiber by source</h2>\n  <div class=\"pf-grid\" style=\"margin-bottom:48px;\">\n    <div class=\"pf-card\">\n      <div class=\"pf-card-head protein\">protein per muffin (est.)</div>\n      <div class=\"pf-sources\">\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">Nutricoast casein (¼ cup)</span>\n          <span class=\"pf-source-val pink\">~4g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">greek yogurt (½ cup)</span>\n          <span class=\"pf-source-val pink\">~4g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">2 eggs</span>\n          <span class=\"pf-source-val pink\">~2g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">wheat bran + whole wheat flour</span>\n          <span class=\"pf-source-val pink\">~2g</span>\n        </div>\n      </div>\n      <div class=\"pf-total\">\n        <span class=\"pf-total-label\">total</span>\n        <span class=\"pf-total-val pink\">~12g</span>\n      </div>\n    </div>\n    <div class=\"pf-card\">\n      <div class=\"pf-card-head fiber\">fiber per muffin (est.)</div>\n      <div class=\"pf-sources\">\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">wheat bran (1½ cups)</span>\n          <span class=\"pf-source-val purple\">~4g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">ground flaxseed (2 tbsp)</span>\n          <span class=\"pf-source-val purple\">~1.5g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">whole wheat flour (¾ cup)</span>\n          <span class=\"pf-source-val purple\">~1g</span>\n        </div>\n        <div class=\"pf-source\">\n          <span class=\"pf-source-name\">blueberries (1 cup)</span>\n          <span class=\"pf-source-val purple\">~0.5g</span>\n        </div>\n      </div>\n      <div class=\"pf-total\">\n        <span class=\"pf-total-label\">total</span>\n        <span class=\"pf-total-val purple\">~7g</span>\n      </div>\n    </div>\n  </div>\n\n  <!-- WHY IT WORKS -->\n  <div class=\"section-label\">ingredient logic</div>\n  <h2 class=\"section-title\" style=\"margin-bottom:16px;\">why each swap works</h2>\n  <div class=\"why-grid\">\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🥛</span>\n      <div class=\"why-card-title\">casein over whey</div>\n      <div class=\"why-card-text\">whey is fast-absorbing and thin — it makes baked goods rubbery and wet. casein is slow-absorbing and thick-mixing, which is exactly what a muffin batter needs. it holds moisture during the bake without making the crumb gummy.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🥣</span>\n      <div class=\"why-card-title\">greek yogurt as liquid</div>\n      <div class=\"why-card-text\">swapping most of the milk for greek yogurt cuts volume while adding protein and fat. the acidity also reacts with baking soda for a better rise. full-fat or 2% yogurt gives the best crumb — non-fat works but can make muffins slightly denser.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🌱</span>\n      <div class=\"why-card-title\">flaxseed for soluble fiber</div>\n      <div class=\"why-card-text\">wheat bran is almost entirely insoluble fiber — great for digestion, less great for satiety. ground flaxseed adds soluble fiber, which slows digestion and keeps you full longer. 2 tbsp vanishes into the batter with no texture impact and only a mild nutty flavor.</div>\n    </div>\n    <div class=\"why-card\">\n      <span class=\"why-card-icon\">🫐</span>\n      <div class=\"why-card-title\">blueberries, not raisins</div>\n      <div class=\"why-card-text\">sally's original calls for raisins. blueberries give you antioxidants, a burst of juice in every bite, and lower added sugar. fresh blueberries make a meaningfully better muffin than frozen — use them when you can. fold gently at the very end.</div>\n    </div>\n  </div>\n\n  <div class=\"divider\"></div>\n\n  <!-- METHOD -->\n  <div class=\"steps-section\">\n    <div class=\"section-label\">method</div>\n    <h2 class=\"section-title\">how to make it</h2>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">01</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">preheat and prep</div>\n        <div class=\"step-text\">preheat oven to <strong>425°F (218°C)</strong>. line a standard 12-count muffin pan with paper liners or spray with nonstick spray. the high initial temp is what gives these muffins their domed top — don't skip it.</div>\n        <div class=\"step-timing\">⏱ 10 min preheat</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">02</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">mix the dry ingredients</div>\n        <div class=\"step-text\">whisk together in a large bowl: whole wheat flour, casein, wheat bran, ground flaxseed, baking powder, baking soda, cinnamon, and salt. whisk well — casein can clump, so make sure it's fully distributed through the dry mix before the wet ingredients go in.</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">03</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">mix the wet ingredients</div>\n        <div class=\"step-text\">in a medium bowl, whisk together the eggs, greek yogurt, milk, applesauce, honey, melted coconut oil, and vanilla until fully smooth. the yogurt may resist at first — keep whisking. the batter will be thicker than you'd expect from a standard muffin recipe. that's the casein and yogurt doing their job.</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">04</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">combine — do not overmix</div>\n        <div class=\"step-text\">pour the wet ingredients into the dry and fold with a rubber spatula until <strong>just combined</strong>. a few streaks of flour are fine — they'll hydrate during the rest. overmixing at this stage develops gluten and makes muffins tough. switch to gentle folding as soon as no dry clumps remain.</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">05</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">fold in blueberries</div>\n        <div class=\"step-text\">add the blueberries and fold in with 3–4 gentle strokes. if using frozen, add straight from the freezer — thawing first causes them to bleed and turns the batter purple. fresh blueberries can be tossed in 1 tsp of flour before folding to help them suspend in the batter rather than sinking.</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">06</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">fill and bake — two-temperature method</div>\n        <div class=\"step-text\">divide batter evenly across the 12 cups, filling each <strong>all the way to the top</strong>. the high batter and high initial temp are what create that tall, domed bakery-style top. bake at <strong>425°F for 5 minutes</strong>, then — without opening the oven — reduce the temperature to <strong>350°F (177°C)</strong>. bake for an additional <strong>14–16 minutes</strong> until a toothpick inserted in the center comes out clean.</div>\n        <div class=\"step-timing\">⏱ 5 min at 425° + 14–16 min at 350°</div>\n      </div>\n    </div>\n\n    <div class=\"step\">\n      <div class=\"step-num\"><span class=\"step-num-text\">07</span></div>\n      <div class=\"step-body\">\n        <div class=\"step-title\">cool before eating</div>\n        <div class=\"step-text\">let muffins cool in the pan for 5 minutes, then transfer to a wire rack. casein-enriched baked goods continue to set as they cool — eating them straight from the oven can make them taste gummy. give them 10–15 minutes and the texture firms up significantly.</div>\n        <div class=\"step-timing\">⏱ 10–15 min cool time</div>\n      </div>\n    </div>\n\n  </div>\n\n  <!-- PRO TIPS -->\n  <div class=\"pro-tip\" style=\"margin-bottom:12px;\">\n    <div class=\"pro-tip-label\">pro tip — browning</div>\n    <div class=\"pro-tip-text\">casein contains milk proteins that brown faster than flour. watch your muffins at the 12-minute mark of the second bake. if the tops look dark, tent loosely with foil. a clean toothpick is your real doneness signal.</div>\n  </div>\n\n  <div class=\"pro-tip\" style=\"margin-bottom:48px;\">\n    <div class=\"pro-tip-label\">pro tip — tall muffin tops</div>\n    <div class=\"pro-tip-text\">the combination of filling cups to the top, starting at 425°F, and not opening the oven door for the first 5 minutes is what creates that tall, cracked, bakery-style dome. resist the urge to check early.</div>\n  </div>\n\n  <!-- MACRO COMPARE -->\n  <div class=\"macro-section\">\n    <div class=\"section-label\">nutrition</div>\n    <h2 class=\"section-title\">per muffin (1 of 12) — estimated</h2>\n    <div class=\"macro-compare\">\n      <div>\n        <div class=\"macro-col-head original\">sally's original</div>\n        <div class=\"macro-rows\">\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">protein</span>\n            <span class=\"macro-val\">~4g</span>\n          </div>\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">fiber</span>\n            <span class=\"macro-val\">~4g</span>\n          </div>\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">calories</span>\n            <span class=\"macro-val\">~150</span>\n          </div>\n          <div class=\"macro-row\">\n            <span class=\"macro-label\">carbs</span>\n            <span class=\"macro-val\">~28g</span>\n          </div>\n        </div>\n      </div>\n      <div>\n        <div class=\"macro-col-head tandoco\">tandoco version</div>\n        <div class=\"macro-rows\">\n          <div class=\"macro-row highlighted\">\n            <span class=\"macro-label\">protein</span>\n            <span class=\"macro-val pink\">~12g</span>\n          </div>\n          <div class=\"macro-row highlighted\">\n            <span class=\"macro-label\">fiber</span>\n            <span class=\"macro-val purple\">~7g</span>\n          </div>\n          <div class=\"macro-row highlighted\">\n            <span class=\"macro-label\">calories</span>\n            <span class=\"macro-val\">~210</span>\n          </div>\n          <div class=\"macro-row highlighted\">\n            <span class=\"macro-label\">carbs</span>\n            <span class=\"macro-val\">~24g</span>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div style=\"height:12px;\"></div>\n    <div class=\"table-note\">\n      <span class=\"table-note-icon\">📊</span>\n      <span>estimates based on USDA nutrition data and Nutricoast casein label. actual macros vary by exact brand of greek yogurt, milk fat %, and blueberry weight. use a food scale and log your specific brands for precision tracking.</span>\n    </div>\n  </div>\n\n  <!-- STORAGE -->\n  <div class=\"section-label\">storage</div>\n  <h2 class=\"section-title\">keeping them fresh</h2>\n  <div class=\"storage-row\">\n    <div class=\"storage-card\">\n      <span class=\"storage-card-icon\">🗃️</span>\n      <div class=\"storage-card-title\">counter</div>\n      <div class=\"storage-card-text\">airtight container, up to 3 days. place a paper towel under the muffins to absorb moisture.</div>\n    </div>\n    <div class=\"storage-card\">\n      <span class=\"storage-card-icon\">❄️</span>\n      <div class=\"storage-card-title\">fridge</div>\n      <div class=\"storage-card-text\">up to 1 week. the higher protein content means these keep better cold than standard muffins.</div>\n    </div>\n    <div class=\"storage-card\">\n      <span class=\"storage-card-icon\">🧊</span>\n      <div class=\"storage-card-title\">freezer</div>\n      <div class=\"storage-card-text\">up to 3 months. wrap individually, thaw overnight in fridge, or microwave 45–60 seconds straight from frozen.</div>\n    </div>\n  </div>\n\n  <div class=\"divider\"></div>\n\n  <!-- CTA -->\n  <div class=\"cta-box\">\n    <div class=\"cta-eyebrow\">made in minneapolis</div>\n    <div class=\"cta-title\">want us to do the baking?</div>\n    <div class=\"cta-text\">scratch-made, high-protein bakery and weekly meal prep. real ingredients, no shortcuts. orders close thursday, pickup sunday.</div>\n    <a href=\"https://tandoco.com/store\" class=\"cta-btn\">see this week's menu →</a>\n  </div>\n\n</main>\n\n<footer>\n  <div class=\"footer-brand\">tandoco</div>\n  <div class=\"footer-meta\">hello@tandoco.com · tandoco.com · @tandocohq</div>\n</footer>\n\n</body>\n</html>","availableNextWeek":false,"supplies":[],"dietaryTags":[],"fiber":"7","sortOrder":7,"collections":["fiber"],"isChefPick":false,"weeklyLimitRemaining":null,"unitName":"muffin","pairsWith":[],"isTopSeller":false,"storage":"","qtyPicker":"auto","isFanFavorite":false,"photoFocal":{"x":50,"y":50},"packOptions":[],"substitutions":[],"weeklyLimit":null,"heating":"","isNewThisWeek":false,"thumbURL":"","name":"the pumpkin pump muffin","menuDescription":"high protein, high fiber, real pumpkin and warm spice. made from scratch to keep you full past lunch — no fillers, no shortcuts.","photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKGOv4bJNqhM8NUVsfRdy%2F1778111583668_Gemini_Generated_Image_z06a6wz06a6wz06a.png?alt=media&token=435596d9-422c-4f02-9cb9-e19ae74f1f50","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKGOv4bJNqhM8NUVsfRdy%2F1778111584416_Gemini_Generated_Image_7s3u5x7s3u5x7s3u.png?alt=media&token=d519f0a3-1548-45bd-8089-1b88d33c7c07"],"backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"Kka5f9K2PQjJTNSM5reF","carbs":"","fat":"","notes":"","linkedProjectId":"","createdAt":{"_seconds":1774578149,"_nanoseconds":950000000},"skuBase":"TDC-0007","weeklySpecial":false,"fiber":"","nutritionTags":[],"menuIngredients":"","instructionsHtml":"","sodium":"","hideCalories":false,"cholesterol":"","fanFavorite":false,"satFat":"","nextAvailableDate":"","sugar":"","sellQty":3,"servingsPerBatch":10,"mealType":"Bakery","menuCategory":"Bakery","owner":"tommy","dietaryTags":[],"published":true,"availableThisWeek":true,"category":"Approved","protein":"15","calories":"250","servingSize":"1 brownie","menuPrice":"9.99","menuDescription":"Fudgy, dense, and deeply chocolate. these aren't protein bars pretending to be brownies,  they're real brownies that happen to hit your macros. made from scratch with whole ingredients, no fillers, nothing you can't pronounce. the kind of thing you eat and then check the label twice because it doesn't add up.","availableNextWeek":false,"supplies":[],"name":"built brownie","sortOrder":4,"isChefPick":false,"isTopSeller":false,"isFanFavorite":false,"photoFocal":{"x":50,"y":50},"isNewThisWeek":false,"collections":["protein","fan"],"createdByName":"Tommy","weeklyLimitRemaining":null,"substitutions":[],"unitName":"brownie","pairsWith":[],"weeklyLimit":null,"storage":"","heating":"","qtyPicker":"auto","thumbURL":"","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKka5f9K2PQjJTNSM5reF%2F1778111613042_Gemini_Generated_Image_ugw5v2ugw5v2ugw5.png?alt=media&token=3637f53f-0d4c-4a50-a9ed-71208e333dcd"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKka5f9K2PQjJTNSM5reF%2F1778167756128_Gemini_Generated_Image_yri963yri963yri9.png?alt=media&token=9780a434-80e1-4c31-92e7-9f7ffc1ee22a","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"ingredients":[{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla extract","qty":2,"unit":"tsp"},{"ingredientId":null,"name":"hot water","qty":10,"unit":"tbsp"},{"ingredientId":null,"name":"sea salt","qty":0.5,"unit":"tsp"},{"ingredientId":"Jk9xb1OqPp5rBV4TzNBo","name":"whole milk","qty":0.25,"unit":"cup"},{"ingredientId":"ywtOtoFnh6EL8hRtLgM9","name":"dark chocolate chips","qty":255,"unit":"g"},{"ingredientId":"4yRKEugscqkLpPQlJU4y","name":"powdered sugar","qty":1.5,"unit":"cup"},{"ingredientId":"Jk9xb1OqPp5rBV4TzNBo","name":"milk","qty":3,"unit":"tbsp"},{"ingredientId":"dZeM4mOorzXD0vmRNkBS","name":"Eggs Large","qty":2,"unit":"ea"},{"ingredientId":"b9j19jDBI9faAhBsLMQF","name":"Brown Sugar","qty":250,"unit":"g"},{"ingredientId":"to6Ng7UOPm5vFAylJc6m","name":"All Purpose Flour","qty":0.75,"unit":"cup"},{"ingredientId":"HVJwdYvzIfiGhAGIhdij","name":"Nutricost Casein Protein Unflavored","qty":72,"unit":"g"},{"ingredientId":"02siuYZJhLV9XoOc0xFh","name":"Cocoa Powder","qty":0.9375,"unit":"tbsp"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"Unsalted Butter Kirkland","qty":141,"unit":"g"},{"ingredientId":"xgG22Lulzzr2zndPRtGG","name":"coconut oil","qty":1,"unit":"tbsp"},{"ingredientId":"tUyqh3urNM2I9VxQ7Cog","name":"Kosher Salt","qty":0.5,"unit":"tsp"}],"priceUpdatedBy":"GrmEERx4cgXljXaxqQ9hCVdKA5J2","ladderId":"custom","price":22.99,"priceUpdatedAt":{"_seconds":1779130831,"_nanoseconds":259000000},"packOptions":[{"qty":1,"label":"3 pack","price":7.99,"tierKey":"slice","ladderId":"custom","allowStepper":false,"note":""},{"qty":1,"label":"6 pack","price":15.99,"tierKey":"quarter","ladderId":"custom","allowStepper":false,"note":""},{"qty":9,"label":"full pan","price":22.99,"tierKey":"half","ladderId":"custom","allowStepper":false,"note":""}],"customPackOptions":[{"key":"slice","label":"3 pack","qty":1,"price":7.99,"note":""},{"key":"quarter","label":"6 pack","qty":1,"price":15.99,"note":""},{"key":"half","label":"full pan","qty":9,"price":22.99,"note":""}],"recipeYield":1,"unitsPerYield":10,"updatedAt":{"_seconds":1779134193,"_nanoseconds":428000000}},{"id":"KxdTPR7IvHTTphUrCqMm","category":"Ideation","mealType":"Entrée","protein":"52","calories":"480","carbs":"18","fat":"22","satFat":"","cholesterol":"","sodium":"","sugar":"","nutritionTags":[],"weeklySpecial":false,"fanFavorite":false,"hideCalories":false,"packOptions":[],"nextAvailableDate":"","owner":"omar","linkedProjectId":"","createdAt":{"_seconds":1775319485,"_nanoseconds":307000000},"availableNextWeek":false,"notes":"","published":true,"availableThisWeek":true,"sortOrder":1,"name":"beef & sausage meatballs","packMins":0,"activeMins":0,"supplies":[{"supplyId":"FDvZuV0n5gnfmmouvfmP","name":"Parchment paper","qty":1,"unit":"each","costPerUnit":0.05}],"ingredients":[{"id":"","name":"Baking Powder","qty":2,"unit":"g","costPerUnit":0,"currentStock":0,"restockThreshold":0,"libraryId":""}],"thumbURL":"","dietaryTags":["Contains Eggs","Contains Milk","Contains Wheat"],"servingSize":"","isTopSeller":false,"isFanFavorite":false,"isNewThisWeek":false,"photoFocal":{"x":50,"y":50},"menuDescription":"beef & sausage meatballs 90/10 beef. italian sausage. scratch san marzano marinara. protein penne. hand-rolled or ground depending on the week. always 53g protein.","weeklyLimitRemaining":null,"weeklyLimit":null,"menuCategory":"Entrée","instructionsHtml":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Tandoco — Polpette al Sugo</title>\n<link href=\"https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;1,9..144,300;1,9..144,400&family=Outfit:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n  :root {\n    --navy: #1B1A6B; --blue-mid: #2D2FA8; --blue-light: #4F51D4; --blue-pale: #C8C9F5;\n    --cream: #FAF8F3; --gold: #C8A96E; --gold-dark: #BA7517; --terra: #C87555;\n    --ink: #1a1a1a; --muted: #666; --border: rgba(0,0,0,0.08);\n  }\n  body { font-family: 'Outfit', sans-serif; background: var(--cream); color: var(--ink); min-height: 100vh; }\n\n  .hero { background: var(--navy); padding: 3.5rem 2rem 0; text-align: center; position: relative; overflow: hidden; }\n  .hero::before { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse 60% 50% at 20% 80%, rgba(200,117,85,0.25) 0%, transparent 70%), radial-gradient(ellipse 50% 60% at 80% 20%, rgba(200,169,110,0.2) 0%, transparent 70%); pointer-events: none; }\n  .hero-eyebrow { font-size: 11px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); margin-bottom: 1rem; position: relative; }\n  .hero-title { font-family: 'Fraunces', serif; font-size: clamp(2.6rem, 7vw, 4.5rem); font-weight: 400; color: #fff; line-height: 1.05; margin-bottom: 0.5rem; position: relative; }\n  .hero-title em { font-style: italic; color: var(--terra); }\n  .hero-sub { font-size: 14px; color: rgba(255,255,255,0.55); margin-bottom: 2.5rem; position: relative; }\n  .hero-tags { display: flex; justify-content: center; gap: 8px; flex-wrap: wrap; margin-bottom: 2.5rem; position: relative; }\n  .tag { font-size: 11px; font-weight: 500; letter-spacing: 0.06em; padding: 5px 12px; border-radius: 100px; border: 1px solid rgba(255,255,255,0.15); color: rgba(255,255,255,0.7); background: rgba(255,255,255,0.06); }\n  .hero-divider { width: 100%; height: 48px; background: var(--cream); border-radius: 48px 48px 0 0; position: relative; z-index: 1; }\n\n  .serving-picker { background: #fff; border: 2px solid var(--navy); border-radius: 16px; padding: 1.25rem 1.5rem; margin: 1.5rem 0; display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n  .serving-label { font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--navy); }\n  .serving-unit { font-size: 11px; color: var(--muted); margin-top: 3px; }\n  .serving-controls { display: flex; align-items: center; gap: 8px; }\n  .serving-btn { width: 38px; height: 38px; border-radius: 50%; border: 2px solid var(--navy); background: #fff; color: var(--navy); font-size: 20px; font-weight: 600; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.15s; line-height: 1; }\n  .serving-btn:hover { background: var(--navy); color: #fff; }\n  .serving-count { font-family: 'Fraunces', serif; font-size: 2.2rem; font-weight: 400; color: var(--navy); min-width: 52px; text-align: center; line-height: 1; }\n  .serving-presets { display: flex; gap: 6px; flex-wrap: wrap; }\n  .preset-btn { padding: 6px 14px; border-radius: 100px; border: 1.5px solid var(--border); background: #fff; font-family: 'Outfit', sans-serif; font-size: 13px; font-weight: 500; color: var(--muted); cursor: pointer; transition: all 0.15s; }\n  .preset-btn:hover, .preset-btn.active { border-color: var(--navy); color: var(--navy); background: #EEF0FF; font-weight: 600; }\n\n  .wrap { max-width: 720px; margin: 0 auto; padding: 0 1.5rem 4rem; }\n  .section-head { display: flex; align-items: center; gap: 12px; margin: 2.5rem 0 1.25rem; }\n  .section-num { width: 32px; height: 32px; border-radius: 50%; background: var(--navy); color: #fff; font-size: 13px; font-weight: 600; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n  .section-title { font-family: 'Fraunces', serif; font-size: 1.35rem; font-weight: 400; color: var(--navy); }\n  .section-sub { font-size: 12.5px; color: var(--muted); margin-left: auto; white-space: nowrap; }\n\n  .timing-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--border); border-radius: 12px; overflow: hidden; border: 1px solid var(--border); margin: 2rem 0; }\n  .timing-item { background: #fff; padding: 1rem; text-align: center; }\n  .timing-val { font-family: 'Fraunces', serif; font-size: 1.6rem; font-weight: 400; color: var(--navy); line-height: 1; margin-bottom: 4px; }\n  .timing-label { font-size: 11px; color: var(--muted); letter-spacing: 0.06em; text-transform: uppercase; }\n  .macro-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--border); border-radius: 12px; overflow: hidden; border: 1px solid var(--border); margin: 1.5rem 0; }\n  .macro-item { background: var(--navy); padding: 1rem; text-align: center; }\n  .macro-val { font-family: 'Fraunces', serif; font-size: 1.5rem; font-weight: 400; color: #fff; line-height: 1; margin-bottom: 4px; }\n  .macro-val span { font-size: 0.9rem; }\n  .macro-label { font-size: 10px; color: rgba(255,255,255,0.55); letter-spacing: 0.08em; text-transform: uppercase; }\n  .macro-item.highlight .macro-val { color: var(--gold); }\n  .sequence-bar { display: grid; grid-template-columns: repeat(5, 1fr); gap: 1px; background: var(--border); border-radius: 12px; overflow: hidden; border: 1px solid var(--border); margin: 1.5rem 0; }\n  .seq-item { background: #fff; padding: 0.85rem 0.5rem; text-align: center; }\n  .seq-num { font-family: 'Fraunces', serif; font-size: 1.1rem; color: var(--terra); line-height: 1; margin-bottom: 3px; }\n  .seq-label { font-size: 10px; color: var(--muted); letter-spacing: 0.05em; text-transform: uppercase; line-height: 1.3; }\n\n  .card { background: #fff; border-radius: 14px; border: 1px solid var(--border); overflow: hidden; margin-bottom: 1rem; }\n  .card-header { padding: 1rem 1.25rem; background: #f7f5f0; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }\n  .card-header-title { font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--navy); }\n  .card-header-note { font-size: 11.5px; color: var(--gold); font-weight: 500; }\n  .card-body { padding: 1.25rem; }\n\n  .ingredient-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }\n  .ingredient { display: flex; align-items: baseline; gap: 10px; font-size: 14px; line-height: 1.4; }\n  .ing-amount { font-weight: 600; color: var(--navy); min-width: 110px; text-align: right; flex-shrink: 0; font-size: 13px; }\n  .ing-name { color: var(--ink); }\n  .ing-note { font-size: 12px; color: var(--muted); margin-left: 4px; }\n  .ing-divider { height: 1px; background: var(--border); margin: 6px 0 6px 120px; }\n  .ing-group-label { font-size: 10.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); padding: 8px 0 4px 120px; }\n\n  .steps { display: flex; flex-direction: column; }\n  .step { display: flex; gap: 16px; padding: 1.25rem; border-bottom: 1px solid var(--border); }\n  .step:last-child { border-bottom: none; }\n  .step-left { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }\n  .step-dot { width: 28px; height: 28px; border-radius: 50%; background: var(--navy); color: #fff; font-size: 12px; font-weight: 600; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n  .step-line { width: 1.5px; flex: 1; background: var(--border); margin-top: 6px; min-height: 20px; }\n  .step-content { flex: 1; padding-top: 2px; }\n  .step-title { font-family: 'Fraunces', serif; font-size: 1rem; font-weight: 400; color: var(--navy); margin-bottom: 6px; }\n  .step-body { font-size: 14px; color: var(--ink); line-height: 1.65; }\n  .step-body strong { font-weight: 600; }\n  .step-callout { margin-top: 10px; padding: 10px 14px; background: #EEF0FF; border-radius: 8px; border-left: 3px solid var(--navy); font-size: 13px; color: var(--navy); line-height: 1.5; }\n  .step-callout.gold { background: #FFF8EC; border-left-color: var(--gold); color: #7A5C1E; }\n  .step-callout.terra { background: #FFF2EE; border-left-color: var(--terra); color: #7A3520; }\n  .step-timing { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 500; color: var(--muted); background: #f5f3ee; padding: 3px 10px; border-radius: 100px; margin-top: 8px; }\n  .step-timing svg { width: 11px; height: 11px; }\n\n  .temp-target { display: flex; align-items: center; gap: 16px; background: var(--navy); border-radius: 12px; padding: 1.25rem 1.5rem; margin: 1rem 0; color: #fff; }\n  .temp-val { font-family: 'Fraunces', serif; font-size: 2.5rem; font-weight: 400; color: var(--terra); line-height: 1; flex-shrink: 0; }\n  .temp-text { font-size: 13.5px; line-height: 1.55; color: rgba(255,255,255,0.8); }\n  .temp-text strong { color: #fff; }\n  .science-box { border: 1px solid var(--blue-pale); background: #F4F4FD; border-radius: 12px; padding: 1.25rem; margin: 1rem 0; }\n  .science-label { font-size: 10.5px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--blue-light); margin-bottom: 6px; }\n  .science-text { font-size: 13px; color: #444; line-height: 1.6; }\n  .variant-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 1rem 0; }\n  .variant-card { background: #fff; border: 1px solid var(--border); border-radius: 10px; padding: 1rem; }\n  .variant-card.featured { border-color: var(--navy); background: #F4F4FD; }\n  .variant-name { font-size: 12px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--navy); margin-bottom: 4px; }\n  .variant-note { font-size: 12.5px; color: var(--muted); line-height: 1.5; }\n  .macro-compare { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 1rem 0; }\n  .macro-compare-card { background: #fff; border: 1px solid var(--border); border-radius: 10px; padding: 1rem; }\n  .macro-compare-card.pork-free { border-color: var(--gold); background: #FFFBF2; }\n  .mcc-label { font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--navy); margin-bottom: 10px; }\n  .macro-compare-card.pork-free .mcc-label { color: var(--gold-dark); }\n  .mcc-row { display: flex; justify-content: space-between; font-size: 13px; padding: 4px 0; border-bottom: 1px solid var(--border); }\n  .mcc-row:last-child { border-bottom: none; }\n  .mcc-key { color: var(--muted); }\n  .mcc-val { font-weight: 600; color: var(--navy); }\n  .macro-compare-card.pork-free .mcc-val { color: var(--gold-dark); }\n  .storage-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 1rem 0; }\n  .storage-card { background: #fff; border: 1px solid var(--border); border-radius: 10px; padding: 1rem; text-align: center; }\n  .storage-val { font-family: 'Fraunces', serif; font-size: 1.8rem; color: var(--navy); line-height: 1; margin-bottom: 4px; }\n  .storage-label { font-size: 11px; color: var(--muted); letter-spacing: 0.06em; text-transform: uppercase; }\n  .equip-list { list-style: none; display: flex; flex-direction: column; }\n  .equip-item { display: flex; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 13.5px; line-height: 1.4; }\n  .equip-item:last-child { border-bottom: none; }\n  .equip-name { font-weight: 600; color: var(--navy); min-width: 130px; flex-shrink: 0; }\n  .equip-note { color: var(--muted); }\n  .footer-note { margin-top: 2.5rem; padding: 1.5rem; background: var(--navy); border-radius: 14px; color: rgba(255,255,255,0.75); font-size: 13px; line-height: 1.65; text-align: center; }\n  .footer-note strong { color: #fff; }\n  .tandoco-logo { font-family: 'Fraunces', serif; font-size: 1.1rem; color: var(--blue-pale); font-style: italic; font-weight: 300; display: block; margin-bottom: 8px; }\n\n  @media (max-width: 540px) {\n    .timing-bar, .sequence-bar { grid-template-columns: repeat(2, 1fr); }\n    .macro-bar, .macro-compare, .variant-grid, .storage-grid { grid-template-columns: repeat(2, 1fr); }\n    .serving-picker { flex-direction: column; align-items: flex-start; }\n    .ing-amount { min-width: 80px; }\n  }\n</style>\n</head>\n<body>\n\n<div class=\"hero\">\n  <p class=\"hero-eyebrow\">tandoco recipe guide</p>\n  <h1 class=\"hero-title\">Polpette <em>al Sugo</em></h1>\n  <p class=\"hero-sub\" id=\"hero-sub\">5 servings · italian meatballs in tomato sauce · high-protein meal prep</p>\n  <div class=\"hero-tags\">\n    <span class=\"tag\">~50g protein</span>\n    <span class=\"tag\">~700 cal</span>\n    <span class=\"tag\">barilla protein+ penne</span>\n    <span class=\"tag\">pork-free option</span>\n    <span class=\"tag\">restaurant technique</span>\n    <span class=\"tag\">one day</span>\n  </div>\n  <div class=\"hero-divider\"></div>\n</div>\n\n<div class=\"wrap\">\n\n  <!-- SERVING PICKER -->\n  <div class=\"serving-picker\">\n    <div>\n      <div class=\"serving-label\">Servings</div>\n      <div class=\"serving-unit\">all ingredients + macros update automatically</div>\n    </div>\n    <div class=\"serving-controls\">\n      <button class=\"serving-btn\" onclick=\"adjustServings(-1)\">−</button>\n      <div class=\"serving-count\" id=\"serving-display\">5</div>\n      <button class=\"serving-btn\" onclick=\"adjustServings(1)\">+</button>\n    </div>\n    <div class=\"serving-presets\">\n      <button class=\"preset-btn active\" onclick=\"setServings(5)\">5</button>\n      <button class=\"preset-btn\" onclick=\"setServings(10)\">10</button>\n      <button class=\"preset-btn\" onclick=\"setServings(15)\">15</button>\n      <button class=\"preset-btn\" onclick=\"setServings(20)\">20</button>\n    </div>\n  </div>\n\n  <!-- TIMING -->\n  <div class=\"timing-bar\">\n    <div class=\"timing-item\"><div class=\"timing-val\">20<span style=\"font-size:1rem\">m</span></div><div class=\"timing-label\">Sugo Start</div></div>\n    <div class=\"timing-item\"><div class=\"timing-val\">30<span style=\"font-size:1rem\">m</span></div><div class=\"timing-label\">Mix + Shape</div></div>\n    <div class=\"timing-item\"><div class=\"timing-val\">20<span style=\"font-size:1rem\">m</span></div><div class=\"timing-label\">Roast + Finish</div></div>\n    <div class=\"timing-item\"><div class=\"timing-val\">75<span style=\"font-size:1rem\">m</span></div><div class=\"timing-label\">Total Active</div></div>\n  </div>\n\n  <!-- MACROS -->\n  <div class=\"macro-bar\">\n    <div class=\"macro-item highlight\"><div class=\"macro-val\">~50<span>g</span></div><div class=\"macro-label\">Protein / serving</div></div>\n    <div class=\"macro-item\"><div class=\"macro-val\">~700</div><div class=\"macro-label\">Cal / serving</div></div>\n    <div class=\"macro-item\"><div class=\"macro-val\">~48<span>g</span></div><div class=\"macro-label\">Carbs / serving</div></div>\n    <div class=\"macro-item\"><div class=\"macro-val\">~30<span>g</span></div><div class=\"macro-label\">Fat / serving</div></div>\n  </div>\n  <p style=\"font-size:11.5px;color:var(--muted);text-align:center;margin-bottom:2rem;\">per serving · standard blend · 57g dry Barilla Protein+ penne · verify with final nutrition panel</p>\n\n  <!-- VERSIONS -->\n  <div class=\"section-head\"><div class=\"section-num\">→</div><h2 class=\"section-title\">Two Versions</h2></div>\n  <div class=\"variant-grid\">\n    <div class=\"variant-card featured\">\n      <div class=\"variant-name\">Standard Blend</div>\n      <div class=\"variant-note\">90/10 ground beef + sweet Italian bulk sausage. Sausage brings fat, fennel, herb complexity, and cured seasoning — all in one ingredient. Restaurant-grade depth.</div>\n    </div>\n    <div class=\"variant-card\">\n      <div class=\"variant-name\">Pork-Free</div>\n      <div class=\"variant-note\">90/10 ground beef only, seasoned aggressively with fennel seed, smoked paprika, and red pepper flakes to replicate sausage complexity. Leaner macros.</div>\n    </div>\n  </div>\n  <div class=\"macro-compare\">\n    <div class=\"macro-compare-card\">\n      <div class=\"mcc-label\">Standard Blend</div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Protein</span><span class=\"mcc-val\">~50g</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Calories</span><span class=\"mcc-val\">~700</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Fat</span><span class=\"mcc-val\">~30g</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Carbs</span><span class=\"mcc-val\">~48g</span></div>\n    </div>\n    <div class=\"macro-compare-card pork-free\">\n      <div class=\"mcc-label\">Pork-Free</div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Protein</span><span class=\"mcc-val\">~50g</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Calories</span><span class=\"mcc-val\">~665</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Fat</span><span class=\"mcc-val\">~25g</span></div>\n      <div class=\"mcc-row\"><span class=\"mcc-key\">Carbs</span><span class=\"mcc-val\">~48g</span></div>\n    </div>\n  </div>\n\n  <!-- SEQUENCE -->\n  <div class=\"section-head\"><div class=\"section-num\">→</div><h2 class=\"section-title\">Cook Day Sequence</h2></div>\n  <div class=\"sequence-bar\">\n    <div class=\"seq-item\"><div class=\"seq-num\">1</div><div class=\"seq-label\">Sweat Aromatics + Start Sugo</div></div>\n    <div class=\"seq-item\"><div class=\"seq-num\">2</div><div class=\"seq-label\">Make Panade</div></div>\n    <div class=\"seq-item\"><div class=\"seq-num\">3</div><div class=\"seq-label\">Mix + Shape + Chill</div></div>\n    <div class=\"seq-item\"><div class=\"seq-num\">4</div><div class=\"seq-label\">Roast + Pasta</div></div>\n    <div class=\"seq-item\"><div class=\"seq-num\">5</div><div class=\"seq-label\">Finish + Cool + Pack</div></div>\n  </div>\n  <div class=\"science-box\">\n    <div class=\"science-label\">Why This Order</div>\n    <div class=\"science-text\">Sweat all aromatics first in one pan — garlic and onion for both the sugo and the meatball mix simultaneously. Pull the meatball portion to cool while the rest continues into the sugo. The sugo then runs itself for 45–60 minutes while you make the panade, mix, shape, and chill the meatballs. By the time they've chilled 30 minutes the oven is hot and the sugo is ready.</div>\n  </div>\n\n  <!-- ══ SECTION 1 — INGREDIENTS ══ -->\n  <div class=\"section-head\">\n    <div class=\"section-num\">1</div>\n    <h2 class=\"section-title\">Ingredients</h2>\n    <span class=\"section-sub\" id=\"ing-section-sub\">5 servings</span>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Meat — Standard Blend</span><span class=\"card-header-note\">80% beef / 20% sausage</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"700\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">90/10 ground beef</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"175\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">sweet Italian bulk sausage, casings removed <span class=\"ing-note\">Premio recommended</span></span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Meat — Pork-Free Version</span><span class=\"card-header-note\">beef only</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"875\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">90/10 ground beef</span></li>\n        <div class=\"ing-group-label\">additional seasoning — replaces sausage complexity</div>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">fennel seed, lightly crushed</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">smoked paprika</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">red pepper flakes</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">extra Diamond Crystal kosher salt</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">The Panade</span><span class=\"card-header-note\">both versions — the moisture key</span></div>\n    <div class=\"card-body\">\n      <div class=\"science-box\" style=\"margin-bottom:1rem;\">\n        <div class=\"science-label\">Why a Panade</div>\n        <div class=\"science-text\">Gelatinized bread starch physically blocks the protein cross-linking that makes meatballs chewy. It traps moisture through the cook and through 4 days of refrigerated storage. Without it, meatballs go rubbery by day 2. Buttermilk over whole milk — the acid tenderizes and the tang survives refrigeration.</div>\n      </div>\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"slices\" data-type=\"count\"></span><span class=\"ing-name\">day-old white sandwich bread, crusts removed <span class=\"ing-note\">any generic white bread</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"6\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">buttermilk <span class=\"ing-note\">to soak the bread</span></span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Meatball Seasoning</span><span class=\"card-header-note\">both versions</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"20\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">Parmigiano Reggiano, finely grated</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"13\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">Pecorino Romano, finely grated <span class=\"ing-note\">the Italian sharpness layer</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"egg\" data-type=\"count\"></span><span class=\"ing-name\">large eggs + 1 extra yolk per 5 servings</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"cloves\" data-type=\"count\"></span><span class=\"ing-name\">garlic, sweated <span class=\"ing-note\">pulled from shared sweat — see sugo build</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"clove raw\" data-type=\"count\"></span><span class=\"ing-name\">garlic, microplaned raw <span class=\"ing-note\">added raw alongside sweated for punch</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">¼ onion per 5</span><span class=\"ing-name\">yellow onion, minced <span class=\"ing-note\">pulled from the shared sweat</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"tbsp\" data-type=\"volume\"></span><span class=\"ing-name\">flat-leaf parsley, very finely chopped <span class=\"ing-note\">mandatory — do not skip</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">dried oregano</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">garlic powder <span class=\"ing-note\">not garlic salt</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">onion powder <span class=\"ing-note\">not onion salt</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">lemon zest</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">freshly grated nutmeg</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">black pepper</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">Diamond Crystal kosher salt <span class=\"ing-note\">~1 tsp per 450g meat — test patty is your calibration</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.5\" data-unit=\"tsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">Worcestershire sauce</span></li>\n        <div class=\"ing-group-label\">pork-free only — add to wet base</div>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">fennel seed, crushed</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">smoked paprika</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">red pepper flakes</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">The Sugo</span><span class=\"card-header-note\">both versions</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">extra-virgin olive oil</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"5\" data-unit=\"cloves\" data-type=\"count\"></span><span class=\"ing-name\">garlic <span class=\"ing-note\">3 sliced for sugo · 2 whole for meatballs — sweated together, split</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"onion\" data-type=\"count\"></span><span class=\"ing-name\">yellow onion <span class=\"ing-note\">¼ for sugo · ¼ for meatballs — sweated together, split</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.5\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">double-concentrate tomato paste <span class=\"ing-note\">Mutti or Cento tube</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"cup\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">dry red wine <span class=\"ing-note\">Kirkland Chianti Classico Riserva</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"cans × 28oz\" data-type=\"count\"></span><span class=\"ing-name\">San Marzano whole peeled tomatoes <span class=\"ing-note\">Cento DOP — hand-crushed</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 piece</span><span class=\"ing-name\">Parmigiano Reggiano rind <span class=\"ing-note\">removed before serving</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"sprig\" data-type=\"count\"></span><span class=\"ing-name\">fresh basil <span class=\"ing-note\">+ torn leaves at finish</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">red pepper flakes</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">to taste</span><span class=\"ing-name\">Diamond Crystal kosher salt</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Per-Container Finish</span><span class=\"card-header-note\">packed cold · stirred in at reheat</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp each</span><span class=\"ing-name\">cold unsalted butter per container <span class=\"ing-note\">stir in off heat at reheat</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp each</span><span class=\"ing-name\">Parmigiano Reggiano, freshly grated per container</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">pinch each</span><span class=\"ing-name\">fresh basil, torn per container</span></li>\n      </ul>\n      <div class=\"step-callout gold\" style=\"margin-top:1rem;\">The master sauce is never finished with butter — the emulsion breaks on cooling. Each container gets its own finishing kit so the customer gets the technique at the right moment.</div>\n    </div>\n  </div>\n\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Pasta</span><span class=\"card-header-note\">both versions</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"285\" data-unit=\"g dry\" data-type=\"weight\"></span><span class=\"ing-name\">Barilla Protein+ penne <span class=\"ing-note\">57g per serving · 10g protein per serving</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">generous</span><span class=\"ing-name\">kosher salt <span class=\"ing-note\">pasta water should taste like the sea</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp</span><span class=\"ing-name\">olive oil <span class=\"ing-note\">tossed after draining — prevents clumping</span></span></li>\n      </ul>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 2 — SUGO ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">2</div><h2 class=\"section-title\">Build the Sugo — Start Here</h2><span class=\"section-sub\">runs while you mix</span></div>\n  <div class=\"science-box\">\n    <div class=\"science-label\">The Pincer Method — Most Important Technique in This Recipe</div>\n    <div class=\"science-text\">Standard tomato paste added directly to sauce tastes raw, sharp, and metallic. The pincer method — frying the paste flat on bare hot metal until brick red — drives off that raw flavor through caramelization and Maillard reaction. It takes 3–4 minutes and is the single biggest flavor difference between restaurant sugo and home sugo. Do not rush it or skip it.</div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">sugo</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">extra-virgin olive oil</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"5\" data-unit=\"cloves\" data-type=\"count\"></span><span class=\"ing-name\">garlic <span class=\"ing-note\">3 for sugo · 2 pulled for meatballs</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"onion\" data-type=\"count\"></span><span class=\"ing-name\">yellow onion <span class=\"ing-note\">¼ for sugo · ¼ pulled for meatballs</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.5\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">double-concentrate tomato paste</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"cup\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">dry red wine</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"cans × 28oz\" data-type=\"count\"></span><span class=\"ing-name\">San Marzano tomatoes, hand-crushed</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 piece</span><span class=\"ing-name\">Parmigiano rind</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"sprig\" data-type=\"count\"></span><span class=\"ing-name\">fresh basil + torn at finish</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">red pepper flakes</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">to taste</span><span class=\"ing-name\">kosher salt</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Sweat aromatics — split between sugo and meatballs</div>\n            <div class=\"step-body\">Heat olive oil in your stockpot over <strong>medium-low — around 250–275°F at the pan surface</strong>. The oil should look calm with no shimmer or smoke. Add <strong>all garlic cloves and diced onion</strong>. Cook gently 12–15 minutes until completely soft, translucent, and colorless — no browning at all. <strong>Never let the garlic brown.</strong> Pull out the meatball portion — 2 cloves garlic + roughly half the cooked onion — spread on a plate to cool completely. Mince finely once cooled. Remaining garlic and onion stay in the pot and continue into the sugo.</div>\n            <div class=\"step-callout terra\">⚑ Browned garlic turns bitter and cannot be corrected. If it browns, start over. Keep the heat lower than feels right.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Pincer the tomato paste — 3 to 4 minutes</div>\n            <div class=\"step-body\">Bump heat to <strong>medium — around 300–325°F at the pan surface</strong>. You need this heat for the Maillard reaction to caramelize the paste. Push garlic to the perimeter. Add <strong>tomato paste</strong> to the cleared center. Press flat with a spatula. Cook for <strong>3–4 full minutes</strong>, spreading and folding continuously until it darkens to deep brick red and smells roasted and sweet rather than sharp and raw. If it's not darkening after 2 minutes your heat is too low — nudge it up slightly. Do not rush it.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 3–4 min active</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Deglaze with red wine — reduce until almost dry</div>\n            <div class=\"step-body\">Stay on <strong>medium heat</strong>. Pour in the red wine — it will sizzle and steam immediately. You want it bubbling actively, not just steaming. Scrape up any caramelized bits from the pan bottom. Cook until almost completely evaporated — about 3 minutes. The alcohol is gone when the sharp smell softens and what remains smells deeply savory.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> ~3 min</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">4</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Add tomatoes, rind, basil — simmer 45–60 minutes</div>\n            <div class=\"step-body\">Crush tomatoes by hand into the pot — squeeze each firmly, breaking into pieces no larger than 1½ inches. Pour in all can juices. Add the <strong>Parmigiano rind</strong>, basil sprig, and red pepper flakes. Season with a generous pinch of salt. Stir together. The cold tomatoes will drop the temperature immediately — <strong>bring back to medium</strong> to get it up to a simmer, then <strong>reduce to low once bubbling gently</strong>. Target liquid temperature during the simmer is <strong>180–190°F</strong> — a lazy occasional bubble, not a rolling boil. <strong>Simmer uncovered 45–60 minutes</strong>, stirring every 8–10 minutes. The sauce will reduce, deepen in color, and sweeten noticeably. Every time you add something new going forward, bump back to medium briefly to restore temperature, then pull back to low.</div>\n            <div class=\"step-callout\">Sauce is simmering — now make the panade and meatball mix in parallel.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 45–60 min simmer at 180–190°F</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 3 — MEATBALL MIX ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">3</div><h2 class=\"section-title\">Build the Meatball Mixture</h2><span class=\"section-sub\">while sugo simmers</span></div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">meatball mixture</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"700\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">90/10 ground beef <span class=\"ing-note\">standard · or <span data-base=\"875\" data-unit=\"g\" data-type=\"weight\"></span> pork-free</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"175\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">sweet Italian bulk sausage <span class=\"ing-note\">standard only</span></span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"slices\" data-type=\"count\"></span><span class=\"ing-name\">day-old white bread, crusts removed</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"6\" data-unit=\"tbsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">buttermilk</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"cloves sweated\" data-type=\"count\"></span><span class=\"ing-name\">garlic sweated + 1 raw microplaned per 5 servings</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">¼ onion per 5</span><span class=\"ing-name\">yellow onion, minced from shared sweat</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"20\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">Parmigiano Reggiano, finely grated</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"13\" data-unit=\"g\" data-type=\"weight\"></span><span class=\"ing-name\">Pecorino Romano, finely grated</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"egg\" data-type=\"count\"></span><span class=\"ing-name\">large eggs + 1 extra yolk per 5 servings</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"tbsp\" data-type=\"volume\"></span><span class=\"ing-name\">flat-leaf parsley, very finely chopped — mandatory</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">dried oregano</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">garlic powder</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">onion powder</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">lemon zest</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.25\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">freshly grated nutmeg</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">black pepper</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.75\" data-unit=\"tsp\" data-type=\"volume\"></span><span class=\"ing-name\">Diamond Crystal kosher salt</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"1.5\" data-unit=\"tsp\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">Worcestershire sauce</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Pull the meatball aromatics from the shared sweat</div>\n            <div class=\"step-body\">The garlic and onion you pulled from the shared sweat should be completely cool by now. <strong>Mince them finely</strong> before adding to the mix. No large pieces. Set aside with your other wet base ingredients.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Make the panade</div>\n            <div class=\"step-body\">Tear bread into rough chunks. Pour buttermilk over. Let soak <strong>10 minutes</strong> until completely saturated. Squeeze the bread firmly with both hands — remove as much liquid as possible until you have a damp paste, not wet bread. Set aside.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 10 min soak</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Build the wet base</div>\n            <div class=\"step-body\">In a large bowl combine the <strong>panade, Parmigiano, Pecorino, eggs and yolk, sweated garlic and onion (minced), 1 raw microplaned garlic clove, parsley, oregano, garlic powder, onion powder, lemon zest, nutmeg, Worcestershire, pepper, and salt</strong>. For pork-free: add fennel seed, smoked paprika, and red pepper flakes here. Mix until completely uniform. Meat goes in last.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">4</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Cook a test patty — adjust salt now</div>\n            <div class=\"step-body\">Pinch off a tablespoon of the wet base. Fry in a dry pan — 1 minute per side. Taste. <strong>Adjust salt now</strong> before the meat goes in. This is your only opportunity and it costs 2 minutes. Do not skip it.</div>\n            <div class=\"step-callout gold\">Season until it tastes slightly over-salted raw — cooking dulls salt perception.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">5</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Fold in the meat — gently</div>\n            <div class=\"step-body\">Add <strong>⅓ of the meat</strong> to the wet base and fold until incorporated. Add the remaining meat and <strong>fold gently with your hands for 30–45 seconds</strong>. Stop the moment no dry spots remain. The mixture should feel loose, sticky, and soft — not springy or paste-like.</div>\n            <div class=\"step-callout terra\">⚑ Salt into the wet base, never directly onto raw meat. Salt on raw ground meat dissolves myosin immediately, producing a dense meatball before it ever hits the pan.</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 4 — SHAPE AND CHILL ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">4</div><h2 class=\"section-title\">Shape and Chill</h2><span class=\"section-sub\">30 min rest — non-negotiable</span></div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">shape + chill</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">#16 disher</span><span class=\"ing-name\">2 oz / 57g scoop — mandatory for consistency</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"pans\" data-type=\"count\"></span><span class=\"ing-name\">half-sheet pans sprayed with high-heat cooking spray</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">cold water</span><span class=\"ing-name\">for wetting hands while rolling</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Portion with a #16 disher</div>\n            <div class=\"step-body\">Use a <strong>#16 disher (2 oz / 57g)</strong> to portion every meatball identically. Scoop directly onto sprayed sheet pans. Every ball the same size means every ball cooks in the same time and every container has the same macro weight. One batch of 5 servings yields approximately 20–22 meatballs (4 per container + some spare).</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Roll with wet cold hands</div>\n            <div class=\"step-body\">Wet both hands with cold water — not oil. Roll each ball with 2–3 light rotations under gentle pressure. <strong>Do not pack tightly.</strong> Re-wet hands every 8–10 balls. Space at least 1 inch apart on the pans.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Refrigerate uncovered — 30 minutes minimum</div>\n            <div class=\"step-body\">Place sheet pans <strong>uncovered</strong> in the refrigerator for a minimum 30 minutes. This firms the surface for better browning, dries the exterior so the oven can develop a crust, and allows seasoning to equilibrate through the mix. Use this time to preheat the oven and boil pasta water.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 30 min rest</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 5 — ROAST ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">5</div><h2 class=\"section-title\">Roast the Meatballs</h2><span class=\"section-sub\">while oven preheats — cook pasta</span></div>\n  <div class=\"temp-target\">\n    <div class=\"temp-val\">425°F</div>\n    <div class=\"temp-text\"><strong>Convection setting.</strong> Equivalent to 450°F conventional. Always use convection if available — it circulates hot air for even browning across all pans simultaneously.</div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">roast</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">Chilled meatballs</span><span class=\"ing-name\">30 min rest, uncovered</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"2\" data-unit=\"wire racks\" data-type=\"count\"></span><span class=\"ing-name\">set inside sheet pans sprayed with high-heat cooking spray</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"0.5\" data-unit=\"cup\" data-type=\"volume\" data-liquid=\"true\"></span><span class=\"ing-name\">per pan — hot water or stock for deglazing fond after roasting</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Probe thermometer</span><span class=\"ing-name\">pull at 165°F internal</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Set up the pans</div>\n            <div class=\"step-body\">Spray the <strong>sheet pans</strong> with high-heat cooking spray — one quick pass, hold the can about 6 inches away. Place <strong>wire racks inside the sprayed sheet pans</strong>. The meatballs go on the wire racks — never directly on the pan. The rack elevates them so hot air circulates on all sides. The spray is just to prevent drippings from welding to the pan surface so the fond releases cleanly when you deglaze. Do not spray the racks themselves. Arrange chilled meatballs directly on the wire racks with at least 1 inch of space between each. Do not crowd.</div>\n            <div class=\"step-callout terra\">⚑ No parchment paper. Parchment creates a barrier between the drippings and the pan — nothing caramelizes, nothing sticks, and when you go to deglaze you're scraping a clean pan with nothing on it. You lose one of the biggest flavor moves in the entire recipe. The meatballs are on the wire rack so they never touch the pan — there is nothing to stick.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Roast 15–18 minutes to 165°F internal</div>\n            <div class=\"step-body\">Roast <strong>15–18 minutes</strong>, rotating pans front-to-back and swapping rack positions at the halfway mark. Pull when meatballs are deep golden brown and a probe thermometer reads <strong>165°F internal</strong> in the thickest ball on each pan. Never cook by time alone.</div>\n            <div class=\"temp-target\" style=\"margin-top:12px;\">\n              <div class=\"temp-val\">165°F</div>\n              <div class=\"temp-text\"><strong>Pull temperature.</strong> USDA safe internal temperature for ground meat. Pulling here keeps the interior moist — they continue cooking gently in the sauce.</div>\n            </div>\n            <div class=\"step-callout terra\">⚑ Verify oven temp before the first batch. Most ovens run 25–50°F cooler than the dial. A $10 oven thermometer fixes this permanently.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 15–18 min</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Transfer meatballs to sugo — then deglaze the pans</div>\n            <div class=\"step-body\">Transfer all meatballs into the simmering sugo using tongs. Remove wire racks. <strong>Pour hot water or stock onto each bare hot sheet pan.</strong> Scrape up all the dark caramelized bits with a spatula. Strain that liquid directly into the sugo. This fond is concentrated Maillard flavor. Do not throw it away.</div>\n            <div class=\"step-callout gold\">The sugo will visibly deepen in color when the fond goes in — one of the highest-impact moves in the entire recipe.</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 6 — PASTA ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">6</div><h2 class=\"section-title\">Cook the Pasta</h2><span class=\"section-sub\">while meatballs chill and oven preheats</span></div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">pasta</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"285\" data-unit=\"g dry\" data-type=\"weight\"></span><span class=\"ing-name\">Barilla Protein+ penne</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">generous</span><span class=\"ing-name\">kosher salt for pasta water</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp</span><span class=\"ing-name\">olive oil tossed after draining</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Salt the water aggressively</div>\n            <div class=\"step-body\">Bring a large pot (8-quart minimum) to a full rolling boil. Add a <strong>generous handful of kosher salt</strong> — it should taste like the sea. This is the only opportunity to season the pasta from the inside.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Pull 30 seconds under package time</div>\n            <div class=\"step-body\">Add penne and stir immediately. Cook stirring occasionally. <strong>Pull 30 seconds before the package minimum</strong> — it continues cooking when drained and again when reheated. Reserve <strong>1 cup pasta cooking water</strong> before draining.</div>\n            <div class=\"step-callout terra\">⚑ Do not rinse the pasta. Rinsing strips the surface starch that helps sugo cling inside every tube. Drain and move immediately.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">3</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Toss with olive oil — set aside to cool</div>\n            <div class=\"step-body\">Drain and immediately toss with <strong>1 tsp olive oil</strong>. Spread in a shallow container to cool separately from the sauce and meatballs.</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 7 — FINISH IN SAUCE ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">7</div><h2 class=\"section-title\">Finish in the Sauce</h2><span class=\"section-sub\">the dish becomes polpette al sugo here</span></div>\n  <div class=\"science-box\">\n    <div class=\"science-label\">Why This Step Makes the Dish</div>\n    <div class=\"science-text\">Meatballs roasted and eaten immediately taste good. Meatballs simmered 15–20 minutes in sugo taste like something completely different. The meatball juices bleed into the sauce, the sauce penetrates the meatball interior, and both become one thing. This is the core technique of polpette al sugo. It cannot be skipped or rushed.</div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">finish in sauce</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">All meatballs</span><span class=\"ing-name\">transferred from oven into the simmering sugo</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Fond liquid</span><span class=\"ing-name\">deglazed from sheet pans, strained into sugo</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Fresh basil</span><span class=\"ing-name\">torn in off heat at finish</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Reserved pasta water</span><span class=\"ing-name\">to loosen sauce if needed</span></li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Simmer together 15–20 minutes at 180–190°F</div>\n            <div class=\"step-body\">Meatballs are already in the sugo. Maintain a <strong>gentle simmer — 180–190°F</strong>, a lazy bubble not a rolling boil. A rolling boil breaks the meatballs. Simmer uncovered for <strong>15–20 minutes</strong>, shaking the pot gently every 5 minutes rather than stirring.</div>\n            <div class=\"step-timing\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg> 15–20 min</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Finish off heat</div>\n            <div class=\"step-body\">Remove from heat. Pull out and discard the Parmigiano rind and basil sprig. Tear in fresh basil leaves. Taste and adjust salt. If sauce is too thick, loosen with a splash of reserved pasta water. Sauce should coat a spoon but flow slowly.</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 8 — COOL AND PACK ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">8</div><h2 class=\"section-title\">Cool and Pack</h2><span class=\"section-sub\">never pack hot</span></div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">You'll Need</span><span class=\"card-header-note\">cool + pack</span></div>\n    <div class=\"card-body\" style=\"padding-bottom:0.75rem;\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\" data-base=\"5\" data-unit=\"containers\" data-type=\"count\"></span><span class=\"ing-name\">sealed meal prep containers — CPET preferred</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">~113g cooked</span><span class=\"ing-name\">penne per container (57g dry × ~2)</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">3 meatballs</span><span class=\"ing-name\">per container</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">4oz sauce</span><span class=\"ing-name\">per container + small drizzle over tops</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">1 tsp each</span><span class=\"ing-name\">cold butter + grated Parmigiano + torn basil per container</span></li>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Ice bath</span><span class=\"ing-name\">large bowl or sink with ice water for rapid sauce cooling</span></li>\n      </ul>\n    </div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">FDA Cooling Protocol</span><span class=\"card-header-note\">Minnesota Department of Health standard</span></div>\n    <div class=\"card-body\">\n      <p style=\"font-size:13.5px;line-height:1.65;color:var(--ink);margin-bottom:1rem;\">Food must cool from <strong>135°F → 70°F within 2 hours</strong>, then <strong>70°F → 41°F within 4 more hours</strong>. Log start temp, 2-hour checkpoint, and final temp for every batch.</p>\n      <div class=\"steps\">\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">1</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Cool components separately</div>\n            <div class=\"step-body\"><strong>Sauce:</strong> Shallow container in an ice-water bath, stirred every 10 minutes. <strong>Meatballs:</strong> Spread single layer uncovered on sheet pans in the refrigerator. <strong>Pasta:</strong> Already cooling in its shallow container. All three reach 41°F faster separated than combined.</div>\n          </div>\n        </div>\n        <div class=\"step\">\n          <div class=\"step-left\"><div class=\"step-dot\">2</div><div class=\"step-line\"></div></div>\n          <div class=\"step-content\">\n            <div class=\"step-title\">Cold-portion when everything is at 41°F</div>\n            <div class=\"step-body\">Work cold. Use a kitchen scale. <strong>~113g cooked penne</strong> per container. <strong>4oz sauce</strong> over the pasta. <strong>3 meatballs</strong> nested <strong>60–70% submerged</strong>. Drizzle a small additional spoon of sauce over the tops. Add butter coin, fresh basil, grated Parmigiano. Seal. Label.</div>\n            <div class=\"step-callout gold\">60–70% submerged is the target. Fully buried looks like soup. Fully exposed dries out by day 3. Partially submerged is the professional standard.</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Container Label Requirements</span><span class=\"card-header-note\">every container</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\"><span class=\"ing-amount\">Prep date</span><span class=\"ing-name\">Date the batch was cooked</span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Best by</span><span class=\"ing-name\">Prep date + 4 days</span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Allergens</span><span class=\"ing-name\">Wheat (pasta), Milk (butter, cheese), Eggs — standard blend also contains Pork</span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\"><span class=\"ing-amount\">Lot code</span><span class=\"ing-name\">Batch identifier for traceability</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 9 — STORAGE ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">9</div><h2 class=\"section-title\">Storage &amp; Reheating</h2></div>\n  <div class=\"storage-grid\">\n    <div class=\"storage-card\"><div class=\"storage-val\">4 days</div><div class=\"storage-label\">Refrigerated (sealed)</div></div>\n    <div class=\"storage-card\"><div class=\"storage-val\">3 mo</div><div class=\"storage-label\">Sauce + meatballs frozen separately</div></div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-header\"><span class=\"card-header-title\">Reheating Instructions</span><span class=\"card-header-note\">for container card</span></div>\n    <div class=\"card-body\">\n      <ul class=\"ingredient-list\">\n        <li class=\"ingredient\" style=\"align-items:flex-start;\"><span class=\"ing-amount\" style=\"padding-top:2px;\">Stovetop</span><span class=\"ing-name\">Transfer to a small saucepan. Add 2 tbsp water. Cover and heat over medium-low, stirring gently, until hot — 8–10 minutes. Remove from heat. Stir in the butter coin. Eat immediately.</span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\" style=\"align-items:flex-start;\"><span class=\"ing-amount\" style=\"padding-top:2px;\">Microwave</span><span class=\"ing-name\">Remove lid. Add 2 tbsp water over the pasta. Cover loosely with a damp paper towel. 70% power 90 seconds. Stir gently. 60–90 more seconds. Rest 1 minute. Stir in the butter coin. Eat immediately.</span></li>\n        <div class=\"ing-divider\"></div>\n        <li class=\"ingredient\" style=\"align-items:flex-start;\"><span class=\"ing-amount\" style=\"padding-top:2px;\">Note</span><span class=\"ing-name\">The 2 tbsp water is not optional. It replaces moisture lost during refrigeration and prevents pasta from drying out. Do not skip it.</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <!-- ══ SECTION 10 — EQUIPMENT ══ -->\n  <div class=\"section-head\"><div class=\"section-num\">10</div><h2 class=\"section-title\">Non-Negotiable Equipment</h2></div>\n  <div class=\"card\">\n    <div class=\"card-body\">\n      <ul class=\"equip-list\">\n        <li class=\"equip-item\"><span class=\"equip-name\">Kitchen scale</span><span class=\"equip-note\">For meat weight, pasta portioning (113g cooked), and container fill weight. Every batch. No exceptions.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">#16 disher</span><span class=\"equip-note\">2 oz / 57g scoop. The only way to guarantee consistent meatball size, cooking time, and macro weight per container.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Probe thermometer</span><span class=\"equip-note\">ThermoWorks Thermapen recommended. Pull meatballs at 165°F internal. Never cook by time alone.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Oven thermometer</span><span class=\"equip-note\">Most ovens run 25–50°F cooler than the dial. A $10 thermometer hung on the rack tells you your actual temperature. Document the offset every cook day.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Dutch oven or rondeau</span><span class=\"equip-note\">Heavy-gauge, non-reactive (stainless or enamel). Wide surface area for the pincer method and even heat through a 60-minute simmer without scorching.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Half-sheet pans + wire racks</span><span class=\"equip-note\">13×18\" pans, no parchment. Spray with high-heat cooking spray. Bare metal allows drippings to caramelize for the fond deglaze. Wire racks keep meatballs lifted for airflow on all sides.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">High-heat cooking spray</span><span class=\"equip-note\">PAM original or equivalent. Not olive oil spray — it smokes at 425°F. One quick pass over each sheet pan before the rack goes in.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Large pasta pot</span><span class=\"equip-note\">8-quart minimum. Barilla Protein+ penne needs volume to cook evenly. Cramped water produces gummy pasta.</span></li>\n        <li class=\"equip-item\"><span class=\"equip-name\">Ice bath setup</span><span class=\"equip-note\">Large bowl or sink with ice water for rapid sauce cooling. Required for FDA two-stage cooling compliance.</span></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"footer-note\">\n    <span class=\"tandoco-logo\">tandoco.</span>\n    <strong>eat well. feel good.</strong><br>\n    your cravings are valid. your body is a temple.\n  </div>\n\n</div>\n\n<script>\nconst BASE = 5;\nlet servings = 5;\n\nconst FRACS = [[1/8,'⅛'],[1/4,'¼'],[1/3,'⅓'],[3/8,'⅜'],[1/2,'½'],[5/8,'⅝'],[2/3,'⅔'],[3/4,'¾'],[7/8,'⅞']];\n\nfunction fmtFrac(n) {\n  const w = Math.floor(n), r = n - w;\n  let fs = '';\n  if (r > 0.05) {\n    let best = '', bd = 1;\n    for (const [v,s] of FRACS) { const d=Math.abs(r-v); if(d<bd){bd=d;best=s;} }\n    fs = bd < 0.09 ? best : r.toFixed(1);\n  }\n  if (w === 0) return fs || '0';\n  return fs ? `${w}${fs}` : `${w}`;\n}\n\nfunction fmtWeight(g) {\n  if (g >= 1000) { const k=g/1000; return (k%1===0?k:k.toFixed(1))+'kg'; }\n  return Math.round(g)+'g';\n}\n\nfunction fmtVol(val, unit, isLiquid) {\n  if (isLiquid) {\n    // Convert to ml\n    let ml;\n    if (unit === 'tsp')  ml = val * 4.93;\n    else if (unit === 'tbsp') ml = val * 14.79;\n    else if (unit === 'cup')  ml = val * 236.6;\n    else ml = val * 4.93;\n    if (ml < 5) return (Math.round(ml * 2) / 2) + 'ml';\n    return (Math.round(ml / 5) * 5) + 'ml';\n  }\n  // Dry spices — keep tsp/tbsp\n  let tsp = unit==='tbsp' ? val*3 : unit==='cup' ? val*48 : val;\n  if (tsp >= 3) return fmtFrac(Math.round(tsp/3*8)/8) + ' tbsp';\n  return fmtFrac(Math.round(tsp*8)/8) + ' tsp';\n}\n\nfunction fmtCount(val, unit) {\n  const r = Math.round(val*2)/2;\n  return fmtFrac(r)+' '+unit;\n}\n\nfunction render() {\n  const m = servings / BASE;\n  document.getElementById('serving-display').textContent = servings;\n  document.getElementById('hero-sub').textContent = `${servings} servings · italian meatballs in tomato sauce · high-protein meal prep`;\n  document.getElementById('ing-section-sub').textContent = `${servings} servings`;\n\n  document.querySelectorAll('.preset-btn').forEach(b => {\n    b.classList.toggle('active', parseInt(b.textContent) === servings);\n  });\n\n  document.querySelectorAll('[data-base]').forEach(el => {\n    const base = parseFloat(el.dataset.base);\n    const unit = el.dataset.unit;\n    const type = el.dataset.type;\n    const scaled = base * m;\n\n    if (type === 'weight') {\n      el.textContent = unit === 'g dry' ? fmtWeight(scaled)+' dry' : fmtWeight(scaled);\n    } else if (type === 'volume') {\n      const isLiquid = el.dataset.liquid === 'true';\n      el.textContent = fmtVol(scaled, unit, isLiquid);\n    } else if (type === 'count') {\n      el.textContent = fmtCount(scaled, unit);\n    }\n  });\n}\n\nfunction adjustServings(d) {\n  const n = servings + d;\n  if (n >= 1 && n <= 50) { servings = n; render(); }\n}\n\nfunction setServings(n) { servings = n; render(); }\n\nrender();\n</script>\n</body>\n</html>","substitutions":[],"unitName":"","pairsWith":[],"storage":"keep refrigerated. best within 4 days. to freeze — remove meatballs and sauce from container and freeze separately for up to 3 months. do not freeze assembled.","menuIngredients":"90/10 ground beef, sweet Italian pork sausage, Barilla Protein+ penne (chickpea, yellow pea), San Marzano whole peeled tomatoes, white bread, buttermilk, Parmigiano Reggiano, Pecorino Romano, eggs, yellow onion, garlic, flat-leaf parsley, extra-virgin olive oil, dry red wine, tomato paste, unsalted butter, kosher salt, black pepper, dried oregano, garlic powder, onion powder, lemon zest, nutmeg, red pepper flakes, Worcestershire sauce","heating":"stovetop: transfer to a small saucepan, add 2 tbsp water, cover and heat over medium-low 8–10 minutes. stir in the butter coin at the end.\n\nmicrowave: add 2 tbsp water, cover loosely with a damp paper towel, 70% power 90 seconds, stir, 60 more seconds. rest 1 minute. stir in the butter coin.","qtyPicker":"auto","_validation":{"ok":true,"errors":[],"warnings":[{"field":"stripeTaxCode","code":"tax_code_unset","msg":"No Stripe tax code set — Stripe Tax will use its default."}],"lastValidatedAt":{"_seconds":1777753483,"_nanoseconds":590000000}},"photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKxdTPR7IvHTTphUrCqMm%2F1778110576209_Gemini_Generated_Image_tjxeq9tjxeq9tjxe.png?alt=media&token=7c384749-e4a0-4d72-bdfa-e5a6ec29e6d7"],"createdByName":"Omar Yusuf","menuPrice":"11.50","fiber":"7.5","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"isChefPick":true,"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FKxdTPR7IvHTTphUrCqMm%2F1778907746144-Gemini_Generated_Image_z4nv5xz4nv5xz4nv.png?alt=media&token=f225a99b-504d-494d-9d82-54e3a25f69d2","updatedAt":{"_seconds":1778907748,"_nanoseconds":307000000}},{"id":"LyXHpBhh3guXibmPbuTx","servings":1,"macros":{"calories":0,"protein":18,"carbs":0,"fat":0,"fiber":0},"feedback":[],"createdAt":{"_seconds":1774392079,"_nanoseconds":806000000},"description":"High protein gooey cinnamon rolls","servingSize":"1 roll","status":"approved","instructions":"I. Ingredients\nDough:\n• Whole Milk (110°F): 1.25 cups\n• Active Dry Yeast: 7g (1 packet)\n• Granulated Sugar: 1/2 cup + 2 tbsp\n• Melted Butter: 1/2 cup\n• Eggs: 2 large (room temp)\n• Vanilla Extract: 2 tsp\n• Salt: 1 tsp\n• Nutmeg: 1/2 tsp\n• Bread Flour: 3 cups\n• Casein Protein: 1.5 cups\nFilling (Paste Method):\n• Butter: 1 cup\n• Brown Sugar: 2 cups\n• Cinnamon: 4 tbsp\n• AP Flour: 1.5 tbsp\nPour-Over:\n• Heavy Cream: 1/2 cup\n• Casein: 1 tbsp\n• Vanilla: 1/2 tsp\n• Sugar: 1 tsp\nFrosting:\n• Cream Cheese: 6 oz\n• Butter: 1/4 cup\n• Casein: 1/2 scoop\n• Powdered Sugar: 1.5 cups\n• Vanilla: 2 tsp\n• Pinch Salt\nII. Step-by-Step Instructions\n1. Bloom yeast in warm milk + 1 tbsp sugar for 10 minutes until foamy.\n2. Mix in remaining sugar, butter, eggs, vanilla, salt, nutmeg.\n3. Add flour + casein and knead 5–7 minutes.\n4. Stop when smooth. Do not over-knead.\n5. Let dough rise 90 minutes covered.\n6. Mix filling into spreadable paste.\n7. Roll dough to 24x15 inches.\n8. Spread filling edge-to-edge.\n9. Roll tightly from long side.\n10. Cut into 12 rolls (~2 inches).\n11. Place in pan and rise 30 minutes.\n12. Add cream pour-over.\n13. Bake at 350°F for 22–26 minutes.\n14. Frost half while hot, rest after 10 minutes.\nIII. Key Technique Tips\n• Do not over-knead (casein changes gluten behavior)\n• Tight roll = better structure\n• Paste filling prevents leaks\n• Do not overbake (protein dries fast)\n• Double frosting creates premium texture","carbs":"","linkedProjectId":"","fat":"","category":"Approved","protein":"18","published":true,"nextAvailableDate":"2026-04-05","sodium":"","fiber":"","cholesterol":"","satFat":"","nutritionTags":[],"menuIngredients":"","availableThisWeek":true,"sugar":"","mealType":"Bakery","menuCategory":"Bakery","weeklySpecial":false,"hideCalories":true,"fanFavorite":true,"notes":"","menuDescription":"this is the one that started it all. gooey, rich, and packed with protein — our cinnamon rolls are proof that eating clean doesn't mean giving up the things you love. tommy built this recipe from scratch because he refused to choose between progress and flavor. real ingredients. real macros. zero guilt","servingsPerBatch":12,"skuBase":"TDC-0016","sellQty":1,"owner":"tommy","instructionsHtml":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>protein cinnamon rolls — tandoco</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,400;0,600;0,700;0,800;0,900;1,700&family=Inter:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">\n<style>\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n  --navy:    #1B1A6B;\n  --navy-dk: #12114A;\n  --navy-lt: #2D2FA8;\n  --gold:    #C8A96E;\n  --gold-lt: #E8C87A;\n  --cream:   #FAF8F3;\n  --sand:    #EDE8DC;\n  --muted:   #6B6B7B;\n  --border:  #E0DBCF;\n  --text:    #1A1A2E;\n  --bakery:  #be185d;\n}\n\nhtml { font-size: 16px; scroll-behavior: smooth; }\n\nbody {\n  font-family: 'Inter', sans-serif;\n  background: var(--cream);\n  color: var(--text);\n  -webkit-font-smoothing: antialiased;\n}\n\n/* ── TOP BAR ── */\n.topbar {\n  height: 4px;\n  background: linear-gradient(90deg, var(--navy) 0%, var(--navy-lt) 55%, var(--gold) 100%);\n}\n\n/* ── NAV ── */\nnav {\n  background: var(--cream);\n  border-bottom: 1px solid var(--border);\n  padding: 0 40px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  height: 56px;\n  position: sticky;\n  top: 0;\n  z-index: 100;\n}\n\n.nav-wordmark {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 20px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.04em;\n  text-decoration: none;\n}\n\n.nav-links {\n  display: flex;\n  gap: 28px;\n  list-style: none;\n}\n\n.nav-links a {\n  font-size: 13px;\n  font-weight: 500;\n  color: var(--muted);\n  text-decoration: none;\n  transition: color .15s;\n}\n\n.nav-links a:hover { color: var(--navy); }\n\n.nav-badge {\n  background: var(--bakery);\n  color: #fff;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: .06em;\n  text-transform: uppercase;\n  padding: 4px 10px;\n  border-radius: 99px;\n}\n\n/* ── HERO ── */\n.hero {\n  background: var(--navy);\n  padding: 72px 40px 60px;\n  position: relative;\n  overflow: hidden;\n}\n\n.hero-orb {\n  position: absolute;\n  border-radius: 50%;\n  pointer-events: none;\n}\n\n.hero-orb-1 {\n  width: 600px; height: 600px;\n  background: radial-gradient(circle, rgba(200,169,110,.07) 0%, transparent 70%);\n  top: -200px; right: -100px;\n}\n\n.hero-orb-2 {\n  width: 400px; height: 400px;\n  background: radial-gradient(circle, rgba(45,47,168,.3) 0%, transparent 70%);\n  bottom: -150px; left: -80px;\n}\n\n.hero-inner {\n  max-width: 800px;\n  margin: 0 auto;\n  position: relative;\n}\n\n.hero-eyebrow {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 20px;\n}\n\n.hero-badge {\n  background: var(--bakery);\n  color: #fff;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: .1em;\n  text-transform: uppercase;\n  padding: 5px 12px;\n  border-radius: 99px;\n}\n\n.hero-category {\n  font-size: 12px;\n  font-weight: 500;\n  color: rgba(255,255,255,.4);\n  letter-spacing: .06em;\n}\n\n.hero-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: clamp(42px, 7vw, 72px);\n  font-weight: 900;\n  color: #fff;\n  letter-spacing: -.04em;\n  line-height: .95;\n  margin-bottom: 20px;\n}\n\n.hero-title span { color: var(--gold); }\n\n.hero-sub {\n  font-size: 15px;\n  color: rgba(255,255,255,.55);\n  line-height: 1.65;\n  max-width: 480px;\n  margin-bottom: 32px;\n}\n\n.hero-stats {\n  display: flex;\n  gap: 0;\n  border: 1px solid rgba(255,255,255,.1);\n  border-radius: 12px;\n  overflow: hidden;\n  width: fit-content;\n}\n\n.hero-stat {\n  padding: 14px 24px;\n  border-right: 1px solid rgba(255,255,255,.1);\n  display: flex;\n  flex-direction: column;\n  gap: 3px;\n}\n\n.hero-stat:last-child { border-right: none; }\n\n.hero-stat-val {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 20px;\n  font-weight: 900;\n  color: var(--gold);\n  letter-spacing: -.03em;\n}\n\n.hero-stat-label {\n  font-size: 10px;\n  font-weight: 600;\n  text-transform: uppercase;\n  letter-spacing: .08em;\n  color: rgba(255,255,255,.35);\n}\n\n/* ── ALERT BOX ── */\n.alert-wrap {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 0 40px;\n}\n\n.alert {\n  margin: 32px 0 0;\n  background: #FFF8EC;\n  border: 1px solid #F0D49A;\n  border-left: 4px solid var(--gold);\n  border-radius: 10px;\n  padding: 16px 20px;\n}\n\n.alert-title {\n  font-size: 11px;\n  font-weight: 700;\n  letter-spacing: .08em;\n  text-transform: uppercase;\n  color: #92650A;\n  margin-bottom: 6px;\n}\n\n.alert-text {\n  font-size: 13px;\n  color: #5C4007;\n  line-height: 1.6;\n}\n\n/* ── MAIN LAYOUT ── */\n.main {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 48px 40px 80px;\n  display: grid;\n  grid-template-columns: 1fr 280px;\n  gap: 48px;\n  align-items: start;\n}\n\n/* ── SECTION LABEL ── */\n.section-label {\n  font-size: 10px;\n  font-weight: 700;\n  letter-spacing: .12em;\n  text-transform: uppercase;\n  color: var(--gold);\n  margin-bottom: 14px;\n}\n\n/* ── INGREDIENT GROUPS ── */\n.ingredient-group {\n  margin-bottom: 28px;\n}\n\n.ingredient-group-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.01em;\n  padding-bottom: 10px;\n  border-bottom: 1px solid var(--border);\n  margin-bottom: 12px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.group-dot {\n  width: 6px; height: 6px;\n  border-radius: 50%;\n  background: var(--gold);\n  flex-shrink: 0;\n}\n\n.ingredient-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n  padding: 7px 0;\n  border-bottom: 1px solid rgba(0,0,0,.04);\n  gap: 12px;\n}\n\n.ingredient-item:last-child { border-bottom: none; }\n\n.ing-name {\n  font-size: 14px;\n  color: var(--text);\n  font-weight: 400;\n}\n\n.ing-amount {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 700;\n  color: var(--navy);\n  white-space: nowrap;\n  flex-shrink: 0;\n}\n\n/* ── STEPS ── */\n.steps { list-style: none; }\n\n.step {\n  display: flex;\n  gap: 20px;\n  margin-bottom: 28px;\n  position: relative;\n}\n\n.step::before {\n  content: '';\n  position: absolute;\n  left: 19px;\n  top: 42px;\n  bottom: -28px;\n  width: 1px;\n  background: var(--border);\n}\n\n.step:last-child::before { display: none; }\n\n.step-num-wrap {\n  flex-shrink: 0;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.step-num {\n  width: 38px; height: 38px;\n  border-radius: 50%;\n  background: var(--navy);\n  color: #fff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 900;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  letter-spacing: -.02em;\n}\n\n.step.highlighted .step-num {\n  background: var(--gold);\n  color: var(--navy-dk);\n}\n\n.step-body { flex: 1; padding-top: 6px; }\n\n.step-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 15px;\n  font-weight: 800;\n  color: var(--navy);\n  letter-spacing: -.02em;\n  margin-bottom: 6px;\n}\n\n.step-text {\n  font-size: 14px;\n  color: var(--muted);\n  line-height: 1.65;\n}\n\n.step-text strong {\n  color: var(--navy);\n  font-weight: 600;\n}\n\n.step-timer {\n  display: inline-flex;\n  align-items: center;\n  gap: 5px;\n  background: rgba(27,26,107,.06);\n  border-radius: 6px;\n  padding: 4px 10px;\n  font-size: 11px;\n  font-weight: 600;\n  color: var(--navy);\n  margin-top: 8px;\n}\n\n.timer-dot {\n  width: 6px; height: 6px;\n  border-radius: 50%;\n  background: var(--navy-lt);\n}\n\n/* ── SIDEBAR ── */\n.sidebar { position: sticky; top: 72px; }\n\n.sidebar-card {\n  background: #fff;\n  border: 1px solid var(--border);\n  border-radius: 16px;\n  overflow: hidden;\n  margin-bottom: 16px;\n}\n\n.sidebar-card-header {\n  background: var(--navy);\n  padding: 16px 20px;\n}\n\n.sidebar-card-title {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 800;\n  color: #fff;\n  letter-spacing: -.01em;\n}\n\n.sidebar-card-body { padding: 16px 20px; }\n\n.tip-item {\n  display: flex;\n  gap: 10px;\n  padding: 8px 0;\n  border-bottom: 1px solid rgba(0,0,0,.05);\n  align-items: flex-start;\n}\n\n.tip-item:last-child { border-bottom: none; }\n\n.tip-icon {\n  width: 20px; height: 20px;\n  border-radius: 5px;\n  background: rgba(200,169,110,.15);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  font-size: 11px;\n  margin-top: 1px;\n}\n\n.tip-text {\n  font-size: 12px;\n  color: var(--muted);\n  line-height: 1.55;\n}\n\n.tip-text strong { color: var(--navy); font-weight: 600; }\n\n.fix-item {\n  display: flex;\n  gap: 10px;\n  padding: 7px 0;\n  border-bottom: 1px solid rgba(0,0,0,.05);\n  align-items: flex-start;\n}\n\n.fix-item:last-child { border-bottom: none; }\n\n.fix-check {\n  width: 16px; height: 16px;\n  border-radius: 4px;\n  background: #F0FDF4;\n  border: 1px solid #86EFAC;\n  color: #16A34A;\n  font-size: 9px;\n  font-weight: 900;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  margin-top: 1px;\n}\n\n.fix-text {\n  font-size: 12px;\n  color: #166534;\n  line-height: 1.5;\n}\n\n.order-cta {\n  background: linear-gradient(135deg, var(--gold), var(--gold-lt));\n  border-radius: 12px;\n  padding: 20px;\n  text-align: center;\n}\n\n.order-cta-headline {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 900;\n  color: var(--navy-dk);\n  letter-spacing: -.02em;\n  margin-bottom: 6px;\n}\n\n.order-cta-sub {\n  font-size: 11px;\n  color: rgba(27,26,107,.65);\n  line-height: 1.5;\n  margin-bottom: 14px;\n}\n\n.order-btn {\n  display: block;\n  background: var(--navy);\n  color: #fff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 13px;\n  font-weight: 800;\n  padding: 11px 0;\n  border-radius: 8px;\n  text-decoration: none;\n  letter-spacing: -.01em;\n  transition: background .15s;\n}\n\n.order-btn:hover { background: var(--navy-lt); }\n\n/* ── FOOTER ── */\nfooter {\n  border-top: 1px solid var(--border);\n  padding: 28px 40px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.footer-brand {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 16px;\n  font-weight: 900;\n  color: var(--navy);\n  letter-spacing: -.04em;\n}\n\n.footer-meta {\n  font-size: 12px;\n  color: var(--muted);\n}\n\n/* ── ANIMATIONS ── */\n@keyframes fadeUp {\n  from { opacity: 0; transform: translateY(16px); }\n  to   { opacity: 1; transform: translateY(0); }\n}\n\n.hero-inner > * {\n  animation: fadeUp .5s ease both;\n}\n\n.hero-eyebrow { animation-delay: .05s; }\n.hero-title   { animation-delay: .12s; }\n.hero-sub     { animation-delay: .18s; }\n.hero-stats   { animation-delay: .24s; }\n\n@media (max-width: 700px) {\n  .main { grid-template-columns: 1fr; padding: 32px 20px 60px; }\n  .sidebar { position: static; }\n  .hero { padding: 48px 20px 40px; }\n  nav { padding: 0 20px; }\n  .nav-links { display: none; }\n  .alert-wrap { padding: 0 20px; }\n  footer { padding: 20px; flex-direction: column; gap: 8px; text-align: center; }\n}\n</style>\n</head>\n<body>\n\n<div class=\"topbar\"></div>\n\n<nav>\n  <a class=\"nav-wordmark\" href=\"https://tandoco.com\">tandoco</a>\n  <ul class=\"nav-links\">\n    <li><a href=\"https://tandoco.com\">home</a></li>\n    <li><a href=\"https://tandoco.com/store\">menu</a></li>\n    <li><a href=\"https://tandoco.com/blog\">blog</a></li>\n    <li><a href=\"https://tandoco.com/about\">about</a></li>\n  </ul>\n  <span class=\"nav-badge\">bakery</span>\n</nav>\n\n<div class=\"hero\">\n  <div class=\"hero-orb hero-orb-1\"></div>\n  <div class=\"hero-orb hero-orb-2\"></div>\n  <div class=\"hero-inner\">\n    <div class=\"hero-eyebrow\">\n      <span class=\"hero-badge\">protein bakery</span>\n      <span class=\"hero-category\">tandoco · minneapolis</span>\n    </div>\n    <h1 class=\"hero-title\">protein<br><span>cinnamon rolls.</span></h1>\n    <p class=\"hero-sub\">real ingredients, made from scratch. high-protein dough, no fillers, no shortcuts. this is the roll we wished existed.</p>\n    <div class=\"hero-stats\">\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">12</div>\n        <div class=\"hero-stat-label\">rolls</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">350°</div>\n        <div class=\"hero-stat-label\">temp</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">~3 hrs</div>\n        <div class=\"hero-stat-label\">total time</div>\n      </div>\n      <div class=\"hero-stat\">\n        <div class=\"hero-stat-val\">casein</div>\n        <div class=\"hero-stat-label\">protein source</div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"alert-wrap\">\n  <div class=\"alert\">\n    <div class=\"alert-title\">recipe update — sogginess fix applied</div>\n    <div class=\"alert-text\">filling cut in half from the original. pour-over reduced to ¼ cup. additional technique notes added throughout to address moisture pooling. if you made these before, this version is the one.</div>\n  </div>\n</div>\n\n<div class=\"main\">\n\n  <!-- LEFT: STEPS + INGREDIENTS -->\n  <div>\n\n    <!-- INGREDIENTS -->\n    <div class=\"section-label\">ingredients</div>\n\n    <div class=\"ingredient-group\">\n      <div class=\"ingredient-group-title\"><span class=\"group-dot\"></span>dough</div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">whole milk (110°F)</span><span class=\"ing-amount\">1¼ cups</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">active dry yeast</span><span class=\"ing-amount\">7g (1 packet)</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">granulated sugar</span><span class=\"ing-amount\">½ cup + 2 tbsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">melted butter</span><span class=\"ing-amount\">½ cup</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">eggs, room temp</span><span class=\"ing-amount\">2 large</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">vanilla extract</span><span class=\"ing-amount\">2 tsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">salt</span><span class=\"ing-amount\">1 tsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">nutmeg</span><span class=\"ing-amount\">½ tsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">bread flour</span><span class=\"ing-amount\">3 cups</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">casein protein</span><span class=\"ing-amount\">1½ cups</span></div>\n    </div>\n\n    <div class=\"ingredient-group\">\n      <div class=\"ingredient-group-title\"><span class=\"group-dot\"></span>filling <span style=\"font-size:11px;font-weight:500;color:var(--bakery);background:rgba(190,24,93,.08);padding:2px 8px;border-radius:99px;letter-spacing:.04em;\">½ original</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">butter</span><span class=\"ing-amount\">½ cup</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">brown sugar</span><span class=\"ing-amount\">1 cup</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">cinnamon</span><span class=\"ing-amount\">2 tbsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">AP flour (binder)</span><span class=\"ing-amount\">¾ tbsp</span></div>\n    </div>\n\n    <div class=\"ingredient-group\">\n      <div class=\"ingredient-group-title\"><span class=\"group-dot\"></span>pour-over</div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">heavy cream</span><span class=\"ing-amount\">¼ cup</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">casein</span><span class=\"ing-amount\">½ tbsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">vanilla</span><span class=\"ing-amount\">¼ tsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">sugar</span><span class=\"ing-amount\">½ tsp</span></div>\n    </div>\n\n    <div class=\"ingredient-group\">\n      <div class=\"ingredient-group-title\"><span class=\"group-dot\"></span>cream cheese frosting</div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">cream cheese</span><span class=\"ing-amount\">6 oz</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">butter</span><span class=\"ing-amount\">¼ cup</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">casein (½ scoop)</span><span class=\"ing-amount\">~15g</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">powdered sugar</span><span class=\"ing-amount\">1½ cups</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">vanilla</span><span class=\"ing-amount\">2 tsp</span></div>\n      <div class=\"ingredient-item\"><span class=\"ing-name\">salt</span><span class=\"ing-amount\">pinch</span></div>\n    </div>\n\n    <!-- STEPS -->\n    <div class=\"section-label\" style=\"margin-top:48px;\">method</div>\n\n    <ol class=\"steps\">\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">1</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">bloom the yeast</div>\n          <div class=\"step-text\">Combine warm milk and 1 tbsp sugar in your mixing bowl. Sprinkle in the yeast and let sit until foamy. <strong>If it doesn't foam, your milk was too hot or the yeast is dead — start over.</strong> Don't skip this check.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>10 minutes</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">2</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">build the dough</div>\n          <div class=\"step-text\">Add remaining sugar, melted butter, eggs, vanilla, salt, and nutmeg to the yeast mixture. Mix until combined. Add bread flour and casein together and mix in gradually — don't dump it all at once.</div>\n        </div>\n      </li>\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">3</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">knead — stop early</div>\n          <div class=\"step-text\">Knead 5–7 minutes until smooth. <strong>Stop as soon as it comes together.</strong> Casein tightens gluten faster than flour alone — over-kneading leads to a dense, dry crumb.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>5–7 minutes</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">4</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">first rise</div>\n          <div class=\"step-text\">Cover and rise at room temp for 90 minutes until doubled. <strong>Pro move:</strong> refrigerate overnight after this rise. Cold dough is firmer, rolls tighter, and releases far less moisture in the oven.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>90 minutes</div>\n        </div>\n      </li>\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">5</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">make the filling paste — keep it cool</div>\n          <div class=\"step-text\">Mix butter, brown sugar, cinnamon, and AP flour into a thick spreadable paste. <strong>The AP flour is the key</strong> — it binds butter and sugar so it doesn't fully liquefy and pool during baking. Keep the paste cool before applying; warm paste soaks into the dough before rolling even begins.</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">6</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">roll and fill</div>\n          <div class=\"step-text\">Roll dough to 24×15 inches on a lightly floured surface. Spread filling edge-to-edge, but <strong>leave a 1-inch bare border on the far long edge</strong> so the seam seals cleanly. Thin, even layer — don't pile it in the center.</div>\n        </div>\n      </li>\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">7</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">roll tight and cut clean</div>\n          <div class=\"step-text\">Roll tightly from the long side toward the bare edge. <strong>A loose roll = air pockets = sogginess.</strong> Cut into 12 rolls (~2 inches each) using unflavored dental floss or a sharp serrated knife. Press and pull — never saw.</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">8</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">pan with space, second rise</div>\n          <div class=\"step-text\">Place rolls cut-side up in a lightly greased pan. <strong>Leave space between each roll</strong> — crowding traps steam and causes a soggy bottom. Rise 30 minutes uncovered.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>30 minutes</div>\n        </div>\n      </li>\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">9</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">add pour-over — go light</div>\n          <div class=\"step-text\">Whisk heavy cream, casein, vanilla, and sugar. Drizzle <strong>around</strong> the rolls, not over the top of them. If sogginess was severe last time, reduce this pour-over by a third or skip it this batch and add back once you're happy with the base texture.</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">10</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">bake — pull early</div>\n          <div class=\"step-text\">Bake at 350°F for 22–26 minutes. Pull when tops are <strong>just golden</strong> — don't wait for deep brown. Casein overbakes faster than all-flour doughs, and the filling will continue to liquefy the longer it sits in a hot pan after baking.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>22–26 minutes at 350°F</div>\n        </div>\n      </li>\n\n      <li class=\"step highlighted\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">11</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">rest before frosting</div>\n          <div class=\"step-text\">Let rolls rest in the pan for <strong>10 minutes</strong> before any frosting hits them. This lets excess moisture escape and the filling re-set. Frosting immediately traps steam under the layer and undoes all your work.</div>\n          <div class=\"step-timer\"><span class=\"timer-dot\"></span>10 minutes rest</div>\n        </div>\n      </li>\n\n      <li class=\"step\">\n        <div class=\"step-num-wrap\"><div class=\"step-num\">12</div></div>\n        <div class=\"step-body\">\n          <div class=\"step-title\">make and apply frosting</div>\n          <div class=\"step-text\">Beat cream cheese and butter until smooth. Mix in casein, powdered sugar, vanilla, and a pinch of salt. Apply after the rest — or split the batch: frost half immediately for a melty finish, hold the rest 10 more minutes for a thicker set.</div>\n        </div>\n      </li>\n\n    </ol>\n\n  </div>\n\n  <!-- RIGHT: SIDEBAR -->\n  <div class=\"sidebar\">\n\n    <div class=\"sidebar-card\">\n      <div class=\"sidebar-card-header\">\n        <div class=\"sidebar-card-title\">sogginess fixes</div>\n      </div>\n      <div class=\"sidebar-card-body\">\n        <div class=\"fix-item\"><div class=\"fix-check\">✓</div><div class=\"fix-text\">filling cut in half — 1 cup butter, 1 cup brown sugar</div></div>\n        <div class=\"fix-item\"><div class=\"fix-check\">✓</div><div class=\"fix-text\">AP flour in filling binds the butter/sugar — don't skip it</div></div>\n        <div class=\"fix-item\"><div class=\"fix-check\">✓</div><div class=\"fix-text\">pour-over reduced to ¼ cup — drizzle around, not on top</div></div>\n        <div class=\"fix-item\"><div class=\"fix-check\">✓</div><div class=\"fix-text\">space between rolls in pan — lets steam escape</div></div>\n        <div class=\"fix-item\"><div class=\"fix-check\">✓</div><div class=\"fix-text\">rest 10 min before frosting — never frost straight out of the oven</div></div>\n      </div>\n    </div>\n\n    <div class=\"sidebar-card\">\n      <div class=\"sidebar-card-header\" style=\"background: #12114A;\">\n        <div class=\"sidebar-card-title\">casein tips</div>\n      </div>\n      <div class=\"sidebar-card-body\">\n        <div class=\"tip-item\">\n          <div class=\"tip-icon\">↓</div>\n          <div class=\"tip-text\"><strong>stop kneading early.</strong> casein tightens gluten faster than flour — overdoing it dries out the crumb.</div>\n        </div>\n        <div class=\"tip-item\">\n          <div class=\"tip-icon\">⏱</div>\n          <div class=\"tip-text\"><strong>pull at 22 min.</strong> protein bakes dry faster than all-flour doughs. check early, check often.</div>\n        </div>\n        <div class=\"tip-item\">\n          <div class=\"tip-icon\">❄</div>\n          <div class=\"tip-text\"><strong>overnight cold rise.</strong> refrigerating after the first proof = tighter roll, less moisture in the oven.</div>\n        </div>\n        <div class=\"tip-item\">\n          <div class=\"tip-icon\">✂</div>\n          <div class=\"tip-text\"><strong>use dental floss to cut.</strong> cleaner slice, no compression, better layers.</div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"order-cta\">\n      <div class=\"order-cta-headline\">want our protein cinnamon rolls?</div>\n      <div class=\"order-cta-sub\">we make these fresh every week. orders close thursday at midnight. pickup sunday in minneapolis.</div>\n      <a class=\"order-btn\" href=\"https://tandoco.com/store\">order this week →</a>\n    </div>\n\n  </div>\n\n</div>\n\n<footer>\n  <div class=\"footer-brand\">tandoco</div>\n  <div class=\"footer-meta\">minneapolis, mn · hello@tandoco.com · tandoco.com</div>\n</footer>\n\n</body>\n</html>","dietaryTags":[],"availableNextWeek":false,"sortOrder":2,"supplies":[],"name":"swole roll","isChefPick":false,"isTopSeller":false,"isNewThisWeek":false,"photoFocal":{"x":50,"y":50},"menuPrice":"1.00","weeklyLimitRemaining":null,"unitName":"roll","weeklyLimit":null,"qtyPicker":"auto","createdByName":"Tommy","substitutions":[],"pairsWith":["3U7juLAy49hFUGoiQaOS"],"collections":["fan","protein"],"storage":"","heating":"","thumbURL":"","photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FLyXHpBhh3guXibmPbuTx%2F1778111639652_Gemini_Generated_Image_oq9fsoq9fsoq9fso.png?alt=media&token=12e77522-185d-4b2e-8f4a-f051445de19d"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FLyXHpBhh3guXibmPbuTx%2F1778167731307_Gemini_Generated_Image_ka9f3eka9f3eka9f.png?alt=media&token=5714683a-3579-4d94-a8c5-49fdf32398d9","ingredients":[{"ingredientId":"Jk9xb1OqPp5rBV4TzNBo","name":"whole milk","qty":1.25,"unit":"cup"},{"ingredientId":"3p6KhzinECPwLVH73OiY","name":"active dry yeast","qty":7,"unit":"g"},{"ingredientId":"QflNPQztRlMchEERkNYw","name":"granulated sugar","qty":0.625,"unit":"cup"},{"ingredientId":"dZeM4mOorzXD0vmRNkBS","name":"eggs","qty":2,"unit":"piece"},{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla extract","qty":2,"unit":"tsp"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"salt","qty":1,"unit":"tsp"},{"ingredientId":"D6I1SlFBWUkhWUR7Sy0D","name":"nutmeg","qty":0.5,"unit":"tsp"},{"ingredientId":"qGBAwciv1LTJBLE3HChq","name":"bread flour","qty":3,"unit":"cup"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"butter","qty":1,"unit":"cup"},{"ingredientId":"b9j19jDBI9faAhBsLMQF","name":"brown sugar","qty":1,"unit":"cup"},{"ingredientId":"0dNxHgi786bZNoGbqE3x","name":"cinnamon","qty":2,"unit":"tbsp"},{"ingredientId":"eHzUrNatfdMNgD1bQUAN","name":"heavy cream","qty":0.25,"unit":"cup"},{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla","qty":0.25,"unit":"tsp"},{"ingredientId":"4yRKEugscqkLpPQlJU4y","name":"sugar","qty":0.5,"unit":"tsp"},{"ingredientId":"CWGHRWmTseI5P2PFX4Jk","name":"cream cheese","qty":6,"unit":"oz"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"butter","qty":0.25,"unit":"cup"},{"ingredientId":"4yRKEugscqkLpPQlJU4y","name":"powdered sugar","qty":1.5,"unit":"cup"},{"ingredientId":"4zh6GmQNpAT6IPFYmHje","name":"vanilla","qty":2,"unit":"tsp"},{"ingredientId":"NaWUIGxwx96Ff4ws1Qp7","name":"salt","qty":0,"unit":"pinch"},{"ingredientId":"to6Ng7UOPm5vFAylJc6m","name":"All Purpose Flour","qty":0.75,"unit":"tbsp"},{"ingredientId":"HVJwdYvzIfiGhAGIhdij","name":"Nutricost Casein Protein Unflavored","qty":155,"unit":"g"}],"ladderId":"custom","packOptions":[{"qty":1,"label":"single","price":5.99,"tierKey":"custom-1778462930190-s8f3","ladderId":"custom","allowStepper":false},{"qty":6,"label":"half dozen","price":26.99,"tierKey":"custom-1778462931498-0kyp","ladderId":"custom","allowStepper":false},{"qty":12,"label":"dozen","price":49.99,"tierKey":"custom-1778462933531-4337","ladderId":"custom","allowStepper":false}],"customPackOptions":[{"key":"custom-1778462930190-s8f3","label":"single","qty":1,"price":5.99},{"key":"custom-1778462931498-0kyp","label":"half dozen","qty":6,"price":26.99},{"key":"custom-1778462933531-4337","label":"dozen","qty":12,"price":49.99}],"calories":"600","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"isFanFavorite":true,"recipeYield":"1","unitsPerYield":"12","updatedAt":{"_seconds":1779077455,"_nanoseconds":900000000}},{"id":"maxJOwkOg1OY3ocYit6x","name":"date night doolsho","category":"Ideation","servingSize":"","calories":"","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"menuIngredients":"","ingredients":[],"supplies":[],"notes":"","instructionsHtml":"","published":true,"weeklySpecial":false,"fanFavorite":false,"hideCalories":false,"nextAvailableDate":"","menuPrice":"","menuCategory":"Bakery","owner":"tommy","linkedProjectId":"","createdAt":{"_seconds":1775682299,"_nanoseconds":95000000},"mealType":"Bakery","availableThisWeek":true,"protein":"15","menuDescription":"just like your hooyo makes. a somali classic, made to hit your macros. cardamom sponge, date swirl, cream cheese drizzle. 100% halal, scratch-made, high-protein. no shortcuts.","dietaryTags":["Halal"],"isChefPick":false,"weeklyLimitRemaining":null,"weeklyLimit":null,"isTopSeller":false,"isFanFavorite":false,"isNewThisWeek":false,"collections":["protein"],"createdByName":"Tommy","substitutions":[],"unitName":"cake","pairsWith":[],"storage":"","heating":"","qtyPicker":"auto","photoFocal":{"x":52,"y":58},"thumbURL":"","packOptions":[{"qty":1,"label":"single mini-bundt cake","price":4.99,"allowStepper":false},{"qty":4,"label":"4 mini-bundt cakes","price":16.99,"allowStepper":false},{"qty":1,"label":"large bundt cake","price":21.99,"allowStepper":false}],"photos":["https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FmaxJOwkOg1OY3ocYit6x%2F1778111517725_Gemini_Generated_Image_c648oac648oac648.png?alt=media&token=c4e13c27-9414-4659-8405-b3ed46c6a960"],"photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FmaxJOwkOg1OY3ocYit6x%2F1778167908418_Gemini_Generated_Image_9pyo7x9pyo7x9pyo.png?alt=media&token=d9930aa2-a14f-4187-bd8a-d11bf507fd65","backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"mm5yd1s0D9WAq1MfShcT","name":"Chocolate Peanut Butter Smoothie","category":"Ideation","servingSize":"","carbs":"0","fat":"0","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"menuIngredients":"","ingredients":[],"notes":"","published":true,"availableThisWeek":true,"nextAvailableDate":"","menuPrice":"6.99","menuDescription":"","linkedProjectId":"","createdByName":"Omar Yusuf","createdAt":{"_seconds":1774808770,"_nanoseconds":390000000},"protein":"40","calories":"300","mealType":"Smoothie","menuCategory":"Smoothie","skuBase":"TDC-0006","sortOrder":9,"owner":"omar","weeklySpecial":false,"photoURL":"","instructionsHtml":"","supplies":[],"hideCalories":false,"fanFavorite":false,"thumbURL":"","dietaryTags":[],"photos":[],"isChefPick":false,"isTopSeller":false,"ladderId":"smoothie","isFanFavorite":false,"photoFocal":{"x":50,"y":50},"isNewThisWeek":false,"labelOverrides":{},"packOptions":[{"qty":4,"label":"4-pack","price":1,"tierKey":"4-pack","ladderId":"smoothie"},{"qty":8,"label":"8-pack","price":2,"tierKey":"8-pack","ladderId":"smoothie"},{"qty":12,"label":"12-pack","price":3,"tierKey":"12-pack","ladderId":"smoothie"}],"priceOverrides":{"4-pack":1,"8-pack":2,"12-pack":3},"backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"substitutions":[],"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}},{"id":"nizLvGCXUOMQXPlAnroP","category":"Testing","mealType":"sauces","carbs":"","fat":"","satFat":"","cholesterol":"","sodium":"","fiber":"","sugar":"","nutritionTags":[],"dietaryTags":[],"menuIngredients":"","ingredients":[],"supplies":[],"notes":"","instructionsHtml":"","weeklyLimit":null,"weeklyLimitRemaining":null,"weeklySpecial":false,"fanFavorite":false,"isChefPick":false,"isTopSeller":false,"isNewThisWeek":false,"isFanFavorite":false,"hideCalories":false,"substitutions":[],"nextAvailableDate":"","photoFocal":{"x":50,"y":50},"menuDescription":"","linkedProjectId":"","createdByName":"Omar Yusuf","packOptions":[],"createdAt":{"_seconds":1777333207,"_nanoseconds":156000000},"photos":[],"owner":"omar","menuPrice":"5.99","unitName":"bottle","qtyPicker":"stepper","published":true,"availableThisWeek":true,"menuCategory":"sauces","thumbURL":"","pairsWith":[],"storage":"","heating":"","protein":"9","name":"yum-yum sauce","calories":"100","servingSize":"1","photoURL":"https://firebasestorage.googleapis.com/v0/b/tandoco.firebasestorage.app/o/recipe-photos%2FnizLvGCXUOMQXPlAnroP%2F1777762131787_0AEF09FB-021E-4580-85B1-4E58B249D0B5.png?alt=media&token=ca8a2ce8-fc67-4967-9513-b94c27b60c24","_validation":{"ok":true,"errors":[],"warnings":[{"field":"stripeTaxCode","code":"tax_code_unset","msg":"No Stripe tax code set — Stripe Tax will use its default."}],"lastValidatedAt":{"_seconds":1777762133,"_nanoseconds":741000000}},"backfilledPricingFieldsAt":{"_seconds":1778559298,"_nanoseconds":901000000},"premiumMeal":false,"updatedAt":{"_seconds":1778559298,"_nanoseconds":901000000}}],"ts":1779252359027}