hi,... i am looking for specific product characteristics of newly approved insulin icodec, [awikly]from a clinician pov

Reading File
Finding Sources
Searching PubMed

insulin icodec once weekly basal insulin

Searching the Web

insulin icodec FDA approved product characteristics clinician 2025 2026

Reading Article

PMID: 40802020

Reading Article

PMID: 38224978

Reading Web Page

https://www.drugs.com/newdrugs/fda-approves-awiqli-insulin-i…

Excellent - I now have comprehensive data. Here is the full clinician-oriented profile:

Awiqli (Insulin Icodec-abae) - Once-Weekly Basal Insulin: Clinician Profile

FDA Approved: March 26, 2026 | Manufacturer: Novo Nordisk | Trade name: Awiqli

1. Mechanism of Action - What Makes It "Weekly"

Icodec is a basal insulin analogue engineered with three key structural modifications that extend its half-life to ~196 hours (~8 days):
  • High albumin binding (~99.7%) - reversibly binds plasma albumin, creating a circulating depot
  • Reduced insulin receptor affinity - slows cellular uptake and clearance
  • Fatty acid side chain - similar strategy to degludec, further extends absorption from subcutaneous depot
The result is a flat, ultra-prolonged pharmacokinetic profile with significantly less peak-to-trough variability compared to glargine U-300 or degludec. Steady state is reached after 2-4 weekly doses (approximately 3-4 weeks into therapy).

2. Formulation & Delivery Device

ParameterDetail
ConcentrationU-700 (700 units/mL) - this is 7x more concentrated than standard U-100
DeliveryAwiqli FlexTouch pen (subcutaneous injection)
Injection frequencyOnce weekly, same day each week
Injection sitesAbdomen, thigh, upper arm (standard subcutaneous sites)
Pen typePre-filled, disposable - specifically designed for U-700
Clinical note on U-700 concentration: The pen is dose-locked to prevent unit confusion. Do NOT attempt to draw up in a syringe - this would result in massive dosing error (7x overdose). Only use the dedicated Awiqli FlexTouch.

3. Approved Indication

  • Adults with type 2 diabetes requiring basal insulin, as adjunct to diet and exercise
  • NOT approved for type 1 diabetes in the US (the FDA US label is T2D-specific, though some markets differ)
  • NOT approved in pediatric populations (safety/efficacy not established)

4. Dosing & Titration

Starting Doses (Insulin-Naive T2D)

  • Start at 70 units once weekly (equivalent to ~10 units/day of a daily basal)
  • Or use the Awiqli dosing guide app (Novo Nordisk) which assists with dose calculation and tracking

Conversion from Daily Basal Insulin

Switching FromConversion FactorNotes
Once-daily glargine U-100/U-300 or degludecTotal weekly dose = daily dose × 7 × 0.8 (i.e., 80%)20% reduction to account for the flatter profile and reduced hypoglycemia risk during initiation
Twice-daily NPH or premixedConvert total daily dose × 7 × 0.8Expect slower onset of full steady-state effect

Titration Algorithm

  • Target fasting glucose: 80-130 mg/dL (per label/ONWARDS protocol)
  • Adjust dose by ±20 units per week based on fasting glucose readings from the preceding 3 days
  • Minimum recommended dose: 50 units/week

Missed Dose

  • If a dose is missed and there are ≥3 days (72 hours) until the next scheduled dose - administer the missed dose
  • If <72 hours remain until next scheduled dose - skip the missed dose and resume on the usual day
  • This window is clinically generous compared to daily insulins due to the long half-life

5. Efficacy - ONWARDS Phase 3 Program (T2D Trials)

The US FDA approval was based on 4 randomized, treat-to-target trials in ~2,680 adults with uncontrolled T2D:
TrialComparatorBackground therapyKey finding
ONWARDS 1Glargine U-300OADs ± GLP-1 RANon-inferior HbA1c reduction; icodec superior at week 52 in insulin-naive
ONWARDS 2DegludecBasal insulin (switching)Non-inferior HbA1c
ONWARDS 3Glargine U-100Insulin-naive + OADsNon-inferior HbA1c
ONWARDS 5Daily basal analoguesInsulin-naive, with dosing appNon-inferior; improved treatment satisfaction
HbA1c reduction: Comparable to once-daily basal analogues across trials (~1.0-1.6% reduction from baseline). Icodec was non-inferior and in some comparisons numerically superior.

6. Safety Profile - Key Clinical Considerations

Hypoglycemia

  • Overall hypoglycemia rates were similar to daily basal insulins in the ONWARDS trials
  • However: clinically significant hypoglycemia (<54 mg/dL) was slightly higher with icodec in some trials, particularly in the first 4-8 weeks (loading phase while reaching steady state)
  • The long half-life means hypoglycemia can be prolonged and harder to correct - patients and caregivers must be counseled on this
  • Risk is higher during the titration phase (weeks 1-4)

