21 yo girl has acne scars on face from when she had acne in teenage also has a lot of black heads on nose even after face masks and has a lot of open pore and oily skin what all shout she do and use
acne scars blackheads open pores oily skin treatment skincare routine 2024 dermatologist
https://www.mayoclinic.org/diseases-conditions/acne/expert-a…
retinol niacinamide AHA BHA acne scars open pores blackheads oily skin routine dermatologist 2025
| Step | What to Use | Why |
|---|---|---|
| 1. Cleanser | Gentle, low-pH, non-stripping gel cleanser (e.g. CeraVe Foaming, La Roche-Posay Effaclar Gel) | Removes overnight oil without disrupting barrier |
| 2. Toner (optional) | Alcohol-free BHA toner (e.g. Paula's Choice 2% BHA) OR niacinamide toner | Exfoliates inside pores, controls oil |
| 3. Serum | Niacinamide 10% (e.g. The Ordinary, Minimalist) | Reduces oil production, minimizes pore appearance, fades post-acne marks |
| 4. Moisturizer | Oil-free, non-comedogenic gel moisturizer (e.g. Neutrogena Hydro Boost, La Roche-Posay Effaclar Mat) | Critical - skipping it causes rebound oiliness |
| 5. Sunscreen | SPF 50, oil-free, non-comedogenic (e.g. EltaMD UV Clear, La Roche-Posay Anthelios Clear Skin) | Most important step - sun darkens acne scars significantly |
| Step | What to Use | Why |
|---|---|---|
| 1. Double Cleanse | Micellar water or gentle cleansing oil FIRST, then gel cleanser | Fully removes sunscreen + pollution |
| 2. Exfoliant (3x/week) | AHA (Glycolic/Lactic acid) at night OR BHA (Salicylic acid 2%) - alternate, don't use both same night | AHA resurfaces top skin layer (scars), BHA unclogs pores (blackheads) |
| 3. Treatment serum | Retinol (start at 0.025-0.05%, use 2x/week to begin) OR Adapalene 0.1% (OTC, more effective) | Single most important ingredient - speeds cell turnover, rebuilds collagen in scars, clears pores, reduces oil production |
| 4. Moisturizer | Same gentle gel moisturizer, or one with ceramides on retinol nights | Repairs skin barrier, reduces retinol dryness |
| Day | AM | PM |
|---|---|---|
| Mon | Niacinamide serum + SPF | BHA exfoliant (Salicylic acid) |
| Tue | Niacinamide serum + SPF | Retinol/Adapalene + moisturizer |
| Wed | Vitamin C serum + SPF | AHA exfoliant (Glycolic acid) |
| Thu | Niacinamide serum + SPF | Retinol/Adapalene + moisturizer |
| Fri | Niacinamide serum + SPF | BHA exfoliant |
| Sat | Niacinamide serum + SPF | Rest night (just cleanse + moisturize) + clay mask optional |
| Sun | Niacinamide serum + SPF | Retinol/Adapalene + moisturizer |
| Product | Purpose | Approx. Range |
|---|---|---|
| CeraVe Foaming Cleanser | Daily cleanser | Affordable |
| The Ordinary Niacinamide 10% + Zinc 1% | Oil + pores | Very affordable |
| Paula's Choice 2% BHA Liquid | Blackheads | Mid-range |
| Differin Adapalene 0.1% Gel | Scars + pores | Affordable, OTC |
| La Roche-Posay Anthelios Clear Skin SPF 60 | Sunscreen | Mid-range |
| CeraVe PM Moisturizing Lotion | Night moisturizer | Affordable |
Create a printable skincare routine checklist she can follow daily
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace/skincare && echo "created"
mkdir -p /tmp/workspace/skincare && cat > /tmp/workspace/skincare/checklist.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import cm, mm from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.platypus import KeepTogether output_path = "/tmp/workspace/skincare/skincare_checklist.pdf" doc = SimpleDocTemplate( output_path, pagesize=A4, rightMargin=1.8*cm, leftMargin=1.8*cm, topMargin=1.5*cm, bottomMargin=1.5*cm ) # Color palette - soft feminine skincare theme PINK_DARK = colors.HexColor("#C2185B") PINK_MID = colors.HexColor("#E91E63") PINK_LIGHT = colors.HexColor("#FCE4EC") PINK_PALE = colors.HexColor("#FFF0F5") PEACH = colors.HexColor("#FFE0B2") PEACH_LIGHT = colors.HexColor("#FFF8F0") TEAL = colors.HexColor("#00897B") TEAL_LIGHT = colors.HexColor("#E0F2F1") LAVENDER = colors.HexColor("#EDE7F6") LAVENDER_MID= colors.HexColor("#7E57C2") GOLD = colors.HexColor("#F9A825") GREY_LIGHT = colors.HexColor("#F5F5F5") GREY_MID = colors.HexColor("#BDBDBD") WHITE = colors.white DARK = colors.HexColor("#212121") DARK_GREY = colors.HexColor("#424242") styles = getSampleStyleSheet() # Custom styles title_style = ParagraphStyle("title", parent=styles["Normal"], fontSize=22, textColor=PINK_DARK, alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=2, leading=26) subtitle_style = ParagraphStyle("subtitle", parent=styles["Normal"], fontSize=11, textColor=DARK_GREY, alignment=TA_CENTER, fontName="Helvetica", spaceAfter=4, leading=14) section_header_style = ParagraphStyle("sec_header", parent=styles["Normal"], fontSize=13, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=16) step_name_style = ParagraphStyle("step_name", parent=styles["Normal"], fontSize=10, textColor=DARK, fontName="Helvetica-Bold", leading=13) step_detail_style = ParagraphStyle("step_detail", parent=styles["Normal"], fontSize=8.5, textColor=DARK_GREY, fontName="Helvetica", leading=11) tip_style = ParagraphStyle("tip", parent=styles["Normal"], fontSize=8, textColor=TEAL, fontName="Helvetica-Oblique", leading=10) week_header_style = ParagraphStyle("week_header", parent=styles["Normal"], fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=11) week_cell_style = ParagraphStyle("week_cell", parent=styles["Normal"], fontSize=7.5, textColor=DARK_GREY, fontName="Helvetica", alignment=TA_CENTER, leading=10) note_style = ParagraphStyle("note", parent=styles["Normal"], fontSize=8, textColor=DARK_GREY, fontName="Helvetica", leading=11, leftIndent=4) footer_style = ParagraphStyle("footer", parent=styles["Normal"], fontSize=7.5, textColor=GREY_MID, alignment=TA_CENTER, fontName="Helvetica-Oblique") def checkbox_cell(label): return Paragraph(f"☐ {label}", step_name_style) def make_section_header(text, bg_color): header_data = [[Paragraph(text, section_header_style)]] t = Table(header_data, colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg_color), ("ROWPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ("ROUNDEDCORNERS", [6,6,6,6]), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) return t def make_step_row(emoji, step_label, product_hint, tip=None, bg=WHITE): check = Paragraph(f"☐", ParagraphStyle("chk", parent=styles["Normal"], fontSize=14, fontName="Helvetica", textColor=PINK_MID, alignment=TA_CENTER, leading=16)) em = Paragraph(emoji, ParagraphStyle("em", parent=styles["Normal"], fontSize=14, alignment=TA_CENTER, leading=16)) name = Paragraph(f"<b>{step_label}</b>", ParagraphStyle("sn", parent=styles["Normal"], fontSize=9.5, fontName="Helvetica-Bold", textColor=DARK, leading=12)) detail_parts = [name] if product_hint: detail_parts.append(Paragraph(product_hint, step_detail_style)) if tip: detail_parts.append(Paragraph(f"💡 {tip}", tip_style)) from reportlab.platypus import KeepTogether detail_cell = detail_parts row = [[check, em, detail_cell]] t = Table(row, colWidths=[0.8*cm, 0.9*cm, 15.7*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("VALIGN", (0,0), (-1,-1), "TOP"), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (0,0), 4), ("LEFTPADDING", (2,0), (2,0), 6), ("LINEBELOW", (0,0), (-1,-1), 0.5, colors.HexColor("#EEEEEE")), ])) return t # ---- BUILD CONTENT ---- story = [] # ===== TITLE BLOCK ===== title_data = [[ Paragraph("🌸 My Daily Skincare Checklist", title_style), Paragraph("For: Acne Scars · Blackheads · Open Pores · Oily Skin", subtitle_style), ]] title_table = Table([[ Paragraph("🌸 My Daily Skincare Checklist", title_style), ]], colWidths=[17.4*cm]) title_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), PINK_LIGHT), ("TOPPADDING", (0,0), (-1,-1), 12), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 8), ("RIGHTPADDING", (0,0), (-1,-1), 8), ("ROUNDEDCORNERS", [8,8,0,0]), ])) story.append(title_table) sub_table = Table([[ Paragraph("For: Acne Scars · Blackheads · Open Pores · Oily Skin", subtitle_style), ]], colWidths=[17.4*cm]) sub_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), PINK_LIGHT), ("TOPPADDING", (0,0), (-1,-1), 0), ("BOTTOMPADDING", (0,0), (-1,-1), 8), ("LEFTPADDING", (0,0), (-1,-1), 8), ("ROUNDEDCORNERS", [0,0,8,8]), ])) story.append(sub_table) story.append(Spacer(1, 0.3*cm)) # ===== DATE LINE ===== date_data = [[ Paragraph("Date: _____________________________", ParagraphStyle("date", parent=styles["Normal"], fontSize=9, textColor=DARK_GREY, fontName="Helvetica", leading=12)), Paragraph("Week: _____________________________", ParagraphStyle("date", parent=styles["Normal"], fontSize=9, textColor=DARK_GREY, fontName="Helvetica", leading=12, alignment=TA_CENTER)), Paragraph("Mood: 😊 😐 😞", ParagraphStyle("date", parent=styles["Normal"], fontSize=9, textColor=DARK_GREY, fontName="Helvetica", leading=12, alignment=TA_CENTER)), ]] date_table = Table(date_data, colWidths=[6*cm, 6*cm, 5.4*cm]) date_table.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), GREY_LIGHT), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 8), ("LINEBELOW", (0,0), (-1,-1), 0.5, GREY_MID), ])) story.append(date_table) story.append(Spacer(1, 0.4*cm)) # =================================================== # MORNING ROUTINE # =================================================== story.append(make_section_header("☀️ MORNING ROUTINE ( ~5 minutes )", PINK_MID)) story.append(Spacer(1, 0.15*cm)) am_steps = [ ("🧴", "Step 1 — Gentle Gel Cleanser", "e.g. CeraVe Foaming Cleanser / La Roche-Posay Effaclar Gel", "Wash face with lukewarm water. Pat dry — don't rub.", PINK_PALE), ("✨", "Step 2 — Niacinamide Serum (10%)", "e.g. The Ordinary Niacinamide 10% + Zinc / Minimalist", "Controls oil, shrinks pore appearance, fades dark marks. Apply 2-3 drops evenly.", PEACH_LIGHT), ("💧", "Step 3 — Oil-Free Moisturizer", "e.g. Neutrogena Hydro Boost Gel / La Roche-Posay Effaclar Mat", "Even oily skin NEEDS moisture — skipping causes more oil production!", PINK_PALE), ("🌞", "Step 4 — Sunscreen SPF 50 (NON-NEGOTIABLE)", "e.g. La Roche-Posay Anthelios Clear Skin SPF 60 / EltaMD UV Clear", "⭐ #1 most important step. UV darkens acne scars. Non-comedogenic, matte finish.", PEACH_LIGHT), ] for emoji, name, hint, tip, bg in am_steps: story.append(make_step_row(emoji, name, hint, tip, bg)) story.append(Spacer(1, 0.45*cm)) # =================================================== # EVENING ROUTINE # =================================================== story.append(make_section_header("🌙 EVENING ROUTINE ( ~8 minutes )", TEAL)) story.append(Spacer(1, 0.15*cm)) pm_steps = [ ("🧼", "Step 1 — Double Cleanse", "First: Micellar water / gentle cleansing oil · Then: Same gel cleanser as AM", "Remove sunscreen & pollution fully. This step prevents clogged pores.", TEAL_LIGHT), ("🌿", "Step 2 — Exfoliant (3x per week — rotate, see schedule below)", "BHA nights: Paula's Choice 2% BHA / Salicylic acid toner\nAHA nights: The Ordinary Glycolic Acid 7% / Lactic Acid 10%", "BHA = unclogs blackheads (oil-soluble). AHA = resurfaces scars. Never use both on same night!", LAVENDER), ("🌙", "Step 3 — Retinol / Adapalene (2-3x per week)", "e.g. Differin Adapalene 0.1% Gel (OTC) · OR Retinol 0.025% serum to start", "Start slow: 2 nights/week for 4 weeks, then increase. The most powerful scar treatment!", TEAL_LIGHT), ("🛡️", "Step 4 — Night Moisturizer (with ceramides on retinol nights)", "e.g. CeraVe PM Moisturizing Lotion / Simple Kind to Skin Moisturiser", "Seal in treatment + repair skin barrier overnight.", LAVENDER), ] for emoji, name, hint, tip, bg in pm_steps: story.append(make_step_row(emoji, name, hint, tip, bg)) story.append(Spacer(1, 0.45*cm)) # =================================================== # WEEKLY SCHEDULE # =================================================== story.append(make_section_header("📅 WEEKLY EXFOLIANT & TREATMENT SCHEDULE", LAVENDER_MID)) story.append(Spacer(1, 0.2*cm)) days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"] pm_treatments = [ "BHA\n(Salicylic\nAcid)", "Retinol /\nAdapalene", "AHA\n(Glycolic\nAcid)", "Retinol /\nAdapalene", "BHA\n(Salicylic\nAcid)", "REST\n(Clay mask\noptional)", "Retinol /\nAdapalene", ] bg_colors = [TEAL_LIGHT, LAVENDER, TEAL_LIGHT, LAVENDER, TEAL_LIGHT, PEACH_LIGHT, LAVENDER] header_row = [Paragraph(d, week_header_style) for d in days] treat_row = [Paragraph(t, week_cell_style) for t in pm_treatments] check_row = [Paragraph("☐", ParagraphStyle("wchk", parent=styles["Normal"], fontSize=14, alignment=TA_CENTER, textColor=PINK_MID, leading=16)) for _ in days] col_w = 17.4/7 week_table = Table( [header_row, treat_row, check_row], colWidths=[col_w*cm]*7, rowHeights=[0.65*cm, 1.5*cm, 0.6*cm] ) style_cmds = [ ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("ALIGN", (0,0), (-1,-1), "CENTER"), ("TOPPADDING", (0,0), (-1,-1), 3), ("BOTTOMPADDING", (0,0), (-1,-1), 3), ("GRID", (0,0), (-1,-1), 0.5, GREY_MID), ("LINEBELOW", (0,0), (6,0), 1, WHITE), ] for i, bg in enumerate(bg_colors): style_cmds.append(("BACKGROUND", (i,0), (i,0), LAVENDER_MID)) style_cmds.append(("BACKGROUND", (i,1), (i,2), bg)) week_table.setStyle(TableStyle(style_cmds)) story.append(week_table) story.append(Spacer(1, 0.4*cm)) # =================================================== # WEEKLY EXTRAS # =================================================== story.append(make_section_header("🎯 WEEKLY ADD-ONS ( 1-2x per week )", GOLD)) story.append(Spacer(1, 0.15*cm)) extras = [ ("🍃", "Clay Mask (Kaolin/Bentonite)", "Apply thin layer to oily T-zone/nose. Leave 10 min. Rinse well.", "Absorbs excess oil, helps minimise blackheads. Far better than pore strips.", PEACH_LIGHT), ("💆", "Face Massage / Gua Sha (optional)", "Use facial oil or moisturizer. Gentle upward strokes 3-5 min.", "Boosts circulation, helps with lymphatic drainage. Avoid over pressing on scarred areas.", PEACH_LIGHT), ] for emoji, name, hint, tip, bg in extras: story.append(make_step_row(emoji, name, hint, tip, bg)) story.append(Spacer(1, 0.4*cm)) # =================================================== # GOLDEN RULES # =================================================== story.append(make_section_header("⭐ GOLDEN RULES TO REMEMBER", colors.HexColor("#AD1457"))) story.append(Spacer(1, 0.15*cm)) rules = [ ("🚫", "Never skip SPF — even indoors. UV is the #1 cause of scars darkening."), ("🚫", "Never use AHA + BHA + Retinol on the same night — rotate them."), ("🚫", "Never skip moisturizer just because skin is oily — it makes oiliness WORSE."), ("✅", "Introduce ONE new active ingredient every 2-3 weeks to track reactions."), ("✅", "Always patch test a new product on your jawline for 3 days first."), ("✅", "Results take time: blackheads 4-8 wks · dark marks 3-6 months · pitted scars 6-12 months."), ("✅", "See a dermatologist if no improvement after 3 months — prescription retinoids work faster."), ] rule_rows = [] for icon, text in rules: col = colors.HexColor("#FFEBEE") if icon == "🚫" else colors.HexColor("#E8F5E9") rule_rows.append([ Paragraph(icon, ParagraphStyle("ri", parent=styles["Normal"], fontSize=11, alignment=TA_CENTER, leading=14)), Paragraph(text, ParagraphStyle("rt", parent=styles["Normal"], fontSize=8.5, textColor=DARK_GREY, fontName="Helvetica", leading=11)), ]) rules_table = Table(rule_rows, colWidths=[0.9*cm, 16.5*cm]) rule_style = [ ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (1,0), (1,-1), 6), ("LINEBELOW", (0,0), (-1,-1), 0.4, GREY_MID), ] for i, (icon, _) in enumerate(rules): bg = colors.HexColor("#FFEBEE") if icon == "🚫" else colors.HexColor("#E8F5E9") rule_style.append(("BACKGROUND", (0,i), (-1,i), bg)) rules_table.setStyle(TableStyle(rule_style)) story.append(rules_table) story.append(Spacer(1, 0.4*cm)) # =================================================== # SKIN NOTES # =================================================== notes_header = make_section_header("📝 DAILY SKIN NOTES", colors.HexColor("#5C6BC0")) story.append(notes_header) story.append(Spacer(1, 0.15*cm)) note_rows = [ ["How does skin feel today?", "_"*60], ["Any new breakouts / reactions?", "_"*60], ["Products used today:", "_"*60], ["Water intake (aim 8 glasses):", "☐☐☐☐☐☐☐☐ glasses"], ["Sleep (aim 7-8 hrs):", "_______ hours"], ] notes_table = Table(note_rows, colWidths=[5.5*cm, 11.9*cm]) notes_table.setStyle(TableStyle([ ("FONTNAME", (0,0), (0,-1), "Helvetica-Bold"), ("FONTSIZE", (0,0), (-1,-1), 8.5), ("TEXTCOLOR", (0,0), (-1,-1), DARK_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (0,-1), 6), ("LINEBELOW", (0,0), (-1,-1), 0.4, GREY_MID), ("BACKGROUND", (0,0), (-1,-1), GREY_LIGHT), ("ROWBACKGROUNDS", (0,0), (-1,-1), [WHITE, GREY_LIGHT]), ])) story.append(notes_table) story.append(Spacer(1, 0.35*cm)) # FOOTER story.append(HRFlowable(width="100%", thickness=0.5, color=GREY_MID)) story.append(Spacer(1, 0.1*cm)) story.append(Paragraph("Consistency is everything · Print one sheet per day · Reprint weekly · See a dermatologist for personalised prescription advice", footer_style)) # BUILD doc.build(story) print(f"PDF created: {output_path}") PYEOF python3 /tmp/workspace/skincare/checklist.py
skincare checklist
PDF Document · PDF
She mainly has pitted scars not pigmentation
pitted atrophic acne scars icepick boxcar rolling treatment dermatologist 2024 2025
https://idealfaceandbody.com/atrophic-acne-scars
atrophic acne scars microneedling subcision treatment
| Type | Appearance | Depth | Best Treatment |
|---|---|---|---|
| Ice pick | Deep, narrow, V-shaped holes | Very deep | TCA CROSS, punch excision |
| Boxcar | Wide, rectangular pit with sharp edges (like chickenpox) | Shallow-medium | Fractional laser, RF microneedling, chemical peels |
| Rolling | Wave-like undulating texture, broad shallow depressions | Medium | Subcision, RF microneedling |
| Step | Why it Matters for Pits |
|---|---|
| Adapalene 0.1% (Differin) nightly | Best OTC retinoid - stimulates collagen over time, slightly improves shallow scars, prevents new ones |
| SPF 50 daily | Prevents UV damage to healing skin post-procedure; also keeps skin healthy for better treatment outcomes |
| Niacinamide 10% AM | Keeps skin barrier strong, controls oil - secondary benefit for scar appearance |
| Vitamin C serum (optional, AM) | Supports collagen synthesis - minor adjunct benefit |
| Stay well hydrated + avoid picking | Picking creates more ice pick scars |
| Approach | Expected Improvement | Timeline |
|---|---|---|
| Adapalene alone (home only) | 10-20% very shallow scars | 6-12 months |
| TCA CROSS (3-6 sessions) | 50-70% ice pick scars | 4-9 months |
| RF Microneedling (4-6 sessions) | 40-60% boxcar/rolling | 4-8 months |
| Combination (subcision + laser + PRP) | 60-80% overall | 6-12 months |
| Single deep pits - punch excision | Near complete for individual scars | 1 session |
Can u suggest products from indian brands that are more affordable
best Indian skincare brands affordable salicylic acid niacinamide retinol adapalene 2024 2025 Minimalist Dot and Key Plum
Minimalist skincare India products ingredients price list BHA AHA retinol niacinamide
Deconstruct Plum Dot Key Dermaco India skincare acne oily skin products price 2025
| Product | Price (approx.) |
|---|---|
| Minimalist Salicylic Acid + LHA 2% Cleanser - best pick, exfoliates inside pores while cleansing | ~₹249 |
| Plum Green Tea Pore Cleansing Face Wash - great for oily/acne skin, gentle surfactants | ~₹200-220 |
| Deconstruct Pore Minimizing Face Wash (salicylic + niacinamide) | ~₹299 |
| Product | Price (approx.) |
|---|---|
| Minimalist Niacinamide 10% + Zinc 1% - the gold standard, best price-to-performance ratio in India | ~₹599 (30ml) |
| Plum 10% Niacinamide Face Serum - good for sensitive/oily skin, slightly more hydrating | ~₹545 |
| The Derma Co 5% Niacinamide Serum - lighter concentration, good starter option | ~₹399 |
| Product | Price (approx.) |
|---|---|
| Minimalist Vitamin B5 10% Lightweight Moisturizer - oil-free, non-comedogenic, best for oily skin | ~₹349 |
| Plum SebaClear Mattifying Gel Crème (with Sebacic Acid + Matcha) - controls oil for hours | ~₹483 |
| Deconstruct Oil-Free Moisturizer (3% NMF Complex) - lightweight gel, very affordable | ~₹299 |
| Product | Price (approx.) |
|---|---|
| Minimalist Light Fluid SPF 50 PA++++ - no white cast, matte finish, best for Indian skin tones | ~₹399 |
| The Derma Co 1% Hyaluronic Sunscreen Aqua Gel SPF 50 PA++++ - CTRI-certified, top-rated | ~₹499 |
| Deconstruct Gel Sunscreen SPF 50 PA++++ - in-vivo tested, non-greasy, bestseller | ~₹399 |
| Plum 2% Niacinamide SPF 50 PA++++ Sunscreen - niacinamide bonus, no white cast | ~₹350-400 |
| Product | Price (approx.) |
|---|---|
| Minimalist Salicylic Acid 2% Face Serum - best BHA exfoliant in India, specifically targets blackheads/pores | ~₹599 |
| The Derma Co 2% Salicylic Acid Serum | ~₹449 |
| Product | Price (approx.) |
|---|---|
| Minimalist Glycolic Acid 8% Exfoliating Liquid - resurfaces skin texture, good for shallow scar borders | ~₹599 |
| Minimalist AHA PHA BHA 32% Face Peel - weekly use only, strong but very effective | ~₹799 |
| Suganda 10% Lactic Acid Serum - gentler AHA, good for beginners | ~₹545 |
| Product | Price (approx.) |
|---|---|
| Minimalist Retinol 0.3% Face Serum - start here, well-tolerated, excellent for collagen building | ~₹229-249 |
| Minimalist Retinol 0.1% Serum - if 0.3% feels too strong initially | ~₹199 |
| The Derma Co 0.1% Retinol Serum | ~₹599 |
| Adapalene (Adaferin/Deriva gel 0.1%) - prescription OTC at chemists in India, ~₹150-180 for a tube - this is the strongest and best value option for pitted scars |
Note on Adapalene: In India, Adapalene 0.1% gels (brand names: Adaferin, Deriva, Aclene) are available at medical stores for ₹150-200 a tube without prescription. This is the best bang for money for pitted scars - the same ingredient as Differin but a fraction of the cost.
| Product | Price (approx.) |
|---|---|
| Minimalist Ceramides 0.3% + Bisabolol Moisturizer - repairs skin barrier on retinol nights | ~₹599 |
| Plum 2% Niacinamide & Rice Water Night Crème | ~₹395 |
| The Derma Co Ceramide Moisturizer | ~₹399 |
| Product | Purpose | Price |
|---|---|---|
| Minimalist AHA PHA BHA 32% Peel | Weekly deep exfoliation (use once only, not for beginners) | ~₹799 |
| mCaffeine Coffee Face Mask (with Kaolin clay) | Clay mask for oily skin/blackheads | ~₹349 |
| Plum Kaolin + Bentonite Clay Mask | Oil absorption, pore cleansing | ~₹350 |
| Deconstruct Exfoliating Mask | BHA + enzyme, good for blackheads | ~₹349 |
What abt pilgrim 10% Niacinamide serum
Pilgrim 10% Niacinamide serum review ingredients price India 2024 2025
| Ingredient | What it Does for Her Skin |
|---|---|
| Niacinamide 10% | Controls excess oil, minimizes pore appearance, strengthens skin barrier |
| Zinc PCA | Regulates sebum further, antimicrobial - tackles blackhead-causing bacteria |
| Gluconolactone (PHA) | Gentle exfoliant - softer than AHA/BHA, improves texture without irritation |
| Salicylic Acid (BHA) | Goes inside pores, dissolves blackhead plugs |
| Sodium Hyaluronate | Keeps oily skin hydrated so it doesn't overproduce oil |
| Allantoin + Panthenol | Soothing, barrier-repairing - reduces irritation from actives |
| Pilgrim 10% Niacinamide | Minimalist 10% Niacinamide + Zinc | |
|---|---|---|
| Niacinamide | 10% | 10% |
| Zinc | Zinc PCA ✅ | Zinc 1% ✅ |
| BHA (Salicylic) | ✅ Yes | ❌ No |
| PHA (Gluconolactone) | ✅ Yes | ❌ No |
| Hyaluronic Acid | ✅ Yes | ❌ No |
| Fragrance | Fragrance-free ✅ | Fragrance-free ✅ |
| Price | ~₹545-599 | ~₹599 |
| Best for | Blackheads + oily + pores | General oil control + brightness |
Why abt plum 10% niacinamide serum
Plum 10% Niacinamide face serum ingredients full list review India 2024 2025
https://incidecoder.com/products/plum-10-niacinamide-rice-wa…
| Ingredient | Benefit |
|---|---|
| Niacinamide 10% | Controls oil, minimizes pores, strengthens barrier |
| Fermented Rice Water | Brightening, antioxidant, skin-softening |
| Hyaluronic Acid | Hydration without heaviness |
| No fragrance | Good for acne-prone skin |
| Texture | Lightweight, fast-absorbing, no stickiness |
| Plum 10% Niacinamide | Pilgrim 10% Niacinamide | |
|---|---|---|
| Niacinamide | 10% ✅ | 10% ✅ |
| BHA (Salicylic Acid) | ❌ No | ✅ Yes |
| PHA (Gluconolactone) | ❌ No | ✅ Yes |
| Zinc PCA | ❌ No | ✅ Yes |
| Rice Water / Brightening | ✅ Yes | ❌ No |
| Comedogenic risk | ⚠️ Sesame derivative - caution | ✅ Clean formula |
| Price (30ml) | ~₹527-659 | ~₹545-599 |
| Best for | Brightening + tone (if no reaction) | Blackheads + oily + pores |
Search for dermatologist recommendations on Indian adapalene brands for pitted scars
dermatologist recommended adapalene brand India pitted acne scars Adaferin Deriva Aclene 2024 2025
adapalene atrophic acne scars collagen remodeling
Adaferin Deriva Aclene adapalene 0.1% gel India dermatologist review pitted scars best brand chemist
adapalene 0.3% acne scar atrophic improvement
"Adapalene 0.3% gel effectively treats atrophic acne scars and improves skin texture, with good tolerability. Adapalene 0.3% + BPO 2.5% gel is particularly effective for treating atrophic acne scars."
| Brand | Manufacturer | Price | Notes |
|---|---|---|---|
| Adaferin Gel 0.1% | Galderma India | ~₹150-180 (15g) | Original, gold standard - introduced in India in 2001, studied in the Indian J Dermatol post-marketing surveillance study. Specially formulated microcrystals that penetrate follicles within 5 minutes. Most widely available and trusted. |
| Deriva Gel 0.1% | Micro Labs | ~₹130-160 (15g) | Popular generic, widely available at medical stores, good alternative to Adaferin |
| Aclene Gel 0.1% | Sun Pharma | ~₹120-150 (15g) | Good availability, same active ingredient |
| Adpalen Gel 0.1% | Various | ~₹100-140 | Generic, available at larger chemists |
| Brand | Manufacturer | Price | Notes |
|---|---|---|---|
| Adaferin 0.3% Gel | Galderma India | ~₹350-450 (15g) | Prescription required; most recommended by Indian dermatologists for atrophic scars specifically |
| Deriva 0.3% Gel | Micro Labs | ~₹280-350 | Prescription, good alternative |
| Brand | Combination | Price | Notes |
|---|---|---|---|
| Epiduo Gel | Adapalene 0.1% + BPO 2.5% | ~₹499-561 | Galderma; specifically recommended in PRACT-India guidelines for atrophic scars; available on Clinikally, Nykaa |
| Deriva CMS Gel | Adapalene + Clindamycin | ~₹200-250 | For inflammatory acne + scar prevention combo |
Create a complete skincare routine PDF using Indian brands & adapalene for her specific skin type
ls -la /tmp/workspace/skincare/
~/skincare/routine_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Table, TableStyle,
Paragraph, Spacer, HRFlowable, PageBreak)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
OUTPUT = "/tmp/workspace/skincare/indian_skincare_routine.pdf"
# ── COLOURS ────────────────────────────────────────────────────────────────
ROSE = colors.HexColor("#AD1457")
ROSE_LIGHT = colors.HexColor("#FCE4EC")
ROSE_MID = colors.HexColor("#E91E63")
PEACH = colors.HexColor("#FF7043")
PEACH_LT = colors.HexColor("#FFF3E0")
TEAL = colors.HexColor("#00796B")
TEAL_LT = colors.HexColor("#E0F2F1")
INDIGO = colors.HexColor("#3949AB")
INDIGO_LT = colors.HexColor("#E8EAF6")
GOLD = colors.HexColor("#F9A825")
GOLD_LT = colors.HexColor("#FFFDE7")
PURPLE = colors.HexColor("#6A1B9A")
PURPLE_LT = colors.HexColor("#F3E5F5")
GREEN = colors.HexColor("#2E7D32")
GREEN_LT = colors.HexColor("#E8F5E9")
RED_LT = colors.HexColor("#FFEBEE")
GREY = colors.HexColor("#F5F5F5")
GREY_MID = colors.HexColor("#BDBDBD")
DARK = colors.HexColor("#212121")
DARK_GREY = colors.HexColor("#424242")
MED_GREY = colors.HexColor("#757575")
WHITE = colors.white
# ── STYLES ─────────────────────────────────────────────────────────────────
def S(name, **kw):
base = getSampleStyleSheet()["Normal"]
return ParagraphStyle(name, parent=base, **kw)
H1 = S("H1", fontSize=20, textColor=ROSE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=24, spaceAfter=2)
H2 = S("H2", fontSize=13, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=16)
H3 = S("H3", fontSize=10, textColor=DARK, fontName="Helvetica-Bold", leading=13)
H3W = S("H3W", fontSize=10, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=13)
SUB = S("SUB", fontSize=9, textColor=DARK_GREY,fontName="Helvetica", leading=12)
SML = S("SML", fontSize=8, textColor=DARK_GREY,fontName="Helvetica", leading=10)
SML_I=S("SMLI",fontSize=8, textColor=TEAL, fontName="Helvetica-Oblique",leading=10)
SML_W=S("SMLW",fontSize=8, textColor=WHITE, fontName="Helvetica",
alignment=TA_CENTER, leading=10)
CTR = S("CTR", fontSize=9, textColor=DARK_GREY,fontName="Helvetica",
alignment=TA_CENTER, leading=11)
CTR_B=S("CTRB",fontSize=9, textColor=DARK, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=11)
FOOT= S("FOOT",fontSize=7, textColor=GREY_MID, fontName="Helvetica-Oblique",
alignment=TA_CENTER)
PRICE=S("PRC", fontSize=8.5,textColor=GREEN, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=11)
WARN= S("WARN",fontSize=8, textColor=colors.HexColor("#B71C1C"),
fontName="Helvetica-Bold", leading=11)
NOTE= S("NOTE",fontSize=8, textColor=DARK_GREY,fontName="Helvetica", leading=11)
# ── HELPERS ────────────────────────────────────────────────────────────────
W = 17.4 * cm # usable width
def sec_header(text, bg):
t = Table([[Paragraph(text, H2)]], colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("TOPPADDING",(0,0),(-1,-1), 7),
("BOTTOMPADDING",(0,0),(-1,-1), 7),
("LEFTPADDING",(0,0),(-1,-1), 10),
]))
return t
def divider(color=GREY_MID, thickness=0.5):
return HRFlowable(width="100%", thickness=thickness, color=color)
def pill(text, bg, fg=WHITE):
"""Small inline coloured tag."""
p = Table([[Paragraph(text, S("pill", fontSize=7, textColor=fg,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=9))]],
colWidths=[2.2*cm])
p.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("TOPPADDING",(0,0),(-1,-1), 2),
("BOTTOMPADDING",(0,0),(-1,-1), 2),
("LEFTPADDING",(0,0),(-1,-1), 4),
("RIGHTPADDING",(0,0),(-1,-1), 4),
]))
return p
def step_row(num, emoji, title, brand_product, price, tip="", bg=WHITE, alt_bg=GREY):
"""One step row: number | emoji | title+product | price."""
num_p = Paragraph(str(num), S("N", fontSize=14, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=16))
em_p = Paragraph(emoji, S("E", fontSize=14, alignment=TA_CENTER, leading=16))
body = [Paragraph(f"<b>{title}</b>", H3)]
for line in brand_product:
body.append(Paragraph(line, SML))
if tip:
body.append(Paragraph(f"💡 {tip}", SML_I))
pr_p = Paragraph(price, PRICE)
row = [[num_p, em_p, body, pr_p]]
cw = [0.65*cm, 0.75*cm, 13.5*cm, 2.5*cm]
t = Table(row, colWidths=cw)
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("VALIGN",(0,0),(-1,-1), "TOP"),
("TOPPADDING",(0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING",(0,0),(0,0), 5),
("LEFTPADDING",(2,0),(2,0), 6),
("RIGHTPADDING",(3,0),(3,0), 6),
("LINEBELOW",(0,0),(-1,-1), 0.4, GREY_MID),
]))
return t
def product_card(emoji, name, brand, price, why, bg=GREY):
body = [
Paragraph(f"{emoji} <b>{name}</b>", H3),
Paragraph(f"Brand: {brand}", SML),
Paragraph(f"Why: {why}", SML),
]
pr = Paragraph(price, PRICE)
row = [[body, pr]]
t = Table(row, colWidths=[13.9*cm, 3.5*cm])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("VALIGN",(0,0),(-1,-1),"TOP"),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(0,0), 8),
("RIGHTPADDING",(1,0),(1,0), 8),
("LINEBELOW",(0,0),(-1,-1), 0.4, GREY_MID),
]))
return t
# ══════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ══════════════════════════════════════════════════════════════════════════
story = []
# ── PAGE 1: COVER / PROFILE ───────────────────────────────────────────────
cover_top = Table([[
Paragraph("🌸 Personalised Skincare Routine", H1),
Paragraph("Complete Indian Brand Guide with Adapalene Protocol", S("sub2",
fontSize=10, textColor=DARK_GREY, fontName="Helvetica",
alignment=TA_CENTER, leading=13)),
]], colWidths=[W])
cover_top.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), ROSE_LIGHT),
("TOPPADDING",(0,0),(-1,-1), 14),
("BOTTOMPADDING",(0,0),(-1,-1), 14),
("LEFTPADDING",(0,0),(-1,-1), 10),
]))
story.append(cover_top)
story.append(Spacer(1, 0.35*cm))
# Skin Profile Box
profile_rows = [
[Paragraph("👤 Your Skin Profile", S("ph", fontSize=11, textColor=WHITE,
fontName="Helvetica-Bold", leading=14)),
Paragraph("", SML)],
[Paragraph("Skin Type", S("pk", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold")),
Paragraph("Oily, Acne-Prone, 21 years", SML_W)],
[Paragraph("Primary Concern", S("pk", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold")),
Paragraph("Pitted Atrophic Acne Scars (Ice Pick / Boxcar / Rolling)", SML_W)],
[Paragraph("Secondary Concerns", S("pk", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold")),
Paragraph("Blackheads on Nose · Open / Enlarged Pores · Excess Oil", SML_W)],
[Paragraph("Routine Level", S("pk", fontSize=9, textColor=WHITE,
fontName="Helvetica-Bold")),
Paragraph("Beginner to Intermediate", SML_W)],
]
pt = Table(profile_rows, colWidths=[4.5*cm, 12.9*cm])
pt.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0), ROSE),
("BACKGROUND",(0,1),(-1,-1), colors.HexColor("#880E4F")),
("TEXTCOLOR",(0,0),(-1,-1), WHITE),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(0,-1), 8),
("LEFTPADDING",(1,0),(1,-1), 6),
("SPAN",(0,0),(1,0)),
("LINEBELOW",(0,0),(-1,-2), 0.4, colors.HexColor("#C2185B")),
]))
story.append(pt)
story.append(Spacer(1, 0.4*cm))
# Key Principle boxes
kp_data = [
["⭐ #1 Rule", "SPF 50 EVERY morning — UV darkens pitted scars and makes them harder to treat."],
["🔄 Rotation", "Never use AHA + BHA + Adapalene on the same night. Rotate them across the week."],
["⏳ Patience", "Adapalene takes 12-24 weeks to show scar improvement. Consistency > intensity."],
["💊 Best Upgrade", "Ask a dermatologist for Adaferin 0.3% — clinically proven for atrophic scars."],
]
kp_rows = [[Paragraph(a, S("kpa", fontSize=8.5, textColor=WHITE,
fontName="Helvetica-Bold", leading=11)),
Paragraph(b, S("kpb", fontSize=8.5, textColor=WHITE,
fontName="Helvetica", leading=11))]
for a,b in kp_data]
kpt = Table(kp_rows, colWidths=[3.2*cm, 14.2*cm])
kpt.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,-1), INDIGO),
("BACKGROUND",(1,0),(1,-1), colors.HexColor("#283593")),
("ROWBACKGROUNDS",(0,0),(-1,-1),
[colors.HexColor("#303F9F"), colors.HexColor("#283593")]*4),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(0,-1), 8),
("LEFTPADDING",(1,0),(1,-1), 6),
("LINEBELOW",(0,0),(-1,-2), 0.3, colors.HexColor("#1A237E")),
]))
story.append(kpt)
story.append(Spacer(1, 0.5*cm))
# ── AM ROUTINE ────────────────────────────────────────────────────────────
story.append(sec_header("☀️ MORNING ROUTINE (5-6 minutes)", ROSE_MID))
story.append(Spacer(1, 0.12*cm))
am_steps = [
(1, "🧴", "Gentle Gel Cleanser",
["• Minimalist Salicylic Acid + LHA 2% Cleanser (best pick — BHA while cleansing)",
"• Alt: Plum Green Tea Pore Cleansing Face Wash",
"• Alt: Deconstruct Pore Minimizing Face Wash"],
"₹249-299",
"Use lukewarm water. Pat dry — never rub. No harsh scrubs.", ROSE_LIGHT),
(2, "✨", "Niacinamide Serum ← Oil Control + Pore Minimizer",
["• Pilgrim 10% Niacinamide + Zinc PCA + BHA + PHA (best for blackheads + pores)",
"• Alt: Minimalist 10% Niacinamide + Zinc 1%",
"• Apply 2-3 drops on dry face. Let absorb 60 seconds before next step."],
"₹545-599",
"Pilgrim is preferred here — it contains salicylic acid + gluconolactone for extra blackhead benefit.", PEACH_LT),
(3, "💧", "Oil-Free Gel Moisturizer",
["• Minimalist Vitamin B5 10% Lightweight Moisturizer (best for oily skin)",
"• Alt: Deconstruct Oil-Free Moisturizer (₹299)",
"• Alt: Plum SebaClear Mattifying Gel Crème (controls shine up to 2 hrs)"],
"₹299-349",
"NEVER skip this. Oily skin that is dehydrated produces more oil to compensate.", ROSE_LIGHT),
(4, "🌞", "Sunscreen SPF 50 PA++++ ← Most Important Step",
["• The Derma Co 1% Hyaluronic Aqua Gel SPF 50 PA++++ (CTRI-certified, no white cast)",
"• Alt: Minimalist Light Fluid SPF 50 PA++++ (matte finish, great for oily skin)",
"• Alt: Deconstruct Gel Sunscreen SPF 50 PA++++ (in-vivo tested, non-greasy)",
"• Apply as last step. Reapply every 2-3 hrs if outdoors."],
"₹399-499",
"UV exposure permanently darkens pitted scar borders. SPF is non-negotiable.", PEACH_LT),
]
for num, emoji, title, brand_product, price, tip, bg in am_steps:
story.append(step_row(num, emoji, title, brand_product, price, tip, bg))
story.append(Spacer(1, 0.45*cm))
# ── PM ROUTINE ────────────────────────────────────────────────────────────
story.append(sec_header("🌙 EVENING ROUTINE (8-10 minutes)", TEAL))
story.append(Spacer(1, 0.12*cm))
pm_steps = [
(1, "🧼", "Double Cleanse — Remove Sunscreen First",
["Step A: Minimalist Marula Oil 5% Cleansing Oil OR Simple Micellar Water (₹299)",
"Step B: Same gel cleanser used in the morning",
"Skipping double cleanse = SPF residue left on skin = clogged pores overnight."],
"₹299-399",
"Massage cleansing oil 60 seconds, then rinse. Follow immediately with gel cleanser.", TEAL_LT),
(2, "🌿", "Exfoliant — 3×/week (rotate BHA and AHA, see schedule below)",
["BHA nights: Minimalist Salicylic Acid 2% Face Serum — unclogs blackheads (oil-soluble)",
"AHA nights: Minimalist Glycolic Acid 8% Exfoliating Liquid — resurfaces scar edges",
"⚠ Never use BHA and AHA on the same night.",
"⚠ Never use exfoliant on same night as Adapalene."],
"₹599 each",
"BHA targets the blackheads on your nose; AHA smooths the texture around pitted scars.", INDIGO_LT),
(3, "🎯", "Adapalene 0.1% Gel — Core Scar Treatment (3-4×/week)",
["• Adaferin Gel 0.1% by Galderma India (FIRST CHOICE — original, most researched)",
"• Alt: Deriva Gel 0.1% by Micro Labs (same active, lower price)",
"• Alt: Aclene Gel 0.1% by Sun Pharma",
"• Upgrade: Adaferin 0.3% (prescription) — Indian dermatologists recommend this",
" specifically for atrophic/pitted scars per PRACT-India 2025 consensus.",
"Apply pea-sized amount to entire face (not just scars). On dry skin only."],
"₹150-200",
"Do NOT use on same nights as BHA or AHA exfoliants. Adapalene nights = moisturiser only after.", GOLD_LT),
(4, "🛡️", "Night Moisturizer — Especially important on Adapalene nights",
["• Minimalist Ceramides 0.3% + Bisabolol Moisturizer (barrier repair best pick)",
"• Alt: Plum 2% Niacinamide & Rice Water Night Crème (brightening + hydrating)",
"• Alt: CeraVe PM Moisturizing Lotion (if budget allows international brands)"],
"₹395-599",
"Apply generously on adapalene nights to reduce peeling and dryness during the adjustment phase.", TEAL_LT),
]
for num, emoji, title, brand_product, price, tip, bg in pm_steps:
story.append(step_row(num, emoji, title, brand_product, price, tip, bg))
story.append(Spacer(1, 0.45*cm))
# ── WEEKLY SCHEDULE ───────────────────────────────────────────────────────
story.append(sec_header("📅 WEEKLY TREATMENT SCHEDULE", PURPLE))
story.append(Spacer(1, 0.2*cm))
DAYS = ["MON","TUE","WED","THU","FRI","SAT","SUN"]
EVENING = [
"BHA\nSalicylic\nAcid 2%",
"Adapalene\n0.1% Gel",
"AHA\nGlycolic\nAcid 8%",
"Adapalene\n0.1% Gel",
"BHA\nSalicylic\nAcid 2%",
"REST\nClay Mask\n(optional)",
"Adapalene\n0.1% Gel",
]
EV_COLORS = [INDIGO_LT, GOLD_LT, INDIGO_LT, GOLD_LT, INDIGO_LT, PEACH_LT, GOLD_LT]
EV_TEXT = [INDIGO, PURPLE, INDIGO, PURPLE, INDIGO, PEACH, PURPLE]
cw7 = [W/7]*7
hdr_row = [Paragraph(d, H3W) for d in DAYS]
ev_row = [Paragraph(t, S("ec", fontSize=7.5, textColor=EV_TEXT[i],
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10))
for i,t in enumerate(EVENING)]
am_row = [Paragraph("Cleanser\nNiacinamide\nMoisturiser\nSPF 50",
S("am", fontSize=7, textColor=ROSE, fontName="Helvetica",
alignment=TA_CENTER, leading=9)) for _ in DAYS]
sched = Table([hdr_row, am_row, ev_row],
colWidths=cw7, rowHeights=[0.6*cm, 1.35*cm, 1.35*cm])
style_cmds = [
("ALIGN",(0,0),(-1,-1),"CENTER"),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
("TOPPADDING",(0,0),(-1,-1), 3),
("BOTTOMPADDING",(0,0),(-1,-1), 3),
("GRID",(0,0),(-1,-1), 0.5, GREY_MID),
("BACKGROUND",(0,0),(6,0), PURPLE),
("BACKGROUND",(0,1),(6,1), ROSE_LIGHT),
]
for i, bg in enumerate(EV_COLORS):
style_cmds.append(("BACKGROUND",(i,2),(i,2), bg))
sched.setStyle(TableStyle(style_cmds))
legend = Table([[
Paragraph("🟦 BHA Night", SML),
Paragraph("🟨 Adapalene Night", SML),
Paragraph("⬜ AHA Night", SML),
Paragraph("🍑 Rest Night", SML),
]], colWidths=[W/4]*4)
legend.setStyle(TableStyle([
("TOPPADDING",(0,0),(-1,-1), 4),
("ALIGN",(0,0),(-1,-1),"CENTER"),
]))
story.append(sched)
story.append(legend)
story.append(Spacer(1, 0.45*cm))
# ── PAGE BREAK ────────────────────────────────────────────────────────────
story.append(PageBreak())
# ── PAGE 2: PRODUCT GUIDE + ADAPALENE PROTOCOL ───────────────────────────
story.append(sec_header("🛒 COMPLETE PRODUCT GUIDE ( Prioritised by Importance )", ROSE_MID))
story.append(Spacer(1, 0.15*cm))
# Header row
hdr = Table([[
Paragraph("Priority", CTR_B),
Paragraph("Product & Brand", CTR_B),
Paragraph("Key Ingredients", CTR_B),
Paragraph("Concern Targeted", CTR_B),
Paragraph("Price", CTR_B),
]], colWidths=[1.3*cm, 6.5*cm, 4.2*cm, 3.4*cm, 2.0*cm])
hdr.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), ROSE),
("TEXTCOLOR",(0,0),(-1,-1), WHITE),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 4),
("FONTNAME",(0,0),(-1,-1), "Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1), 8),
]))
story.append(hdr)
products = [
("★★★", "Adaferin Gel 0.1% (Galderma India)\n→ Upgrade to 0.3% via dermatologist",
"Adapalene 0.1%\n(Retinoid)", "Pitted Scars\n(core treatment)", "₹150-180", GOLD_LT),
("★★★", "The Derma Co SPF 50 PA++++ Aqua Gel\nMandatory AM last step",
"Hyaluronic Acid\nBroad-spectrum UV", "Scar darkening\nprevention", "₹449-499", ROSE_LIGHT),
("★★★", "Pilgrim 10% Niacinamide + BHA + PHA",
"Niacinamide 10%\nSalicylic Acid\nZinc PCA", "Blackheads\nOpen Pores\nOil Control", "₹545-599", TEAL_LT),
("★★☆", "Minimalist Salicylic Acid 2% Face Serum",
"BHA 2%", "Blackheads\nPore cleansing", "₹599", INDIGO_LT),
("★★☆", "Minimalist Salicylic Acid + LHA 2% Cleanser",
"BHA + LHA", "Oily skin\nBlackheads (cleanser)", "₹249", INDIGO_LT),
("★★☆", "Minimalist Glycolic Acid 8% Exfoliating Liquid",
"AHA (Glycolic 8%)", "Scar texture\nSmoothing", "₹599", PURPLE_LT),
("★★☆", "Minimalist Vitamin B5 10% Moisturizer",
"Vitamin B5\nOil-free", "Oily skin\nBarrier support", "₹349", PEACH_LT),
("★★☆", "Minimalist Ceramides 0.3% Moisturizer",
"Ceramides\nBisabolol", "Barrier repair on\nadapalene nights", "₹599", TEAL_LT),
("★☆☆", "Minimalist Glycolic Acid 8% OR Lactic Acid 10%\n(alternate as AHA)",
"AHA", "Surface texture\nScar borders", "₹599", PURPLE_LT),
("★☆☆", "mCaffeine Coffee Clay Mask (1-2×/week)",
"Kaolin Clay\nCoffee", "Oil absorption\nBlackheads", "₹349", PEACH_LT),
("★☆☆", "Minimalist Marula Oil 5% Cleansing Oil\n(PM Step 1 only)",
"Marula Oil", "Remove SPF\nbefore cleanser", "₹399", GOLD_LT),
]
for pri, name, ingr, concern, price, bg in products:
r = Table([[
Paragraph(pri, S("star", fontSize=8, textColor=GOLD,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10)),
Paragraph(name, SML),
Paragraph(ingr, SML),
Paragraph(concern, SML),
Paragraph(price, PRICE),
]], colWidths=[1.3*cm, 6.5*cm, 4.2*cm, 3.4*cm, 2.0*cm])
r.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 4),
("VALIGN",(0,0),(-1,-1), "TOP"),
("LINEBELOW",(0,0),(-1,-1), 0.3, GREY_MID),
]))
story.append(r)
story.append(Spacer(1, 0.45*cm))
# ── ADAPALENE PROTOCOL ────────────────────────────────────────────────────
story.append(sec_header("💊 ADAPALENE PROTOCOL — Step-by-Step Guide for Pitted Scars", TEAL))
story.append(Spacer(1, 0.2*cm))
adapt_intro = [
["Phase", "Timeline", "Frequency", "What to Expect"],
["Phase 1\nIntroduction", "Weeks 1-4", "2 nights/week",
"Mild dryness, flaking, possible purge (new pimples). Normal.\nDo NOT stop."],
["Phase 2\nBuilding", "Weeks 5-10", "3-4 nights/week",
"Skin adjusts. Purge settles. Texture begins improving."],
["Phase 3\nMaintenance", "Week 11+", "Every night (if tolerated)",
"Scar depth visibly reduces over months. Boxcar + rolling scars improve most."],
["Phase 4\nUpgrade", "Month 3-4", "Prescription 0.3%",
"See dermatologist. PRACT-India 2025 recommends 0.3% specifically for atrophic scars.\nEpiduo (Adapalene + BPO) is an option if acne recurs."],
]
at = Table(adapt_intro, colWidths=[2.8*cm, 2.2*cm, 2.6*cm, 9.8*cm])
at.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), 8),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 5),
("VALIGN",(0,0),(-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [TEAL_LT, WHITE]),
("GRID",(0,0),(-1,-1), 0.4, GREY_MID),
]))
story.append(at)
story.append(Spacer(1, 0.3*cm))
# Key application rules
rules_title = Table([[Paragraph("📋 Adapalene Application Rules", S("rt",
fontSize=10, textColor=WHITE, fontName="Helvetica-Bold", leading=13))]],
colWidths=[W])
rules_title.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), colors.HexColor("#00695C")),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 8),
]))
story.append(rules_title)
rules = [
("✅", "Apply to FULLY DRY skin — wait 10-15 min after cleansing. Damp skin = more irritation."),
("✅", "Use a PEA-SIZED amount for the ENTIRE face. More is not better."),
("✅", "Apply at NIGHT only. Always follow with a moisturizer."),
("✅", "Wear SPF 50 every single morning — adapalene increases UV sensitivity."),
("🚫", "Do NOT use on the same night as AHA (glycolic) or BHA (salicylic acid)."),
("🚫", "Do NOT use around eyes, lips, or nostrils — these areas are too sensitive."),
("🚫", "Do NOT stop during the purge phase (weeks 2-4) — this is the retinoid clearing pores."),
("⚠️", "If severe redness/peeling occurs, drop to 1×/week and build back up slowly."),
]
for icon, text in rules:
bg = GREEN_LT if icon == "✅" else (RED_LT if icon == "🚫" else GOLD_LT)
r = Table([[
Paragraph(icon, S("ri", fontSize=11, alignment=TA_CENTER, leading=14)),
Paragraph(text, NOTE),
]], colWidths=[0.8*cm, 16.6*cm])
r.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("VALIGN",(0,0),(-1,-1), "MIDDLE"),
("LINEBELOW",(0,0),(-1,-1), 0.3, GREY_MID),
]))
story.append(r)
story.append(Spacer(1, 0.45*cm))
# ── IN-CLINIC TREATMENTS ──────────────────────────────────────────────────
story.append(sec_header("🏥 WHEN HOME CARE IS NOT ENOUGH — In-Clinic Treatments", INDIGO))
story.append(Spacer(1, 0.15*cm))
clinic_note = Table([[Paragraph(
"⚠ Pitted scars are caused by collagen loss. Topicals improve texture slowly "
"but cannot fill physical depressions. After 3-6 months of home routine, "
"consider the following with a qualified dermatologist.",
S("cn", fontSize=8.5, textColor=DARK_GREY, fontName="Helvetica-Oblique",
leading=11))]],
colWidths=[W])
clinic_note.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), INDIGO_LT),
("TOPPADDING",(0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING",(0,0),(-1,-1), 8),
]))
story.append(clinic_note)
story.append(Spacer(1, 0.1*cm))
clinic_rows = [
["Treatment", "Best For", "Sessions", "Improvement"],
["TCA CROSS\n(Trichloroacetic Acid)", "Ice Pick scars\n(deep narrow pits)", "3-6 sessions\n6-8 wks apart", "50-70% improvement"],
["Subcision", "Rolling scars\n(wave-like texture)", "2-4 sessions", "50-60% improvement"],
["RF Microneedling", "Boxcar + Rolling\n(broad depressions)", "4-6 sessions", "40-60% improvement"],
["Fractional CO2 Laser", "Boxcar scars\n(wide, sharp edges)", "2-3 sessions", "60-70% improvement\n⚠ Caution: darker skin"],
["Punch Excision", "Single deep ice\npick scars", "1 session per scar", "Near complete for\nindividual scars"],
]
ct = Table(clinic_rows, colWidths=[3.8*cm, 4.0*cm, 3.8*cm, 5.8*cm])
ct.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0), INDIGO),
("TEXTCOLOR",(0,0),(-1,0), WHITE),
("FONTNAME",(0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1), 8),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 5),
("VALIGN",(0,0),(-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [INDIGO_LT, WHITE]),
("GRID",(0,0),(-1,-1), 0.4, GREY_MID),
]))
story.append(ct)
story.append(Spacer(1, 0.4*cm))
# ── BUDGET BREAKDOWN ─────────────────────────────────────────────────────
story.append(sec_header("💰 STARTER BUDGET PLAN — What to Buy First", GOLD))
story.append(Spacer(1, 0.15*cm))
budget_rows = [
["Priority", "Product", "Why Buy First", "Price"],
["1st", "Adaferin Gel 0.1% (Galderma)", "Core pitted scar treatment — adapalene", "~₹175"],
["2nd", "The Derma Co SPF 50 Aqua Gel", "Most impactful habit — protects scars", "~₹449"],
["3rd", "Pilgrim 10% Niacinamide Serum", "Oil + blackheads + pores in one product", "~₹575"],
["4th", "Minimalist Salicylic Acid 2% Serum", "Dedicated BHA for deep blackhead clearing", "~₹599"],
["5th", "Minimalist Glycolic Acid 8%", "AHA for scar texture + skin smoothing", "~₹599"],
["6th", "Minimalist Ceramide Moisturizer", "Barrier repair on adapalene nights", "~₹599"],
["", "TOTAL (Priority 1-4)", "Start here — full active routine", "~₹1,800"],
["", "TOTAL (Priority 1-6)", "Complete routine", "~₹2,996"],
]
bt = Table(budget_rows, colWidths=[1.5*cm, 6.2*cm, 6.7*cm, 3.0*cm])
bstyle = [
("BACKGROUND",(0,0),(-1,0), GOLD),
("TEXTCOLOR",(0,0),(-1,0), WHITE),
("FONTNAME",(0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1), 8),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 5),
("VALIGN",(0,0),(-1,-1), "TOP"),
("GRID",(0,0),(-1,-1), 0.4, GREY_MID),
("ROWBACKGROUNDS",(0,1),(-1,-6), [GOLD_LT, WHITE]),
("BACKGROUND",(0,-2),(-1,-1), colors.HexColor("#FFF9C4")),
("FONTNAME",(0,-2),(-1,-1), "Helvetica-Bold"),
("TEXTCOLOR",(2,-2),(3,-1), GREEN),
]
bt.setStyle(TableStyle(bstyle))
story.append(bt)
story.append(Spacer(1, 0.35*cm))
# ── FINAL DO / DON'T ─────────────────────────────────────────────────────
dos_donts_title = sec_header("✅ DO'S & 🚫 DON'TS", colors.HexColor("#37474F"))
story.append(dos_donts_title)
story.append(Spacer(1, 0.15*cm))
dd_data = [
("✅", "Introduce ONE new product every 2-3 weeks to identify reactions."),
("✅", "Patch test all new actives on jawline for 3 days before full face use."),
("✅", "Apply adapalene to dry skin — wait 10-15 min after washing."),
("✅", "Continue SPF daily even in monsoon and indoors near windows."),
("✅", "Drink 8+ glasses of water and get 7-8 hrs sleep — skin repairs at night."),
("✅", "See a dermatologist after 3 months for prescription 0.3% adapalene."),
("🚫", "Never use AHA + BHA + Adapalene on the same night."),
("🚫", "Never use pore strips — they pull the plug but don't fix the cause."),
("🚫", "Never skip moisturiser because skin is oily — it makes oiliness worse."),
("🚫", "Never pop or pick at skin — each picking event creates a new pitted scar."),
("🚫", "Never use Plum Niacinamide serum — contains comedogenic sesame derivative."),
]
for icon, text in dd_data:
bg = GREEN_LT if icon == "✅" else RED_LT
r = Table([[
Paragraph(icon, S("ddi", fontSize=11, alignment=TA_CENTER, leading=14)),
Paragraph(text, NOTE),
]], colWidths=[0.7*cm, 16.7*cm])
r.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("VALIGN",(0,0),(-1,-1), "MIDDLE"),
("LINEBELOW",(0,0),(-1,-1), 0.3, GREY_MID),
]))
story.append(r)
story.append(Spacer(1, 0.35*cm))
# ── RESULTS TIMELINE ─────────────────────────────────────────────────────
story.append(sec_header("⏳ REALISTIC RESULTS TIMELINE", colors.HexColor("#4A148C")))
story.append(Spacer(1, 0.15*cm))
tl_rows = [
["Timeframe", "What Improves", "Key Driver"],
["4-8 weeks", "Blackheads visibly reduce on nose;\nOiliness reduces",
"BHA (Salicylic) + Niacinamide"],
["8-12 weeks", "Pore appearance minimises;\nSkin texture smoother",
"Niacinamide + AHA + Adapalene"],
["3-6 months", "Shallow boxcar/rolling scars softer;\nOverall skin tone improved",
"Adapalene (collagen building)"],
["6-12 months", "Moderate improvement in pitted scar depth",
"Adapalene 0.3% (dermatologist)"],
["After in-clinic\ntreatment",
"Significant reduction in pitted scar depth (50-70%+)",
"TCA CROSS / RF Microneedling /\nSubcision"],
]
tlt = Table(tl_rows, colWidths=[3.2*cm, 8.2*cm, 6.0*cm])
tlt.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0), colors.HexColor("#4A148C")),
("TEXTCOLOR",(0,0),(-1,0), WHITE),
("FONTNAME",(0,0),(-1,0), "Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1), 8),
("TOPPADDING",(0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 5),
("VALIGN",(0,0),(-1,-1), "TOP"),
("ROWBACKGROUNDS",(0,1),(-1,-1), [PURPLE_LT, WHITE]),
("GRID",(0,0),(-1,-1), 0.4, GREY_MID),
]))
story.append(tlt)
story.append(Spacer(1, 0.3*cm))
# ── FOOTER ────────────────────────────────────────────────────────────────
story.append(divider())
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"Prepared with dermatologist-aligned guidance · Based on PRACT-India 2025 Consensus & clinical evidence · "
"For personalised prescription advice (tretinoin, 0.3% adapalene) please consult a qualified dermatologist",
FOOT))
# ══════════════════════════════════════════════════════════════════════════
# BUILD
# ══════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
doc.build(story)
print(f"PDF saved: {OUTPUT}")
python3 /tmp/workspace/skincare/routine_pdf.py
ls -lh /tmp/workspace/skincare/indian_skincare_routine.pdf
indian skincare routine
PDF Document · PDF
Currently, if she can get only one out of the BHAAHA and adapting, which one should she get and how should she use it and also suggest alternative alternative brand as well. Indian brand.
| Adapalene | BHA (Salicylic) | AHA (Glycolic) | |
|---|---|---|---|
| Treats pitted scars | ✅ Yes — rebuilds collagen | ❌ No | ❌ Minimal |
| Clears blackheads | ✅ Yes — unclogs pores (retinoid) | ✅ Yes (better) | ❌ No |
| Controls oil | ✅ Yes — reduces sebum long-term | ✅ Short-term | ❌ No |
| Improves skin texture | ✅ Yes | ✅ Yes | ✅ Yes |
| Prevents new scars | ✅ Best in class | ❌ No | ❌ No |
| Price | ₹150-180 | ₹599 | ₹599 |
| Week | Frequency | Notes |
|---|---|---|
| Week 1-2 | 2 nights/week (Mon + Thu) | Start gentle. Expect mild dryness. |
| Week 3-4 | 3 nights/week | You may get a purge (new pimples) — do NOT stop. |
| Week 5-8 | 4 nights/week | Skin adapting. Texture starting to smooth. |
| Week 9+ | Every night (if tolerated) | Maintenance dose for ongoing scar improvement. |
| Brand | Manufacturer | Price | Availability | Notes |
|---|---|---|---|---|
| Adaferin Gel 0.1% | Galderma India | ~₹175 | Pan India at medical stores | First choice - original brand, most researched, Galderma microcrystal formula penetrates follicles faster. Introduced in India 2001. |
| Deriva Gel 0.1% | Micro Labs | ~₹130-150 | Very widely available | Best alternative - Micro Labs is a reputable Indian pharma company, good formulation, cheaper than Adaferin |
| Aclene Gel 0.1% | Sun Pharma | ~₹120-140 | Most chemists | Sun Pharma is India's largest pharma - reliable quality, very affordable |
| Adpalen Gel 0.1% | Generic/various | ~₹100-130 | Larger chemists | Works fine, just less consistent base formulation |
| Epiduo Gel | Galderma India | ~₹499-561 | Clinikally, Nykaa, chemists | Adapalene 0.1% + Benzoyl Peroxide 2.5% combo - actually better for both scars AND active acne, but more expensive. Worth considering if she has occasional active breakouts too. |
What abt squalene glow creme serum pilgrim ?