Hi

Hi! How can I help you today?

Im 25 years old

Good to know! What can I help you with today?

I am suspecting hyperparathyroidism, i recently saw symptoms and i think i might have this and most recently i also had kidney stones then i did a blood test for ca it was mildly high but i didnt check pth hormone yet and tell me what should i do until i check the pth level and also what steps should i take and what should i eat more and what should i eat less and also i sometimes have bone pain

Reading File
Finding Sources
Searching PubMed

primary hyperparathyroidism management guidelines

Reading File
Finding Sources
Reading File
Finding Sources
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Searching the Web

primary hyperparathyroidism dietary advice calcium intake kidney stones what to eat avoid

Here is a thorough answer based on medical textbooks and current guidelines:

Your Situation - What's Likely Going On

Your combination of mild hypercalcemia + kidney stones + bone pain at age 25 is the classic triad of primary hyperparathyroidism (PHPT). The mnemonic doctors use is "bones, stones, groans, and psychic moans" - you already have bones (bone pain) and stones (kidney stones).
In primary hyperparathyroidism, one or more parathyroid glands (usually a benign adenoma) secretes too much PTH, which pulls calcium out of your bones and into your blood, and spills it into your urine causing kidney stones. At 25, this is less common but absolutely possible.

Step 1: What Tests You Still Need (Before Your PTH Result)

Get these tests done ideally at the same time as your PTH, or as soon as possible:
TestWhy
PTH (intact/whole)If elevated alongside high calcium = confirms PHPT
24-hour urine calciumMeasures how much calcium your kidneys are excreting
Serum phosphatePTH lowers phosphate - low phosphate supports PHPT
Vitamin D (25-OH)Low vitamin D can falsely lower calcium AND raise PTH
Serum creatinine / eGFRAssess kidney function from the stone history
Alkaline phosphataseElevated if there is significant bone turnover
DEXA bone scanCheck bone density - especially important given bone pain at your age
Renal ultrasoundCheck for any remaining stones or nephrocalcinosis
Interpreting the PTH result:
  • High PTH + high calcium = primary hyperparathyroidism (most likely)
  • Low/suppressed PTH + high calcium = look for other causes (cancer, vitamin D toxicity, sarcoidosis)
  • High PTH + normal or low calcium = secondary hyperparathyroidism (kidney disease, vitamin D deficiency)

Step 2: What To Do Right Now (While Awaiting Results)

Drink a LOT of water

This is the single most important thing you can do right now. Aim for 2.5 to 3 liters of fluid per day (mostly water). High urine volume is the best protection against forming more kidney stones. Your urine should be pale/clear, not dark yellow.
  • Add lemon juice to your water - lemon contains citrate, which binds calcium in urine and prevents stones from forming.
  • Avoid grapefruit juice and soda (especially colas which contain phosphoric acid).

Stay active but avoid prolonged bed rest

Immobility makes hypercalcemia worse. Light regular movement keeps calcium in your bones. Avoid strenuous high-impact exercise that could fracture weakened bones if your bone density is low, but don't stay sedentary.

See an endocrinologist

Given your age (25), kidney stones, and bone pain, most guidelines strongly recommend referral to an endocrinologist. At 25, the threshold for surgery (parathyroidectomy) is lower than in older patients - surgery is often the definitive cure.

What to Eat More Of

Food / CategoryWhy It Helps
Water, water, waterDilutes urine, prevents stone re-formation
Dietary calcium from food (milk, yogurt, cheese, kefir)Counterintuitively, food calcium binds oxalate in the gut and prevents it from reaching the kidneys. Do NOT restrict calcium from food.
Citrus fruits (lemons, oranges, limes)High in citrate - inhibits calcium stone formation
Fruits and vegetables (most of them)Provide potassium and alkalize urine
Plant-based proteins (lentils, beans, tofu)Less urine calcium excretion than animal protein
Omega-3 rich foods (salmon, mackerel, walnuts, flaxseed)May help lower urinary calcium

What to Eat Less Of

Food / CategoryWhy to Reduce
High-sodium / salty foods (processed foods, chips, canned soups, deli meats, fast food)Salt makes kidneys excrete MORE calcium into urine - directly worsens stone risk
Animal protein in large amounts (red meat, chicken, fish in excess)Increases urinary calcium and uric acid
High-oxalate foods (spinach, almonds, dark chocolate, beets, rhubarb, nuts, wheat bran)Oxalate combines with calcium to form stones
Vitamin C supplementsConverts to oxalate in the body
Calcium supplementsUnlike food calcium, supplements can worsen hypercalcemia and stones - avoid unless a doctor specifically tells you otherwise
Caffeine in excessMild calcium-wasting through urine
AlcoholDehydrating, raises calcium levels

About Your Bone Pain

Bone pain in hyperparathyroidism is from PTH constantly pulling calcium out of the bone matrix, weakening it. This is called osteitis fibrosa cystica in severe cases. At your age this needs urgent attention - get a DEXA scan done. If bone density is already reduced, this is another strong argument for treatment (likely surgery) rather than watchful waiting.

The Bigger Picture - What Happens Next

Once your PTH is confirmed elevated, you will likely be referred for:
  1. Parathyroid imaging - ultrasound and/or sestamibi scan to locate the adenoma
  2. Endocrinologist evaluation to confirm the diagnosis and grade severity
  3. Parathyroidectomy (surgical removal of the abnormal parathyroid gland) - this is the only definitive cure, and guidelines recommend it for patients your age with kidney stones or bone involvement. Cure rates are >95%
If surgery is delayed or not immediately possible, a medication called cinacalcet (Sensipar) can be used to lower calcium levels temporarily.