Other Adverse Effects

  • Injection site reactions
  • Lipodystrophy (rotate sites)
  • Weight gain (comparable to daily basal)
  • Peripheral edema
  • Hypokalemia (class effect)
  • Serious allergic/anaphylactic reactions (rare, class effect)

7. Special Populations - Practical Flags

PopulationGuidance
ElderlyUse with caution; hypoglycemia may be prolonged - consider lower starting dose
Renal impairmentIncreased hypoglycemia sensitivity - more frequent glucose monitoring; dose adjust as needed
Hepatic impairmentSimilar caution - reduced gluconeogenesis amplifies hypo risk
PregnancyNot recommended - insufficient data; switch to well-studied daily insulins (NPH or glargine U-100)
Hospitalized patientsSwitch to daily insulin during acute illness/surgery - weekly dosing is NOT appropriate in ICU or perioperative settings due to unpredictable eating/activity changes and inability to rapidly adjust
T1DUsed in some markets (EU-approved for T1D); US label is T2D only; requires co-administration with bolus insulin; slightly higher hypoglycemia rate in T1D vs T2D

8. Drug Interactions & Co-medication

  • Can be used with OADs, GLP-1 receptor agonists, and mealtime insulin
  • GLP-1 RA combination (e.g., IcoSema - icodec + semaglutide co-formulation) is in late-stage trials (COMBINE program, COMBINE 2 Lancet Diabetol 2025, PMID 40482670)
  • Drugs that affect glucose metabolism (corticosteroids, beta-blockers masking hypo symptoms, alcohol) require standard counseling

9. Contraindications

  • Hypersensitivity to insulin icodec or any excipient
  • During episodes of hypoglycemia
  • NOT for IV administration (must be subcutaneous only)

10. Key Practical Pearls for Clinicians

  1. Steady state takes 3-4 weeks - do not expect full effect in the first 1-2 injections; avoid aggressive uptitration in the first month
  2. The 80% dose conversion rule when switching from daily basal - this is intentional and should not be "corrected" upward prematurely
  3. Hypo is prolonged - ensure patients have glucagon or fast-acting glucose available; the long half-life means a single glucose correction may not be enough
  4. Do NOT use in hospital - perioperative and critical care settings require daily insulin flexibility; switch to daily insulin on admission
  5. Same-day flexibility - if patient misses their usual day by 1-2 days, they can still inject without major glycemic disruption (a practical advantage over daily insulin)
  6. Patient selection - best candidates are adherence-challenged patients with T2D who are not at high hypoglycemia risk and who are not pregnant or planning pregnancy

Supporting Evidence

Create a practical quick-reference PDF on icodec dosing & conversion for clinician use

Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/icodec-pdf && ls /tmp/workspace/icodec-pdf/

Writing File

~/icodec-pdf/build_icodec_pdf.py

"""
Insulin Icodec (Awiqli) Clinician Quick-Reference PDF
Built with ReportLab
"""

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

# ─────────────────────────────────────────────
# Colour palette  (navy / teal / amber / white)
# ─────────────────────────────────────────────
NAVY     = colors.HexColor("#1B3A5C")
TEAL     = colors.HexColor("#0D7A8A")
AMBER    = colors.HexColor("#E07B39")
LTBLUE   = colors.HexColor("#D6EAF8")
LTGREY   = colors.HexColor("#F2F4F4")
MIDGREY  = colors.HexColor("#BDC3C7")
WHITE    = colors.white
RED      = colors.HexColor("#C0392B")
GREEN    = colors.HexColor("#1A7A4A")

OUTPUT   = "/tmp/workspace/icodec-pdf/Icodec_Clinician_QuickRef.pdf"
PAGE_W, PAGE_H = A4
MARGIN = 15 * mm


