Hi orris
I am 23 yr old male , currently in final year of my MBBS , having severe hair fall , which were everytime i take a shower , I am active vollyball player , plays in red soil , so takes bath 2 times , hair fall was started in my 2nd year , but it was profusely hair falling last year from 8 th month , i visited a doctor they wrote investigation like all vitamins and minerals and that came normal , prescribed me PRP but that was expensive for me in medication they gave me Root gain hair growth serum, and keraglow tablet to eat daily , i think they dx me as Androgen male pattern hair baldness as i have familial history of baldness, i shaved my hair and the patch due hair loss have regrowth, and till last 1 month everything was normal, but now it is heavenly hair fall recorded, they added minoxidil 5% , i shaved my hair again as that 30 days hairfall make my scalp vision in occipito-parital juction of my head , my hair was silky and smooth , more volume, less shiney but i was okay with that when I was in 12 th standard, but now it is awful
androgenetic alopecia treatment minoxidil

| What you have | What it does | Evidence |
|---|---|---|
| Minoxidil 5% topical | Prolongs anagen phase, increases follicle size | FDA-approved, strong evidence |
| Root Gain serum | Mostly cosmetic support | Weak evidence |
| Keraglow tablet | Usually biotin/multivitamin combo | Supportive only |
| PRP (recommended, not done) | Releases growth factors locally | Mixed RCT evidence, expensive |
Look i a taking minoxidil + fenestride now
| Timeframe | What happens |
|---|---|
| Weeks 1-8 | Shedding may worsen (minoxidil shed) - normal, don't panic |
| Month 2-3 | Shedding slows down |
| Month 4-6 | Fine vellus regrowth appears, often not visible to naked eye yet |
| Month 6-12 | Noticeable thickening and density improvement |
| 12+ months | Best results seen |
Let me clarify now , i am taking minoxidil fenestride combo topically on scalp and taking keraglow tab too , i am mastrubating too , and think the cart you show the temporal patch on 4a like and frontal also but not so deep , tell me what to do in simple , elaborate, step wise with details, now you everything personlise me to stop hairfall , and give me details products suggestions and its uses to me , give me routine care of hair like what shampoo to apply when to apply, like I like to wash my hair daily so which shampoo will help , then what to apply to scalp , then what to carry , tell me everything in detail stepwise, and easily manner
best shampoo for androgenetic alopecia on minoxidil finasteride daily wash ketoconazole 2026
minoxidil topical application timing after shampoo how long wait scalp routine AGA
| Day | Shampoo (Morning Bath) | Shampoo (Evening Bath) |
|---|---|---|
| Mon | Ketoconazole 2% (Nizoral/Ketomac) | Mild sulfate-free |
| Tue | Mild sulfate-free | Mild sulfate-free |
| Wed | Mild sulfate-free | Mild sulfate-free |
| Thu | Ketoconazole 2% | Mild sulfate-free |
| Fri | Mild sulfate-free | Mild sulfate-free |
| Sat | Ketoconazole 2% | Mild sulfate-free |
| Sun | Mild sulfate-free | Mild sulfate-free |
| Product | What it is | Where to get | Cost approx |
|---|---|---|---|
| Nizoral 2% / Ketomac shampoo | Ketoconazole shampoo | Pharmacy / 1mg / Amazon | ₹150-300 |
| Sebamed Anti-Hair Fall / Dove Men+ Thickening | Daily mild shampoo | Amazon / D-Mart | ₹200-400 |
| Your combo topical (minoxidil+finasteride) | Already prescribed | Pharmacy | Per prescription |
| Keraglow tablets | Already taking | Pharmacy | Per prescription |
| Wide-tooth comb | For wet hair detangling | Any store | ₹50 |
| Soft microfiber towel | Less friction on wet hair | Amazon | ₹200-400 |
Now (Month 0) → Shedding phase (scary but normal)
Month 2 → Shedding slows
Month 3-4 → Fine vellus regrowth appears on shaved scalp
Month 6 → Visible density increase in vertex patch
Month 9-12 → Best response to minoxidil + finasteride combo
Year 2+ → Maintenance phase - keep taking, keep applying
Create a pdf of all of this chat for my future reference and quick review at the end which i can easily see and follow further,like I don't need to read everytime by going back
ls -la /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace
mkdir -p /home/daytona/workspace/hair-care-guide && python3 -c "import reportlab…
~/hair-care-guide/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak, KeepTogether)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
from reportlab.lib.colors import HexColor
OUTPUT = "/home/daytona/workspace/hair-care-guide/Hair_Care_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_NAVY = HexColor("#1A2E4A")
TEAL = HexColor("#0F7173")
LIGHT_TEAL = HexColor("#E6F4F4")
ORANGE = HexColor("#E8713C")
LIGHT_ORANGE= HexColor("#FDF0EA")
GRAY_BG = HexColor("#F4F6F8")
GRAY_TEXT = HexColor("#555555")
WHITE = colors.white
BLACK = colors.black
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="AGA Hair Care Guide – Personal Reference",
author="Orris Medical AI"
)
W, H = A4
styles = getSampleStyleSheet()
# ── Custom styles ────────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
COVER_TITLE = S("CoverTitle", fontName="Helvetica-Bold", fontSize=28, textColor=WHITE, alignment=TA_CENTER, leading=36)
COVER_SUB = S("CoverSub", fontName="Helvetica", fontSize=14, textColor=HexColor("#CCE8E8"), alignment=TA_CENTER, leading=20)
COVER_TAG = S("CoverTag", fontName="Helvetica", fontSize=10, textColor=HexColor("#AADDDD"), alignment=TA_CENTER)
SEC_HEAD = S("SecHead", fontName="Helvetica-Bold", fontSize=15, textColor=WHITE, alignment=TA_LEFT, leading=20,
backColor=DARK_NAVY, borderPad=(6,4,6,8), leftIndent=0)
SUB_HEAD = S("SubHead", fontName="Helvetica-Bold", fontSize=12, textColor=DARK_NAVY, alignment=TA_LEFT, leading=16, spaceAfter=4)
BODY = S("Body", fontName="Helvetica", fontSize=10, textColor=HexColor("#333333"), alignment=TA_JUSTIFY, leading=15, spaceAfter=4)
BODY_BOLD = S("BodyBold", fontName="Helvetica-Bold", fontSize=10, textColor=HexColor("#333333"), alignment=TA_LEFT, leading=15)
CAPTION = S("Caption", fontName="Helvetica-Oblique", fontSize=8.5, textColor=GRAY_TEXT, alignment=TA_CENTER, leading=12)
CALLOUT = S("Callout", fontName="Helvetica-Bold", fontSize=10, textColor=DARK_NAVY, alignment=TA_CENTER, leading=14,
backColor=LIGHT_TEAL, borderPad=6)
WARN = S("Warn", fontName="Helvetica-Bold", fontSize=10, textColor=HexColor("#8B0000"), alignment=TA_LEFT, leading=14,
backColor=HexColor("#FFF0F0"), borderPad=5)
STEP_NUM = S("StepNum", fontName="Helvetica-Bold", fontSize=22, textColor=TEAL, alignment=TA_CENTER, leading=26)
STEP_TITLE = S("StepTitle", fontName="Helvetica-Bold", fontSize=13, textColor=DARK_NAVY, alignment=TA_LEFT, leading=18)
FOOTER_STYLE = S("Footer", fontName="Helvetica", fontSize=8, textColor=GRAY_TEXT, alignment=TA_CENTER)
PAGE_NUM = S("PageNum", fontName="Helvetica-Bold", fontSize=9, textColor=TEAL, alignment=TA_CENTER)
# ── Helpers ──────────────────────────────────────────────────────────────────
def hr(color=TEAL, thickness=1.2):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=8, spaceBefore=4)
def space(h=0.3):
return Spacer(1, h*cm)
def section_header(text):
# coloured banner
data = [[Paragraph(text, S("sh_inner", fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, alignment=TA_LEFT, leading=18))]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_NAVY),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4]),
]))
return t
def info_box(text, bg=LIGHT_TEAL, border=TEAL):
data = [[Paragraph(text, S("ib", fontName="Helvetica", fontSize=10, textColor=DARK_NAVY,
alignment=TA_LEFT, leading=14))]]
t = Table(data, colWidths=[W - 3.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 1.5, border),
("ROUNDEDCORNERS", [4]),
]))
return t
def step_block(num, title, body_lines):
"""Numbered step card."""
left_data = [[Paragraph(str(num), STEP_NUM)]]
left_table = Table(left_data, colWidths=[1.4*cm])
left_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_TEAL),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
right_content = [Paragraph(title, STEP_TITLE)]
for line in body_lines:
right_content.append(Paragraph(line, BODY))
from reportlab.platypus import KeepTogether
right_data = [[p] for p in right_content]
right_table = Table([[p] for p in right_content], colWidths=[W - 3.6*cm - 1.8*cm])
right_table.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING", (0,0), (-1,-1), 2),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
outer = Table([[left_table, right_table]], colWidths=[1.6*cm, W - 3.6*cm - 1.6*cm])
outer.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GRAY_BG),
("BOX", (0,0), (-1,-1), 1, TEAL),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
("VALIGN", (0,0), (-1,-1), "TOP"),
("ROUNDEDCORNERS", [4]),
]))
return outer
# ── Page numbering ───────────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# footer line
canvas.setStrokeColor(TEAL)
canvas.setLineWidth(0.5)
canvas.line(1.8*cm, 1.5*cm, W - 1.8*cm, 1.5*cm)
canvas.setFont("Helvetica", 8)
canvas.setFillColor(GRAY_TEXT)
canvas.drawCentredString(W/2, 1.2*cm, "Personal Hair Care Reference | Prepared by Orris Medical AI | Confidential")
canvas.setFillColor(TEAL)
canvas.setFont("Helvetica-Bold", 9)
canvas.drawRightString(W - 1.8*cm, 1.2*cm, f"Page {doc.page}")
canvas.restoreState()
# ════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────────────────
cover_data = [[
Paragraph("🧬 AGA Hair Care Guide", S("ct2", fontName="Helvetica-Bold", fontSize=26,
textColor=WHITE, alignment=TA_CENTER, leading=32)),
Paragraph("Your Personal Hair Loss Management Reference", S("cs2", fontName="Helvetica",
fontSize=13, textColor=HexColor("#AADDDD"), alignment=TA_CENTER, leading=18)),
Paragraph("23-Year-Old Male • MBBS Final Year • Type III-IV Vertex AGA", S("cs3",
fontName="Helvetica", fontSize=10, textColor=HexColor("#CCE8E8"), alignment=TA_CENTER)),
Paragraph("Current Treatment: Topical Minoxidil + Finasteride Combo | Keraglow Tablet", S("cs4",
fontName="Helvetica-Oblique", fontSize=10, textColor=HexColor("#CCE8E8"), alignment=TA_CENTER)),
Paragraph("Prepared: May 2026", S("cs5", fontName="Helvetica", fontSize=9,
textColor=HexColor("#99BBBB"), alignment=TA_CENTER)),
]]
# Build cover as one tall coloured block
cover_items = [
space(3),
Paragraph("🧬 AGA Hair Care Guide", S("cth", fontName="Helvetica-Bold", fontSize=28,
textColor=WHITE, alignment=TA_CENTER, leading=36)),
space(0.4),
Paragraph("Your Personal Hair Loss Management Reference", S("csh", fontName="Helvetica",
fontSize=15, textColor=HexColor("#AADDDD"), alignment=TA_CENTER, leading=22)),
space(0.8),
hr(HexColor("#AADDDD"), 0.8),
space(0.5),
Paragraph("Patient Profile", S("clab", fontName="Helvetica-Bold", fontSize=11,
textColor=HexColor("#CCE8E8"), alignment=TA_CENTER)),
space(0.2),
]
profile_data = [
["Age", "23 years", "Gender", "Male"],
["Status", "MBBS Final Year", "Sport", "Volleyball (Red Soil)"],
["Diagnosis", "AGA Type III-IV Vertex", "Family Hx", "Positive (Both sides)"],
["Treatment", "Topical Minoxidil + Finasteride", "Supplement", "Keraglow tablet"],
]
profile_table = Table(profile_data, colWidths=[3.2*cm, 5.2*cm, 3.2*cm, 5.2*cm])
profile_table.setStyle(TableStyle([
("FONTNAME", (0,0), (-1,-1), "Helvetica"),
("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"),
("FONTNAME", (2,0), (2,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("TEXTCOLOR", (0,0), (-1,-1), WHITE),
("TEXTCOLOR", (0,0), (0,-1), HexColor("#AADDDD")),
("TEXTCOLOR", (2,0), (2,-1), HexColor("#AADDDD")),
("BACKGROUND", (0,0), (-1,-1), HexColor("#1A3A5A")),
("ROWBACKGROUNDS", (0,0), (-1,-1), [HexColor("#1A3A5A"), HexColor("#1E4060")]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#2A5A7A")),
]))
cover_items.append(profile_table)
cover_items.append(space(1.5))
cover_items.append(Paragraph("⚠ This document is for personal reference only. Always follow your dermatologist's advice.",
S("disc", fontName="Helvetica-Oblique", fontSize=8.5, textColor=HexColor("#99BBBB"), alignment=TA_CENTER)))
cover_items.append(PageBreak())
story.extend(cover_items)
# ── 1. UNDERSTANDING YOUR CONDITION ─────────────────────────────────────────
story.append(section_header("1. Understanding Your Condition"))
story.append(space(0.3))
story.append(Paragraph("What is AGA?", SUB_HEAD))
story.append(Paragraph(
"Androgenetic Alopecia (AGA) is a genetic, androgen-driven condition where the enzyme "
"<b>5α-reductase</b> converts testosterone to <b>DHT (dihydrotestosterone)</b>. "
"DHT binds to androgen receptors in genetically sensitive follicles, causing them to "
"<b>miniaturize</b> - shrinking from thick terminal hairs into fine, colorless vellus hairs "
"over repeated cycles. The stem cells in your follicle bulge are intact (that is why you "
"get regrowth after shaving), but the progenitor cells that actually produce the hair shaft are "
"being depleted by DHT.", BODY))
story.append(space(0.2))
story.append(info_box(
"🧬 Your genetics: The androgen receptor (AR) gene on chromosome Xq11-12 is the main "
"determinant. You have positive family history on both sides - this is a polygenic pattern. "
"This is NOT caused by masturbation, stress, diet deficiency (your labs were normal), or bathing frequency.", LIGHT_TEAL, TEAL))
story.append(space(0.3))
story.append(Paragraph("Your Pattern - Norwood Classification", SUB_HEAD))
story.append(Paragraph(
"Based on your description (scalp visible at occipito-parietal junction + frontal/temporal thinning), "
"you are approximately at <b>Norwood Type III Vertex / Type IV</b>. This is significant for age 23 "
"but still in a stage where aggressive early treatment can preserve a lot of follicles.", BODY))
story.append(space(0.2))
# Norwood quick reference table
norwood_data = [
["Type", "Description", "Your Status"],
["I", "Normal hairline, no recession", ""],
["II", "Slight recession at temples", ""],
["III", "Deeper recession, vertex thinning begins", ""],
["III Vertex", "Prominent vertex (crown) patch + mild frontal", "← Likely YOU"],
["IV", "Larger vertex + frontal recession", "← Possible YOU"],
["V-VII", "Extensive baldness", "Not yet"],
]
n_table = Table(norwood_data, colWidths=[3*cm, 9.5*cm, 4.5*cm])
n_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("BACKGROUND", (0,4), (-1,5), HexColor("#E6F4F4")),
("FONTNAME", (0,4), (-1,5), "Helvetica-Bold"),
("TEXTCOLOR", (2,4), (2,5), TEAL),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(n_table)
story.append(space(0.5))
# ── 2. YOUR TREATMENT EXPLAINED ─────────────────────────────────────────────
story.append(section_header("2. Your Treatment Explained"))
story.append(space(0.3))
tx_data = [
["Treatment", "How It Works", "How Long to See Results"],
["Topical Minoxidil 5%\n+ Finasteride combo", "Minoxidil: Opens KATP channels, prolongs anagen phase, increases follicle size.\nFinasteride: Blocks 5α-reductase type II, cuts DHT by ~70%", "6-12 months"],
["Keraglow Tablet", "Biotin, zinc, amino acids - supports hair shaft structure and growth.", "Supportive - ongoing"],
]
tx_table = Table(tx_data, colWidths=[5*cm, 8.5*cm, 3.5*cm])
tx_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tx_table)
story.append(space(0.3))
story.append(info_box(
"⚡ IMPORTANT - The Current Shedding You Are Experiencing:\n"
"The 'heavenly hair fall' right now is almost certainly the <b>Minoxidil Early Shed Phase</b>. "
"When minoxidil is started, it forces resting (telogen) hairs out simultaneously so new anagen "
"hairs can grow. It looks terrifying but is a sign the drug is working. "
"This peaks at Week 4-6 and resolves by Week 8-12. <b>DO NOT STOP MINOXIDIL.</b>", LIGHT_ORANGE, ORANGE))
story.append(space(0.4))
story.append(Paragraph("Treatment Timeline - What to Expect", SUB_HEAD))
timeline_data = [
["Phase", "Timeframe", "What Happens", "Action"],
["Shed Phase", "Week 1-8", "Heavy shedding - looks scary", "Stay calm, continue treatment"],
["Transition", "Month 2-3", "Shedding slows significantly", "Keep going"],
["Early Regrowth", "Month 3-5", "Fine vellus regrowth on scalp, barely visible", "Monthly photos"],
["Visible Results", "Month 6-9", "Noticeable density + thickening", "Review with dermatologist"],
["Best Results", "Month 12-18", "Maximum response", "Continue maintenance"],
["Maintenance", "Year 2+", "Results maintained ONLY if continued", "Never stop without Dr advice"],
]
tl_table = Table(timeline_data, colWidths=[3*cm, 3*cm, 6*cm, 5*cm])
tl_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("BACKGROUND", (0,1), (-1,2), HexColor("#FFF0F0")),
("BACKGROUND", (0,4), (-1,5), HexColor("#E6F4F4")),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tl_table)
story.append(PageBreak())
# ── 3. DAILY HAIR CARE ROUTINE ───────────────────────────────────────────────
story.append(section_header("3. Your Daily Hair Care Routine"))
story.append(space(0.3))
story.append(info_box(
"You bathe TWICE daily (volleyball + red soil). That is fine and necessary. "
"The key is using the right products and the right sequence.", LIGHT_TEAL, TEAL))
story.append(space(0.4))
story.append(Paragraph("☀ MORNING ROUTINE (Before or After Morning Sports)", SUB_HEAD))
story.append(space(0.1))
steps_morning = [
("1", "Shampoo (See shampoo schedule below)",
["Wet hair fully with lukewarm/cool water (NOT hot).",
"Apply shampoo to scalp - not hair strands.",
"On Ketoconazole days: leave on scalp 3-5 minutes before rinsing.",
"Massage gently with FINGERTIPS in circular motion - NOT nails, NOT aggressive.",
"Rinse thoroughly. Pat dry with soft towel - do NOT rub."]),
("2", "Air Dry Completely",
["Wait 30-40 minutes naturally OR use cool setting on hair dryer.",
"NEVER apply minoxidil to wet/damp scalp - it dilutes the product and kills absorption.",
"Scalp must be bone dry before next step."]),
("3", "Apply Topical Minoxidil + Finasteride Combo",
["Part hair to expose your affected areas: vertex (crown/back) + frontal/temporal hairline.",
"Use dropper/applicator: apply directly to SCALP SKIN, not hair.",
"Use 1 mL per application (check dropper markings).",
"Gently spread with fingertips across the two affected zones.",
"WASH HANDS IMMEDIATELY after - minoxidil absorbed through hands causes unwanted body hair.",
"Do NOT wash hair, sweat heavily, or wear helmet for at least 4 hours after.",
"Let it air dry on scalp (10-15 min) before going out."]),
("4", "Take Keraglow Tablet",
["Take with breakfast or after morning meal.",
"Always take with food to avoid nausea and improve absorption."]),
]
for num, title, lines in steps_morning:
story.append(step_block(num, title, lines))
story.append(space(0.25))
story.append(space(0.4))
story.append(Paragraph("🌙 EVENING ROUTINE (After Sports / Red Soil Session)", SUB_HEAD))
story.append(space(0.1))
steps_evening = [
("1", "Rinse / Mild Shampoo (Second Bath)",
["Use MILD sulfate-free shampoo only (not ketoconazole twice in one day).",
"Quick gentle wash - 1-2 minutes. Rinse well with cool water.",
"Pat dry gently with soft towel."]),
("2", "Air Dry Completely",
["Same as morning - 30-40 minutes natural air dry or cool blow dry.",
"Do not rush this step."]),
("3", "Second Application of Topical Minoxidil + Finasteride",
["Apply exactly as morning routine.",
"Space morning and evening application by at least 8 hours (your routine naturally achieves this).",
"If your product is prescribed once-daily, SKIP this step and only apply in the morning."]),
]
for num, title, lines in steps_evening:
story.append(step_block(num, title, lines))
story.append(space(0.25))
story.append(PageBreak())
# ── 4. SHAMPOO SCHEDULE ──────────────────────────────────────────────────────
story.append(section_header("4. Weekly Shampoo Schedule"))
story.append(space(0.3))
shampoo_data = [
["Day", "Morning Bath Shampoo", "Evening Bath Shampoo"],
["Monday", "✅ Ketoconazole 2% (Nizoral / Ketomac)", "Mild sulfate-free"],
["Tuesday", "Mild sulfate-free", "Mild sulfate-free"],
["Wednesday", "Mild sulfate-free", "Mild sulfate-free"],
["Thursday", "✅ Ketoconazole 2%", "Mild sulfate-free"],
["Friday", "Mild sulfate-free", "Mild sulfate-free"],
["Saturday", "✅ Ketoconazole 2%", "Mild sulfate-free"],
["Sunday", "Mild sulfate-free", "Mild sulfate-free"],
]
sh_table = Table(shampoo_data, colWidths=[3.5*cm, 8.5*cm, 5*cm])
sh_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("BACKGROUND", (0,1), (-1,1), LIGHT_TEAL),
("BACKGROUND", (0,4), (-1,4), LIGHT_TEAL),
("BACKGROUND", (0,6), (-1,6), LIGHT_TEAL),
("FONTNAME", (1,1), (1,1), "Helvetica-Bold"),
("FONTNAME", (1,4), (1,4), "Helvetica-Bold"),
("FONTNAME", (1,6), (1,6), "Helvetica-Bold"),
("TEXTCOLOR", (1,1), (1,1), TEAL),
("TEXTCOLOR", (1,4), (1,4), TEAL),
("TEXTCOLOR", (1,6), (1,6), TEAL),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(sh_table)
story.append(space(0.3))
story.append(Paragraph("Use ketoconazole 3× per week. Every other wash = mild shampoo.",
S("note", fontName="Helvetica-Oblique", fontSize=9, textColor=GRAY_TEXT, alignment=TA_CENTER)))
story.append(space(0.5))
story.append(Paragraph("How to Use Ketoconazole Shampoo (Key Points)", SUB_HEAD))
keto_points = [
"Apply to WET scalp and hair.",
"Leave on scalp for <b>3-5 minutes</b> - do not rinse immediately.",
"Rinse thoroughly with cool/lukewarm water.",
"You ONLY need it on scalp - not necessarily through entire hair length.",
"WHY it helps: Has anti-androgenic DHT-blocking properties at scalp level + reduces inflammation. Synergizes with your finasteride+minoxidil combo.",
]
for p in keto_points:
story.append(Paragraph(f"• {p}", BODY))
story.append(space(0.5))
# ── 5. PRODUCT LIST ──────────────────────────────────────────────────────────
story.append(section_header("5. Product List (India-Available)"))
story.append(space(0.3))
prod_data = [
["Product", "Purpose", "Brand Options", "Cost (approx)", "Priority"],
["Ketoconazole 2%\nShampoo", "Anti-DHT + anti-inflammatory scalp", "Nizoral, Ketomac,\nScalpe+", "₹150-300", "MUST HAVE"],
["Mild Sulfate-Free\nDaily Shampoo", "Gentle daily cleanse", "Sebamed Anti-Hair Fall,\nDove Men+ Thickening,\nBiotique Bio Kelp", "₹200-400", "MUST HAVE"],
["Soft Microfiber\nTowel", "Less friction/breakage on\nwet hair", "Any brand", "₹200-400", "RECOMMENDED"],
["Wide-Tooth\nComb", "Detangle wet hair gently", "Any brand", "₹50", "RECOMMENDED"],
["Derma Roller\n0.5mm", "Microneedling - enhances\nminoxidil absorption by ~3x", "Any medical-grade\n(Amazon)", "₹200-500", "OPTIONAL\n(High value)"],
["Rosemary Oil\n(diluted)", "Some RCT evidence for hair\ndensity when applied to scalp", "Mix 1:10 in jojoba\nor coconut oil", "₹100-300", "OPTIONAL"],
]
pr_table = Table(prod_data, colWidths=[3.5*cm, 4.5*cm, 4*cm, 2.8*cm, 2.7*cm])
pr_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("BACKGROUND", (4,1), (4,2), HexColor("#E6F4F4")),
("BACKGROUND", (4,3), (4,4), GRAY_BG),
("BACKGROUND", (4,5), (4,6), HexColor("#FFF8E8")),
("FONTNAME", (4,1), (4,2), "Helvetica-Bold"),
("TEXTCOLOR", (4,1), (4,2), TEAL),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(pr_table)
story.append(space(0.4))
story.append(info_box(
"💊 OPTIONAL - Discuss with your dermatologist:\n"
"• <b>Derma roller 0.5mm</b> once a week before Sunday evening minoxidil: Roll gently over affected "
"areas to create micro-channels → dramatically boosts minoxidil absorption. Clean with alcohol before/after.\n"
"• <b>Low-Level Laser Therapy (LLLT) cap</b>: FDA-cleared device, can complement your regimen. "
"Used 3x/week. Not needed right now but is an option if results plateau.", LIGHT_ORANGE, ORANGE))
story.append(PageBreak())
# ── 6. THINGS TO STOP ────────────────────────────────────────────────────────
story.append(section_header("6. Things to STOP Doing Immediately"))
story.append(space(0.3))
stop_items = [
("❌ Hot water for hair wash", "Hot water strips scalp oils, increases inflammation, and worsens scalp sensitivity. Always lukewarm or cool."),
("❌ Heavy overnight oil massages", "Coconut oil, mustard oil sitting overnight clogs follicles and worsens scalp inflammation. If you use oil, apply 1 hour before wash max."),
("❌ Aggressive towel rubbing", "Wet hair is fragile. Rubbing causes breakage and mechanical trauma to already-sensitive follicles."),
("❌ Harsh SLS shampoos daily", "Head & Shoulders Classic, Pantene with SLS - drying for daily use. Switch to mild sulfate-free for daily."),
("❌ Tight helmets right after minoxidil", "Wait at least 1-2 hours after applying minoxidil before wearing a helmet. Smearing = less absorption."),
("❌ Alcohol-based hair gels/wax on scalp", "Drying, inflammatory. Keep styling products off your scalp. Hair only."),
("❌ Stopping minoxidil suddenly", "Acute telogen efflux happens 3-4 months after stopping - you lose everything gained. Never stop without dermatologist guidance."),
("❌ Worrying about masturbation", "Has NO effect on hair loss. Testosterone fluctuations are transient and clinically irrelevant to AGA. Stop worrying about this."),
]
for item, desc in stop_items:
data = [[Paragraph(item, S("st", fontName="Helvetica-Bold", fontSize=10, textColor=HexColor("#8B0000"))),
Paragraph(desc, BODY)]]
t = Table(data, colWidths=[5.5*cm, W - 3.6*cm - 5.5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), HexColor("#FFF5F5")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, HexColor("#FFAAAA")),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(space(0.15))
story.append(PageBreak())
# ── 7. TRACKING YOUR PROGRESS ────────────────────────────────────────────────
story.append(section_header("7. How to Track Your Progress"))
story.append(space(0.3))
story.append(Paragraph(
"This is the part most people skip - and then they either stop treatment prematurely or can't tell if it's working. Do this:", BODY))
story.append(space(0.2))
track_data = [
["What to Track", "How to Do It", "When"],
["Scalp photos", "Same spot, same overhead light (bathroom tubelight), same camera distance. Take crown + frontal shots.", "Every 4 weeks"],
["Shed count (rough)", "After shower, collect shed hair on the drain guard. Count roughly. >150/day in first 6 weeks = normal minoxidil shed.", "Daily, Week 1-8"],
["Texture/quality", "Note if hair feels thicker, less breakage, more volume - these are early signs before visible density", "Monthly"],
["Side effects", "Note any scalp irritation, headache, ankle swelling (minoxidil) or sexual dysfunction, low mood (finasteride)", "Ongoing"],
["Weight", "Rare - minoxidil can cause ankle edema. Note any unusual swelling.", "Monthly"],
]
tr_table = Table(track_data, colWidths=[4.5*cm, 8.5*cm, 4*cm])
tr_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), TEAL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(tr_table)
story.append(space(0.4))
story.append(info_box(
"📸 Pro tip: Use your smartphone. Every 4 weeks, same Sunday morning, same bathroom, same angle. "
"Keep them in one folder. When you feel discouraged (you will around Month 2), compare to Month 0 photo. "
"Progress is ALWAYS slower than you think when you see yourself every day.", LIGHT_TEAL, TEAL))
story.append(space(0.5))
# ── 8. SIDE EFFECTS TO WATCH ─────────────────────────────────────────────────
story.append(section_header("8. Side Effects to Watch For"))
story.append(space(0.3))
se_data = [
["Drug", "Side Effect", "How Common", "What to Do"],
["Minoxidil\n(Topical)", "Scalp irritation, dryness, flaking", "Common (5-10%)", "Switch to minoxidil foam (no propylene glycol). Tell dermatologist."],
["Minoxidil\n(Topical)", "Unwanted facial hair (cheeks, forehead)", "Uncommon", "Avoid getting product on face. Wash hands immediately."],
["Minoxidil\n(Topical)", "Headache, ankle edema", "Rare", "Tell dermatologist. Dose adjustment may be needed."],
["Finasteride\n(Topical)", "Decreased libido, erectile dysfunction", "Rare with topical (<1-2%)", "Tell dermatologist IMMEDIATELY. Do not tough it out silently."],
["Finasteride\n(Topical)", "Low mood / depression", "Very rare", "Tell dermatologist. Stop if significant."],
["Keraglow", "Nausea (if not taken with food)", "Occasional", "Always take with food."],
]
se_table = Table(se_data, colWidths=[3*cm, 4.5*cm, 3*cm, 6.5*cm])
se_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#CCDDDD")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("BACKGROUND", (2,3), (2,4), HexColor("#FFF0F0")),
]))
story.append(se_table)
story.append(PageBreak())
# ── 9. QUICK REFERENCE CARD ──────────────────────────────────────────────────
story.append(section_header("9. Quick Reference Card (Cut This Out / Screenshot)"))
story.append(space(0.3))
# Quick card - daily checklist
qr_left = [
["☀ MORNING CHECKLIST"],
["☐ Cool/lukewarm shower"],
["☐ Ketoconazole OR mild shampoo (see schedule)"],
["☐ Gentle fingertip scalp massage while washing"],
["☐ Pat dry - no rubbing"],
["☐ Wait 30-40 min (fully dry)"],
["☐ Apply minoxidil+finasteride combo to DRY scalp"],
["☐ Wash hands after application"],
["☐ Wait 4 hours before any wash/sweat"],
["☐ Take Keraglow with breakfast"],
]
qr_right = [
["🌙 EVENING CHECKLIST"],
["☐ Post-sports shower"],
["☐ Mild shampoo only (no ketoconazole again)"],
["☐ Pat dry gently"],
["☐ Wait 30-40 min (fully dry)"],
["☐ Apply minoxidil+finasteride (if 2x/day prescribed)"],
["☐ Wash hands after application"],
["", ],
["", ],
["", ],
]
def mini_card(rows, header_bg):
t = Table(rows, colWidths=[(W - 3.6*cm)/2 - 0.3*cm])
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 11),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 9.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_BG]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("BOX", (0,0), (-1,-1), 1.5, header_bg),
("GRID", (0,1), (-1,-1), 0.3, HexColor("#DDDDDD")),
]
t.setStyle(TableStyle(style))
return t
cards = Table([[mini_card(qr_left, TEAL), mini_card(qr_right, DARK_NAVY)]],
colWidths=[(W - 3.6*cm)/2, (W - 3.6*cm)/2])
cards.setStyle(TableStyle([
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
story.append(cards)
story.append(space(0.5))
# Weekly reminder
story.append(Paragraph("⚠ Never-Forget Rules", SUB_HEAD))
never_data = [
["NEVER", "Stop minoxidil suddenly - massive shed happens 3-4 months later"],
["NEVER", "Apply minoxidil to wet/damp scalp"],
["NEVER", "Skip finasteride - it is a daily long-term drug, not as-needed"],
["NEVER", "Judge results before 6 months"],
["NEVER", "Use hot water to wash hair"],
["ALWAYS", "Wash hands immediately after applying minoxidil"],
["ALWAYS", "Take Keraglow with food"],
["ALWAYS", "Take monthly scalp photos for comparison"],
["ALWAYS", "Tell your dermatologist about any sexual side effects from finasteride"],
]
nf_table = Table(never_data, colWidths=[2.5*cm, W - 3.6*cm - 2.5*cm])
nf_table.setStyle(TableStyle([
("FONTNAME", (0,0), (-1,-1), "Helvetica"),
("FONTSIZE", (0,0), (-1,-1), 10),
("FONTNAME", (0,0), (0,4), "Helvetica-Bold"),
("FONTNAME", (0,5), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,0), (0,4), HexColor("#CC0000")),
("TEXTCOLOR", (0,5), (0,-1), TEAL),
("BACKGROUND", (0,0), (-1,4), HexColor("#FFF5F5")),
("BACKGROUND", (0,5), (-1,-1), LIGHT_TEAL),
("GRID", (0,0), (-1,-1), 0.5, HexColor("#DDDDDD")),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
story.append(nf_table)
story.append(space(0.5))
# Big picture timeline visual
story.append(Paragraph("📅 Your 18-Month Journey at a Glance", SUB_HEAD))
journey_data = [
["Now\nMonth 0", "Month 1-2", "Month 3-4", "Month 5-6", "Month 9-12", "Month 12-18+"],
["Start Minox\n+ Fin combo.\nShedding begins.",
"Heavy shed.\nScary. Normal.\nDo NOT stop.",
"Shed slows.\nFine vellus\nregrowth starts.",
"Visible\nthickening\nbegins.",
"Dermatologist\nreview.\nBest visible\nresults.",
"Maintenance.\nNever stop\nwithout advice."],
]
jt = Table(journey_data, colWidths=[(W - 3.6*cm)/6]*6)
jt.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [LIGHT_TEAL]),
("BACKGROUND", (0,1), (1,1), HexColor("#FFF0F0")),
("GRID", (0,0), (-1,-1), 0.8, TEAL),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
]))
story.append(jt)
story.append(space(0.5))
# ── FINAL DISCLAIMER ─────────────────────────────────────────────────────────
story.append(hr(GRAY_TEXT, 0.5))
story.append(Paragraph(
"This guide is a personal reference based on your clinical history and evidence-based dermatology sources "
"(Dermatology 2-Volume Set 5e, Goldman-Cecil Medicine). It does not replace your dermatologist's advice. "
"Always consult your treating physician for dose changes, new symptoms, or treatment modifications. "
"Prepared by Orris Medical AI | May 2026.",
S("disc2", fontName="Helvetica-Oblique", fontSize=8, textColor=GRAY_TEXT, alignment=TA_CENTER, leading=12)))
# ── BUILD PDF ─────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")