Important disclaimer: This is educational information based on medical textbooks (Robbins Pathology, Miller's Anesthesia, Brenner's Kidney). It is not a substitute for evaluation by your doctor. Please see an endocrinologist soon given your age and symptoms - do not delay getting the PTH checked.
  • Robbins & Kumar Basic Pathology, p. 765
  • Miller's Anesthesia 10e, p. 4262
  • Brenner and Rector's The Kidney, p. 814

Create a printable meal plan for kidney stone + hyperparathyroidism prevention

Asking for Preferences
Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"

Running Command

mkdir -p /home/daytona/workspace/meal-plan && echo "dir created"

Writing File

~/meal-plan/generate_meal_plan.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import PageBreak

OUTPUT = "/home/daytona/workspace/meal-plan/Kidney_Stone_Hyperparathyroidism_Meal_Plan.pdf"

# ── Colour palette ───────────────────────────────────────────────────────────
TEAL        = colors.HexColor("#1A7A8A")
LIGHT_TEAL  = colors.HexColor("#D6EFF2")
MID_TEAL    = colors.HexColor("#4DAAB8")
ORANGE      = colors.HexColor("#E07B2E")
LIGHT_ORANGE= colors.HexColor("#FDF0E6")
YELLOW      = colors.HexColor("#F5C842")
LIGHT_YELLOW= colors.HexColor("#FFFBE6")
WHITE       = colors.white
DARK_GREY   = colors.HexColor("#333333")
MID_GREY    = colors.HexColor("#666666")
LIGHT_GREY  = colors.HexColor("#F5F5F5")
GREEN       = colors.HexColor("#2E8B57")
LIGHT_GREEN = colors.HexColor("#E8F5EE")
RED_LIGHT   = colors.HexColor("#FDEDED")
RED         = colors.HexColor("#C0392B")

# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

title_style = S("Title2", fontName="Helvetica-Bold", fontSize=22,
                textColor=WHITE, alignment=TA_CENTER, spaceAfter=2)
subtitle_style = S("Sub2", fontName="Helvetica", fontSize=11,
                   textColor=LIGHT_TEAL, alignment=TA_CENTER, spaceAfter=4)
section_hdr = S("SecHdr", fontName="Helvetica-Bold", fontSize=13,
                textColor=WHITE, alignment=TA_CENTER)
day_hdr = S("DayHdr", fontName="Helvetica-Bold", fontSize=11,
            textColor=WHITE, alignment=TA_LEFT)
meal_label = S("MealLbl", fontName="Helvetica-Bold", fontSize=9,
               textColor=TEAL, spaceAfter=1)
body_small = S("Body8", fontName="Helvetica", fontSize=8.5,
               textColor=DARK_GREY, leading=12)
body_bold  = S("Body8B", fontName="Helvetica-Bold", fontSize=8.5,
               textColor=DARK_GREY)
tip_style  = S("Tip", fontName="Helvetica-Oblique", fontSize=8,
               textColor=MID_GREY, leading=11)
note_bold  = S("NoteBold", fontName="Helvetica-Bold", fontSize=9,
               textColor=DARK_GREY)
note_body  = S("NoteBody", fontName="Helvetica", fontSize=8.5,
               textColor=DARK_GREY, leading=12)
footer_s   = S("Footer", fontName="Helvetica-Oblique", fontSize=7,
               textColor=MID_GREY, alignment=TA_CENTER)
green_hdr  = S("GreenHdr", fontName="Helvetica-Bold", fontSize=10,
               textColor=WHITE, alignment=TA_LEFT)
red_hdr    = S("RedHdr", fontName="Helvetica-Bold", fontSize=10,
               textColor=WHITE, alignment=TA_LEFT)