# ─────────────────────────────────────────────
# Styles
# ─────────────────────────────────────────────
def make_styles():
    base = getSampleStyleSheet()

    styles = {}

    styles["banner_title"] = ParagraphStyle(
        "banner_title", fontName="Helvetica-Bold", fontSize=18,
        textColor=WHITE, alignment=TA_CENTER, leading=22, spaceAfter=2
    )
    styles["banner_sub"] = ParagraphStyle(
        "banner_sub", fontName="Helvetica", fontSize=9,
        textColor=colors.HexColor("#AED6F1"), alignment=TA_CENTER, leading=12
    )
    styles["section_hdr"] = ParagraphStyle(
        "section_hdr", fontName="Helvetica-Bold", fontSize=10,
        textColor=WHITE, alignment=TA_LEFT, leading=13, spaceAfter=1,
        spaceBefore=4
    )
    styles["body"] = ParagraphStyle(
        "body", fontName="Helvetica", fontSize=8.5,
        textColor=colors.HexColor("#1C1C1C"), leading=12, spaceAfter=2
    )
    styles["body_bold"] = ParagraphStyle(
        "body_bold", fontName="Helvetica-Bold", fontSize=8.5,
        textColor=NAVY, leading=12, spaceAfter=2
    )
    styles["small"] = ParagraphStyle(
        "small", fontName="Helvetica", fontSize=7.5,
        textColor=colors.HexColor("#555555"), leading=10
    )
    styles["warning"] = ParagraphStyle(
        "warning", fontName="Helvetica-Bold", fontSize=8,
        textColor=RED, leading=11
    )
    styles["green"] = ParagraphStyle(
        "green", fontName="Helvetica-Bold", fontSize=8,
        textColor=GREEN, leading=11
    )
    styles["tbl_hdr"] = ParagraphStyle(
        "tbl_hdr", fontName="Helvetica-Bold", fontSize=8,
        textColor=WHITE, alignment=TA_CENTER, leading=10
    )
    styles["tbl_cell"] = ParagraphStyle(
        "tbl_cell", fontName="Helvetica", fontSize=8,
        textColor=colors.HexColor("#1C1C1C"), leading=10, alignment=TA_LEFT
    )
    styles["tbl_cell_bold"] = ParagraphStyle(
        "tbl_cell_bold", fontName="Helvetica-Bold", fontSize=8,
        textColor=NAVY, leading=10, alignment=TA_LEFT
    )
    styles["tbl_cell_c"] = ParagraphStyle(
        "tbl_cell_c", fontName="Helvetica", fontSize=8,
        textColor=colors.HexColor("#1C1C1C"), leading=10, alignment=TA_CENTER
    )
    styles["tbl_cell_bold_c"] = ParagraphStyle(
        "tbl_cell_bold_c", fontName="Helvetica-Bold", fontSize=9,
        textColor=AMBER, leading=10, alignment=TA_CENTER
    )
    styles["footnote"] = ParagraphStyle(
        "footnote", fontName="Helvetica-Oblique", fontSize=7,
        textColor=colors.HexColor("#777777"), leading=9
    )
    styles["pill_label"] = ParagraphStyle(
        "pill_label", fontName="Helvetica-Bold", fontSize=7.5,
        textColor=WHITE, alignment=TA_CENTER, leading=9
    )

    return styles


# ─────────────────────────────────────────────
# Helper: section header row for a table-like block
# ─────────────────────────────────────────────
def section_header(text, styles, color=NAVY, colspan=4):
    return Table(
        [[Paragraph(text, styles["section_hdr"])]],
        colWidths=[PAGE_W - 2 * MARGIN],
        style=TableStyle([
            ("BACKGROUND", (0,0), (-1,-1), color),
            ("TOPPADDING",    (0,0), (-1,-1), 5),
            ("BOTTOMPADDING", (0,0), (-1,-1), 5),
            ("LEFTPADDING",   (0,0), (-1,-1), 8),
            ("RIGHTPADDING",  (0,0), (-1,-1), 8),
            ("ROUNDEDCORNERS", [3,3,3,3]),
        ])
    )


def hr(color=MIDGREY, thickness=0.5):
    return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=3, spaceBefore=3)


def sp(h=3):
    return Spacer(1, h * mm)


# ─────────────────────────────────────────────
# Page background canvas callback
# ─────────────────────────────────────────────
def draw_page_bg(canvas, doc):
    canvas.saveState()
    # Top banner background
    canvas.setFillColor(NAVY)
    canvas.rect(0, PAGE_H - 32 * mm, PAGE_W, 32 * mm, fill=1, stroke=0)
    # Teal accent stripe
    canvas.setFillColor(TEAL)
    canvas.rect(0, PAGE_H - 34.5 * mm, PAGE_W, 2.5 * mm, fill=1, stroke=0)
    # Bottom footer bar
    canvas.setFillColor(NAVY)
    canvas.rect(0, 0, PAGE_W, 10 * mm, fill=1, stroke=0)
    # Footer text
    canvas.setFillColor(colors.HexColor("#AED6F1"))
    canvas.setFont("Helvetica", 7)
    canvas.drawString(MARGIN, 3.5 * mm,
        "Awiqli® (insulin icodec-abae) 700 units/mL | FDA Approved March 26, 2026 | For adult T2D only")
    canvas.setFont("Helvetica", 7)
    page_num = canvas.getPageNumber()
    canvas.drawRightString(PAGE_W - MARGIN, 3.5 * mm, f"Page {page_num}")
    # Amber left accent bar
    canvas.setFillColor(AMBER)
    canvas.rect(0, 10 * mm, 4 * mm, PAGE_H - 44 * mm, fill=1, stroke=0)
    canvas.restoreState()


