Best skincare affordable for dullness according to you in india
best affordable skincare for dullness India 2025 2026
Minimalist niacinamide vitamin C dullness India review 2025
| Step | Product | Price |
|---|---|---|
| Cleanser | Minimalist Salicylic Acid Face Wash | ₹249 |
| Serum | Minimalist 10% Vitamin C | ₹469 |
| Moisturizer | Plum Niacinamide Moisturiser | ₹399 |
| Sunscreen | Minimalist SPF 50 Multi-Vitamins | ₹399 |
| Total | ~₹1516 |
Create a comparison chart of these serums & ingredients
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/skincare-chart && cat << 'EOF' > /home/daytona/workspace/skincare-chart/create_chart.py from openpyxl import Workbook from openpyxl.styles import ( Font, PatternFill, Alignment, Border, Side, GradientFill ) from openpyxl.utils import get_column_letter wb = Workbook() ws = wb.active ws.title = "Serum Comparison" # ── Colour palette ────────────────────────────────────────────────── HEADER_BG = "4A90D9" # blue SUBHDR_BG = "EAF4FF" # light blue ALT_ROW_BG = "F5FAFF" # very light blue WHITE = "FFFFFF" DARK_TXT = "1A1A2E" ACCENT_GRN = "27AE60" # ✓ green ACCENT_RED = "E74C3C" # ✗ red ACCENT_YLW = "F39C12" # partial / moderate TITLE_BG = "1B3A6B" # dark navy thin = Side(style="thin", color="BDC3C7") thick = Side(style="medium", color="4A90D9") def border(t=False, b=False, l=False, r=False): return Border( top=thick if t else thin, bottom=thick if b else thin, left=thick if l else thin, right=thick if r else thin, ) def cell_fmt(ws, rc, value="", bold=False, italic=False, font_color=DARK_TXT, bg=None, align="center", wrap=False, size=11, border_obj=None): c = ws.cell(row=rc[0], column=rc[1], value=value) c.font = Font(name="Arial", bold=bold, italic=italic, color=font_color, size=size) if bg: c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal=align, vertical="center", wrap_text=wrap) if border_obj: c.border = border_obj return c # ── Data ──────────────────────────────────────────────────────────── serums = [ { "name": "Minimalist\n10% Vitamin C", "brand": "Minimalist", "price": "~₹469", "key_ingredient": "Ethyl Ascorbic Acid 10%", "secondary": "Ferulic Acid", "targets": "Dullness, Dark Spots, Uneven Tone", "texture": "Lightweight Fluid", "skin_types": "All Skin Types", "time_of_use": "Morning", "vit_c": "✓", "niacinamide": "✗", "arbutin": "✗", "aha": "✗", "hyaluronic": "✗", "ferulic": "✓", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★★☆☆☆", "stability": "High (Ethyl form)", "results_timeline": "4–6 weeks", "rating": "4.5/5", "buy": "Amazon / Nykaa / Minimalist.in", }, { "name": "Minimalist\nAlpha Arbutin 2% + HA", "brand": "Minimalist", "price": "~₹399", "key_ingredient": "Alpha Arbutin 2%", "secondary": "Hyaluronic Acid", "targets": "Dark Spots, Hyperpigmentation, Hydration", "texture": "Watery Serum", "skin_types": "All Skin Types", "time_of_use": "AM & PM", "vit_c": "✗", "niacinamide": "✗", "arbutin": "✓", "aha": "✗", "hyaluronic": "✓", "ferulic": "✗", "brightening": "★★★★☆", "anti_aging": "★★★☆☆", "hydration": "★★★★☆", "stability": "Very High", "results_timeline": "6–8 weeks", "rating": "4.4/5", "buy": "Amazon / Nykaa / Minimalist.in", }, { "name": "Plum 15%\nVitamin C Glow Serum", "brand": "Plum", "price": "~₹599", "key_ingredient": "Ethyl Ascorbic Acid 15%", "secondary": "Niacinamide 5%, HA", "targets": "Dullness, Dark Spots, Glow", "texture": "Gel-Serum", "skin_types": "Normal / Oily / Combo", "time_of_use": "Morning", "vit_c": "✓", "niacinamide": "✓", "arbutin": "✗", "aha": "✗", "hyaluronic": "✓", "ferulic": "✗", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★★★★☆", "stability": "High", "results_timeline": "3–5 weeks", "rating": "4.6/5", "buy": "Amazon / Nykaa / Plum website", }, { "name": "Minimalist\nAHA 25% + BHA 5% Exfoliant", "brand": "Minimalist", "price": "~₹599", "key_ingredient": "Glycolic + Lactic Acid (AHA 25%)", "secondary": "Salicylic Acid (BHA 5%)", "targets": "Dullness, Dead Skin, Uneven Texture", "texture": "Liquid Exfoliant", "skin_types": "Normal / Oily (Not Sensitive)", "time_of_use": "Night (2–3x/week)", "vit_c": "✗", "niacinamide": "✗", "arbutin": "✗", "aha": "✓", "hyaluronic": "✗", "ferulic": "✗", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★☆☆☆☆", "stability": "Very High", "results_timeline": "1–2 weeks", "rating": "4.3/5", "buy": "Amazon / Nykaa / Minimalist.in", }, { "name": "Dr. Sheth's\nCeramide & Niacinamide Serum", "brand": "Dr. Sheth's", "price": "~₹695", "key_ingredient": "Niacinamide 5%", "secondary": "Ceramides, HA", "targets": "Dullness, Large Pores, Uneven Skin Tone", "texture": "Lightweight Lotion", "skin_types": "All Skin Types esp. Sensitive", "time_of_use": "AM & PM", "vit_c": "✗", "niacinamide": "✓", "arbutin": "✗", "aha": "✗", "hyaluronic": "✓", "ferulic": "✗", "brightening": "★★★★☆", "anti_aging": "★★★★☆", "hydration": "★★★★★", "stability": "Very High", "results_timeline": "4–6 weeks", "rating": "4.5/5", "buy": "Amazon / Nykaa / Dr. Sheth's website", }, ] # ── Title row ──────────────────────────────────────────────────────── ws.merge_cells("A1:L1") title_cell = ws["A1"] title_cell.value = "✦ AFFORDABLE SERUMS FOR DULLNESS — INDIA 2026 COMPARISON CHART ✦" title_cell.font = Font(name="Arial", bold=True, color=WHITE, size=14) title_cell.fill = PatternFill("solid", start_color=TITLE_BG) title_cell.alignment = Alignment(horizontal="center", vertical="center") ws.row_dimensions[1].height = 34 # ── Column headers ─────────────────────────────────────────────────── headers = [ "Serum / Product", "Brand", "Price\n(approx)", "Key Ingredient", "Secondary\nIngredients", "Skin Concern\nTargeted", "Skin Type", "Use Time", "Brightening\nPower", "Hydration\nLevel", "Results\nTimeline", "Our Rating", ] col_widths = [24, 14, 10, 28, 24, 32, 26, 18, 14, 12, 14, 11] for ci, (h, w) in enumerate(zip(headers, col_widths), start=1): c = ws.cell(row=2, column=ci, value=h) c.font = Font(name="Arial", bold=True, color=WHITE, size=10) c.fill = PatternFill("solid", start_color=HEADER_BG) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = Border( top=Side(style="medium", color=WHITE), bottom=Side(style="medium", color=WHITE), left=Side(style="thin", color=WHITE), right=Side(style="thin", color=WHITE), ) ws.column_dimensions[get_column_letter(ci)].width = w ws.row_dimensions[2].height = 36 # ── Ingredient sub-header ───────────────────────────────────────────── # (separate sheet for ingredient matrix) ws2 = wb.create_sheet("Ingredient Matrix") ing_headers = ["Serum / Product", "Price", "Vitamin C", "Niacinamide", "Alpha Arbutin", "AHA/BHA", "Hyaluronic Acid", "Ferulic Acid", "Brightening", "Anti-Aging", "Hydration", "Best For", "When to Use"] ing_widths = [26, 10, 12, 13, 14, 10, 16, 12, 14, 12, 12, 30, 20] ws2.merge_cells("A1:M1") t2 = ws2["A1"] t2.value = "✦ SERUM INGREDIENT & BENEFIT MATRIX ✦" t2.font = Font(name="Arial", bold=True, color=WHITE, size=13) t2.fill = PatternFill("solid", start_color=TITLE_BG) t2.alignment = Alignment(horizontal="center", vertical="center") ws2.row_dimensions[1].height = 30 for ci, (h, w) in enumerate(zip(ing_headers, ing_widths), start=1): c = ws2.cell(row=2, column=ci, value=h) c.font = Font(name="Arial", bold=True, color=WHITE, size=10) c.fill = PatternFill("solid", start_color=HEADER_BG) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = Border( top=Side(style="medium", color=WHITE), bottom=Side(style="medium", color=WHITE), left=Side(style="thin", color=WHITE), right=Side(style="thin", color=WHITE), ) ws2.column_dimensions[get_column_letter(ci)].width = w ws2.row_dimensions[2].height = 32 # ── Populate rows ───────────────────────────────────────────────────── def tick_color(val): if val == "✓": return ACCENT_GRN elif val == "✗": return ACCENT_RED return DARK_TXT for ri, s in enumerate(serums, start=3): bg = ALT_ROW_BG if ri % 2 == 0 else WHITE row_data = [ s["name"], s["brand"], s["price"], s["key_ingredient"], s["secondary"], s["targets"], s["skin_types"], s["time_of_use"], s["brightening"], s["hydration"], s["results_timeline"], s["rating"], ] for ci, val in enumerate(row_data, start=1): c = ws.cell(row=ri, column=ci, value=val) c.font = Font(name="Arial", size=10, bold=(ci == 1), color=DARK_TXT) c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal="center" if ci != 4 else "left", vertical="center", wrap_text=True) c.border = Border( left=Side(style="thin", color="BDC3C7"), right=Side(style="thin", color="BDC3C7"), top=Side(style="thin", color="BDC3C7"), bottom=Side(style="thin", color="BDC3C7"), ) ws.row_dimensions[ri].height = 44 # Ingredient matrix sheet ing_row = [ s["name"], s["price"], s["vit_c"], s["niacinamide"], s["arbutin"], s["aha"], s["hyaluronic"], s["ferulic"], s["brightening"], s["anti_aging"], s["hydration"], s["targets"], s["time_of_use"], ] for ci2, val2 in enumerate(ing_row, start=1): c2 = ws2.cell(row=ri, column=ci2, value=val2) is_tick = val2 in ("✓", "✗") fc = tick_color(val2) if is_tick else DARK_TXT c2.font = Font(name="Arial", size=11 if is_tick else 10, bold=(is_tick or ci2 == 1), color=fc) c2.fill = PatternFill("solid", start_color=bg) c2.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c2.border = Border( left=Side(style="thin", color="BDC3C7"), right=Side(style="thin", color="BDC3C7"), top=Side(style="thin", color="BDC3C7"), bottom=Side(style="thin", color="BDC3C7"), ) ws2.row_dimensions[ri].height = 44 # ── Legend / Notes sheet ────────────────────────────────────────────── ws3 = wb.create_sheet("Notes & How to Use") notes = [ ("SKINCARE NOTES & USAGE GUIDE", True, TITLE_BG, WHITE, 13), ("", False, WHITE, DARK_TXT, 10), ("HOW TO COMBINE THESE SERUMS", True, HEADER_BG, WHITE, 11), ("Morning Routine:", True, SUBHDR_BG, DARK_TXT, 10), ("1. Cleanser → 2. Vitamin C Serum (Minimalist / Plum) → 3. Alpha Arbutin → 4. Moisturiser → 5. SPF 50+", False, WHITE, DARK_TXT, 10), ("Night Routine:", True, SUBHDR_BG, DARK_TXT, 10), ("1. Cleanser → 2. AHA/BHA Exfoliant (2–3x/week ONLY) → 3. Niacinamide Serum → 4. Moisturiser", False, WHITE, DARK_TXT, 10), ("", False, WHITE, DARK_TXT, 10), ("KEY INGREDIENT GUIDE", True, HEADER_BG, WHITE, 11), ("Vitamin C (Ethyl Ascorbic Acid)", True, SUBHDR_BG, DARK_TXT, 10), ("Brightens dull skin, fades dark spots, boosts collagen. Use in the morning. Pairs well with SPF.", False, WHITE, DARK_TXT, 10), ("Niacinamide (Vitamin B3)", True, SUBHDR_BG, DARK_TXT, 10), ("Reduces pore size, evens skin tone, controls sebum. Can be used AM & PM.", False, WHITE, DARK_TXT, 10), ("Alpha Arbutin", True, SUBHDR_BG, DARK_TXT, 10), ("Inhibits melanin production. Targets stubborn dark spots. Very gentle — safe for all skin types.", False, WHITE, DARK_TXT, 10), ("AHA (Glycolic / Lactic Acid)", True, SUBHDR_BG, DARK_TXT, 10), ("Exfoliates dead skin cells causing dullness. Use only at NIGHT, 2–3x per week max.", False, WHITE, DARK_TXT, 10), ("Hyaluronic Acid", True, SUBHDR_BG, DARK_TXT, 10), ("Draws moisture into the skin. Plumps and brightens dehydrated dull skin.", False, WHITE, DARK_TXT, 10), ("Ferulic Acid", True, SUBHDR_BG, DARK_TXT, 10), ("Antioxidant that stabilises and boosts Vitamin C efficacy.", False, WHITE, DARK_TXT, 10), ("", False, WHITE, DARK_TXT, 10), ("WARNINGS", True, "FFE0E0", ACCENT_RED, 11), ("Do NOT use Vitamin C and AHA/BHA in the same routine (causes irritation).", False, "FFF5F5", ACCENT_RED, 10), ("Always patch test new products for 24–48 hours.", False, "FFF5F5", DARK_TXT, 10), ("Expect 4–8 weeks for visible brightening results — consistency is key.", False, "FFF5F5", DARK_TXT, 10), ("Always use SPF 50+ in the morning when using Vitamin C or AHAs.", False, "FFF5F5", DARK_TXT, 10), ] ws3.column_dimensions["A"].width = 90 for ri, (txt, bold, bg, fc, sz) in enumerate(notes, start=1): c = ws3.cell(row=ri, column=1, value=txt) c.font = Font(name="Arial", bold=bold, color=fc, size=sz) c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal="left", vertical="center", wrap_text=True) ws3.row_dimensions[ri].height = 22 # ── Freeze panes ────────────────────────────────────────────────────── ws.freeze_panes = "A3" ws2.freeze_panes = "A3" # ── Save ────────────────────────────────────────────────────────────── out_path = "/home/daytona/workspace/skincare-chart/Serum_Comparison_India_2026.xlsx" wb.save(out_path) print(f"Saved: {out_path}") EOF python /home/daytona/workspace/skincare-chart/create_chart.py
ls -la /home/daytona/workspace/skincare-chart/ && python3 -c " import io, openpyxl wb = openpyxl.Workbook() ws = wb.active ws['A1'] = 'test' buf = io.BytesIO() wb.save(buf) print('BytesIO save works, len:', len(buf.getvalue())) "
cat << 'PYEOF' > /home/daytona/workspace/skincare-chart/create_chart.py import io from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment, Border, Side from openpyxl.utils import get_column_letter wb = Workbook() ws = wb.active ws.title = "Serum Comparison" # Colours HEADER_BG = "4A90D9" SUBHDR_BG = "EAF4FF" ALT_ROW_BG = "F5FAFF" WHITE = "FFFFFF" DARK_TXT = "1A1A2E" ACCENT_GRN = "27AE60" ACCENT_RED = "E74C3C" TITLE_BG = "1B3A6B" def thin_border(): s = Side(style="thin", color="BDC3C7") return Border(left=s, right=s, top=s, bottom=s) def hdr_border(): s = Side(style="thin", color="FFFFFF") return Border(left=s, right=s, top=s, bottom=s) serums = [ { "name": "Minimalist 10% Vitamin C", "brand": "Minimalist", "price": "~Rs.469", "key_ing": "Ethyl Ascorbic Acid 10%", "secondary": "Ferulic Acid", "targets": "Dullness, Dark Spots, Uneven Tone", "skin_type": "All Skin Types", "use_time": "Morning", "vit_c": "YES", "niacinamide": "NO", "arbutin": "NO", "aha": "NO", "ha": "NO", "ferulic": "YES", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★★☆☆☆", "timeline": "4-6 weeks", "rating": "4.5 / 5", }, { "name": "Minimalist Alpha Arbutin 2% + HA", "brand": "Minimalist", "price": "~Rs.399", "key_ing": "Alpha Arbutin 2%", "secondary": "Hyaluronic Acid", "targets": "Dark Spots, Hyperpigmentation, Hydration", "skin_type": "All Skin Types", "use_time": "AM & PM", "vit_c": "NO", "niacinamide": "NO", "arbutin": "YES", "aha": "NO", "ha": "YES", "ferulic": "NO", "brightening": "★★★★☆", "anti_aging": "★★★☆☆", "hydration": "★★★★☆", "timeline": "6-8 weeks", "rating": "4.4 / 5", }, { "name": "Plum 15% Vitamin C Glow Serum", "brand": "Plum", "price": "~Rs.599", "key_ing": "Ethyl Ascorbic Acid 15%", "secondary": "Niacinamide 5%, HA", "targets": "Dullness, Dark Spots, Glow", "skin_type": "Normal / Oily / Combo", "use_time": "Morning", "vit_c": "YES", "niacinamide": "YES", "arbutin": "NO", "aha": "NO", "ha": "YES", "ferulic": "NO", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★★★★☆", "timeline": "3-5 weeks", "rating": "4.6 / 5", }, { "name": "Minimalist AHA 25% + BHA 5%", "brand": "Minimalist", "price": "~Rs.599", "key_ing": "Glycolic + Lactic Acid 25%", "secondary": "Salicylic Acid (BHA 5%)", "targets": "Dullness, Dead Skin, Uneven Texture", "skin_type": "Normal / Oily (Not Sensitive)", "use_time": "Night 2-3x/week", "vit_c": "NO", "niacinamide": "NO", "arbutin": "NO", "aha": "YES", "ha": "NO", "ferulic": "NO", "brightening": "★★★★★", "anti_aging": "★★★★☆", "hydration": "★☆☆☆☆", "timeline": "1-2 weeks", "rating": "4.3 / 5", }, { "name": "Dr. Sheth's Niacinamide 5% Serum", "brand": "Dr. Sheth's", "price": "~Rs.695", "key_ing": "Niacinamide 5%", "secondary": "Ceramides, Hyaluronic Acid", "targets": "Dullness, Pores, Uneven Tone, Barrier", "skin_type": "All Types incl. Sensitive", "use_time": "AM & PM", "vit_c": "NO", "niacinamide": "YES", "arbutin": "NO", "aha": "NO", "ha": "YES", "ferulic": "NO", "brightening": "★★★★☆", "anti_aging": "★★★★☆", "hydration": "★★★★★", "timeline": "4-6 weeks", "rating": "4.5 / 5", }, ] # ── Sheet 1: Full Comparison ────────────────────────────────────────── ws.merge_cells("A1:L1") tc = ws["A1"] tc.value = "AFFORDABLE SERUMS FOR DULLNESS - INDIA 2026 COMPARISON CHART" tc.font = Font(name="Arial", bold=True, color=WHITE, size=13) tc.fill = PatternFill("solid", start_color=TITLE_BG) tc.alignment = Alignment(horizontal="center", vertical="center") ws.row_dimensions[1].height = 32 headers = [ "Serum / Product", "Brand", "Price", "Key Ingredient", "Secondary Ingredients", "Skin Concern Targeted", "Skin Type", "When to Use", "Brightening", "Anti-Aging", "Hydration", "Our Rating", ] col_widths = [30, 14, 10, 30, 26, 34, 28, 18, 13, 12, 12, 11] for ci, (h, w) in enumerate(zip(headers, col_widths), start=1): c = ws.cell(row=2, column=ci, value=h) c.font = Font(name="Arial", bold=True, color=WHITE, size=10) c.fill = PatternFill("solid", start_color=HEADER_BG) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = hdr_border() ws.column_dimensions[get_column_letter(ci)].width = w ws.row_dimensions[2].height = 34 for ri, s in enumerate(serums, start=3): bg = ALT_ROW_BG if ri % 2 == 0 else WHITE row = [ s["name"], s["brand"], s["price"], s["key_ing"], s["secondary"], s["targets"], s["skin_type"], s["use_time"], s["brightening"], s["anti_aging"], s["hydration"], s["rating"], ] for ci, val in enumerate(row, start=1): c = ws.cell(row=ri, column=ci, value=val) c.font = Font(name="Arial", size=10, bold=(ci == 1), color=DARK_TXT) c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = thin_border() ws.row_dimensions[ri].height = 44 ws.freeze_panes = "A3" # ── Sheet 2: Ingredient Matrix ──────────────────────────────────────── ws2 = wb.create_sheet("Ingredient Matrix") ws2.merge_cells("A1:J1") t2 = ws2["A1"] t2.value = "SERUM INGREDIENT & BENEFIT MATRIX" t2.font = Font(name="Arial", bold=True, color=WHITE, size=13) t2.fill = PatternFill("solid", start_color=TITLE_BG) t2.alignment = Alignment(horizontal="center", vertical="center") ws2.row_dimensions[1].height = 30 ing_headers = [ "Serum / Product", "Price", "Vitamin C", "Niacinamide", "Alpha Arbutin", "AHA / BHA", "Hyaluronic Acid", "Ferulic Acid", "Brightening Power", "Best Timeline", ] ing_widths = [30, 10, 13, 14, 15, 12, 16, 13, 18, 14] for ci, (h, w) in enumerate(zip(ing_headers, ing_widths), start=1): c = ws2.cell(row=2, column=ci, value=h) c.font = Font(name="Arial", bold=True, color=WHITE, size=10) c.fill = PatternFill("solid", start_color=HEADER_BG) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = hdr_border() ws2.column_dimensions[get_column_letter(ci)].width = w ws2.row_dimensions[2].height = 32 for ri, s in enumerate(serums, start=3): bg = ALT_ROW_BG if ri % 2 == 0 else WHITE ing_row = [ s["name"], s["price"], s["vit_c"], s["niacinamide"], s["arbutin"], s["aha"], s["ha"], s["ferulic"], s["brightening"], s["timeline"], ] for ci, val in enumerate(ing_row, start=1): c = ws2.cell(row=ri, column=ci, value=val) is_yn = val in ("YES", "NO") if is_yn: fc = ACCENT_GRN if val == "YES" else ACCENT_RED else: fc = DARK_TXT c.font = Font(name="Arial", size=10, bold=(is_yn or ci == 1), color=fc) c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) c.border = thin_border() ws2.row_dimensions[ri].height = 44 ws2.freeze_panes = "A3" # ── Sheet 3: Usage Guide ────────────────────────────────────────────── ws3 = wb.create_sheet("Usage Guide") ws3.column_dimensions["A"].width = 85 guide = [ ("SKINCARE USAGE GUIDE & INGREDIENT NOTES", True, TITLE_BG, WHITE, 13), ("", False, WHITE, DARK_TXT, 10), ("MORNING ROUTINE (for dullness)", True, HEADER_BG, WHITE, 11), ("Step 1 - Cleanser", True, SUBHDR_BG, DARK_TXT, 10), ("Step 2 - Vitamin C Serum (Minimalist 10% or Plum 15%)", False, WHITE, DARK_TXT, 10), ("Step 3 - Alpha Arbutin Serum (optional, pat on after Vitamin C)", False, WHITE, DARK_TXT, 10), ("Step 4 - Niacinamide Moisturiser or Serum", False, WHITE, DARK_TXT, 10), ("Step 5 - SPF 50+ Sunscreen (MANDATORY when using Vit C)", False, WHITE, DARK_TXT, 10), ("", False, WHITE, DARK_TXT, 10), ("NIGHT ROUTINE (for dullness)", True, HEADER_BG, WHITE, 11), ("Step 1 - Cleanser", True, SUBHDR_BG, DARK_TXT, 10), ("Step 2 - AHA/BHA Exfoliant (2-3x per week ONLY, not every night)", False, WHITE, DARK_TXT, 10), ("Step 3 - Niacinamide Serum (on nights you skip exfoliant)", False, WHITE, DARK_TXT, 10), ("Step 4 - Moisturiser with Ceramides", False, WHITE, DARK_TXT, 10), ("", False, WHITE, DARK_TXT, 10), ("INGREDIENT GUIDE", True, HEADER_BG, WHITE, 11), ("Vitamin C (Ethyl Ascorbic Acid)", True, SUBHDR_BG, DARK_TXT, 10), ("Brightens dull skin, fades dark spots, boosts collagen. Use in the morning only. Always follow with SPF.", False, WHITE, DARK_TXT, 10), ("Niacinamide (Vitamin B3)", True, SUBHDR_BG, DARK_TXT, 10), ("Reduces pore appearance, evens skin tone, controls oil. Safe AM and PM. Very gentle.", False, WHITE, DARK_TXT, 10), ("Alpha Arbutin", True, SUBHDR_BG, DARK_TXT, 10), ("Blocks melanin production. Targets stubborn dark spots. Extremely gentle, suits all skin types.", False, WHITE, DARK_TXT, 10), ("AHA (Glycolic/Lactic Acid) + BHA (Salicylic Acid)", True, SUBHDR_BG, DARK_TXT, 10), ("Chemical exfoliant that removes dead skin causing dullness. Night use only, 2-3 times/week maximum.", False, WHITE, DARK_TXT, 10), ("Hyaluronic Acid", True, SUBHDR_BG, DARK_TXT, 10), ("Deeply hydrates skin. Plumps and brightens dehydrated, dull complexion.", False, WHITE, DARK_TXT, 10), ("Ferulic Acid", True, SUBHDR_BG, DARK_TXT, 10), ("Antioxidant that stabilises Vitamin C and doubles its effectiveness.", False, WHITE, DARK_TXT, 10), ("", False, WHITE, DARK_TXT, 10), ("IMPORTANT WARNINGS", True, "FFE0E0", ACCENT_RED, 11), ("Do NOT use Vitamin C and AHA/BHA in the same routine (morning + night is fine, not same session).", False, "FFF5F5", ACCENT_RED, 10), ("Always patch test any new serum for 24-48 hours before full face use.", False, "FFF5F5", DARK_TXT, 10), ("Expect 4-8 weeks for visible brightening - consistency beats product hopping.", False, "FFF5F5", DARK_TXT, 10), ("Always use SPF 50+ every morning when using Vitamin C or AHAs.", False, "FFF5F5", ACCENT_RED, 10), ] for ri, (txt, bold, bg, fc, sz) in enumerate(guide, start=1): c = ws3.cell(row=ri, column=1, value=txt) c.font = Font(name="Arial", bold=bold, color=fc, size=sz) c.fill = PatternFill("solid", start_color=bg) c.alignment = Alignment(horizontal="left", vertical="center", wrap_text=True) ws3.row_dimensions[ri].height = 22 # ── Save via BytesIO to avoid filesystem issues ─────────────────────── buf = io.BytesIO() wb.save(buf) out_path = "/home/daytona/workspace/skincare-chart/Serum_Comparison_India_2026.xlsx" with open(out_path, "wb") as f: f.write(buf.getvalue()) print(f"Saved: {out_path} ({len(buf.getvalue())} bytes)") PYEOF python3 /home/daytona/workspace/skincare-chart/create_chart.py
ls /home/daytona/skills/xlsx/scripts/ 2>/dev/null && python3 /home/daytona/skills/xlsx/scripts/recalc.py /home/daytona/workspace/skincare-chart/Serum_Comparison_India_2026.xlsx 2>/dev/null || echo "recalc script not found or no formulas to check"
Serum Comparison India 2026
Spreadsheet · XLSX
Desonide cream
desonide cream 0.05% uses mechanism side effects corticosteroid
| Indication | Notes |
|---|---|
| Atopic dermatitis (eczema) | Especially in children; highly responsive |
| Seborrheic dermatitis | Face, scalp - preferred low-potency option |
| Contact dermatitis | Allergic and irritant types |
| Intertrigo | Intertriginous (skin fold) areas |
| Angular cheilitis | Often combined with an anticandidal agent |
| Otitis externa | Desonide otic lotion (0.05% + 2% acetic acid) |
| Psoriasis (intertriginous) | Gentle enough for skin fold psoriasis |
| Diaper dermatitis | In infants under supervised use |
Being low-potency and non-halogenated, desonide has a significantly lower risk of these effects compared to fluorinated steroids like clobetasol or betamethasone.
| Scenario | Why Desonide |
|---|---|
| Face / eyelids | Safe low-potency; potent steroids cause atrophy rapidly on facial skin |
| Children & infants | Lower HPA suppression risk |
| Chronic dry dermatoses | Suitable for maintenance/long-term use |
| Groin, axillae, genitalia | Natural occlusion = high absorption → needs low-potency steroid |
| Sensitive skin types | Non-halogenated = fewer local adverse effects |