# ── 7-Day Meal Data ──────────────────────────────────────────────────────────
DAYS = [
    {
        "day": "DAY 1  –  Monday",
        "breakfast": [
            "Oatmeal with low-fat milk + sliced banana",
            "1 boiled egg",
            "Lemon water (300 ml)"
        ],
        "snack_am": ["Greek yogurt (plain, low-fat)", "Orange slices"],
        "lunch": [
            "Grilled chicken breast (90 g) + steamed broccoli + quinoa",
            "Side salad: romaine, cucumber, olive oil & lemon dressing"
        ],
        "snack_pm": ["Apple + small piece of mozzarella", "Water with lemon"],
        "dinner": [
            "Baked salmon fillet (100 g) with herbs",
            "Steamed carrots + small baked potato (no skin)",
            "Glass of water or chamomile tea"
        ],
        "tip": "Tip: Aim for 2.5–3 L of fluid today. Start every meal with a glass of water."
    },
    {
        "day": "DAY 2  –  Tuesday",
        "breakfast": [
            "Scrambled eggs (2) with sautéed bell peppers & tomatoes",
            "1 slice whole-grain toast",
            "Lemon water (300 ml)"
        ],
        "snack_am": ["Low-fat yogurt + kiwi slices"],
        "lunch": [
            "Lentil soup (1 cup) with carrots and celery",
            "Small whole-grain roll",
            "Mixed greens salad with olive oil"
        ],
        "snack_pm": ["Handful of grapes + 30 g ricotta on rice cake"],
        "dinner": [
            "Turkey mince stir-fry with bell peppers, zucchini, onion",
            "Brown rice (½ cup cooked)",
            "Water with cucumber slices"
        ],
        "tip": "Tip: Avoid processed/canned foods today — they are high in sodium which raises urinary calcium."
    },
    {
        "day": "DAY 3  –  Wednesday",
        "breakfast": [
            "Whole-grain cereal with low-fat milk + blueberries",
            "Hard-boiled egg",
            "Lemon water"
        ],
        "snack_am": ["Watermelon slices (citrate-rich)", "Water"],
        "lunch": [
            "Tofu & vegetable stir-fry (broccoli, snap peas, carrots)",
            "½ cup brown rice",
            "Sparkling water with lime"
        ],
        "snack_pm": ["Low-fat cheese stick + pear"],
        "dinner": [
            "Grilled white fish (cod/tilapia) with lemon & herbs",
            "Roasted sweet potato + green beans",
            "Herbal tea (no sugar)"
        ],
        "tip": "Tip: Pair calcium-rich foods (dairy, tofu) with meals — this binds oxalate in the gut and reduces stone risk."
    },
    {
        "day": "DAY 4  –  Thursday",
        "breakfast": [
            "Smoothie: low-fat milk + banana + strawberries (no spinach)",
            "2 rice cakes with a thin spread of avocado"
        ],
        "snack_am": ["Orange + handful of sunflower seeds (lightly salted or unsalted)"],
        "lunch": [
            "Chicken & vegetable soup (homemade, low sodium)",
            "Small whole-grain bread roll",
            "Lemon water"
        ],
        "snack_pm": ["Greek yogurt + melon cubes"],
        "dinner": [
            "Bean & vegetable chili (kidney beans, tomato, zucchini, corn)",
            "Small portion of plain rice",
            "Water with lemon juice"
        ],
        "tip": "Tip: Use herbs and lemon juice to flavour food instead of salt."
    },
    {
        "day": "DAY 5  –  Friday",
        "breakfast": [
            "2 egg omelette with low-fat cheese & tomato",
            "1 slice whole-grain toast",
            "Lemon water or orange juice (small glass)"
        ],
        "snack_am": ["Kefir (small cup) — high in calcium, gut-friendly"],
        "lunch": [
            "Canned salmon (in water, rinsed) salad with romaine, tomato, cucumber",
            "Lemon-olive oil dressing",
            "Water"
        ],
        "snack_pm": ["Apple + low-fat yogurt"],
        "dinner": [
            "Grilled chicken thigh (skinless, 90 g) + roasted broccoli + boiled potato",
            "Chamomile or peppermint tea"
        ],
        "tip": "Tip: Salmon and canned fish (with bones) are excellent calcium sources — better than supplements."
    },
    {
        "day": "DAY 6  –  Saturday",
        "breakfast": [
            "Pancakes made with oat flour + low-fat milk",
            "Fresh berries (strawberries, blueberries)",
            "Lemon water"
        ],
        "snack_am": ["Small orange + low-fat cheese"],
        "lunch": [
            "Vegetable & chickpea curry (light, low-sodium)",
            "½ cup basmati rice",
            "Water with lime"
        ],
        "snack_pm": ["Banana + small pot of Greek yogurt"],
        "dinner": [
            "Baked cod or chicken with lemon, garlic & herbs",
            "Steamed asparagus + small baked potato (no skin)",
            "Herbal tea"
        ],
        "tip": "Tip: Choose plant-based protein (chickpeas, lentils) at least once today — animal protein increases urinary calcium."
    },
    {
        "day": "DAY 7  –  Sunday",
        "breakfast": [
            "Oatmeal with milk + sliced banana + cinnamon",
            "1 boiled egg",
            "Fresh-squeezed lemon water"
        ],
        "snack_am": ["Fruit salad: melon, kiwi, orange, grapes"],
        "lunch": [
            "Grilled salmon + quinoa salad with cucumber, tomato, lemon dressing",
            "Sparkling water with lime"
        ],
        "snack_pm": ["Low-fat yogurt + strawberries"],
        "dinner": [
            "Homemade turkey or chicken meatballs (low sodium) in tomato sauce",
            "Whole-grain pasta (small portion)",
            "Steamed broccoli",
            "Herbal tea or lemon water"
        ],
        "tip": "Tip: End the week strong — check your urine colour. Pale yellow = well hydrated. Dark = drink more!"
    }
]

MEAL_LABELS = ["Breakfast", "Morning Snack", "Lunch", "Afternoon Snack", "Dinner"]
MEAL_KEYS   = ["breakfast", "snack_am", "lunch", "snack_pm", "dinner"]
MEAL_ICONS  = ["☀", "🍎", "🥗", "🫐", "🌙"]

# Foods to eat / avoid
EAT_MORE = [
    ("💧 Water + Lemon", "2.5–3 L daily. Add fresh lemon juice for urinary citrate."),
    ("🥛 Dairy (food only)", "Milk, yogurt, kefir, ricotta — 1,000 mg calcium/day from food."),
    ("🐟 Salmon / Sardines", "Rich in omega-3 and calcium (with bones). Reduces urinary calcium."),
    ("🍊 Citrus Fruits", "Oranges, lemons, limes, kiwi — high in citrate, inhibit stone formation."),
    ("🥦 Vegetables", "Broccoli, carrots, bell peppers, zucchini, asparagus, green beans."),
    ("🫘 Plant Proteins", "Lentils, chickpeas, beans, tofu — lower urinary calcium vs. meat."),
    ("🍌 Potassium-rich fruits", "Banana, melon, grapes — alkalise urine and support bone health."),
    ("🌾 Whole grains", "Oats, quinoa, brown rice, whole-grain bread — fibre and nutrients."),
]

EAT_LESS = [
    ("🧂 High-sodium foods", "Canned soups, processed meats, chips, fast food, pickles. Salt raises urinary calcium."),
    ("🥩 Excess animal protein", "Red meat, large portions of chicken/fish — increases uric acid & calcium in urine."),
    ("🌿 High-oxalate foods", "Spinach, almonds, dark chocolate, beets, rhubarb, wheat bran, peanuts."),
    ("💊 Calcium supplements", "Avoid unless doctor-prescribed — food calcium is safe; supplement calcium can worsen hypercalcaemia."),
    ("🍬 Vitamin C supplements", "Converts to oxalate in the body. Get vitamin C from fruit instead."),
    ("🥤 Cola / Soda", "Phosphoric acid in cola damages kidneys and promotes stone formation."),
    ("🍺 Alcohol", "Dehydrating. Raises serum calcium. Limit to zero or rarely."),
    ("☕ Excess caffeine", "Mild calcium-wasting through urine. 1–2 cups coffee/day maximum."),
]