# ─────────────────────────────────────────────
# MAIN BUILD
# ─────────────────────────────────────────────
def build():
    doc = SimpleDocTemplate(
        OUTPUT,
        pagesize=A4,
        leftMargin=MARGIN + 6 * mm,
        rightMargin=MARGIN,
        topMargin=34 * mm,
        bottomMargin=14 * mm,
        title="Insulin Icodec (Awiqli) Clinician Quick Reference",
        author="Orris Medical Reference",
        subject="Once-Weekly Basal Insulin Dosing & Conversion",
    )

    styles = make_styles()
    S = styles  # shorthand
    elems = []

    # ── BANNER (drawn by canvas; add a spacer to clear it) ──
    # Overlay on the canvas-drawn banner
    banner_data = [[
        Paragraph("AWIQLI<sup>®</sup> (Insulin Icodec)", S["banner_title"]),
    ],[
        Paragraph(
            "Once-Weekly Basal Insulin  ·  U-700  ·  FDA Approved March 26 2026  ·  Clinician Quick Reference",
            S["banner_sub"]
        ),
    ]]
    banner_tbl = Table(banner_data, colWidths=[PAGE_W - 2*MARGIN - 6*mm])
    banner_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), colors.transparent),
        ("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), "MIDDLE"),
    ]))
    # We actually just put text in canvas; add spacer matching banner height
    # (the canvas draws the banner at top, so we need top-margin content)

    # ─────────────────────────────
    # SECTION 1: Key Facts at a Glance
    # ─────────────────────────────
    elems.append(section_header("  KEY FACTS AT A GLANCE", S, color=NAVY))
    elems.append(sp(2))

    facts = [
        ["Class:", "First-in-class once-weekly basal insulin analogue",
         "Half-life:", "~196 h (~8 days)"],
        ["Formulation:", "U-700 (700 units/mL) — 7× more concentrated than U-100",
         "Steady state:", "~3–4 weeks (2–4 doses)"],
        ["Device:", "Awiqli FlexTouch® pen — ONLY approved delivery device",
         "Approval:", "FDA Mar 2026 | EU approved | Adults T2D only"],
        ["Dosing interval:", "Once weekly — same day each week",
         "Not approved:", "Paediatrics | T1D (US) | IV use"],
    ]
    facts_tbl = Table(
        [[Paragraph(c, S["tbl_cell_bold"] if i % 2 == 0 else S["tbl_cell"])
          for i, c in enumerate(row)]
         for row in facts],
        colWidths=[28*mm, 62*mm, 26*mm, 62*mm]
    )
    facts_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), LTGREY),
        ("BACKGROUND",    (0,0), (0,-1), LTBLUE),
        ("BACKGROUND",    (2,0), (2,-1), LTBLUE),
        ("ROWBACKGROUNDS",(0,0), (-1,-1), [LTGREY, WHITE]),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    elems.append(facts_tbl)
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 2: Dosing — two columns (Initiation | Titration)
    # ─────────────────────────────
    elems.append(section_header("  DOSING — INITIATION & TITRATION", S, color=TEAL))
    elems.append(sp(2))

    # --- 2a: Starting dose table ---
    init_hdr = [
        Paragraph("STARTING DOSE", S["tbl_hdr"]),
        Paragraph("RECOMMENDED WEEKLY DOSE", S["tbl_hdr"]),
        Paragraph("NOTES", S["tbl_hdr"]),
    ]
    init_rows = [
        [Paragraph("Insulin-naive T2D", S["tbl_cell_bold"]),
         Paragraph("70 units once weekly", S["tbl_cell_bold_c"]),
         Paragraph("Adjust every week based on fasting glucose", S["tbl_cell"])],
        [Paragraph("On OADs + GLP-1 RA", S["tbl_cell_bold"]),
         Paragraph("70 units once weekly", S["tbl_cell_bold_c"]),
         Paragraph("Continue OADs; monitor for hypo with sulfonylureas", S["tbl_cell"])],
        [Paragraph("On basal-bolus (T2D)", S["tbl_cell_bold"]),
         Paragraph("See conversion table below", S["tbl_cell_bold_c"]),
         Paragraph("Replace basal component only; maintain mealtime insulin", S["tbl_cell"])],
    ]
    init_tbl = Table([init_hdr] + init_rows, colWidths=[48*mm, 50*mm, 80*mm])
    init_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), TEAL),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE]),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    elems.append(init_tbl)
    elems.append(sp(3))

    # --- 2b: Titration algorithm ---
    titration_hdr = [
        Paragraph("FASTING GLUCOSE\n(mean of past 3 readings)", S["tbl_hdr"]),
        Paragraph("DOSE ADJUSTMENT\n(next weekly dose)", S["tbl_hdr"]),
        Paragraph("ACTION", S["tbl_hdr"]),
    ]
    titration_rows = [
        [Paragraph("< 80 mg/dL  (< 4.4 mmol/L)", S["tbl_cell"]),
         Paragraph("DECREASE by 20 units", S["warning"]),
         Paragraph("Review for hypoglycaemia; check for missed meals", S["tbl_cell"])],
        [Paragraph("80 – 130 mg/dL  (4.4 – 7.2 mmol/L)", S["tbl_cell"]),
         Paragraph("NO CHANGE  ✓ Target", S["green"]),
         Paragraph("Continue current dose", S["tbl_cell"])],
        [Paragraph("131 – 180 mg/dL  (7.3 – 10.0 mmol/L)", S["tbl_cell"]),
         Paragraph("INCREASE by 20 units", S["tbl_cell_bold"]),
         Paragraph("Reassess at next weekly contact", S["tbl_cell"])],
        [Paragraph("> 180 mg/dL  (> 10.0 mmol/L)", S["tbl_cell"]),
         Paragraph("INCREASE by 40 units", S["tbl_cell_bold"]),
         Paragraph("Consider earlier review; check adherence & injection technique", S["tbl_cell"])],
    ]
    titration_tbl = Table([titration_hdr] + titration_rows, colWidths=[55*mm, 50*mm, 73*mm])
    titration_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), TEAL),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE, LTGREY, WHITE]),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    elems.append(titration_tbl)
    elems.append(sp(2))
    elems.append(Paragraph(
        "* Minimum dose: 50 units/week. Adjust no more than once per week. "
        "Steady state reached after ~3–4 doses — avoid aggressive uptitration in first month.",
        S["footnote"]
    ))
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 3: CONVERSION TABLE
    # ─────────────────────────────
    elems.append(section_header("  CONVERSION TO ICODEC (Awiqli)", S, color=AMBER))
    elems.append(sp(2))

    conv_hdr = [
        Paragraph("SWITCHING FROM", S["tbl_hdr"]),
        Paragraph("CONVERSION FORMULA", S["tbl_hdr"]),
        Paragraph("EXAMPLE\n(Daily dose 20 u → Weekly icodec)", S["tbl_hdr"]),
        Paragraph("FIRST-DOSE\nADJUSTMENT", S["tbl_hdr"]),
    ]
    conv_rows = [
        [Paragraph("Once-daily glargine U-100\nor glargine U-300", S["tbl_cell_bold"]),
         Paragraph("Daily dose × 7 × 0.8", S["tbl_cell_bold_c"]),
         Paragraph("20 × 7 × 0.8 = 112 units", S["tbl_cell_c"]),
         Paragraph("No loading dose\n(start at 80% weekly)", S["tbl_cell"])],
        [Paragraph("Once-daily degludec", S["tbl_cell_bold"]),
         Paragraph("Daily dose × 7 × 0.8", S["tbl_cell_bold_c"]),
         Paragraph("20 × 7 × 0.8 = 112 units", S["tbl_cell_c"]),
         Paragraph("No loading dose\n(start at 80% weekly)", S["tbl_cell"])],
        [Paragraph("Twice-daily NPH\nor premixed insulin", S["tbl_cell_bold"]),
         Paragraph("Total daily dose × 7 × 0.8", S["tbl_cell_bold_c"]),
         Paragraph("(10+10) × 7 × 0.8 = 112 units", S["tbl_cell_c"]),
         Paragraph("No loading dose;\nmonitor closely for hypo", S["tbl_cell"])],
        [Paragraph("Insulin naive\n(starting de novo)", S["tbl_cell_bold"]),
         Paragraph("Start at 70 units/week\n(fixed initiation)", S["tbl_cell_bold_c"]),
         Paragraph("—", S["tbl_cell_c"]),
         Paragraph("N/A — standard\ninitiation dose", S["tbl_cell"])],
    ]
    col_w = [42*mm, 42*mm, 54*mm, 40*mm]
    conv_tbl = Table([conv_hdr] + conv_rows, colWidths=col_w)
    conv_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), AMBER),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE, LTGREY, WHITE]),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    elems.append(conv_tbl)
    elems.append(sp(2))
    elems.append(Paragraph(
        "⚠  The 20% dose reduction (0.8 factor) is intentional. Do NOT correct upward in the first 3–4 weeks — "
        "steady state has not yet been reached and early uptitration risks hypoglycaemia.",
        S["warning"]
    ))
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 4: Missed Dose Rules
    # ─────────────────────────────
    elems.append(section_header("  MISSED DOSE MANAGEMENT", S, color=NAVY))
    elems.append(sp(2))

    missed_hdr = [
        Paragraph("SCENARIO", S["tbl_hdr"]),
        Paragraph("TIME UNTIL NEXT SCHEDULED DOSE", S["tbl_hdr"]),
        Paragraph("ACTION", S["tbl_hdr"]),
    ]
    missed_rows = [
        [Paragraph("Patient forgot to inject", S["tbl_cell_bold"]),
         Paragraph("≥ 3 days (72 hours) remaining", S["tbl_cell"]),
         Paragraph("✔  Administer the missed dose NOW — then resume usual weekly schedule", S["green"])],
        [Paragraph("Patient forgot to inject", S["tbl_cell_bold"]),
         Paragraph("< 3 days (72 hours) remaining", S["tbl_cell"]),
         Paragraph("✘  SKIP the missed dose — inject next dose on usual scheduled day", S["warning"])],
        [Paragraph("Wrong day injected\n(1–2 days early/late)", S["tbl_cell_bold"]),
         Paragraph("Flexible window", S["tbl_cell"]),
         Paragraph("Administer on the off-day; reset next dose to 7 days later", S["tbl_cell"])],
    ]
    missed_tbl = Table([missed_hdr] + missed_rows, colWidths=[48*mm, 58*mm, 72*mm])
    missed_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), NAVY),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE, LTGREY]),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    elems.append(missed_tbl)
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 5: Special Populations & Cautions
    # ─────────────────────────────
    elems.append(section_header("  SPECIAL POPULATIONS & CLINICAL CAUTIONS", S, color=TEAL))
    elems.append(sp(2))

    pop_hdr = [
        Paragraph("POPULATION / SITUATION", S["tbl_hdr"]),
        Paragraph("GUIDANCE", S["tbl_hdr"]),
        Paragraph("RISK FLAG", S["tbl_hdr"]),
    ]
    pop_rows = [
        [Paragraph("Elderly (≥ 65 yrs)", S["tbl_cell_bold"]),
         Paragraph("Consider lower starting dose (e.g. 50–60 u/wk); more frequent BG monitoring", S["tbl_cell"]),
         Paragraph("⚠ Prolonged hypo risk", S["warning"])],
        [Paragraph("Renal impairment", S["tbl_cell_bold"]),
         Paragraph("Use with caution; reduced gluconeogenesis amplifies hypo risk; dose titrate slowly", S["tbl_cell"]),
         Paragraph("⚠ Hypo risk ↑", S["warning"])],
        [Paragraph("Hepatic impairment", S["tbl_cell_bold"]),
         Paragraph("Start at lower dose; monitor closely — impaired glycogen storage", S["tbl_cell"]),
         Paragraph("⚠ Hypo risk ↑", S["warning"])],
        [Paragraph("Pregnancy / planning pregnancy", S["tbl_cell_bold"]),
         Paragraph("NOT recommended — insufficient data. Switch to daily NPH or glargine U-100", S["warning"]),
         Paragraph("✘ Do NOT use", S["warning"])],
        [Paragraph("Hospitalised / perioperative / ICU", S["tbl_cell_bold"]),
         Paragraph("Discontinue icodec on admission. Switch to daily basal insulin for flexible dose management", S["warning"]),
         Paragraph("✘ Not appropriate inpatient", S["warning"])],
        [Paragraph("Type 1 Diabetes (T1D)", S["tbl_cell_bold"]),
         Paragraph("Not FDA-approved for T1D in US (EU-approved). Use with bolus insulin. Higher hypo risk than T2D.", S["tbl_cell"]),
         Paragraph("⚠ Off-label US use", S["warning"])],
        [Paragraph("Paediatrics", S["tbl_cell_bold"]),
         Paragraph("Not approved — safety & efficacy not established", S["warning"]),
         Paragraph("✘ Contraindicated", S["warning"])],
    ]
    pop_tbl = Table([pop_hdr] + pop_rows, colWidths=[52*mm, 90*mm, 36*mm])
    pop_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), TEAL),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE] * 5),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
    elems.append(pop_tbl)
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 6: Safety & Hypoglycaemia Box
    # ─────────────────────────────
    elems.append(section_header("  HYPOGLYCAEMIA — KEY CONSIDERATIONS", S, color=RED))
    elems.append(sp(2))

    hypo_bullets = [
        ("Risk period:", "Highest in first 4–8 weeks (loading phase while reaching steady state)"),
        ("Severity concern:", "Long half-life (~8 days) means hypoglycaemia can be PROLONGED and harder to self-correct"),
        ("Threshold:", "Clinically significant hypo defined as < 54 mg/dL (< 3.0 mmol/L)"),
        ("ONWARDS data:", "Overall hypo rates similar to daily basal analogues; slightly higher clinically significant hypo early on"),
        ("Patient education:", "Ensure glucagon kit (or nasal glucagon) prescribed and patient/carer trained BEFORE first dose"),
        ("Masking risk:", "Counsel on beta-blocker use masking adrenergic symptoms of hypoglycaemia"),
        ("Driving/work:", "Advise caution with driving or operating machinery during titration phase"),
    ]
    hypo_data = [
        [Paragraph(b[0], S["tbl_cell_bold"]),
         Paragraph(b[1], S["tbl_cell"])]
        for b in hypo_bullets
    ]
    hypo_tbl = Table(hypo_data, colWidths=[38*mm, 140*mm])
    hypo_tbl.setStyle(TableStyle([
        ("ROWBACKGROUNDS",(0,0), (-1,-1), [colors.HexColor("#FEF9F9"), WHITE]),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("RIGHTPADDING",  (0,0), (-1,-1), 6),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ("LINEABOVE",     (0,0), (-1,0), 1.5, RED),
        ("LINEBELOW",     (0,-1), (-1,-1), 1.5, RED),
    ]))
    elems.append(hypo_tbl)
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 7: Clinical Pearls
    # ─────────────────────────────
    elems.append(section_header("  10 CLINICAL PEARLS", S, color=NAVY))
    elems.append(sp(2))

    pearls = [
        ("1", "U-700 ONLY via FlexTouch pen",
         "NEVER draw up in syringe — a U-100 syringe delivers 7× the intended dose → life-threatening overdose"),
        ("2", "80% dose rule is intentional",
         "The 20% reduction on switching is evidence-based. Resist pressure to correct upward before steady state"),
        ("3", "Steady state = 3–4 weeks",
         "Full pharmacodynamic effect not seen until after 3rd or 4th dose. Patience during initiation is key"),
        ("4", "Hypo is prolonged",
         "A single glucose correction may be insufficient. Monitor for recurrence over 24–48 h after a hypo episode"),
        ("5", "Same-day flexibility is a feature",
         "Injecting 1–2 days early or late rarely causes meaningful glycaemic disruption — a practical adherence advantage"),
        ("6", "Discharge = switch",
         "Do not send patients home from hospital on icodec. Restart only when outpatient setting with stable routine"),
        ("7", "GLP-1 RA combination is fine",
         "Icodec + GLP-1 RA (e.g. semaglutide) is safe and studied — monitor for additive hypoglycaemia if sulfonylurea co-prescribed"),
        ("8", "Sulfonylurea — consider dose reduction",
         "Initiating icodec alongside a sulfonylurea increases hypo risk. Consider halving or stopping SU at start"),
        ("9", "Awiqli dosing app available",
         "Novo Nordisk provides a free clinician/patient dosing guide app — useful for titration tracking"),
        ("10", "Review at 4 weeks",
         "Schedule a 4-week post-initiation review to assess BG logs, titration, hypo events and injection technique"),
    ]
    pearl_hdr = [
        Paragraph("#", S["tbl_hdr"]),
        Paragraph("PEARL", S["tbl_hdr"]),
        Paragraph("WHY IT MATTERS", S["tbl_hdr"]),
    ]
    pearl_rows = [
        [Paragraph(p[0], S["tbl_cell_bold_c"]),
         Paragraph(p[1], S["tbl_cell_bold"]),
         Paragraph(p[2], S["tbl_cell"])]
        for p in pearls
    ]
    pearl_tbl = Table([pearl_hdr] + pearl_rows, colWidths=[10*mm, 56*mm, 112*mm])
    pearl_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), NAVY),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTBLUE, WHITE] * 6),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ("ALIGN",         (0,0), (0,-1), "CENTER"),
    ]))
    elems.append(pearl_tbl)
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 8: Evidence Base & References
    # ─────────────────────────────
    elems.append(section_header("  EVIDENCE BASE (ONWARDS PROGRAMME)", S, color=TEAL))
    elems.append(sp(2))

    ev_hdr = [
        Paragraph("TRIAL", S["tbl_hdr"]),
        Paragraph("n", S["tbl_hdr"]),
        Paragraph("COMPARATOR", S["tbl_hdr"]),
        Paragraph("POPULATION", S["tbl_hdr"]),
        Paragraph("KEY FINDING", S["tbl_hdr"]),
    ]
    ev_rows = [
        [Paragraph("ONWARDS 1", S["tbl_cell_bold"]),
         Paragraph("~582", S["tbl_cell_c"]),
         Paragraph("Glargine U-300", S["tbl_cell"]),
         Paragraph("T2D on OADs, insulin-naive", S["tbl_cell"]),
         Paragraph("Icodec superior HbA1c at 52 wks; similar hypo", S["tbl_cell"])],
        [Paragraph("ONWARDS 2", S["tbl_cell_bold"]),
         Paragraph("~526", S["tbl_cell_c"]),
         Paragraph("Degludec U-100", S["tbl_cell"]),
         Paragraph("T2D switching from daily basal", S["tbl_cell"]),
         Paragraph("Non-inferior HbA1c; slightly ↑ hypo (NS)", S["tbl_cell"])],
        [Paragraph("ONWARDS 3", S["tbl_cell_bold"]),
         Paragraph("~588", S["tbl_cell_c"]),
         Paragraph("Glargine U-100", S["tbl_cell"]),
         Paragraph("T2D insulin-naive + OADs", S["tbl_cell"]),
         Paragraph("Non-inferior HbA1c; similar safety", S["tbl_cell"])],
        [Paragraph("ONWARDS 5", S["tbl_cell_bold"]),
         Paragraph("~1085", S["tbl_cell_c"]),
         Paragraph("Daily basal (clinician choice)", S["tbl_cell"]),
         Paragraph("T2D insulin-naive; with dosing app", S["tbl_cell"]),
         Paragraph("Non-inferior; improved treatment satisfaction", S["tbl_cell"])],
        [Paragraph("ONWARDS 6*", S["tbl_cell_bold"]),
         Paragraph("~582", S["tbl_cell_c"]),
         Paragraph("Degludec U-100", S["tbl_cell"]),
         Paragraph("T1D basal-bolus regimen", S["tbl_cell"]),
         Paragraph("Non-inferior HbA1c; hypo rate slightly ↑ with icodec", S["tbl_cell"])],
    ]
    ev_tbl = Table([ev_hdr] + ev_rows, colWidths=[26*mm, 12*mm, 32*mm, 46*mm, 62*mm])
    ev_tbl.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), TEAL),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [LTGREY, WHITE] * 4),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 5),
        ("RIGHTPADDING",  (0,0), (-1,-1), 5),
        ("GRID",          (0,0), (-1,-1), 0.25, MIDGREY),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
    elems.append(ev_tbl)
    elems.append(sp(1))
    elems.append(Paragraph(
        "* ONWARDS 6 is EU evidence; not part of US FDA approval package (US indication is T2D only). "
        "All T2D trials (ONWARDS 1, 2, 3, 5) form the basis of the FDA-approved label.",
        S["footnote"]
    ))
    elems.append(sp(2))
    elems.append(Paragraph(
        "Key references: Philis-Tsimikas A et al. Drugs 2025 (PMID 40802020) | "
        "Rosenstock J et al. N Engl J Med 2023 (PMID 37356066) | "
        "Bajaj HS et al. Ann Intern Med 2023 (PMID 37748181) | "
        "Russell-Jones D et al. Lancet 2023 (PMID 37863084) | "
        "Awiqli® Prescribing Information, Novo Nordisk, March 2026",
        S["footnote"]
    ))
    elems.append(sp(3))

    # ─────────────────────────────
    # SECTION 9: Disclaimer
    # ─────────────────────────────
    disclaimer_box = Table(
        [[Paragraph(
            "DISCLAIMER: This quick-reference is for educational purposes only and is not a substitute "
            "for the full Awiqli® (insulin icodec-abae) Prescribing Information. Always refer to the approved "
            "label and current institutional guidelines. Dosing decisions must be individualised. "
            "Prepared by Orris Medical Reference | July 2026.",
            S["footnote"]
        )]],
        colWidths=[PAGE_W - 2*MARGIN - 6*mm]
    )
    disclaimer_box.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), colors.HexColor("#F8F9FA")),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("RIGHTPADDING",  (0,0), (-1,-1), 8),
        ("BOX",           (0,0), (-1,-1), 0.5, MIDGREY),
    ]))
    elems.append(disclaimer_box)

    # ─── Build the PDF ───
    doc.build(elems, onFirstPage=draw_page_bg, onLaterPages=draw_page_bg)
    print(f"PDF written to: {OUTPUT}")


