Here it is — copy and paste the whole thing into Notes, WhatsApp Saved Messages, Notion, or anywhere: --- ``` ╔══════════════════════════════════════════════════════════════╗ ║ USMLE STEP 1 — STRATEGIC TIMETABLE — NOV 1, 2026 ║ ║ Manasa Veena Mayabrahma ║ ║ 2,595 Qs | 24 Topics | 80 Qs/day | Exam: Nov 1 ║ ╚══════════════════════════════════════════════════════════════╝ LEGEND 📖 FA READ = Read First Aid + make Anki cards ✅ UWORLD = 2 blocks of 40 Qs (tutor mode) + full review 🔄 REVISION = 7 days after topic: re-read weak areas + 20 Qs 📦 FA+UW = Small topic: FA read + all Qs same day TIER SYSTEM 🔴 TIER 1 — Concept-Heavy : Renal → Cardio → Pulm 🟠 BRIDGE — GP Reinforce : Pathology, Biochem, Pharmacology 🔵 TIER 2 — Memory-Based : Repro → Endo → Neuro → Immuno 🟢 TIER 3 — High-Volume : GI → Infec → Heme → Psych 🟣 TIER 4 — Standalone : Derm → Rheum → Biostats → Social Sci ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ JUNE 2026 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Sat 20 Jun 🔴 📖 FA READ Renal (Part 1/2) Sun 21 Jun 🔴 📖 FA READ Renal (Part 2/2) Mon 22 Jun 🔴 ✅ UWORLD Renal — Block 1 (80 Qs) Tue 23 Jun 🔴 ✅ UWORLD Renal — Block 2 (35 Qs) ← DONE Wed 24 Jun 🔴 📖 FA READ Cardiovascular (Part 1/2) Thu 25 Jun 🔴 📖 FA READ Cardiovascular (Part 2/2) Fri 26 Jun 🔴 ✅ UWORLD Cardiovascular — Block 1 (80 Qs) Sat 27 Jun 🔴 🔄 REVISION Renal [7-day spaced review] Sun 28 Jun 🔴 ✅ UWORLD Cardiovascular — Block 2 (80 Qs) Mon 29 Jun 🔴 ✅ UWORLD Cardiovascular — Block 3 (80 Qs) Tue 30 Jun 🔴 ✅ UWORLD Cardiovascular — Block 4 (63 Qs) ← DONE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ JULY 2026 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Wed 01 Jul 🔴 🔄 REVISION Cardiovascular [7-day spaced review] Thu 02 Jul 🔴 📖 FA READ Pulmonary & Critical Care (Part 1/2) Fri 03 Jul 🔴 📖 FA READ Pulmonary & Critical Care (Part 2/2) Sat 04 Jul 🔴 ✅ UWORLD Pulmonary — Block 1 (80 Qs) Sun 05 Jul 🔴 ✅ UWORLD Pulmonary — Block 2 (80 Qs) Mon 06 Jul 🔴 ✅ UWORLD Pulmonary — Block 3 (67 Qs) ← DONE Tue 07 Jul 🟠 📦 FA+UW Pathology GP (26 Qs) — combined day Wed 08 Jul 🔴 🔄 REVISION Pulmonary [7-day spaced review] Thu 09 Jul 🟠 📦 FA+UW Biochemistry GP (29 Qs) — combined day Fri 10 Jul 🟠 📖 FA READ Pharmacology GP Sat 11 Jul 🟠 ✅ UWORLD Pharmacology GP (45 Qs) ← DONE Sun 12 Jul 🔵 📦 FA+UW Pregnancy/Childbirth/Puerperium (39 Qs) Mon 13 Jul 🔵 📦 FA+UW Male Reproductive System (4 Qs) Tue 14 Jul 🟠 🔄 REVISION Pathology GP [7-day spaced review] Wed 15 Jul 🔵 📖 FA READ Endocrine, Diabetes & Metabolism (Part 1/2) Thu 16 Jul 🟠 🔄 REVISION Biochemistry GP [7-day spaced review] Fri 17 Jul 🔵 📖 FA READ Endocrine, Diabetes & Metabolism (Part 2/2) Sat 18 Jul 🟠 🔄 REVISION Pharmacology GP [7-day spaced review] Sun 19 Jul 🔵 ✅ UWORLD Endocrine — Block 1 (80 Qs) Mon 20 Jul 🔵 🔄 REVISION Pregnancy/Repro [7-day spaced review] Tue 21 Jul 🔵 🔄 REVISION Male Reproductive [7-day spaced review] Wed 22 Jul 🔵 ✅ UWORLD Endocrine — Block 2 (30 Qs) ← DONE Thu 23 Jul 🔵 🔄 REVISION Endocrine [7-day spaced review] Fri 24 Jul 🔵 📖 FA READ Genetics GP Sat 25 Jul 🔵 ✅ UWORLD Genetics GP (62 Qs) ← DONE Sun 26 Jul 🔵 📖 FA READ Nervous System (Part 1/2) Mon 27 Jul 🔵 📖 FA READ Nervous System (Part 2/2) Tue 28 Jul 🔵 ✅ UWORLD Nervous System — Block 1 (80 Qs) Wed 29 Jul 🔵 ✅ UWORLD Nervous System — Block 2 (80 Qs) Thu 30 Jul 🔵 🔄 REVISION Genetics GP [7-day spaced review] Fri 31 Jul 🔵 ✅ UWORLD Nervous System — Block 3 (80 Qs) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AUGUST 2026 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Sat 01 Aug 🔵 ✅ UWORLD Nervous System — Block 4 (42 Qs) ← DONE Sun 02 Aug 🔵 🔄 REVISION Nervous System [7-day spaced review] Mon 03 Aug 🔵 📦 FA+UW Allergy & Immunology (28 Qs) — combined day Tue 04 Aug 🟢 📖 FA READ Gastrointestinal & Nutrition (Part 1/2) Wed 05 Aug 🟢 📖 FA READ Gastrointestinal & Nutrition (Part 2/2) Thu 06 Aug 🟢 ✅ UWORLD GI & Nutrition — Block 1 (80 Qs) Fri 07 Aug 🟢 ✅ UWORLD GI & Nutrition — Block 2 (80 Qs) Sat 08 Aug 🟢 ✅ UWORLD GI & Nutrition — Block 3 (80 Qs) Sun 09 Aug 🟢 ✅ UWORLD GI & Nutrition — Block 4 (45 Qs) ← DONE Mon 10 Aug 🔵 🔄 REVISION Allergy & Immunology [7-day spaced review] Tue 11 Aug 🟢 📦 FA+UW Microbiology GP (5 Qs) — combined day Wed 12 Aug 🟢 🔄 REVISION GI & Nutrition [7-day spaced review] Thu 13 Aug 🟢 📖 FA READ Infectious Diseases (Part 1/2) Fri 14 Aug 🟢 📖 FA READ Infectious Diseases (Part 2/2) Sat 15 Aug 🟢 ✅ UWORLD Infectious Diseases — Block 1 (80 Qs) Sun 16 Aug 🟢 ✅ UWORLD Infectious Diseases — Block 2 (80 Qs) Mon 17 Aug 🟢 ✅ UWORLD Infectious Diseases — Block 3 (80 Qs) Tue 18 Aug 🟢 🔄 REVISION Microbiology GP [7-day spaced review] Wed 19 Aug 🟢 ✅ UWORLD Infectious Diseases — Block 4 (31 Qs) ← DONE Thu 20 Aug 🟢 🔄 REVISION Infectious Diseases [7-day spaced review] Fri 21 Aug 🟢 📖 FA READ Hematology & Oncology Sat 22 Aug 🟢 ✅ UWORLD Hematology & Oncology — Block 1 (80 Qs) Sun 23 Aug 🟢 ✅ UWORLD Hematology & Oncology — Block 2 (18 Qs) ← DONE Mon 24 Aug 🟢 📖 FA READ Psychiatry/Behavioral (Part 1/2) Tue 25 Aug 🟢 📖 FA READ Psychiatry/Behavioral (Part 2/2) Wed 26 Aug 🟢 ✅ UWORLD Psychiatry — Block 1 (80 Qs) Thu 27 Aug 🟢 🔄 REVISION Hematology & Oncology [7-day spaced review] Fri 28 Aug 🟢 ✅ UWORLD Psychiatry — Block 2 (78 Qs) ← DONE Sat 29 Aug 🟣 📖 FA READ Dermatology Sun 30 Aug 🟣 ✅ UWORLD Dermatology — Block 1 (80 Qs) Mon 31 Aug 🟢 🔄 REVISION Psychiatry [7-day spaced review] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SEPTEMBER 2026 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Tue 01 Sep 🟣 ✅ UWORLD Dermatology — Block 2 (12 Qs) ← DONE Wed 02 Sep 🟣 📖 FA READ Rheumatology/Orthopedics (Part 1/2) Thu 03 Sep 🟣 📖 FA READ Rheumatology/Orthopedics (Part 2/2) Fri 04 Sep 🟣 ✅ UWORLD Rheumatology — Block 1 (80 Qs) Sat 05 Sep 🟣 🔄 REVISION Dermatology [7-day spaced review] Sun 06 Sep 🟣 ✅ UWORLD Rheumatology — Block 2 (62 Qs) ← DONE Mon 07 Sep 🟣 📦 FA+UW ENT (34 Qs) — combined day Tue 08 Sep 🟣 📦 FA+UW Ophthalmology (1 Q) — combined day Wed 09 Sep 🟣 🔄 REVISION Rheumatology [7-day spaced review] Thu 10 Sep 🟣 📖 FA READ Biostatistics & Epidemiology (Part 1/2) Fri 11 Sep 🟣 📖 FA READ Biostatistics & Epidemiology (Part 2/2) Sat 12 Sep 🟣 ✅ UWORLD Biostatistics — Block 1 (80 Qs) Sun 13 Sep 🟣 ✅ UWORLD Biostatistics — Block 2 (34 Qs) ← DONE Mon 14 Sep 🟣 🔄 REVISION ENT [7-day spaced review] Tue 15 Sep 🟣 📖 FA READ Social Sciences/Ethics (Part 1/2) Wed 16 Sep 🟣 🔄 REVISION Ophthalmology [7-day spaced review] Thu 17 Sep 🟣 🔄 REVISION Biostatistics [7-day spaced review] Fri 18 Sep 🟣 📖 FA READ Social Sciences/Ethics (Part 2/2) Sat 19 Sep 🟣 ✅ UWORLD Social Sciences — Block 1 (80 Qs) Sun 20 Sep 🟣 ✅ UWORLD Social Sciences — Block 2 (27 Qs) ← DONE Mon 21 Sep 🟣 🔄 REVISION Social Sciences [7-day spaced review] Tue 22 Sep 🟣 📦 FA+UW Poisoning & Environmental (18 Qs) ← DONE 🏁 ALL 2,595 UWORLD QUESTIONS COMPLETE — SEP 22 Tue 29 Sep 🟣 🔄 REVISION Poisoning & Environmental [7-day review] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ FINAL STRETCH — OCT 18 to NOV 1 NBMEs + Weak Area Review + EXAM ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Oct 18 📋 NBME #1 — full exam + review all wrong answers Oct 22 📋 NBME #2 — full exam + review Oct 24 📖 FA weak area re-read — Tier 1 gaps (Renal/Cardio/Pulm) Oct 26 📋 NBME #3 — full exam + review Oct 27 ✅ UWorld custom — wrong answers only (80 Qs) Oct 28 📖 FA weak area re-read — Tier 2 gaps (Neuro/Endo) Oct 29 ✅ UWorld custom — Cardio + Renal mixed (80 Qs) Oct 30 📖 Final FA rapid review — all high-yield tables Oct 31 😴 Rest day — Anki only — sleep by 10 PM Nov 01 🎯 EXAM DAY — YOU'VE GOT THIS, MANASA! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DAILY SCHEDULE (8-10 hrs) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 06:00-08:00 Warm up: yesterday's wrong answers + Anki 08:00-09:30 FA Read Block 1 OR UWorld Block 1 (40 Qs) 09:30-11:30 UWorld Block 1 full review + annotate FA 11:30-12:00 Break + lunch 12:00-13:30 FA Read Block 2 OR UWorld Block 2 (40 Qs) 13:30-15:30 UWorld Block 2 full review + make Anki cards 15:30-16:00 Break 16:00-17:30 Anki / active recall / weak area sketching 17:30-18:00 Plan tomorrow + mark today done ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` Select all of that, copy, and paste into WhatsApp Saved Messages, Apple Notes, Google Keep, or Notion - it'll hold its formatting. The `← DONE` markers are there so you can search "DONE" to find where each topic ends. crate proper timetable pdf
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
~/usmle-timetable/generate_timetable.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import 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, TA_RIGHT
from reportlab.platypus import KeepTogether
from reportlab.lib.colors import HexColor
import os
OUTPUT = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_Timetable_Manasa.pdf"
# Color palette
C_RED = HexColor("#C0392B")
C_ORANGE = HexColor("#E67E22")
C_BLUE = HexColor("#2980B9")
C_GREEN = HexColor("#27AE60")
C_PURPLE = HexColor("#8E44AD")
C_DARK = HexColor("#1A1A2E")
C_HEADER = HexColor("#0D1B2A")
C_ACCENT = HexColor("#E8F4FD")
C_WHITE = colors.white
C_LIGHT_GRAY = HexColor("#F8F9FA")
C_MID_GRAY = HexColor("#DEE2E6")
C_DONE_BG = HexColor("#E8F8E8")
C_GOLD = HexColor("#F39C12")
TIER_COLORS = {
"🔴": (C_RED, HexColor("#FDECEA")),
"🟠": (C_ORANGE, HexColor("#FEF0E7")),
"🔵": (C_BLUE, HexColor("#EBF5FB")),
"🟢": (C_GREEN, HexColor("#EAFAF1")),
"🟣": (C_PURPLE, HexColor("#F5EEF8")),
}
ACTIVITY_COLORS = {
"📖": HexColor("#1A5276"),
"✅": HexColor("#145A32"),
"🔄": HexColor("#7D6608"),
"📦": HexColor("#6E2F8E"),
"📋": HexColor("#1A5276"),
"😴": HexColor("#555555"),
"🎯": HexColor("#C0392B"),
}
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=12*mm,
rightMargin=12*mm,
topMargin=12*mm,
bottomMargin=12*mm,
title="USMLE Step 1 Timetable — Manasa Veena Mayabrahma",
author="Orris AI",
)
W, H = A4
CONTENT_W = W - 24*mm
styles = getSampleStyleSheet()
def style(name, **kwargs):
base = styles["Normal"]
return ParagraphStyle(name, parent=base, **kwargs)
TITLE_STYLE = style("title", fontSize=18, textColor=C_WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=22)
SUB_STYLE = style("sub", fontSize=9, textColor=HexColor("#BDC3C7"), alignment=TA_CENTER, fontName="Helvetica", leading=13)
SECTION_STYLE = style("section", fontSize=11, textColor=C_WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold", leading=14)
DATE_STYLE = style("date", fontSize=8.5,textColor=HexColor("#2C3E50"), fontName="Helvetica-Bold", leading=11)
ACT_STYLE = style("act", fontSize=8, textColor=C_WHITE, fontName="Helvetica-Bold", leading=10)
DESC_STYLE = style("desc", fontSize=8.5,textColor=HexColor("#1A1A2E"), fontName="Helvetica", leading=11)
DONE_STYLE = style("done", fontSize=7.5,textColor=HexColor("#27AE60"), fontName="Helvetica-Bold", leading=10)
LEGEND_STYLE = style("legend", fontSize=8, textColor=HexColor("#2C3E50"), fontName="Helvetica", leading=11)
NOTE_STYLE = style("note", fontSize=7.5,textColor=HexColor("#555555"), fontName="Helvetica-Oblique", leading=10, alignment=TA_CENTER)
DAILY_HDR = style("dailyhdr",fontSize=8.5,textColor=C_WHITE, fontName="Helvetica-Bold", leading=11)
DAILY_ROW = style("dailyrow",fontSize=8, textColor=HexColor("#1A1A2E"), fontName="Helvetica", leading=11)
story = []
# ─── HEADER BLOCK ───────────────────────────────────────────────────────────
def header_table():
title_para = Paragraph("USMLE STEP 1 — STRATEGIC TIMETABLE — NOV 1, 2026", TITLE_STYLE)
name_para = Paragraph("Manasa Veena Mayabrahma", style("n2", fontSize=13, textColor=HexColor("#F39C12"), alignment=TA_CENTER, fontName="Helvetica-Bold", leading=16))
stats_para = Paragraph("2,595 Questions | 24 Topics | 80 Qs/day | Exam: November 1, 2026", SUB_STYLE)
t = Table([[title_para],[name_para],[stats_para]], colWidths=[CONTENT_W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_HEADER),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 7),
("LEFTPADDING", (0,0),(-1,-1), 14),
("RIGHTPADDING", (0,0),(-1,-1), 14),
("ROUNDEDCORNERS", (0,0),(-1,-1), 6),
]))
return t
story.append(header_table())
story.append(Spacer(1, 5*mm))
# ─── LEGEND + TIERS ─────────────────────────────────────────────────────────
legend_items = [
("📖 FA READ", "Read First Aid + make Anki cards"),
("✅ UWORLD", "2 blocks of 40 Qs (tutor mode) + full review"),
("🔄 REVISION", "7 days after topic: re-read weak areas + 20 Qs"),
("📦 FA+UW", "Small topic: FA read + all Qs same day"),
]
tier_items = [
("🔴 TIER 1", "Concept-Heavy", "Renal → Cardio → Pulm", C_RED),
("🟠 BRIDGE", "GP Reinforce", "Pathology, Biochem, Pharmacology", C_ORANGE),
("🔵 TIER 2", "Memory-Based", "Repro → Endo → Neuro → Immuno", C_BLUE),
("🟢 TIER 3", "High-Volume", "GI → Infec → Heme → Psych", C_GREEN),
("🟣 TIER 4", "Standalone", "Derm → Rheum → Biostats → Social Sci", C_PURPLE),
]
leg_data = [[Paragraph(f"<b>{k}</b> — {v}", LEGEND_STYLE)] for k,v in legend_items]
leg_t = Table(leg_data, colWidths=[CONTENT_W/2 - 3*mm])
leg_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), HexColor("#EEF2F7")),
("BOX", (0,0),(-1,-1), 0.5, C_MID_GRAY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 8),
]))
tier_data = []
for emoji_label, kind, topics, color in tier_items:
tier_data.append([
Paragraph(f"<b>{emoji_label}</b>", style("t1", fontSize=8, textColor=color, fontName="Helvetica-Bold", leading=10)),
Paragraph(kind, style("t2", fontSize=8, textColor=HexColor("#555555"), fontName="Helvetica-Oblique", leading=10)),
Paragraph(topics, style("t3", fontSize=8, textColor=HexColor("#1A1A2E"), fontName="Helvetica", leading=10)),
])
tier_t = Table(tier_data, colWidths=[22*mm, 28*mm, CONTENT_W/2 - 50*mm - 3*mm])
tier_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), HexColor("#FAFAFA")),
("BOX", (0,0),(-1,-1), 0.5, C_MID_GRAY),
("TOPPADDING", (0,0),(-1,-1), 3),
("BOTTOMPADDING", (0,0),(-1,-1), 3),
("LEFTPADDING", (0,0),(-1,-1), 5),
]))
combined = Table([[leg_t, Spacer(6*mm,1), tier_t]], colWidths=[CONTENT_W/2-3*mm, 6*mm, CONTENT_W/2-3*mm])
combined.setStyle(TableStyle([("VALIGN",(0,0),(-1,-1),"TOP")]))
story.append(combined)
story.append(Spacer(1, 5*mm))
# ─── TIMETABLE DATA ──────────────────────────────────────────────────────────
# Format: (date_str, tier_emoji, activity_emoji, activity_label, description, is_done)
ENTRIES = [
# JUNE
("Sat 20 Jun", "🔴", "📖", "FA READ", "Renal (Part 1/2)", False),
("Sun 21 Jun", "🔴", "📖", "FA READ", "Renal (Part 2/2)", False),
("Mon 22 Jun", "🔴", "✅", "UWORLD", "Renal — Block 1 (80 Qs)", False),
("Tue 23 Jun", "🔴", "✅", "UWORLD", "Renal — Block 2 (35 Qs)", True),
("Wed 24 Jun", "🔴", "📖", "FA READ", "Cardiovascular (Part 1/2)", False),
("Thu 25 Jun", "🔴", "📖", "FA READ", "Cardiovascular (Part 2/2)", False),
("Fri 26 Jun", "🔴", "✅", "UWORLD", "Cardiovascular — Block 1 (80 Qs)", False),
("Sat 27 Jun", "🔴", "🔄", "REVISION", "Renal [7-day spaced review]", False),
("Sun 28 Jun", "🔴", "✅", "UWORLD", "Cardiovascular — Block 2 (80 Qs)", False),
("Mon 29 Jun", "🔴", "✅", "UWORLD", "Cardiovascular — Block 3 (80 Qs)", False),
("Tue 30 Jun", "🔴", "✅", "UWORLD", "Cardiovascular — Block 4 (63 Qs)", True),
# JULY
("Wed 01 Jul", "🔴", "🔄", "REVISION", "Cardiovascular [7-day spaced review]", False),
("Thu 02 Jul", "🔴", "📖", "FA READ", "Pulmonary & Critical Care (Part 1/2)", False),
("Fri 03 Jul", "🔴", "📖", "FA READ", "Pulmonary & Critical Care (Part 2/2)", False),
("Sat 04 Jul", "🔴", "✅", "UWORLD", "Pulmonary — Block 1 (80 Qs)", False),
("Sun 05 Jul", "🔴", "✅", "UWORLD", "Pulmonary — Block 2 (80 Qs)", False),
("Mon 06 Jul", "🔴", "✅", "UWORLD", "Pulmonary — Block 3 (67 Qs)", True),
("Tue 07 Jul", "🟠", "📦", "FA+UW", "Pathology GP (26 Qs) — combined day", False),
("Wed 08 Jul", "🔴", "🔄", "REVISION", "Pulmonary [7-day spaced review]", False),
("Thu 09 Jul", "🟠", "📦", "FA+UW", "Biochemistry GP (29 Qs) — combined day", False),
("Fri 10 Jul", "🟠", "📖", "FA READ", "Pharmacology GP", False),
("Sat 11 Jul", "🟠", "✅", "UWORLD", "Pharmacology GP (45 Qs)", True),
("Sun 12 Jul", "🔵", "📦", "FA+UW", "Pregnancy/Childbirth/Puerperium (39 Qs)", False),
("Mon 13 Jul", "🔵", "📦", "FA+UW", "Male Reproductive System (4 Qs)", False),
("Tue 14 Jul", "🟠", "🔄", "REVISION", "Pathology GP [7-day spaced review]", False),
("Wed 15 Jul", "🔵", "📖", "FA READ", "Endocrine, Diabetes & Metabolism (Part 1/2)", False),
("Thu 16 Jul", "🟠", "🔄", "REVISION", "Biochemistry GP [7-day spaced review]", False),
("Fri 17 Jul", "🔵", "📖", "FA READ", "Endocrine, Diabetes & Metabolism (Part 2/2)", False),
("Sat 18 Jul", "🟠", "🔄", "REVISION", "Pharmacology GP [7-day spaced review]", False),
("Sun 19 Jul", "🔵", "✅", "UWORLD", "Endocrine — Block 1 (80 Qs)", False),
("Mon 20 Jul", "🔵", "🔄", "REVISION", "Pregnancy/Repro [7-day spaced review]", False),
("Tue 21 Jul", "🔵", "🔄", "REVISION", "Male Reproductive [7-day spaced review]", False),
("Wed 22 Jul", "🔵", "✅", "UWORLD", "Endocrine — Block 2 (30 Qs)", True),
("Thu 23 Jul", "🔵", "🔄", "REVISION", "Endocrine [7-day spaced review]", False),
("Fri 24 Jul", "🔵", "📖", "FA READ", "Genetics GP", False),
("Sat 25 Jul", "🔵", "✅", "UWORLD", "Genetics GP (62 Qs)", True),
("Sun 26 Jul", "🔵", "📖", "FA READ", "Nervous System (Part 1/2)", False),
("Mon 27 Jul", "🔵", "📖", "FA READ", "Nervous System (Part 2/2)", False),
("Tue 28 Jul", "🔵", "✅", "UWORLD", "Nervous System — Block 1 (80 Qs)", False),
("Wed 29 Jul", "🔵", "✅", "UWORLD", "Nervous System — Block 2 (80 Qs)", False),
("Thu 30 Jul", "🔵", "🔄", "REVISION", "Genetics GP [7-day spaced review]", False),
("Fri 31 Jul", "🔵", "✅", "UWORLD", "Nervous System — Block 3 (80 Qs)", False),
# AUGUST
("Sat 01 Aug", "🔵", "✅", "UWORLD", "Nervous System — Block 4 (42 Qs)", True),
("Sun 02 Aug", "🔵", "🔄", "REVISION", "Nervous System [7-day spaced review]", False),
("Mon 03 Aug", "🔵", "📦", "FA+UW", "Allergy & Immunology (28 Qs) — combined day", False),
("Tue 04 Aug", "🟢", "📖", "FA READ", "Gastrointestinal & Nutrition (Part 1/2)", False),
("Wed 05 Aug", "🟢", "📖", "FA READ", "Gastrointestinal & Nutrition (Part 2/2)", False),
("Thu 06 Aug", "🟢", "✅", "UWORLD", "GI & Nutrition — Block 1 (80 Qs)", False),
("Fri 07 Aug", "🟢", "✅", "UWORLD", "GI & Nutrition — Block 2 (80 Qs)", False),
("Sat 08 Aug", "🟢", "✅", "UWORLD", "GI & Nutrition — Block 3 (80 Qs)", False),
("Sun 09 Aug", "🟢", "✅", "UWORLD", "GI & Nutrition — Block 4 (45 Qs)", True),
("Mon 10 Aug", "🔵", "🔄", "REVISION", "Allergy & Immunology [7-day spaced review]", False),
("Tue 11 Aug", "🟢", "📦", "FA+UW", "Microbiology GP (5 Qs) — combined day", False),
("Wed 12 Aug", "🟢", "🔄", "REVISION", "GI & Nutrition [7-day spaced review]", False),
("Thu 13 Aug", "🟢", "📖", "FA READ", "Infectious Diseases (Part 1/2)", False),
("Fri 14 Aug", "🟢", "📖", "FA READ", "Infectious Diseases (Part 2/2)", False),
("Sat 15 Aug", "🟢", "✅", "UWORLD", "Infectious Diseases — Block 1 (80 Qs)", False),
("Sun 16 Aug", "🟢", "✅", "UWORLD", "Infectious Diseases — Block 2 (80 Qs)", False),
("Mon 17 Aug", "🟢", "✅", "UWORLD", "Infectious Diseases — Block 3 (80 Qs)", False),
("Tue 18 Aug", "🟢", "🔄", "REVISION", "Microbiology GP [7-day spaced review]", False),
("Wed 19 Aug", "🟢", "✅", "UWORLD", "Infectious Diseases — Block 4 (31 Qs)", True),
("Thu 20 Aug", "🟢", "🔄", "REVISION", "Infectious Diseases [7-day spaced review]", False),
("Fri 21 Aug", "🟢", "📖", "FA READ", "Hematology & Oncology", False),
("Sat 22 Aug", "🟢", "✅", "UWORLD", "Hematology & Oncology — Block 1 (80 Qs)", False),
("Sun 23 Aug", "🟢", "✅", "UWORLD", "Hematology & Oncology — Block 2 (18 Qs)", True),
("Mon 24 Aug", "🟢", "📖", "FA READ", "Psychiatry/Behavioral (Part 1/2)", False),
("Tue 25 Aug", "🟢", "📖", "FA READ", "Psychiatry/Behavioral (Part 2/2)", False),
("Wed 26 Aug", "🟢", "✅", "UWORLD", "Psychiatry — Block 1 (80 Qs)", False),
("Thu 27 Aug", "🟢", "🔄", "REVISION", "Hematology & Oncology [7-day spaced review]", False),
("Fri 28 Aug", "🟢", "✅", "UWORLD", "Psychiatry — Block 2 (78 Qs)", True),
("Sat 29 Aug", "🟣", "📖", "FA READ", "Dermatology", False),
("Sun 30 Aug", "🟣", "✅", "UWORLD", "Dermatology — Block 1 (80 Qs)", False),
("Mon 31 Aug", "🟢", "🔄", "REVISION", "Psychiatry [7-day spaced review]", False),
# SEPTEMBER
("Tue 01 Sep", "🟣", "✅", "UWORLD", "Dermatology — Block 2 (12 Qs)", True),
("Wed 02 Sep", "🟣", "📖", "FA READ", "Rheumatology/Orthopedics (Part 1/2)", False),
("Thu 03 Sep", "🟣", "📖", "FA READ", "Rheumatology/Orthopedics (Part 2/2)", False),
("Fri 04 Sep", "🟣", "✅", "UWORLD", "Rheumatology — Block 1 (80 Qs)", False),
("Sat 05 Sep", "🟣", "🔄", "REVISION", "Dermatology [7-day spaced review]", False),
("Sun 06 Sep", "🟣", "✅", "UWORLD", "Rheumatology — Block 2 (62 Qs)", True),
("Mon 07 Sep", "🟣", "📦", "FA+UW", "ENT (34 Qs) — combined day", False),
("Tue 08 Sep", "🟣", "📦", "FA+UW", "Ophthalmology (1 Q) — combined day", False),
("Wed 09 Sep", "🟣", "🔄", "REVISION", "Rheumatology [7-day spaced review]", False),
("Thu 10 Sep", "🟣", "📖", "FA READ", "Biostatistics & Epidemiology (Part 1/2)", False),
("Fri 11 Sep", "🟣", "📖", "FA READ", "Biostatistics & Epidemiology (Part 2/2)", False),
("Sat 12 Sep", "🟣", "✅", "UWORLD", "Biostatistics — Block 1 (80 Qs)", False),
("Sun 13 Sep", "🟣", "✅", "UWORLD", "Biostatistics — Block 2 (34 Qs)", True),
("Mon 14 Sep", "🟣", "🔄", "REVISION", "ENT [7-day spaced review]", False),
("Tue 15 Sep", "🟣", "📖", "FA READ", "Social Sciences/Ethics (Part 1/2)", False),
("Wed 16 Sep", "🟣", "🔄", "REVISION", "Ophthalmology [7-day spaced review]", False),
("Thu 17 Sep", "🟣", "🔄", "REVISION", "Biostatistics [7-day spaced review]", False),
("Fri 18 Sep", "🟣", "📖", "FA READ", "Social Sciences/Ethics (Part 2/2)", False),
("Sat 19 Sep", "🟣", "✅", "UWORLD", "Social Sciences — Block 1 (80 Qs)", False),
("Sun 20 Sep", "🟣", "✅", "UWORLD", "Social Sciences — Block 2 (27 Qs)", True),
("Mon 21 Sep", "🟣", "🔄", "REVISION", "Social Sciences [7-day spaced review]", False),
("Tue 22 Sep", "🟣", "📦", "FA+UW", "Poisoning & Environmental (18 Qs)", True),
("Tue 29 Sep", "🟣", "🔄", "REVISION", "Poisoning & Environmental [7-day review]", False),
]
MONTHS = [
("JUNE 2026", "🔴 Tier 1 — Concept-Heavy: Renal + Cardiovascular", HexColor("#C0392B")),
("JULY 2026", "🔴 Tier 1 + 🟠 Bridge + 🔵 Tier 2: Pulm, Pharm, Endo, Neuro begins", HexColor("#E67E22")),
("AUGUST 2026", "🔵 Tier 2 + 🟢 Tier 3: Neuro, Immuno, GI, Infec, Heme, Psych", HexColor("#2980B9")),
("SEPTEMBER 2026", "🟣 Tier 4 + Final Qs: Derm, Rheum, Biostats, Social Sci, Poison", HexColor("#8E44AD")),
]
MONTH_ENTRIES = {
"JUNE 2026": [e for e in ENTRIES if "Jun" in e[0]],
"JULY 2026": [e for e in ENTRIES if "Jul" in e[0]],
"AUGUST 2026": [e for e in ENTRIES if "Aug" in e[0]],
"SEPTEMBER 2026": [e for e in ENTRIES if "Sep" in e[0]],
}
def make_badge(label, bg_color, text_color=C_WHITE, width=17*mm):
st = style("badge", fontSize=7, textColor=text_color, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=9)
return Paragraph(f"<b>{label}</b>", st)
def month_section(month_name, subtitle, color, entries):
# Section header
hdr_para = Paragraph(month_name, SECTION_STYLE)
sub_para = Paragraph(subtitle, style("ms", fontSize=7.5, textColor=HexColor("#BDC3C7"), alignment=TA_CENTER, fontName="Helvetica-Oblique", leading=10))
hdr_t = Table([[hdr_para],[sub_para]], colWidths=[CONTENT_W])
hdr_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("TOPPADDING", (0,0),(-1,-1), 7),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
]))
rows = []
for (date, tier, act_em, act_label, desc, done) in entries:
tier_col, tier_bg = TIER_COLORS.get(tier, (C_DARK, C_LIGHT_GRAY))
act_col = ACTIVITY_COLORS.get(act_em, C_DARK)
date_p = Paragraph(f"<b>{date}</b>", DATE_STYLE)
act_p = Paragraph(f"<b>{act_label}</b>",
style("ap", fontSize=7.5, textColor=C_WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=9))
desc_p = Paragraph(desc, DESC_STYLE)
done_p = Paragraph("✔ DONE", DONE_STYLE) if done else Paragraph("", DONE_STYLE)
row_bg = C_DONE_BG if done else tier_bg
rows.append([date_p, act_p, desc_p, done_p])
col_widths = [26*mm, 20*mm, CONTENT_W - 26*mm - 20*mm - 16*mm, 16*mm]
t = Table(rows, colWidths=col_widths, repeatRows=0)
ts = [
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 3.5),
("BOTTOMPADDING",(0,0), (-1,-1), 3.5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("LINEBELOW", (0,0), (-1,-1), 0.3, HexColor("#E0E0E0")),
("ROWBACKGROUNDS",(0,0),(-1,-1), [HexColor("#FAFAFA"), C_WHITE]),
]
for i, (date, tier, act_em, act_label, desc, done) in enumerate(entries):
tier_col, tier_bg = TIER_COLORS.get(tier, (C_DARK, C_LIGHT_GRAY))
act_col = ACTIVITY_COLORS.get(act_em, C_DARK)
row_bg = C_DONE_BG if done else (tier_bg if i % 2 == 0 else C_WHITE)
ts.append(("BACKGROUND", (0,i), (-1,i), row_bg))
ts.append(("BACKGROUND", (1,i), (1,i), act_col))
ts.append(("TEXTCOLOR", (3,i), (3,i), HexColor("#27AE60")))
t.setStyle(TableStyle(ts))
return [hdr_t, t, Spacer(1, 4*mm)]
# Build month sections
for month_name, subtitle, color in MONTHS:
entries = MONTH_ENTRIES.get(month_name, [])
story.extend(month_section(month_name, subtitle, color, entries))
# ─── MILESTONE BANNER ────────────────────────────────────────────────────────
milestone_p = Paragraph(
"🏁 ALL 2,595 UWORLD QUESTIONS COMPLETE — SEPTEMBER 22, 2026",
style("ms2", fontSize=11, textColor=C_WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14)
)
ms_t = Table([[milestone_p]], colWidths=[CONTENT_W])
ms_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), HexColor("#1E8449")),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING", (0,0),(-1,-1), 10),
]))
story.append(ms_t)
story.append(Spacer(1, 5*mm))
# ─── FINAL STRETCH ───────────────────────────────────────────────────────────
final_hdr = Paragraph("FINAL STRETCH — OCT 18 TO NOV 1", SECTION_STYLE)
final_sub = Paragraph("NBMEs + Weak Area Review + EXAM DAY", style("fs", fontSize=8, textColor=HexColor("#BDC3C7"), alignment=TA_CENTER, fontName="Helvetica-Oblique", leading=10))
fhdr_t = Table([[final_hdr],[final_sub]], colWidths=[CONTENT_W])
fhdr_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), C_DARK),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
]))
story.append(fhdr_t)
final_entries = [
("Oct 18", "📋", "NBME #1", "Full exam + review all wrong answers", False),
("Oct 22", "📋", "NBME #2", "Full exam + review", False),
("Oct 24", "📖", "FA WEAK AREAS", "Tier 1 gaps: Renal / Cardio / Pulm", False),
("Oct 26", "📋", "NBME #3", "Full exam + review", False),
("Oct 27", "✅", "UWORLD CUSTOM", "Wrong answers only (80 Qs)", False),
("Oct 28", "📖", "FA WEAK AREAS", "Tier 2 gaps: Neuro / Endo", False),
("Oct 29", "✅", "UWORLD CUSTOM", "Cardio + Renal mixed (80 Qs)", False),
("Oct 30", "📖", "RAPID REVIEW", "Final FA rapid review — all high-yield tables", False),
("Oct 31", "😴", "REST DAY", "Anki only — sleep by 10 PM", False),
("Nov 01", "🎯", "EXAM DAY", "YOU'VE GOT THIS, MANASA! 🎯", False),
]
f_rows = []
for (date, em, label, desc, done) in final_entries:
act_col = ACTIVITY_COLORS.get(em, C_DARK)
if em == "🎯":
act_col = C_RED
date_p = Paragraph(f"<b>{date}</b>", DATE_STYLE)
act_p = Paragraph(f"<b>{label}</b>",
style("fp", fontSize=7.5, textColor=C_WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=9))
if em == "🎯":
desc_p = Paragraph(f"<b>{desc}</b>",
style("gp", fontSize=9, textColor=C_RED, fontName="Helvetica-Bold", leading=11))
else:
desc_p = Paragraph(desc, DESC_STYLE)
f_rows.append([date_p, act_p, desc_p])
col_widths_f = [26*mm, 30*mm, CONTENT_W - 56*mm]
ft = Table(f_rows, colWidths=col_widths_f)
fts = [
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0),(-1,-1), 5),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("LINEBELOW", (0,0),(-1,-1), 0.3, HexColor("#E0E0E0")),
("ROWBACKGROUNDS",(0,0),(-1,-1), [HexColor("#FAFAFA"), C_WHITE]),
]
for i, (date, em, label, desc, done) in enumerate(final_entries):
act_col = ACTIVITY_COLORS.get(em, C_DARK)
if em == "🎯":
act_col = C_RED
fts.append(("BACKGROUND", (0,i), (-1,i), HexColor("#FDE8E8")))
elif em == "😴":
fts.append(("BACKGROUND", (0,i), (-1,i), HexColor("#F0F0F0")))
fts.append(("BACKGROUND", (1,i), (1,i), act_col))
ft.setStyle(TableStyle(fts))
story.append(ft)
story.append(Spacer(1, 5*mm))
# ─── DAILY SCHEDULE ──────────────────────────────────────────────────────────
daily_hdr_p = Paragraph("DAILY SCHEDULE (8-10 hrs)", SECTION_STYLE)
daily_sub_p = Paragraph("Repeat every study day — adjust on revision days", style("ds", fontSize=8, textColor=HexColor("#BDC3C7"), alignment=TA_CENTER, fontName="Helvetica-Oblique", leading=10))
dhdr_t = Table([[daily_hdr_p],[daily_sub_p]], colWidths=[CONTENT_W])
dhdr_t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), HexColor("#2C3E50")),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING", (0,0),(-1,-1), 6),
]))
story.append(dhdr_t)
daily_rows = [
("06:00 – 08:00", "Warm-up", "Yesterday's wrong answers + Anki deck review", HexColor("#D5E8D4")),
("08:00 – 09:30", "Block 1", "FA Read Block 1 OR UWorld Block 1 (40 Qs)", HexColor("#DAE8FC")),
("09:30 – 11:30", "Review 1", "UWorld Block 1 full review + annotate FA", HexColor("#DAE8FC")),
("11:30 – 12:00", "Break", "Lunch + short walk", HexColor("#FFFDE7")),
("12:00 – 13:30", "Block 2", "FA Read Block 2 OR UWorld Block 2 (40 Qs)", HexColor("#DAE8FC")),
("13:30 – 15:30", "Review 2", "UWorld Block 2 full review + make Anki cards", HexColor("#DAE8FC")),
("15:30 – 16:00", "Break", "Short break — stretch / snack", HexColor("#FFFDE7")),
("16:00 – 17:30", "Active Recall","Anki / active recall / weak area sketching", HexColor("#E8DAEF")),
("17:30 – 18:00", "Plan", "Plan tomorrow + mark today done ✓", HexColor("#FDECEA")),
]
d_rows_data = []
for (time, label, detail, bg) in daily_rows:
d_rows_data.append([
Paragraph(f"<b>{time}</b>", style("dt", fontSize=8, textColor=HexColor("#1A1A2E"), fontName="Helvetica-Bold", leading=10)),
Paragraph(f"<b>{label}</b>", style("dl", fontSize=8, textColor=HexColor("#1A1A2E"), fontName="Helvetica-Bold", leading=10, alignment=TA_CENTER)),
Paragraph(detail, style("dd", fontSize=8, textColor=HexColor("#2C3E50"), fontName="Helvetica", leading=10)),
])
col_widths_d = [32*mm, 25*mm, CONTENT_W - 57*mm]
dt = Table(d_rows_data, colWidths=col_widths_d)
dts = [
("VALIGN", (0,0),(-1,-1), "MIDDLE"),
("TOPPADDING", (0,0),(-1,-1), 4.5),
("BOTTOMPADDING",(0,0),(-1,-1), 4.5),
("LEFTPADDING", (0,0),(-1,-1), 7),
("RIGHTPADDING", (0,0),(-1,-1), 5),
("LINEBELOW", (0,0),(-1,-1), 0.3, HexColor("#E0E0E0")),
("ALIGN", (1,0), (1,-1), "CENTER"),
]
for i, (time, label, detail, bg) in enumerate(daily_rows):
dts.append(("BACKGROUND", (0,i), (-1,i), bg))
dt.setStyle(TableStyle(dts))
story.append(dt)
story.append(Spacer(1, 6*mm))
# ─── FOOTER ──────────────────────────────────────────────────────────────────
footer_p = Paragraph(
"Generated by Orris AI | USMLE Step 1 — Nov 1, 2026 | Manasa Veena Mayabrahma | 2,595 Questions across 24 Topics",
style("footer", fontSize=7, textColor=HexColor("#AAAAAA"), alignment=TA_CENTER, fontName="Helvetica-Oblique", leading=9)
)
story.append(footer_p)
# ─── BUILD ───────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
print(f"File size: {os.path.getsize(OUTPUT)/1024:.1f} KB")
cd /home/daytona/workspace/usmle-timetable && python generate_timetable.py
USMLE Step1 Timetable Manasa
PDF Document · PDF