HYDRATION_TIPS = [
    "Start every morning with 300 ml of warm water + fresh lemon juice.",
    "Keep a 1 L water bottle visible at all times and refill it 2–3 × daily.",
    "Add cucumber, lemon, lime or mint to water to make it more enjoyable.",
    "Drink a full glass of water before and after every meal.",
    "Set phone reminders every 2 hours if you forget to drink.",
    "Urine colour check: pale straw yellow = hydrated. Dark yellow = drink more now.",
]

DISCLAIMER = (
    "This meal plan is for educational purposes only and is based on general dietary guidelines for "
    "kidney stone prevention and hypercalcaemia management. It is NOT a substitute for individualised "
    "medical or dietetic advice. Always consult your endocrinologist, nephrologist, or registered "
    "dietitian before making significant dietary changes, especially when awaiting diagnostic results."
)

# ── Build PDF ────────────────────────────────────────────────────────────────

def header_table(text, bg=TEAL, style=section_hdr, h=10*mm):
    t = Table([[Paragraph(text, style)]], colWidths=[170*mm], rowHeights=[h])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), bg),
        ("ROUNDEDCORNERS", [4]),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
    ]))
    return t

def day_table(day_data):
    rows = []
    # Day header row
    rows.append([Paragraph(day_data["day"], day_hdr), ""])

    for key, label, icon in zip(MEAL_KEYS, MEAL_LABELS, MEAL_ICONS):
        items = day_data[key]
        items_text = "<br/>".join(f"• {i}" for i in items)
        rows.append([
            Paragraph(f"<b>{icon} {label}</b>", meal_label),
            Paragraph(items_text, body_small)
        ])

    rows.append([Paragraph(day_data["tip"], tip_style), ""])

    col_w = [45*mm, 125*mm]
    t = Table(rows, colWidths=col_w)

    style = TableStyle([
        # Day header
        ("BACKGROUND",    (0,0), (-1,0), TEAL),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("SPAN",          (0,0), (-1,0)),
        ("TOPPADDING",    (0,0), (-1,0), 7),
        ("BOTTOMPADDING", (0,0), (-1,0), 7),
        ("LEFTPADDING",   (0,0), (-1,0), 10),
        # Alternating meal rows
        ("BACKGROUND",    (0,1), (-1,1), LIGHT_TEAL),
        ("BACKGROUND",    (0,2), (-1,2), WHITE),
        ("BACKGROUND",    (0,3), (-1,3), LIGHT_TEAL),
        ("BACKGROUND",    (0,4), (-1,4), WHITE),
        ("BACKGROUND",    (0,5), (-1,5), LIGHT_TEAL),
        # Tip row
        ("BACKGROUND",    (0,6), (-1,6), LIGHT_YELLOW),
        ("SPAN",          (0,6), (-1,6)),
        # All rows
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("RIGHTPADDING",  (0,0), (-1,-1), 8),
        ("TOPPADDING",    (0,1), (-1,-1), 5),
        ("BOTTOMPADDING", (0,1), (-1,-1), 5),
        ("LINEBELOW",     (0,0), (-1,-2), 0.3, colors.HexColor("#CCCCCC")),
        ("BOX",           (0,0), (-1,-1), 0.5, TEAL),
    ])
    t.setStyle(style)
    return t