if __name__ == "__main__":
    build()
Running Command

cd /tmp/workspace/icodec-pdf && python build_icodec_pdf.py 2>&1

Running Command

ls -lh /tmp/workspace/icodec-pdf/

The PDF built cleanly at 14 KB. Here it is:

Icodec Clinician QuickRef

PDF Document · PDF


What's inside (A4, single-page layout):

SectionContent
Key Facts at a GlanceClass, formulation (U-700), device, half-life, steady state, approval status
Dosing - Initiation & TitrationStarting doses by scenario + full titration algorithm (4-step fasting glucose targets with exact dose adjustments)
Conversion TableGlargine / degludec / NPH → icodec with the ×7 ×0.8 formula, worked examples, and first-dose guidance
Missed Dose RulesThe 72-hour decision rule clearly laid out with colour-coded go/no-go
Special Populations7 groups (elderly, renal, hepatic, pregnancy, hospital, T1D, paediatric) with individual risk flags
Hypoglycaemia Considerations7 bullet points on risk periods, prolonged hypo concern, ONWARDS data, prescribing glucagon
10 Clinical PearlsPractical "must-know" points including U-700 syringe danger warning
ONWARDS Evidence TableAll 5 trials with n, comparator, population, key finding
References & DisclaimerPubMed-linked citations + prescribing info reference
Colour scheme: navy/teal/amber headers with red for warnings and green for target ranges - designed for quick visual scanning at the point of care.
This is a shared conversation. Sign in to Orris to start your own chat.