def build_pdf():
    doc = SimpleDocTemplate(
        OUTPUT,
        pagesize=A4,
        topMargin=15*mm, bottomMargin=15*mm,
        leftMargin=20*mm, rightMargin=20*mm,
        title="Kidney Stone & Hyperparathyroidism Meal Plan",
        author="Orris Health"
    )

    story = []
    W = 170*mm  # usable width

    # ── COVER / TITLE BLOCK ──────────────────────────────────────────────────
    cover_data = [[
        Paragraph("7-DAY MEAL PLAN", title_style),
        Paragraph("Kidney Stone &amp; Hyperparathyroidism Prevention", subtitle_style),
        Paragraph("Prepared for a 25-year-old with suspected primary hyperparathyroidism", S("cov3", fontName="Helvetica-Oblique", fontSize=9, textColor=LIGHT_TEAL, alignment=TA_CENTER)),
    ]]
    cover_t = Table([[Paragraph("7-DAY MEAL PLAN", title_style)],
                     [Paragraph("Kidney Stone &amp; Hyperparathyroidism Prevention", subtitle_style)],
                     [Paragraph("Prepared for a 25-year-old with suspected primary hyperparathyroidism",
                                S("c3", fontName="Helvetica-Oblique", fontSize=9, textColor=LIGHT_TEAL, alignment=TA_CENTER))],
                     [Paragraph("June 2026  •  Orris Health Assistant",
                                S("c4", fontName="Helvetica", fontSize=8, textColor=MID_TEAL, alignment=TA_CENTER))],
                    ],
                    colWidths=[W])
    cover_t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), TEAL),
        ("TOPPADDING",    (0,0), (-1,-1), 8),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("BOX",           (0,0), (-1,-1), 1.5, MID_TEAL),
    ]))
    story.append(cover_t)
    story.append(Spacer(1, 8*mm))

    # ── KEY RULES BANNER ────────────────────────────────────────────────────
    rules_data = [
        [Paragraph("💧 3 L water/day", body_bold),
         Paragraph("🧂 Low sodium", body_bold),
         Paragraph("🚫 No Ca-supplements", body_bold),
         Paragraph("🍊 Citrus daily", body_bold)],
    ]
    rules_t = Table(rules_data, colWidths=[W/4]*4)
    rules_t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), LIGHT_TEAL),
        ("ALIGN",         (0,0), (-1,-1), "CENTER"),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("BOX",           (0,0), (-1,-1), 0.5, TEAL),
        ("INNERGRID",     (0,0), (-1,-1), 0.3, MID_TEAL),
    ]))
    story.append(rules_t)
    story.append(Spacer(1, 6*mm))

    # ── EAT MORE / EAT LESS ──────────────────────────────────────────────────
    eat_hdr = Table([
        [Paragraph("✅  EAT MORE", green_hdr), Paragraph("🚫  LIMIT / AVOID", red_hdr)]
    ], colWidths=[W/2, W/2])
    eat_hdr.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (0,0), GREEN),
        ("BACKGROUND",    (1,0), (1,0), RED),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("BOX",           (0,0), (-1,-1), 0.5, colors.grey),
    ]))
    story.append(eat_hdr)

    eat_rows = []
    max_rows = max(len(EAT_MORE), len(EAT_LESS))
    for i in range(max_rows):
        left = right = Paragraph("", body_small)
        if i < len(EAT_MORE):
            name, desc = EAT_MORE[i]
            left = Paragraph(f"<b>{name}</b><br/>{desc}", body_small)
        if i < len(EAT_LESS):
            name, desc = EAT_LESS[i]
            right = Paragraph(f"<b>{name}</b><br/>{desc}", body_small)
        eat_rows.append([left, right])

    eat_t = Table(eat_rows, colWidths=[W/2, W/2])
    eat_ts = TableStyle([
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("RIGHTPADDING",  (0,0), (-1,-1), 8),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LINEBELOW",     (0,0), (-1,-2), 0.2, colors.HexColor("#DDDDDD")),
        ("LINEBEFORE",    (1,0), (1,-1), 0.5, colors.HexColor("#CCCCCC")),
        ("BOX",           (0,0), (-1,-1), 0.5, colors.grey),
    ])
    for i in range(0, max_rows, 2):
        eat_ts.add("BACKGROUND", (0,i), (0,i), LIGHT_GREEN)
    for i in range(0, max_rows, 2):
        eat_ts.add("BACKGROUND", (1,i), (1,i), RED_LIGHT)
    eat_t.setStyle(eat_ts)
    story.append(eat_t)
    story.append(Spacer(1, 6*mm))

    # ── HYDRATION TIPS ───────────────────────────────────────────────────────
    story.append(header_table("💧  DAILY HYDRATION RULES", bg=MID_TEAL, h=8*mm))
    story.append(Spacer(1, 2*mm))
    hyd_rows = [[Paragraph(f"• {tip}", body_small)] for tip in HYDRATION_TIPS]
    hyd_t = Table(hyd_rows, colWidths=[W])
    hyd_t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), LIGHT_TEAL),
        ("LEFTPADDING",   (0,0), (-1,-1), 12),
        ("TOPPADDING",    (0,0), (-1,-1), 3),
        ("BOTTOMPADDING", (0,0), (-1,-1), 3),
        ("BOX",           (0,0), (-1,-1), 0.5, TEAL),
    ]))
    story.append(hyd_t)

    # ── PAGE BREAK before meal days ──────────────────────────────────────────
    story.append(PageBreak())

    # ── 7-DAY MEAL PLAN ──────────────────────────────────────────────────────
    story.append(header_table("📅  7-DAY MEAL PLAN", bg=TEAL, h=10*mm))
    story.append(Spacer(1, 4*mm))

    for i, day in enumerate(DAYS):
        story.append(KeepTogether([
            day_table(day),
            Spacer(1, 4*mm)
        ]))
        # Page break after day 4 to balance pages
        if i == 3:
            story.append(PageBreak())
            story.append(header_table("📅  7-DAY MEAL PLAN  (continued)", bg=TEAL, h=10*mm))
            story.append(Spacer(1, 4*mm))

    # ── DISCLAIMER ───────────────────────────────────────────────────────────
    story.append(Spacer(1, 4*mm))
    disc_t = Table([[Paragraph(f"⚠ Medical Disclaimer: {DISCLAIMER}", S("disc", fontName="Helvetica-Oblique", fontSize=7.5, textColor=MID_GREY, leading=11))]],
                   colWidths=[W])
    disc_t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), LIGHT_YELLOW),
        ("BOX",           (0,0), (-1,-1), 0.5, YELLOW),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("RIGHTPADDING",  (0,0), (-1,-1), 8),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ]))
    story.append(disc_t)

    doc.build(story)
    print(f"PDF saved: {OUTPUT}")

build_pdf()
Running Command

cd /home/daytona/workspace/meal-plan && python generate_meal_plan.py 2>&1

Running Command

ls -lh /home/daytona/workspace/meal-plan/

Your printable 7-day meal plan PDF is ready:

Kidney Stone Hyperparathyroidism Meal Plan

PDF Document · PDF


Here is what is included in the PDF:
Page 1 - Reference Sheet
  • 4-rule quick banner (3 L water/day, low sodium, no calcium supplements, citrus daily)
  • Side-by-side Eat More vs. Limit/Avoid tables with 8 items each, colour-coded green/red
  • 6 daily hydration rules with practical tips
Pages 2-3 - 7-Day Meal Plan
  • Full day-by-day plan: Breakfast, Morning Snack, Lunch, Afternoon Snack, Dinner
  • Each day has a colour-coded layout and a personalized daily tip
  • Days 1-4 on page 2, Days 5-7 on page 3
Key dietary principles baked into every day:
  • Calcium from food (dairy, salmon, tofu) - never supplements
  • Low sodium throughout - no processed or canned food
  • Citrus and lemon water every single day
  • Plant protein featured at least once daily
  • High-oxalate foods (spinach, almonds, dark chocolate) completely avoided
  • Medical disclaimer on the last page

Whenever i wake up from sleep my talus bone kind of hurts

Reading File
Finding Sources
Finding Sources
Searching the Web

talus bone pain worse in morning after waking up causes

Finding Sources
Finding Sources
Reading File
Finding Sources
Finding Sources
Finding Sources
Reading File
Finding Sources
Good - I now have enough information from both the textbooks and web sources. Here is a thorough answer:

Morning Talus Pain - What's Going On

The talus is the central ankle bone that sits between your heel bone (calcaneus) below and your shin bones (tibia/fibula) above. Pain that is worst right after waking and then eases as you move around is a very specific and meaningful pattern. In medicine this is called "start-up pain" or "first-step pain" and it points to a joint/cartilage problem rather than a nerve or muscle problem.

Most Likely Causes

1. Osteochondral Lesion of the Talus (OLT) - Most Likely Given Your Context

This is the most clinically relevant cause for you specifically. An osteochondral lesion is damage to the cartilage and the bone just beneath it (subchondral bone) on the surface of the talus where it meets the tibia.
Why this matters for you: You already have suspected primary hyperparathyroidism, which causes PTH to constantly pull calcium out of bones. The talus is a high-load bone and its cartilage/subchondral layer can weaken from this systemic bone resorption, making it more vulnerable to lesions - even without a clear injury. The pain is typically:
  • Deep, aching ankle pain
  • Worst after rest (sleep) and eases with movement
  • Sometimes a vague "giving way" or clicking sensation
  • No visible swelling necessarily
Diagnosis requires an MRI or CT scan - plain X-rays often miss it.
"Patients with persistent pain (and sometimes instability) in the ankle following an injury should be suspected of having an osteochondral lesion, with MRI or CT usually required for diagnosis." - Bailey and Love's Short Practice of Surgery, 28th Edition, p. 597

2. Hyperparathyroidism-Related Bone Pain

Your bone pain throughout (which you already mentioned) is directly caused by PTH-driven bone resorption. The talus, being a weight-bearing bone that absorbs enormous impact with every step, is particularly sensitive to this. The pain is typically dull and aching, felt deeply in the bone itself, and is often worse after prolonged rest when the bone has had time to "settle."
This bone pain should improve significantly if and when your hyperparathyroidism is treated (surgery or medication).

3. Synovial/Joint Fluid Changes Overnight

All joints are lubricated by synovial fluid. When you sleep and the ankle is still for hours, this fluid thickens and the joint space becomes less well-lubricated. The first few steps force the fluid to circulate again. In a completely healthy joint this causes no pain, but in a joint with any cartilage damage or inflammation, those first movements hurt until the fluid normalises. This is also why rheumatoid arthritis and osteoarthritis cause prominent morning stiffness.

4. Reactive Arthritis / Inflammatory Arthritis

In young people (especially under 30), ankle joint pain with a morning-stiffness pattern can be the first sign of inflammatory arthritis - conditions like ankylosing spondylitis, psoriatic arthritis, or reactive arthritis. These are worth ruling out especially since you already have a complex systemic picture.

5. Previous Unrecognised Ankle Injury

Even a mild old ankle sprain that didn't fully heal can leave scar tissue or an unnoticed osteochondral chip, which produces exactly this pattern.

What You Should Do

Immediate Steps

  1. Tell your endocrinologist/doctor about this symptom - it adds to the picture of bone involvement and is highly relevant to your hyperparathyroidism workup.
  2. Request an MRI of the ankle - this is the gold-standard test to see the talus cartilage, subchondral bone, and joint. An X-ray will very likely be normal and miss the real cause.
  3. Request blood tests if not already done:
  • ESR and CRP (inflammation markers - rules out inflammatory arthritis)
  • Uric acid (rules out gout, which can affect the ankle)
  • Rheumatoid factor / anti-CCP (if inflammatory arthritis suspected)
  1. Get a DEXA bone scan if you haven't already - your talus pain is another sign your bones may already be affected by PTH.

What Helps Right Now (Before Diagnosis)

  • Before getting out of bed, do 10-15 gentle ankle circles and foot flexion/extension movements while still lying down. This warms up the synovial fluid and reduces the first-step pain significantly.
  • Wear supportive shoes immediately when you get up - avoid barefoot walking on hard floors first thing in the morning.
  • Avoid high-impact activity (running, jumping) until you know what's causing it - if it is an osteochondral lesion, impact can worsen it.
  • Ice the ankle for 10-15 minutes if it aches after walking.
  • NSAIDs (ibuprofen) can help with the morning pain short-term, but given your kidney stone history, use them carefully and not long-term without doctor guidance - NSAIDs can reduce kidney blood flow.

The Key Connection to Your Overall Situation

This is important: your talus pain, bone pain, kidney stones, and high calcium are all potentially part of the same problem - primary hyperparathyroidism causing widespread bone damage. The sooner your PTH is confirmed and treatment started (surgery if confirmed), the sooner the bone-related symptoms should improve. Don't treat the ankle in isolation - treat the root cause.
See a doctor - ideally get an MRI of the ankle and bring up this symptom when you see your endocrinologist.

Is smoking related to this

Finding Sources
Finding Sources
Searching PubMed

smoking hyperparathyroidism calcium PTH bone

Finding Sources
Finding Sources
Searching the Web

smoking effect on parathyroid hormone PTH calcium bone hyperparathyroidism

Good - solid information from peer-reviewed sources. Here is a clear, complete answer:

Is Smoking Related to Your Situation?

The short answer is: yes, in multiple ways - and none of them are in your favour.
Smoking does not directly cause primary hyperparathyroidism (a parathyroid adenoma is the root cause of that). But smoking significantly worsens every single problem you already have - the bone pain, the kidney stones, and the bone damage from hypercalcemia. Here is how:

1. Smoking Disrupts the PTH - Vitamin D Axis

Your parathyroid glands, vitamin D, and calcium all work as a tight feedback loop. Smoking interferes with this system in several ways:
  • Lowers vitamin D levels - Tobacco smoke induces liver enzymes that break down vitamin D faster than normal, leaving you with less of it. Low vitamin D is already a factor that can raise PTH in secondary hyperparathyroidism.
  • Impairs intestinal calcium absorption - Even after adjusting for vitamin D levels, smokers absorb less calcium from their gut. This calcium deficit stresses the parathyroid system further.
  • Directly toxic to parathyroid cells - Research suggests nicotine and tobacco toxins may have a direct suppressive or disruptive effect on parathyroid gland function (Jorde et al., published in Calcified Tissue International).
The result is a dysregulated PTH-vitamin D-calcium axis - exactly the system that is already malfunctioning in your case.

2. Smoking Accelerates Bone Loss

This is the most direct and serious connection for you. Tobacco smoke harms bone through multiple pathways:
  • Damages osteoblasts (the cells that build new bone) while promoting osteoclast activity (the cells that break bone down). In your case, PTH is already driving bone resorption - smoking adds another layer of damage on top.
  • Lowers estrogen and testosterone - Even in young men and women, smoking reduces sex hormone levels. Sex hormones are critical for maintaining bone density. Lower levels = faster bone loss.
  • Increases oxidative stress in bone tissue - Reactive oxygen species from tobacco smoke directly damage bone cell DNA and collagen structure.
  • Reduces bone mineral density (BMD) - Multiple large studies consistently show smokers have significantly lower BMD than non-smokers.
For you specifically, this means: your talus pain and bone pain from hyperparathyroidism are being made worse by smoking. Your bones are being attacked from two directions simultaneously - PTH pulling calcium out, and tobacco damaging the bone-building cells.

3. Smoking and Kidney Stones

The link here is indirect but real:
  • Smoking causes chronic dehydration (nicotine is mildly diuretic and smokers tend to drink less water)
  • Dehydration is the single biggest risk factor for kidney stone formation - it concentrates calcium and oxalate in the urine
  • Smoking also raises urinary oxalate excretion, which contributes to calcium oxalate stone formation
  • Smoking increases urinary calcium in some studies, directly worsening your existing hypercalciuria from hyperparathyroidism

4. Smoking and Wound/Surgical Healing

This matters for your future: if your PTH comes back elevated and you need a parathyroidectomy (which is very likely recommended at your age), smoking significantly:
  • Slows surgical healing
  • Increases infection risk
  • Impairs anaesthesia recovery
  • Increases risk of post-operative complications
Most surgeons will ask you to stop smoking before an elective procedure.

Summary Table

Your ProblemSmoking's Effect
Bone pain (from HPT)Makes it worse - adds a second layer of bone damage
HypercalcemiaDisrupts vitamin D and calcium absorption - worsens the hormonal imbalance
Kidney stonesDehydration + higher urinary oxalate = more stones
Talus/joint painAccelerates cartilage and bone deterioration
Future surgery (parathyroidectomy)Slows healing, raises complication risk

Bottom Line

Smoking did not cause your hyperparathyroidism - a parathyroid adenoma did. But if you smoke, it is making every aspect of your current situation worse and will slow your recovery. Quitting now, before your PTH is confirmed and before any treatment decision, is one of the most impactful things you can do alongside the dietary changes. The bone damage from smoking is partially reversible after quitting, especially at age 25 when your bones still have good regenerative capacity.

What happens if I quit smoking - will my bones recover?

Finding Sources
Searching PubMed

smoking cessation bone mineral density recovery

Searching the Web

quitting smoking bone recovery bone density improvement timeline evidence

Searching PubMed

smoking cessation bone mineral density fracture risk

Reading Web Page

https://www.ncsct.co.uk/library/view/pdf/smoking-and-bone-he…

Here is the full, evidence-based answer - and it is genuinely good news for you at 25:

Will Your Bones Recover After Quitting Smoking?

Yes - and at your age, the recovery potential is better than almost anyone else's.
Here is why, and what the evidence actually shows:

The Critical Age Factor: You're 25

Bone is a living tissue that is constantly being broken down and rebuilt. Your peak bone mass - the maximum bone density your body ever achieves - is reached around age 30. You are 25. You are still in the bone-building window.
This is enormously important. Studies from the National Centre for Smoking Cessation and Training (June 2025) confirm that:
"Bone health is primarily determined by peak bone mass achieved (usually around 30 years of age) and the rate of bone loss in succeeding years."
If you quit now, you still have 5 years of peak bone-building capacity left. Someone who quits at 50 has missed that window entirely. You haven't.

What the Evidence Shows After Quitting

Bone density improves - and relatively quickly

  • Within 6 weeks of quitting: studies show measurable improvement in bone formation markers in the blood (particularly in women, but the cellular mechanism applies to everyone)
  • Within 1 year: bone mineral density (BMD) improvement is measurable on DEXA scans
  • Within 10 years: BMD in ex-smokers sits between that of current smokers and lifelong non-smokers - meaning significant but not always complete recovery
  • Fracture risk drops immediately upon quitting and continues to fall over time
The key finding from multiple longitudinal studies is that ex-smokers have intermediate bone density - better than current smokers, not quite as good as those who never smoked. But the younger you quit, the closer to "never smoked" levels you can get.

Bone loss slows down

Smoking accelerates the rate at which bone is resorbed (broken down) without matching new bone formation. After quitting, this imbalance corrects itself. Your osteoblasts (bone-building cells) that were being suppressed by nicotine start recovering their function.

The Partial Reversibility Principle

It is important to be honest: not all smoking-related bone damage reverses completely. The NCSCT 2025 briefing is clear:
"Several studies have shown that BMD is intermediate between people who currently smoke and people who have never smoked, suggesting that the effects of smoking may be partially reversible."
How much reverses depends on:
FactorYour Situation
Age at quitting25 - excellent, best possible outcome
Years smokedThe fewer pack-years, the more reversible
Nutrition (calcium, vitamin D)You're already working on this via your diet plan
ExerciseWeight-bearing exercise accelerates bone recovery
Underlying conditionTreating your hyperparathyroidism will also help bones recover

The Extra Layer: Your Hyperparathyroidism

Here is what makes your situation unique compared to a healthy smoker trying to quit. You have two things working against your bones right now:
  1. Smoking suppressing bone formation
  2. PTH pulling calcium out of your bones
If you quit smoking AND get your hyperparathyroidism treated, you remove both insults at the same time. Studies on patients who have parathyroidectomy show that bone density increases significantly in the first 1-3 years after surgery - often recovering lost bone. Combined with smoking cessation, your bones at 25 have a genuinely strong chance of reaching near-normal density.
This double recovery effect is specific to your situation and is a real reason for optimism.

How to Maximise Bone Recovery After Quitting

ActionEffect on Bones
Quit smoking completelyStops osteoblast suppression, allows PTH/Vit D axis to normalise
Weight-bearing exercise (walking, light jogging, resistance training)Mechanical stress on bones directly stimulates new bone formation
1,000 mg calcium/day from food (dairy, salmon, kefir)Provides raw material for bone rebuilding
Vitamin D (sun exposure or supplement, doctor-guided)Essential for calcium absorption into bone
Treat hyperparathyroidism (parathyroidectomy if confirmed)Removes the primary driver of bone resorption
Get a DEXA scan nowEstablishes a baseline so you can measure improvement

The Bottom Line

At 25, quitting smoking is one of the most powerful things you can do for your bones - second only to treating the underlying hyperparathyroidism. The bone damage from smoking is substantially reversible at your age, and the combination of quitting + treating your parathyroid condition + good diet + exercise gives your bones an excellent chance of meaningful, measurable recovery over the next 2-5 years.
The evidence is clear: the sooner you quit, the more you recover.

What about boiled eggs

Good question - you're asking whether boiled eggs are good or bad for your situation (hyperparathyroidism, kidney stones, bone health). Here's the straightforward answer:

Boiled Eggs - Are They Good for You?

Yes, boiled eggs are a good food choice for your situation. Here's why:

What Eggs Contain (per 1 large boiled egg)

NutrientAmountRelevance to You
Protein~6 gModerate, safe amount
Calcium~25 mgSmall contribution to daily calcium goal
Phosphorus~86 mgNormal - not excessive
Vitamin D~1 mcgSupports your vitamin D/calcium axis
Vitamin K2Small amountHelps direct calcium into bones, not soft tissue
Sodium~62 mgLow - good for kidney stone prevention
OxalateZeroExcellent - no stone risk

Why Eggs Work Well for Your Specific Conditions

For kidney stones:
  • Eggs contain zero oxalate - this is significant because calcium oxalate is the most common type of kidney stone. Unlike spinach, nuts, or chocolate, eggs pose no oxalate risk whatsoever.
  • They are low in sodium, so they don't drive excess calcium into your urine.
For bone health:
  • Eggs contain vitamin D (small amounts) and vitamin K2, both of which help calcium get deposited into bone rather than floating in blood or landing in kidneys.
  • The protein in eggs supports bone matrix formation - bone isn't just calcium, it needs a collagen protein scaffold.
For hyperparathyroidism:
  • Eggs don't spike serum calcium.
  • They are a clean, unprocessed protein source - far better than processed meats or deli foods which are loaded with sodium.

One Nuance - Protein in Moderation

Large amounts of animal protein (meat, eggs, fish) in one sitting can mildly increase urinary calcium excretion, which adds a small kidney stone risk. But 1-2 boiled eggs per meal is well within the safe range and is actually recommended as part of a kidney-stone-prevention diet. You already have them listed in your meal plan on Day 1 and Day 3 - that's the right approach.

The Yolk vs. White Question

  • Eat the whole egg - the yolk contains all the vitamin D, vitamin K2, and most of the minerals. Egg white alone gives you protein but skips the bone-supportive nutrients.

Bottom line: Boiled eggs are one of the better foods for your situation - zero oxalate, low sodium, bone-supportive vitamins, moderate clean protein. 1-2 per day is ideal. No need to limit or avoid them.

How many is good per day

For your specific situation, 2 eggs per day is the sweet spot.
Here's the reasoning:

Why 2/day Works for You

  • Protein balance - 2 eggs = ~12 g protein. Enough to support bone matrix and muscle without generating excess urinary calcium from high animal protein load.
  • Cholesterol - current evidence (including a 2020 meta-analysis) shows up to 2 eggs/day does not raise cardiovascular risk in healthy people. Beyond 3/day daily, some people see LDL rise.
  • Kidney stones - at 2 eggs/day the urinary calcium impact is negligible, especially if you're drinking your 3 L of water.
  • Vitamin D and K2 intake - 2 yolks/day gives you a meaningful daily contribution of both.

Simple Rule

AmountVerdict
1-2 eggs/dayIdeal
3 eggs/day occasionallyFine
4+ eggs every dayToo much animal protein for your kidney stone history

One Condition

If your doctor checks your LDL cholesterol and it comes back elevated (which can happen with hypercalcemia and parathyroid issues), they may ask you to drop to 1/day. Until then, 2 is the standard recommendation.
Short answer: 2 boiled eggs per day, every day, is perfectly good for you.

Is memory loss an issue herr

Your credits are exhausted. Your daily credits reset tomorrow, or you can purchase a top-up for more.
This is a shared conversation. Sign in to Orris to start your own chat.