Type 4 RTA mechanism clarified: hyperkalemia decreases ammoniagenesis ADDED IN FA 2026 Type 4 RTA: hyperkalemia causes decreased ammoniagenesis in the proximal tubule, reducing NH3/NH4+ available for distal H+ buffering. This impairs net acid excretion despite intact distal H+ secretion (urine pH < 5.5). WHY IT MATTERS This fills the mechanistic gap for Type 4 RTA. Previously students memorized hyperkalemia + low urine pH without understanding why. Now the two-step logic is testable: hyperkalemia inhibits NH3 production, which reduces acid buffering capacity. explin like am 5
Hyperkalemia (↑ K+)
↓
Suppresses ammonia production in proximal tubule (↓ NH3/NH4+)
↓
No buffer available to carry H+ out in urine
↓
Net acid excretion ↓ → Metabolic acidosis
↓
BUT distal H+ pump still works → Urine pH < 5.5
| Feature | Type 1 RTA | Type 2 RTA | Type 4 RTA |
|---|---|---|---|
| Defect | Distal H+ pump broken | Proximal HCO3 reabsorption broken | NH3 production suppressed |
| Potassium | Low (↓) | Low (↓) | High (↑) |
| Urine pH | > 5.5 (can't acidify) | < 5.5 | < 5.5 (pump intact!) |
| Mechanism | Can't secrete H+ distally | Can't reabsorb HCO3 proximally | ↑ K+ → ↓ ammoniagenesis → ↓ NH4+ buffer → ↓ net acid excretion |
| Cause | Sjogren's, amphotericin B | Fanconi syndrome, carbonic anhydrase inhibitors | Diabetes (hyporeninemic hypoaldosteronism), ACE inhibitors, K+-sparing diuretics, heparin |
i want you to generate time table for me i will add questions list give time for that topic to learn first then questions in u world till oct everythimg with revision should complete. this ss has my pending questions in u world i can dedidate whole day no weekends
python3 << 'EOF' from datetime import date, timedelta # === ALL TOPICS WITH QUESTION COUNTS (from screenshot) === topics = [ # General Principles ("Biochemistry (General Principles)", 29), ("Genetics (General Principles)", 62), ("Microbiology (General Principles)", 5), ("Pathology (General Principles)", 26), ("Pharmacology (General Principles)", 45), # Behavioral/Social ("Biostatistics & Epidemiology", 114), ("Poisoning & Environmental Exposure", 18), ("Psychiatric/Behavioral & Substance Use Disorder", 158), ("Social Sciences (Ethics/Legal/Professional)", 107), # Systems ("Allergy & Immunology", 28), ("Cardiovascular System", 303), ("Dermatology", 92), ("Ear, Nose & Throat (ENT)", 34), ("Endocrine, Diabetes & Metabolism", 110), ("Gastrointestinal & Nutrition", 285), ("Hematology & Oncology", 98), ("Infectious Diseases", 271), ("Male Reproductive System", 4), ("Nervous System", 282), ("Ophthalmology", 1), ("Pregnancy, Childbirth & Puerperium", 39), ("Pulmonary & Critical Care", 227), ("Renal, Urinary Systems & Electrolytes", 115), ("Rheumatology/Orthopedics & Sports", 142), ] total_qs = sum(q for _, q in topics) print(f"Total questions: {total_qs}") # === AVAILABLE DAYS === start = date(2026, 6, 20) end = date(2026, 10, 16) all_days = [] d = start while d <= end: all_days.append(d) d += timedelta(days=1) total_days = len(all_days) print(f"Total days available: {total_days} (June 20 - Oct 16)") # === PLAN STRUCTURE === # Each day = 8-10 hrs total # 80 Qs/day takes ~3-4 hrs (40 min/block x2 + review ~1.5 hrs/block) # FA reading for topic takes ~2-3 hrs depending on topic size # Spaced revision = 7 days after finishing a topic, revisit for 1-2 hrs # Q_PER_DAY = 80 Q_PER_DAY = 80 # Assign learning days per topic (FA read + UWorld Qs) # FA read time estimate: small (<30q) = 0.5 day, medium (30-100q) = 1 day, large (100-200q) = 1.5 days, very large (200+) = 2 days # UWorld days = ceil(q / 80) import math plan = [] for topic, qs in topics: if qs == 0: continue if qs <= 30: fa_days = 1 # combine FA + Qs same day q_days = math.ceil(qs / 80) # if qs < 40 and fa_days == 1, combine into 1 day total_topic_days = max(fa_days, q_days) if qs <= 40: total_topic_days = 1 # small topic: read + do Qs same day elif qs <= 100: fa_days = 1 q_days = math.ceil(qs / 80) total_topic_days = fa_days + q_days elif qs <= 200: fa_days = 2 q_days = math.ceil(qs / 80) total_topic_days = fa_days + q_days else: fa_days = 2 q_days = math.ceil(qs / 80) total_topic_days = fa_days + q_days plan.append({ "topic": topic, "qs": qs, "fa_days": fa_days if qs > 40 else 0.5, "q_days": q_days, "total_days": total_topic_days }) total_study_days_needed = sum(p["total_days"] for p in plan) print(f"\nTotal study days needed (before revision): {total_study_days_needed}") print(f"Revision days (1 per topic, 7 days after): {len(plan)} topics = ~{len(plan)} revision slots") print(f"Total days with revision: ~{total_study_days_needed + len(plan)}") print(f"Available days: {total_days}") print(f"Buffer days: {total_days - total_study_days_needed - len(plan)}") for p in plan: print(f" {p['topic']}: {p['qs']} Qs | FA: {p['fa_days']}d | UW: {p['q_days']}d | Total: {p['total_days']}d") EOF
mkdir -p /home/daytona/workspace/usmle-timetable && ls /home/daytona/workspace/usmle-timetable/
python3 << 'PYEOF' import openpyxl from openpyxl.styles import PatternFill, Font, Alignment, Border, Side from openpyxl.utils import get_column_letter from datetime import date, timedelta import math # ============================================================ # DATA # ============================================================ topics = [ ("Biochemistry (General Principles)", 29), ("Genetics (General Principles)", 62), ("Microbiology (General Principles)", 5), ("Pathology (General Principles)", 26), ("Pharmacology (General Principles)", 45), ("Biostatistics & Epidemiology", 114), ("Poisoning & Environmental Exposure", 18), ("Psychiatric/Behavioral & Substance Use Disorder", 158), ("Social Sciences (Ethics/Legal/Professional)", 107), ("Allergy & Immunology", 28), ("Cardiovascular System", 303), ("Dermatology", 92), ("Ear, Nose & Throat (ENT)", 34), ("Endocrine, Diabetes & Metabolism", 110), ("Gastrointestinal & Nutrition", 285), ("Hematology & Oncology", 98), ("Infectious Diseases", 271), ("Male Reproductive System", 4), ("Nervous System", 282), ("Ophthalmology", 1), ("Pregnancy, Childbirth & Puerperium", 39), ("Pulmonary & Critical Care", 227), ("Renal, Urinary Systems & Electrolytes", 115), ("Rheumatology/Orthopedics & Sports", 142), ] Q_PER_DAY = 80 def get_days(qs): if qs <= 40: return {"fa": 0, "q": 1, "total": 1, "note": "FA+UW same day"} elif qs <= 100: return {"fa": 1, "q": math.ceil(qs/Q_PER_DAY), "total": 1 + math.ceil(qs/Q_PER_DAY)} elif qs <= 200: return {"fa": 2, "q": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY)} else: return {"fa": 2, "q": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY)} # ============================================================ # BUILD DAILY SCHEDULE # ============================================================ start = date(2026, 6, 20) end = date(2026, 10, 16) schedule = [] # list of {date, topic, activity, qs_count, day_type} pending_revisions = {} # topic -> date of revision current_date = start for topic, qs in topics: d = get_days(qs) topic_start = current_date # FA reading days if d["fa"] == 0: # Small topic: FA + UW same day # check if any revision due this day while current_date <= end: rev_due = [t for t, rd in pending_revisions.items() if rd == current_date] if rev_due: for rt in rev_due: schedule.append({ "date": current_date, "topic": rt, "activity": "REVISION", "qs_target": "Review notes + 20 Qs", "day_type": "revision", "hours": "2-3 hrs" }) del pending_revisions[rt] current_date += timedelta(days=1) else: break schedule.append({ "date": current_date, "topic": topic, "activity": f"FA Read + UWorld ({qs} Qs)", "qs_target": f"{qs} Qs", "day_type": "combined", "hours": "6-8 hrs" }) pending_revisions[topic] = current_date + timedelta(days=7) current_date += timedelta(days=1) else: # FA days for i in range(d["fa"]): while current_date <= end: rev_due = [t for t, rd in pending_revisions.items() if rd == current_date] if rev_due: for rt in rev_due: schedule.append({ "date": current_date, "topic": rt, "activity": "REVISION", "qs_target": "Review notes + 20 Qs", "day_type": "revision", "hours": "2-3 hrs" }) del pending_revisions[rt] current_date += timedelta(days=1) else: break part = f"Part {i+1}/{d['fa']}" if d['fa'] > 1 else "" schedule.append({ "date": current_date, "topic": topic, "activity": f"FA Read {part}".strip(), "qs_target": "-", "day_type": "fa_read", "hours": "4-5 hrs reading + Anki" }) current_date += timedelta(days=1) # UWorld Q days qs_remaining = qs qday = 1 while qs_remaining > 0: while current_date <= end: rev_due = [t for t, rd in pending_revisions.items() if rd == current_date] if rev_due: for rt in rev_due: schedule.append({ "date": current_date, "topic": rt, "activity": "REVISION", "qs_target": "Review notes + 20 Qs", "day_type": "revision", "hours": "2-3 hrs" }) del pending_revisions[rt] current_date += timedelta(days=1) else: break batch = min(Q_PER_DAY, qs_remaining) schedule.append({ "date": current_date, "topic": topic, "activity": f"UWorld Block {qday} ({batch} Qs)", "qs_target": f"{batch} Qs", "day_type": "uworld", "hours": "4-5 hrs (blocks + review)" }) qs_remaining -= batch qday += 1 current_date += timedelta(days=1) pending_revisions[topic] = topic_start + timedelta(days=7) # Add remaining revisions at end for topic_r, rev_date in sorted(pending_revisions.items(), key=lambda x: x[1]): actual = max(rev_date, current_date) if actual <= end: schedule.append({ "date": actual, "topic": topic_r, "activity": "REVISION", "qs_target": "Review notes + 20 Qs", "day_type": "revision", "hours": "2-3 hrs" }) current_date = actual + timedelta(days=1) schedule.sort(key=lambda x: x["date"]) print(f"Total schedule entries: {len(schedule)}") print(f"Last scheduled date: {schedule[-1]['date']}") print(f"Date range: {schedule[0]['date']} to {schedule[-1]['date']}") # Count fa_days = sum(1 for s in schedule if s["day_type"] == "fa_read") uw_days = sum(1 for s in schedule if s["day_type"] == "uworld") rev_days = sum(1 for s in schedule if s["day_type"] == "revision") combo_days = sum(1 for s in schedule if s["day_type"] == "combined") print(f"FA read days: {fa_days}, UW days: {uw_days}, Revision days: {rev_days}, Combined days: {combo_days}") # Store schedule for xlsx generation import json schedule_serializable = [{**s, "date": s["date"].isoformat()} for s in schedule] with open("/home/daytona/workspace/usmle-timetable/schedule_data.json", "w") as f: json.dump(schedule_serializable, f) print("Schedule data saved.") PYEOF
python3 << 'PYEOF' import openpyxl from openpyxl.styles import PatternFill, Font, Alignment, Border, Side from openpyxl.utils import get_column_letter from datetime import date import json with open("/home/daytona/workspace/usmle-timetable/schedule_data.json") as f: raw = json.load(f) schedule = [{**s, "date": date.fromisoformat(s["date"])} for s in raw] # ============================================================ # COLORS # ============================================================ COLORS = { "header_bg": "1A1A2E", "header_font": "FFFFFF", "fa_read": "D4EDFF", # soft blue "uworld": "D4F4DD", # soft green "revision": "FFF3CD", # amber/gold "combined": "E8D5F5", # soft purple "weekend_col": "F8F8F8", "row_alt": "FAFAFA", "month_header": "16213E", "month_font": "FFFFFF", } DAY_TYPE_LABELS = { "fa_read": "📖 FA READ", "uworld": "✅ UWORLD Qs", "revision": "🔄 REVISION", "combined": "📖✅ FA+UW", } wb = openpyxl.Workbook() # ============================================================ # SHEET 1: FULL TIMETABLE (chronological) # ============================================================ ws = wb.active ws.title = "Full Timetable" # Title row ws.merge_cells("A1:G1") title_cell = ws["A1"] title_cell.value = "USMLE Step 1 Study Timetable | Manasa Veena Mayabrahma | June 20 – Oct 16, 2026" title_cell.font = Font(bold=True, size=14, color="FFFFFF") title_cell.fill = PatternFill("solid", fgColor="1A1A2E") title_cell.alignment = Alignment(horizontal="center", vertical="center") ws.row_dimensions[1].height = 30 # Stats row ws.merge_cells("A2:G2") stats_cell = ws["A2"] stats_cell.value = "Total: 2,595 UWorld Qs across 24 topics | 80 Qs/day (2 blocks) | Spaced Revision (7-day interval) | Completes Sept 23 — 3 weeks buffer before Oct 16" stats_cell.font = Font(italic=True, size=10, color="444444") stats_cell.alignment = Alignment(horizontal="center") ws.row_dimensions[2].height = 18 # Headers headers = ["Date", "Day", "Topic", "Activity", "Qs Target", "Time", "Done ✓"] col_widths = [14, 10, 42, 28, 14, 22, 8] header_fill = PatternFill("solid", fgColor="16213E") header_font = Font(bold=True, color="FFFFFF", size=10) for col_idx, (header, width) in enumerate(zip(headers, col_widths), start=1): cell = ws.cell(row=3, column=col_idx, value=header) cell.fill = header_fill cell.font = header_font cell.alignment = Alignment(horizontal="center", vertical="center") ws.column_dimensions[get_column_letter(col_idx)].width = width ws.row_dimensions[3].height = 20 thin = Side(border_style="thin", color="CCCCCC") border = Border(left=thin, right=thin, top=thin, bottom=thin) fill_map = { "fa_read": PatternFill("solid", fgColor="D4EDFF"), "uworld": PatternFill("solid", fgColor="D4F4DD"), "revision": PatternFill("solid", fgColor="FFF3CD"), "combined": PatternFill("solid", fgColor="E8D5F5"), } weekday_names = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] current_month = None row = 4 for entry in schedule: d = entry["date"] month_name = d.strftime("%B %Y") # Month separator row if month_name != current_month: current_month = month_name ws.merge_cells(f"A{row}:G{row}") month_cell = ws.cell(row=row, column=1, value=f"── {month_name.upper()} ──") month_cell.fill = PatternFill("solid", fgColor="0F3460") month_cell.font = Font(bold=True, color="FFFFFF", size=11) month_cell.alignment = Alignment(horizontal="center") ws.row_dimensions[row].height = 22 row += 1 fill = fill_map.get(entry["day_type"], PatternFill("solid", fgColor="FFFFFF")) day_name = weekday_names[d.weekday()] label = DAY_TYPE_LABELS.get(entry["day_type"], entry["day_type"]) row_data = [ d.strftime("%a, %d %b"), day_name, entry["topic"], label + " — " + entry["activity"], entry["qs_target"], entry["hours"], "" # checkbox ] for col_idx, val in enumerate(row_data, start=1): cell = ws.cell(row=row, column=col_idx, value=val) cell.fill = fill cell.border = border cell.alignment = Alignment(vertical="center", wrap_text=(col_idx == 3)) if col_idx in [1, 2, 5, 7]: cell.alignment = Alignment(horizontal="center", vertical="center") cell.font = Font(size=9) if col_idx == 3: cell.font = Font(size=9, bold=(entry["day_type"] == "revision")) ws.row_dimensions[row].height = 20 row += 1 # Freeze panes ws.freeze_panes = "A4" # ============================================================ # SHEET 2: TOPIC SUMMARY # ============================================================ ws2 = wb.create_sheet("Topic Summary") ws2.merge_cells("A1:F1") ws2["A1"].value = "TOPIC SUMMARY — Questions & Days Allocated" ws2["A1"].font = Font(bold=True, size=13, color="FFFFFF") ws2["A1"].fill = PatternFill("solid", fgColor="1A1A2E") ws2["A1"].alignment = Alignment(horizontal="center") ws2.row_dimensions[1].height = 28 headers2 = ["#", "Topic", "Total Qs", "FA Read Days", "UWorld Days", "Revision Day (approx)"] widths2 = [5, 44, 12, 14, 13, 24] for ci, (h, w) in enumerate(zip(headers2, widths2), 1): c = ws2.cell(row=2, column=ci, value=h) c.fill = PatternFill("solid", fgColor="16213E") c.font = Font(bold=True, color="FFFFFF", size=10) c.alignment = Alignment(horizontal="center") ws2.column_dimensions[get_column_letter(ci)].width = w topics_data = [ ("Biochemistry (General Principles)", 29), ("Genetics (General Principles)", 62), ("Microbiology (General Principles)", 5), ("Pathology (General Principles)", 26), ("Pharmacology (General Principles)", 45), ("Biostatistics & Epidemiology", 114), ("Poisoning & Environmental Exposure", 18), ("Psychiatric/Behavioral & Substance Use Disorder", 158), ("Social Sciences (Ethics/Legal/Professional)", 107), ("Allergy & Immunology", 28), ("Cardiovascular System", 303), ("Dermatology", 92), ("Ear, Nose & Throat (ENT)", 34), ("Endocrine, Diabetes & Metabolism", 110), ("Gastrointestinal & Nutrition", 285), ("Hematology & Oncology", 98), ("Infectious Diseases", 271), ("Male Reproductive System", 4), ("Nervous System", 282), ("Ophthalmology", 1), ("Pregnancy, Childbirth & Puerperium", 39), ("Pulmonary & Critical Care", 227), ("Renal, Urinary Systems & Electrolytes", 115), ("Rheumatology/Orthopedics & Sports", 142), ] import math row_fills = [PatternFill("solid", fgColor="F2F9FF"), PatternFill("solid", fgColor="FFFFFF")] # find revision dates from schedule rev_dates = {} for entry in schedule: if entry["day_type"] == "revision": rev_dates[entry["topic"]] = entry["date"].strftime("%a, %d %b") for i, (topic, qs) in enumerate(topics_data, 1): if qs <= 40: fa_d = "0 (combined)" q_d = 1 elif qs <= 100: fa_d = 1 q_d = math.ceil(qs/80) elif qs <= 200: fa_d = 2 q_d = math.ceil(qs/80) else: fa_d = 2 q_d = math.ceil(qs/80) rev_d = rev_dates.get(topic, "See main sheet") rf = row_fills[i % 2] row_vals = [i, topic, qs, fa_d, q_d, rev_d] for ci, val in enumerate(row_vals, 1): c = ws2.cell(row=i+2, column=ci, value=val) c.fill = rf c.border = border c.alignment = Alignment(horizontal="center" if ci != 2 else "left", vertical="center") c.font = Font(size=9) ws2.row_dimensions[i+2].height = 18 # Total row total_row = len(topics_data) + 3 ws2.merge_cells(f"A{total_row}:B{total_row}") ws2.cell(row=total_row, column=1, value="TOTAL").font = Font(bold=True, size=10) ws2.cell(row=total_row, column=3, value=sum(q for _, q in topics_data)).font = Font(bold=True, size=10) ws2.cell(row=total_row, column=1).fill = PatternFill("solid", fgColor="16213E") ws2.cell(row=total_row, column=1).font = Font(bold=True, color="FFFFFF", size=10) ws2.cell(row=total_row, column=3).fill = PatternFill("solid", fgColor="D4F4DD") # ============================================================ # SHEET 3: LEGEND & DAILY SCHEDULE TEMPLATE # ============================================================ ws3 = wb.create_sheet("Daily Schedule & Legend") ws3.column_dimensions["A"].width = 20 ws3.column_dimensions["B"].width = 55 ws3.merge_cells("A1:B1") ws3["A1"].value = "LEGEND" ws3["A1"].font = Font(bold=True, size=12, color="FFFFFF") ws3["A1"].fill = PatternFill("solid", fgColor="1A1A2E") ws3["A1"].alignment = Alignment(horizontal="center") legend_items = [ ("📖 FA READ (Blue)", "Read First Aid for the topic. 4-5 hrs. No UWorld today. Make Anki cards as you go."), ("✅ UWORLD Qs (Green)", "Do 2 blocks of 40 Qs each (tutor mode). Spend 1.5-2 hrs reviewing each block."), ("🔄 REVISION (Amber)", "7 days after finishing topic: re-read weak areas + do 20 mixed UWorld Qs from that topic."), ("📖✅ FA+UW (Purple)", "Small topic (<40 Qs): read FA in morning, do all Qs in afternoon. Same day."), ] for ri, (label, desc) in enumerate(legend_items, 2): ws3.cell(row=ri, column=1, value=label).font = Font(bold=True, size=9) ws3.cell(row=ri, column=2, value=desc).font = Font(size=9) ws3.cell(row=ri, column=2).alignment = Alignment(wrap_text=True) ws3.row_dimensions[ri].height = 28 ws3.merge_cells("A7:B7") ws3["A7"].value = "DAILY SCHEDULE (8-10 hr day)" ws3["A7"].font = Font(bold=True, size=12, color="FFFFFF") ws3["A7"].fill = PatternFill("solid", fgColor="0F3460") ws3["A7"].alignment = Alignment(horizontal="center") daily_blocks = [ ("06:00 – 08:00", "Warm up: Review yesterday's UWorld incorrect answers + Anki cards"), ("08:00 – 09:30", "FA Reading Block 1 (or UWorld Block 1 - 40 Qs in timed/tutor mode)"), ("09:30 – 11:30", "UWorld Block 1 Review — read ALL explanations, even correct ones"), ("11:30 – 12:00", "Break + lunch"), ("12:00 – 13:30", "FA Reading Block 2 (or UWorld Block 2 - 40 Qs)"), ("13:30 – 15:30", "UWorld Block 2 Review — annotate FA, make Anki"), ("15:30 – 16:00", "Break"), ("16:00 – 17:30", "Anki / active recall / weak area notes"), ("17:30 – 18:00", "Plan tomorrow: check timetable, set UWorld filters"), ] for ri, (time, task) in enumerate(daily_blocks, 8): ws3.cell(row=ri, column=1, value=time).font = Font(bold=True, size=9, color="0F3460") ws3.cell(row=ri, column=2, value=task).font = Font(size=9) ws3.row_dimensions[ri].height = 20 fill_alt = PatternFill("solid", fgColor="F0F7FF" if ri % 2 == 0 else "FFFFFF") ws3.cell(row=ri, column=1).fill = fill_alt ws3.cell(row=ri, column=2).fill = fill_alt # ============================================================ # SAVE # ============================================================ out_path = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_Timetable_ManasaVeena.xlsx" wb.save(out_path) print(f"Saved: {out_path}") # Print first 30 entries preview print("\n=== FIRST 30 DAYS PREVIEW ===") for entry in schedule[:30]: print(f"{entry['date'].strftime('%a %d %b')} | {entry['day_type'].upper():10} | {entry['topic'][:40]:40} | {entry['activity'][:35]}") PYEOF
python3 -c " import openpyxl wb = openpyxl.Workbook() ws = wb.active ws['A1'] = 'test' wb.save('/home/daytona/workspace/usmle-timetable/test.xlsx') print('OK') "
# Check the xlsx skill script location and test it ls /home/daytona/skills/xlsx/ python3 -c "import xlsxwriter; print('xlsxwriter OK')"
ls /home/daytona/skills/xlsx/scripts/ python3 -c "import csv; print('csv OK')" python3 -c "import pandas; print('pandas OK')"
ls /home/daytona/skills/xlsx/scripts/office/
python3 << 'PYEOF' import csv, json, math from datetime import date, timedelta with open("/home/daytona/workspace/usmle-timetable/schedule_data.json") as f: raw = json.load(f) schedule = [{**s, "date": date.fromisoformat(s["date"])} for s in raw] # Write CSV out_csv = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_Timetable.csv" with open(out_csv, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["Date", "Day", "Month", "Type", "Topic", "Activity", "Qs Target", "Time Allocation", "Done ✓"]) for entry in schedule: d = entry["date"] writer.writerow([ d.strftime("%d-%b-%Y"), d.strftime("%A"), d.strftime("%B %Y"), entry["day_type"].upper().replace("_", " "), entry["topic"], entry["activity"], entry["qs_target"], entry["hours"], "" ]) print(f"CSV saved: {out_csv}") # Now generate HTML timetable DAY_COLORS = { "fa_read": ("#D4EDFF", "#0A4D8C"), # blue "uworld": ("#D4F4DD", "#1A6B35"), # green "revision": ("#FFF3CD", "#8C6A00"), # amber "combined": ("#EDE0FF", "#5B2D8E"), # purple } TYPE_LABELS = { "fa_read": "📖 FA READ", "uworld": "✅ UWORLD", "revision": "🔄 REVISION", "combined": "📖✅ FA+UW", } # Group by month from collections import defaultdict by_month = defaultdict(list) for entry in schedule: by_month[entry["date"].strftime("%B %Y")].append(entry) html_rows = "" for month, entries in by_month.items(): html_rows += f""" <tr class="month-header"> <td colspan="7">── {month.upper()} ──</td> </tr>""" for entry in entries: d = entry["date"] dt = entry["day_type"] bg, fg = DAY_COLORS.get(dt, ("#fff", "#000")) label = TYPE_LABELS.get(dt, dt) html_rows += f""" <tr style="background:{bg}; color:{fg};"> <td style="white-space:nowrap; font-weight:600;">{d.strftime("%a, %d %b")}</td> <td>{label}</td> <td style="font-weight:600; max-width:250px;">{entry['topic']}</td> <td>{entry['activity']}</td> <td style="text-align:center;">{entry['qs_target']}</td> <td>{entry['hours']}</td> <td style="text-align:center; font-size:18px;">☐</td> </tr>""" html = f"""<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>USMLE Step 1 Timetable — Manasa Veena</title> <style> * {{ box-sizing: border-box; margin: 0; padding: 0; }} body {{ font-family: 'Segoe UI', Arial, sans-serif; background: #f0f2f5; color: #222; }} .container {{ max-width: 1100px; margin: 30px auto; padding: 20px; }} .title-box {{ background: linear-gradient(135deg, #1A1A2E, #16213E); color: white; border-radius: 12px; padding: 24px 30px; margin-bottom: 20px; }} .title-box h1 {{ font-size: 22px; margin-bottom: 6px; }} .title-box p {{ font-size: 13px; opacity: 0.85; }} .stats {{ display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 24px; }} .stat-card {{ background: white; border-radius: 10px; padding: 14px 20px; flex: 1; min-width: 140px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }} .stat-card .num {{ font-size: 28px; font-weight: 700; color: #1A1A2E; }} .stat-card .lbl {{ font-size: 11px; color: #666; text-transform: uppercase; margin-top: 2px; }} .legend {{ display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 20px; }} .legend-item {{ border-radius: 8px; padding: 8px 14px; font-size: 12px; font-weight: 600; }} table {{ width: 100%; border-collapse: collapse; border-radius: 10px; overflow: hidden; box-shadow: 0 2px 12px rgba(0,0,0,0.1); background: white; }} thead {{ background: #1A1A2E; color: white; }} thead th {{ padding: 12px 14px; text-align: left; font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; }} tbody tr {{ border-bottom: 1px solid rgba(0,0,0,0.06); transition: opacity 0.2s; }} tbody tr:hover {{ filter: brightness(0.96); cursor: default; }} td {{ padding: 10px 14px; font-size: 12.5px; vertical-align: middle; }} .month-header td {{ background: #0F3460 !important; color: white !important; font-weight: 700; font-size: 13px; text-align: center; padding: 8px; letter-spacing: 1px; }} .daily-box {{ background: white; border-radius: 10px; padding: 20px 24px; margin-bottom: 24px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }} .daily-box h2 {{ color: #1A1A2E; margin-bottom: 14px; font-size: 16px; }} .time-block {{ display: flex; gap: 14px; padding: 8px 0; border-bottom: 1px solid #f0f0f0; }} .time-block:last-child {{ border: none; }} .time {{ font-weight: 600; color: #0F3460; min-width: 130px; font-size: 12px; }} .task {{ font-size: 12.5px; color: #444; }} @media print {{ body {{ background: white; }} .container {{ margin: 0; padding: 0; }} }} </style> </head> <body> <div class="container"> <div class="title-box"> <h1>USMLE Step 1 Study Timetable</h1> <p>Manasa Veena Mayabrahma | June 20 – October 16, 2026 | 2,595 pending questions | All topics + spaced revision ✓</p> </div> <div class="stats"> <div class="stat-card"><div class="num">2,595</div><div class="lbl">Total UWorld Qs</div></div> <div class="stat-card"><div class="num">24</div><div class="lbl">Topics</div></div> <div class="stat-card"><div class="num">80</div><div class="lbl">Qs/day (2 blocks)</div></div> <div class="stat-card"><div class="num">Sep 23</div><div class="lbl">Completion Date</div></div> <div class="stat-card"><div class="num">23 days</div><div class="lbl">Buffer before Oct 16</div></div> </div> <div class="legend"> <div class="legend-item" style="background:#D4EDFF; color:#0A4D8C;">📖 FA READ — First Aid reading day</div> <div class="legend-item" style="background:#D4F4DD; color:#1A6B35;">✅ UWORLD — 2 blocks of 40 Qs each</div> <div class="legend-item" style="background:#FFF3CD; color:#8C6A00;">🔄 REVISION — 7 days after topic ends</div> <div class="legend-item" style="background:#EDE0FF; color:#5B2D8E;">📖✅ FA+UW — Small topic, same day</div> </div> <div class="daily-box"> <h2>⏰ Daily Schedule Template (8–10 hrs)</h2> <div class="time-block"><span class="time">06:00 – 08:00</span><span class="task">Warm up: review yesterday's wrong answers + Anki cards</span></div> <div class="time-block"><span class="time">08:00 – 09:30</span><span class="task">FA Reading Block 1 <em>or</em> UWorld Block 1 (40 Qs, tutor mode)</span></div> <div class="time-block"><span class="time">09:30 – 11:30</span><span class="task">UWorld Block 1 full review — read all explanations, annotate FA</span></div> <div class="time-block"><span class="time">11:30 – 12:00</span><span class="task">Break + lunch</span></div> <div class="time-block"><span class="time">12:00 – 13:30</span><span class="task">FA Reading Block 2 <em>or</em> UWorld Block 2 (40 Qs)</span></div> <div class="time-block"><span class="time">13:30 – 15:30</span><span class="task">UWorld Block 2 full review — make Anki cards for missed concepts</span></div> <div class="time-block"><span class="time">15:30 – 16:00</span><span class="task">Break</span></div> <div class="time-block"><span class="time">16:00 – 17:30</span><span class="task">Anki / active recall / weak area notes</span></div> <div class="time-block"><span class="time">17:30 – 18:00</span><span class="task">Plan tomorrow: set UWorld filters, check timetable</span></div> </div> <table> <thead> <tr> <th>Date</th> <th>Type</th> <th>Topic</th> <th>Activity</th> <th>Qs</th> <th>Time</th> <th>Done</th> </tr> </thead> <tbody> {html_rows} </tbody> </table> <p style="text-align:center; color:#999; font-size:11px; margin-top:16px;">Generated by Orris AI • Expiry: Oct 16, 2026 11:59 PM EDT</p> </div> </body> </html>""" out_html = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_Timetable.html" with open(out_html, "w") as f: f.write(html) print(f"HTML saved: {out_html}") print(f"CSV saved: {out_csv}") # Also print the full schedule for reference print("\n=== FULL SCHEDULE ===") for entry in schedule: d = entry["date"] print(f"{d.strftime('%a %d %b %Y')} | {entry['day_type'].upper():10} | {entry['topic'][:38]:38} | {entry['activity'][:40]}") PYEOF
ls -lh /home/daytona/workspace/usmle-timetable/
USMLE Step1 Timetable
HTML File · HTML
USMLE Step1 Timetable
CSV File · CSV
| Total pending Qs | 2,595 across 24 topics |
| Pace | 80 Qs/day (2 blocks of 40) |
| All Qs done by | September 23, 2026 |
| Buffer before expiry | 23 days (Oct 16 deadline) |
| Revision | Automatic - 7 days after each topic finishes |
| Color | Meaning | What to do |
|---|---|---|
| 📖 Blue — FA READ | First Aid reading day | Read the topic chapter, make Anki cards, NO Qs today |
| ✅ Green — UWORLD | Question blocks | 2x40 Qs in tutor mode + FULL review of every explanation |
| 🔄 Amber — REVISION | 7 days after topic | Re-read weak areas + 20 mixed Qs from that topic |
| 💜 Purple — FA+UW | Small topic (<40 Qs) | FA read in morning + all Qs in afternoon, same day |
| Period | Topics |
|---|---|
| June 20–26 | Biochemistry, Genetics, Microbiology, Pathology, Pharmacology (all GP) |
| June 29–Jul 5 | Biostatistics & Epidemiology |
| Jul 7–16 | Psychiatry + Social Sciences |
| Jul 19–Aug 3 | Cardiovascular (303 Qs - your biggest system!), Dermatology, Endocrine |
| Aug 4–21 | GI, Hematology, Infectious Diseases |
| Aug 24–Sep 7 | Nervous System (282 Qs), Pulmonary |
| Sep 11–19 | Renal, Rheumatology |
| Sep 20–23 | Final revision block (Biostats, Cardio, GI, Rheum) |
| Sep 24–Oct 16 | 23-day buffer: full weak-area review + NBMEs |
first i comp;leted renal revision doing uworld questions , after that cardio and then respiratory then in tier 2 I go reproductive , endo, neuro, immuno like that and concepts first then memory based ( add stragegicvally) the order of systems i study and i want to give exam at any cost by nov 1 st week . please guide me
python3 << 'PYEOF' import json, math, csv from datetime import date, timedelta # ============================================================ # YOUR TOPIC ORDER (strategic - concept first, memory second) # + strategic interleaving of remaining topics # ============================================================ # UWorld question counts from screenshot Q = { "Renal, Urinary Systems & Electrolytes": 115, "Cardiovascular System": 303, "Pulmonary & Critical Care": 227, # Tier 2 - memory based "Female Reproductive System & Breast": 0, # skip - 0 qs "Pregnancy, Childbirth & Puerperium": 39, "Male Reproductive System": 4, "Endocrine, Diabetes & Metabolism": 110, "Nervous System": 282, "Allergy & Immunology": 28, # Strategically interleaved "Gastrointestinal & Nutrition": 285, "Hematology & Oncology": 98, "Infectious Diseases": 271, "Psychiatric/Behavioral & Substance Use Disorder": 158, "Dermatology": 92, "Rheumatology/Orthopedics & Sports": 142, # General Principles - sprinkled early/mid "Biochemistry (General Principles)": 29, "Genetics (General Principles)": 62, "Microbiology (General Principles)": 5, "Pathology (General Principles)": 26, "Pharmacology (General Principles)": 45, # High-yield standalone "Biostatistics & Epidemiology": 114, "Social Sciences (Ethics/Legal/Professional)": 107, "Poisoning & Environmental Exposure": 18, "Ear, Nose & Throat (ENT)": 34, "Ophthalmology": 1, } # STRATEGIC ORDER explanation: # Tier 1 - Concept-heavy physiology systems (Renal → Cardio → Pulm) # Bridge - Biochem/Genetics/Pathology GP (short, reinforce concepts) # Tier 2 - Memory-based systems (Repro → Endo → Neuro → Immuno) # Tier 3 - High-volume systems (GI, Infec, Psych, Heme) # Tier 4 - Smaller/standalone (Biostats, Social Sci, Derm, Rheum, ENT, etc.) ORDERED_TOPICS = [ # ── TIER 1: CONCEPT-HEAVY ── ("Renal, Urinary Systems & Electrolytes", 115), ("Cardiovascular System", 303), ("Pulmonary & Critical Care", 227), # ── BRIDGE: Reinforce with GP topics (short) ── ("Pathology (General Principles)", 26), ("Biochemistry (General Principles)", 29), ("Pharmacology (General Principles)", 45), # ── TIER 2: MEMORY-BASED SYSTEMS ── ("Pregnancy, Childbirth & Puerperium", 39), ("Male Reproductive System", 4), ("Endocrine, Diabetes & Metabolism", 110), ("Genetics (General Principles)", 62), # pairs well after Endo ("Nervous System", 282), ("Allergy & Immunology", 28), # ── TIER 3: HIGH VOLUME - concept + memory mix ── ("Gastrointestinal & Nutrition", 285), ("Microbiology (General Principles)", 5), # short, pairs with Infec ("Infectious Diseases", 271), ("Hematology & Oncology", 98), ("Psychiatric/Behavioral & Substance Use Disorder", 158), # ── TIER 4: STANDALONE / SMALLER ── ("Dermatology", 92), ("Rheumatology/Orthopedics & Sports", 142), ("Ear, Nose & Throat (ENT)", 34), ("Ophthalmology", 1), ("Biostatistics & Epidemiology", 114), ("Social Sciences (Ethics/Legal/Professional)", 107), ("Poisoning & Environmental Exposure", 18), ] # Remove 0-question topics ORDERED_TOPICS = [(t, q) for t, q in ORDERED_TOPICS if q > 0] total_qs = sum(q for _, q in ORDERED_TOPICS) print(f"Total Qs: {total_qs}") # ============================================================ # TIMING CONSTANTS # ============================================================ Q_PER_DAY = 80 START = date(2026, 6, 20) EXAM_TARGET = date(2026, 11, 1) # Nov 1 exam # Need final 2 weeks before exam = NBME + light review # So all UWorld must be done by Oct 17 # Leave Oct 17 - Nov 1 = 15 days for NBMEs + final sweep STUDY_END = date(2026, 10, 17) # finish UWorld by Oct 17 all_study_days = [] d = START while d <= STUDY_END: all_study_days.append(d) d += timedelta(days=1) total_days = len(all_study_days) print(f"Study days (June 20 - Oct 17): {total_days}") print(f"Final 2 weeks (Oct 18 - Nov 1): NBME/Final Review") # ============================================================ # ESTIMATE DAYS PER TOPIC # ============================================================ def get_plan(topic, qs): if qs <= 40: return {"fa_days": 0, "q_days": 1, "total": 1, "type": "combined"} elif qs <= 100: return {"fa_days": 1, "q_days": math.ceil(qs/Q_PER_DAY), "total": 1 + math.ceil(qs/Q_PER_DAY), "type": "normal"} elif qs <= 200: return {"fa_days": 2, "q_days": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY), "type": "normal"} else: return {"fa_days": 2, "q_days": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY), "type": "normal"} raw_study_days = sum(get_plan(t, q)["total"] for t, q in ORDERED_TOPICS) revision_days = len(ORDERED_TOPICS) # 1 revision per topic print(f"Raw study days needed: {raw_study_days}") print(f"Revision days: {revision_days}") print(f"Total with revision: {raw_study_days + revision_days}") print(f"Available (to Oct 17): {total_days}") print(f"Buffer: {total_days - raw_study_days - revision_days} days") PYEOF
python3 << 'PYEOF' import json, math, csv from datetime import date, timedelta from collections import defaultdict ORDERED_TOPICS = [ ("Renal, Urinary Systems & Electrolytes", 115), ("Cardiovascular System", 303), ("Pulmonary & Critical Care", 227), ("Pathology (General Principles)", 26), ("Biochemistry (General Principles)", 29), ("Pharmacology (General Principles)", 45), ("Pregnancy, Childbirth & Puerperium", 39), ("Male Reproductive System", 4), ("Endocrine, Diabetes & Metabolism", 110), ("Genetics (General Principles)", 62), ("Nervous System", 282), ("Allergy & Immunology", 28), ("Gastrointestinal & Nutrition", 285), ("Microbiology (General Principles)", 5), ("Infectious Diseases", 271), ("Hematology & Oncology", 98), ("Psychiatric/Behavioral & Substance Use Disorder", 158), ("Dermatology", 92), ("Rheumatology/Orthopedics & Sports", 142), ("Ear, Nose & Throat (ENT)", 34), ("Ophthalmology", 1), ("Biostatistics & Epidemiology", 114), ("Social Sciences (Ethics/Legal/Professional)", 107), ("Poisoning & Environmental Exposure", 18), ] Q_PER_DAY = 80 START = date(2026, 6, 20) EXAM_DATE = date(2026, 11, 1) STUDY_END = date(2026, 10, 17) TIER_MAP = { "Renal, Urinary Systems & Electrolytes": ("TIER 1", "Concept-Heavy"), "Cardiovascular System": ("TIER 1", "Concept-Heavy"), "Pulmonary & Critical Care": ("TIER 1", "Concept-Heavy"), "Pathology (General Principles)": ("BRIDGE", "Concept Reinforcement"), "Biochemistry (General Principles)": ("BRIDGE", "Concept Reinforcement"), "Pharmacology (General Principles)": ("BRIDGE", "Concept Reinforcement"), "Pregnancy, Childbirth & Puerperium": ("TIER 2", "Memory-Based"), "Male Reproductive System": ("TIER 2", "Memory-Based"), "Endocrine, Diabetes & Metabolism": ("TIER 2", "Memory-Based"), "Genetics (General Principles)": ("TIER 2", "Memory-Based"), "Nervous System": ("TIER 2", "Memory-Based"), "Allergy & Immunology": ("TIER 2", "Memory-Based"), "Gastrointestinal & Nutrition": ("TIER 3", "High-Volume Mix"), "Microbiology (General Principles)": ("TIER 3", "High-Volume Mix"), "Infectious Diseases": ("TIER 3", "High-Volume Mix"), "Hematology & Oncology": ("TIER 3", "High-Volume Mix"), "Psychiatric/Behavioral & Substance Use Disorder": ("TIER 3", "High-Volume Mix"), "Dermatology": ("TIER 4", "Standalone"), "Rheumatology/Orthopedics & Sports": ("TIER 4", "Standalone"), "Ear, Nose & Throat (ENT)": ("TIER 4", "Standalone"), "Ophthalmology": ("TIER 4", "Standalone"), "Biostatistics & Epidemiology": ("TIER 4", "Standalone"), "Social Sciences (Ethics/Legal/Professional)": ("TIER 4", "Standalone"), "Poisoning & Environmental Exposure": ("TIER 4", "Standalone"), } def get_plan(qs): if qs <= 40: return {"fa_days": 0, "q_days": 1, "total": 1} elif qs <= 100: return {"fa_days": 1, "q_days": math.ceil(qs/Q_PER_DAY), "total": 1 + math.ceil(qs/Q_PER_DAY)} elif qs <= 200: return {"fa_days": 2, "q_days": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY)} else: return {"fa_days": 2, "q_days": math.ceil(qs/Q_PER_DAY), "total": 2 + math.ceil(qs/Q_PER_DAY)} # ── BUILD SCHEDULE ── schedule = [] pending_revisions = {} # topic -> revision_date current = START def flush_revisions_on(d, schedule, pending_revisions): """If revision due today, insert it.""" due = {t: rd for t, rd in pending_revisions.items() if rd <= d} for t, rd in sorted(due.items(), key=lambda x: x[1]): schedule.append({ "date": d, "topic": t, "activity": "REVISION — review weak notes + 20 mixed Qs", "qs_target": "~20 Qs", "day_type": "revision", "hours": "3-4 hrs", "tier": TIER_MAP.get(t, ("", ""))[0], "tier_label": TIER_MAP.get(t, ("", ""))[1], }) del pending_revisions[t] return d + timedelta(days=len(due)) if due else d def advance_with_revisions(current, schedule, pending_revisions): """Advance current date, inserting revision days that fall in the gap.""" # Check if any revision is due today or past due due = {t: rd for t, rd in pending_revisions.items() if rd <= current} if due: for t, rd in sorted(due.items(), key=lambda x: x[1]): schedule.append({ "date": current, "topic": t, "activity": "REVISION — review weak notes + 20 mixed Qs", "qs_target": "~20 Qs", "day_type": "revision", "hours": "3-4 hrs", "tier": TIER_MAP.get(t, ("", ""))[0], "tier_label": TIER_MAP.get(t, ("", ""))[1], }) del pending_revisions[t] current += timedelta(days=1) return current for topic, qs in ORDERED_TOPICS: tier, tier_label = TIER_MAP.get(topic, ("", "")) plan = get_plan(qs) topic_start = current if plan["fa_days"] == 0: # Small topic: FA + UW same day current = advance_with_revisions(current, schedule, pending_revisions) schedule.append({ "date": current, "topic": topic, "activity": f"FA Read + UWorld ({qs} Qs) — combined", "qs_target": f"{qs} Qs", "day_type": "combined", "hours": "6-7 hrs", "tier": tier, "tier_label": tier_label, }) pending_revisions[topic] = current + timedelta(days=7) current += timedelta(days=1) else: # FA days for i in range(plan["fa_days"]): current = advance_with_revisions(current, schedule, pending_revisions) part = f" Part {i+1}/{plan['fa_days']}" if plan["fa_days"] > 1 else "" schedule.append({ "date": current, "topic": topic, "activity": f"FA Read{part}", "qs_target": "-", "day_type": "fa_read", "hours": "5-6 hrs reading + Anki", "tier": tier, "tier_label": tier_label, }) current += timedelta(days=1) # UWorld Q days qs_remaining = qs qday = 1 while qs_remaining > 0: current = advance_with_revisions(current, schedule, pending_revisions) batch = min(Q_PER_DAY, qs_remaining) schedule.append({ "date": current, "topic": topic, "activity": f"UWorld Block {qday} ({batch} Qs)", "qs_target": f"{batch} Qs", "day_type": "uworld", "hours": "4-5 hrs (blocks + full review)", "tier": tier, "tier_label": tier_label, }) qs_remaining -= batch qday += 1 current += timedelta(days=1) pending_revisions[topic] = topic_start + timedelta(days=7) # Drain remaining revisions for topic_r, rev_d in sorted(pending_revisions.items(), key=lambda x: x[1]): actual = max(rev_d, current) schedule.append({ "date": actual, "topic": topic_r, "activity": "REVISION — review weak notes + 20 mixed Qs", "qs_target": "~20 Qs", "day_type": "revision", "hours": "3-4 hrs", "tier": TIER_MAP.get(topic_r, ("", ""))[0], "tier_label": TIER_MAP.get(topic_r, ("", ""))[1], }) current = actual + timedelta(days=1) schedule.sort(key=lambda x: x["date"]) last_study_day = schedule[-1]["date"] print(f"Schedule entries: {len(schedule)}") print(f"Last study day: {last_study_day}") print(f"Exam target: {EXAM_DATE}") print(f"Days between last study & exam: {(EXAM_DATE - last_study_day).days}") # Save with open("/home/daytona/workspace/usmle-timetable/schedule_v2.json", "w") as f: json.dump([{**s, "date": s["date"].isoformat()} for s in schedule], f, indent=2) print("\n=== FULL SCHEDULE ===") for e in schedule: print(f"{e['date'].strftime('%a %d %b')} | {e['tier']:8} | {e['day_type']:10} | {e['topic'][:35]:35} | {e['qs_target']:8}") PYEOF
python3 << 'PYEOF' import json, csv from datetime import date, timedelta from collections import defaultdict with open("/home/daytona/workspace/usmle-timetable/schedule_v2.json") as f: raw = json.load(f) schedule = [{**s, "date": date.fromisoformat(s["date"])} for s in raw] # ── COLORS ── DAY_COLORS = { "fa_read": ("#C8E6FF", "#004A8C"), "uworld": ("#C8F5D4", "#0A5C2A"), "revision": ("#FFF0B3", "#7A5400"), "combined": ("#EAD5FF", "#4A1980"), } TYPE_LABELS = { "fa_read": "📖 FA READ", "uworld": "✅ UWORLD Qs", "revision": "🔄 REVISION", "combined": "📖✅ FA+UW", } TIER_COLORS = { "TIER 1": "#E63946", "TIER 2": "#457B9D", "TIER 3": "#2A9D8F", "TIER 4": "#6D6875", "BRIDGE": "#F4A261", } # ── GROUP BY MONTH ── by_month = defaultdict(list) for e in schedule: by_month[e["date"].strftime("%B %Y")].append(e) # Add NBME block after last schedule entry last_date = schedule[-1]["date"] nbme_start = last_date + timedelta(days=1) exam_date = date(2026, 11, 1) nbme_html = "" d = nbme_start nbme_entries = [] wk = 1 tasks = [ ("NBME Self-Assessment 1 + review all wrong answers", "Full length"), ("NBME Self-Assessment 2 + review", "Full length"), ("NBME Self-Assessment 3 + weak area FA review", "Full length"), ("NBME Self-Assessment 4 + targeted Qs on weak topics", "Full length"), ("Light FA review: Tier 1 weak points", "Low intensity"), ("Light FA review: Tier 2 weak points", "Low intensity"), ("UWorld custom: wrong answers only (any topic)", "40-80 Qs"), ("UWorld custom: Cardio + Renal mixed reset", "80 Qs"), ("UWorld custom: Neuro + Endo mixed", "80 Qs"), ("UWorld custom: GI + Pulm mixed", "80 Qs"), ("Final FA high-yield pass (rapid review)", "Light pass"), ("Final FA rapid review + rest", "Easy day"), ("Rest + Anki only", "Light"), ("Rest day — sleep early", "Exam Eve"), ("EXAM DAY 🎯", "Nov 1"), ] di = 0 while d <= exam_date and di < len(tasks): nbme_entries.append({"date": d, "task": tasks[di][0], "note": tasks[di][1]}) d += timedelta(days=1) di += 1 # Build HTML rows html_rows = "" for month, entries in by_month.items(): html_rows += f'<tr class="month-hdr"><td colspan="8">── {month.upper()} ──</td></tr>\n' for e in entries: d = e["date"] bg, fg = DAY_COLORS.get(e["day_type"], ("#fff","#000")) label = TYPE_LABELS.get(e["day_type"], "") tier = e.get("tier","") tier_col = TIER_COLORS.get(tier, "#888") tier_badge = f'<span style="background:{tier_col};color:white;border-radius:4px;padding:1px 6px;font-size:10px;font-weight:700;">{tier}</span>' if tier else "" html_rows += f'''<tr style="background:{bg}; color:{fg};"> <td style="white-space:nowrap; font-weight:700; font-size:11px;">{d.strftime("%a, %d %b")}</td> <td style="text-align:center;">{tier_badge}</td> <td style="font-size:10px;">{label}</td> <td style="font-weight:600; max-width:230px; font-size:12px;">{e["topic"]}</td> <td style="font-size:11px;">{e["activity"]}</td> <td style="text-align:center; font-size:11px;">{e["qs_target"]}</td> <td style="font-size:11px;">{e["hours"]}</td> <td style="text-align:center; font-size:16px;">☐</td> </tr>''' # NBME rows html_rows += '<tr class="month-hdr" style="background:#1A1A2E;"><td colspan="8">── OCT 18 – NOV 1: FINAL STRETCH (NBMEs + Weak Area Review) ──</td></tr>\n' for ne in nbme_entries: is_exam = ne["date"] == exam_date bg = "#FFE4E1" if is_exam else ("#F0FFF0" if "NBME" in ne["task"] else "#FFFAF0") fw = "700" if is_exam else "400" html_rows += f'''<tr style="background:{bg};"> <td style="font-weight:{fw}; font-size:11px; white-space:nowrap;">{ne["date"].strftime("%a, %d %b")}</td> <td><span style="background:#555;color:white;border-radius:4px;padding:1px 6px;font-size:10px;">FINAL</span></td> <td style="font-size:10px;">{"🎯 EXAM" if is_exam else "📋 NBME"}</td> <td style="font-weight:{fw}; font-size:12px;" colspan="3">{ne["task"]}</td> <td style="font-size:11px;">{ne["note"]}</td> <td style="text-align:center; font-size:16px;">☐</td> </tr>''' # ── STATS ── total_qs = sum(int(e["qs_target"].replace(" Qs","").replace("~","")) for e in schedule if e["qs_target"] not in ["-",""]) fa_days = sum(1 for e in schedule if e["day_type"]=="fa_read") uw_days = sum(1 for e in schedule if e["day_type"]=="uworld") rev_days = sum(1 for e in schedule if e["day_type"]=="revision") html = f"""<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>USMLE Step 1 — Manasa Veena — Nov 1 2026</title> <style> *{{box-sizing:border-box;margin:0;padding:0;}} body{{font-family:'Segoe UI',Arial,sans-serif;background:#f0f2f5;color:#222;}} .wrap{{max-width:1120px;margin:24px auto;padding:16px;}} .hero{{background:linear-gradient(135deg,#0D1B2A,#1B4332);color:white;border-radius:14px;padding:26px 32px;margin-bottom:18px;}} .hero h1{{font-size:20px;margin-bottom:6px;letter-spacing:-0.3px;}} .hero p{{font-size:12.5px;opacity:0.82;line-height:1.6;}} .hero .exam-badge{{display:inline-block;background:#E63946;color:white;padding:4px 14px;border-radius:20px;font-size:13px;font-weight:700;margin-top:10px;}} .stats{{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px;}} .sc{{background:white;border-radius:10px;padding:12px 18px;flex:1;min-width:130px;box-shadow:0 2px 8px rgba(0,0,0,.07);}} .sc .n{{font-size:26px;font-weight:800;color:#0D1B2A;}} .sc .l{{font-size:10px;color:#777;text-transform:uppercase;margin-top:2px;}} .tier-guide{{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px;}} .tg{{border-radius:8px;padding:8px 14px;font-size:11.5px;font-weight:600;color:white;}} .legend{{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px;}} .li{{border-radius:8px;padding:7px 12px;font-size:11px;font-weight:600;}} .daily{{background:white;border-radius:10px;padding:18px 22px;margin-bottom:20px;box-shadow:0 2px 8px rgba(0,0,0,.07);}} .daily h2{{color:#0D1B2A;margin-bottom:12px;font-size:15px;}} .tb{{display:flex;gap:12px;padding:7px 0;border-bottom:1px solid #f0f0f0;align-items:flex-start;}} .tb:last-child{{border:none;}} .tt{{font-weight:700;color:#0D1B2A;min-width:128px;font-size:11px;}} .tk{{font-size:12px;color:#444;}} table{{width:100%;border-collapse:collapse;border-radius:10px;overflow:hidden;box-shadow:0 2px 12px rgba(0,0,0,.09);background:white;}} thead{{background:#0D1B2A;color:white;}} thead th{{padding:11px 12px;text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.5px;}} tbody tr{{border-bottom:1px solid rgba(0,0,0,.05);}} tbody tr:hover{{filter:brightness(.97);}} td{{padding:8px 12px;font-size:12px;vertical-align:middle;}} .month-hdr td{{background:#16213E!important;color:white!important;font-weight:700;font-size:12px;text-align:center;padding:7px;letter-spacing:1px;}} .footer{{text-align:center;color:#aaa;font-size:10px;margin-top:14px;}} @media print{{body{{background:white;}}.wrap{{margin:0;padding:0;}}}} </style> </head> <body> <div class="wrap"> <div class="hero"> <h1>USMLE Step 1 Study Timetable — Manasa Veena Mayabrahma</h1> <p>2,595 pending UWorld questions | 24 topics | Strategic order: Concept-first → Memory-based<br> FA Read → UWorld Qs → Spaced Revision (7-day) | All UWorld complete by <strong>Sept 29</strong></p> <div class="exam-badge">🎯 TARGET EXAM: November 1, 2026</div> </div> <div class="stats"> <div class="sc"><div class="n">2,595</div><div class="l">Total UWorld Qs</div></div> <div class="sc"><div class="n">24</div><div class="l">Topics</div></div> <div class="sc"><div class="n">Sep 29</div><div class="l">Last UWorld day</div></div> <div class="sc"><div class="n">33 days</div><div class="l">NBME window</div></div> <div class="sc"><div class="n">{fa_days}</div><div class="l">FA Read days</div></div> <div class="sc"><div class="n">{uw_days}</div><div class="l">UWorld days</div></div> <div class="sc"><div class="n">{rev_days}</div><div class="l">Revision days</div></div> </div> <div class="tier-guide"> <div class="tg" style="background:#E63946;">TIER 1 — Concept-Heavy: Renal → Cardio → Pulm</div> <div class="tg" style="background:#F4A261;">BRIDGE — GP Reinforce: Path, Biochem, Pharm</div> <div class="tg" style="background:#457B9D;">TIER 2 — Memory-Based: Repro → Endo → Neuro → Immuno</div> <div class="tg" style="background:#2A9D8F;">TIER 3 — High-Volume: GI → Micro/Infec → Heme → Psych</div> <div class="tg" style="background:#6D6875;">TIER 4 — Standalone: Derm → Rheum → ENT → Biostats → Social Sci</div> </div> <div class="legend"> <div class="li" style="background:#C8E6FF;color:#004A8C;">📖 FA READ — First Aid reading + Anki</div> <div class="li" style="background:#C8F5D4;color:#0A5C2A;">✅ UWORLD — 2×40 Qs tutor mode + full review</div> <div class="li" style="background:#FFF0B3;color:#7A5400;">🔄 REVISION — 7 days later: re-read + 20 Qs</div> <div class="li" style="background:#EAD5FF;color:#4A1980;">📖✅ FA+UW — Small topic: read + do Qs same day</div> <div class="li" style="background:#FFE4E1;color:#8B0000;">🎯 EXAM — November 1, 2026</div> </div> <div class="daily"> <h2>⏰ Daily Schedule Template (8–10 hrs)</h2> <div class="tb"><span class="tt">06:00–08:00</span><span class="tk">Warm-up: yesterday's wrong answers + Anki deck</span></div> <div class="tb"><span class="tt">08:00–09:30</span><span class="tk">FA Read Block 1 <em>or</em> UWorld Block 1 (40 Qs, tutor mode)</span></div> <div class="tb"><span class="tt">09:30–11:30</span><span class="tk">UWorld Block 1 full review — annotate FA, note high-yield facts</span></div> <div class="tb"><span class="tt">11:30–12:00</span><span class="tk">Break + lunch</span></div> <div class="tb"><span class="tt">12:00–13:30</span><span class="tk">FA Read Block 2 <em>or</em> UWorld Block 2 (40 Qs)</span></div> <div class="tb"><span class="tt">13:30–15:30</span><span class="tk">UWorld Block 2 full review — make Anki for wrong answers</span></div> <div class="tb"><span class="tt">15:30–16:00</span><span class="tk">Break</span></div> <div class="tb"><span class="tt">16:00–17:30</span><span class="tk">Anki / spaced repetition / concept sketching for weak areas</span></div> <div class="tb"><span class="tt">17:30–18:00</span><span class="tk">Plan tomorrow: set UWorld filters, mark today done on timetable</span></div> </div> <table> <thead> <tr> <th>Date</th><th>Tier</th><th>Type</th><th>Topic</th><th>Activity</th><th>Qs</th><th>Time</th><th>✓</th> </tr> </thead> <tbody> {html_rows} </tbody> </table> <p class="footer">Generated by Orris AI • USMLE Step 1 Target: Nov 1, 2026 • UWorld expiry: Oct 16, 2026</p> </div> </body> </html>""" out_html = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_StrategicPlan_Nov1.html" with open(out_html, "w") as f: f.write(html) print(f"HTML saved: {out_html}") # ── CSV ── out_csv = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_StrategicPlan_Nov1.csv" with open(out_csv, "w", newline="") as f: w = csv.writer(f) w.writerow(["Date","Day","Tier","Type","Topic","Activity","Qs Target","Time Allocation","Done ✓"]) for e in schedule: d = e["date"] w.writerow([d.strftime("%d-%b-%Y"), d.strftime("%A"), e.get("tier",""), e["day_type"].upper().replace("_"," "), e["topic"], e["activity"], e["qs_target"], e["hours"], ""]) # NBME section w.writerow([]) w.writerow(["--- FINAL STRETCH (Oct 18 - Nov 1): NBMEs + Review ---"]) w.writerow(["Date","Day","","Type","Activity","","Note","",""]) for ne in nbme_entries: w.writerow([ne["date"].strftime("%d-%b-%Y"), ne["date"].strftime("%A"), "", "FINAL", ne["task"], "", ne["note"], "", ""]) print(f"CSV saved: {out_csv}") PYEOF
ls -lh /home/daytona/workspace/usmle-timetable/
USMLE Step1 StrategicPlan Nov1
HTML File · HTML
USMLE Step1 StrategicPlan Nov1
CSV File · CSV
| Tier | Topics | Why this order |
|---|---|---|
| 🔴 TIER 1 | Renal → Cardio → Pulm | Pure physiology - concepts build on each other. Renal teaches you acid-base + electrolytes which feeds directly into Cardio (hemodynamics, HF) and Pulm (resp acidosis, V/Q) |
| 🟠 BRIDGE | Pathology → Biochem → Pharm GP | Short (26-45 Qs each). Placed here to reinforce mechanisms just learned in Tier 1 before pivoting to memory topics |
| 🔵 TIER 2 | Repro → Endo → Neuro → Immuno | Memory-based but with some concept spine. Endo follows Repro (hormones). Genetics placed after Endo (genetic diseases of metabolism). Immuno placed last - high-yield memory table topic |
| 🟢 TIER 3 | GI → Micro/Infec → Heme → Psych | High question volume. GI placed after Endo (both share metabolic concepts). Micro directly before Infec (organisms → bugs → drugs sequential learning). Psych last in this tier - relatively standalone |
| 🟣 TIER 4 | Derm → Rheum → ENT → Biostats → Social Sci → Poisoning | Pure memory-based and smaller systems. Biostats intentionally placed late September - freshest in memory for exam. Social Sciences 2 days before last, right before exam window |
| Phase | Dates | What |
|---|---|---|
| TIER 1 | Jun 20 – Jul 6 | Renal, Cardio, Pulm |
| BRIDGE | Jul 7 – Jul 11 | Path, Biochem, Pharm |
| TIER 2 | Jul 12 – Aug 3 | Repro, Endo, Neuro, Immuno |
| TIER 3 | Aug 4 – Aug 31 | GI, Infec, Heme, Psych |
| TIER 4 | Sep 1 – Sep 22 | Derm, Rheum, ENT, Biostats, Social Sci |
| All UWorld done | Sep 29 | Last revision fires |
| NBME window | Oct 1 – Oct 31 | 4 full NBMEs + targeted weak areas |
| EXAM | Nov 1 | 🎯 |
its not oepning
which wkhtmltopdf; which chromium; which google-chrome; which libreoffice; which pandoc 2>/dev/null; echo "---done"
chromium --headless --no-sandbox --disable-gpu --print-to-pdf="/home/daytona/workspace/usmle-timetable/USMLE_Step1_StrategicPlan_Nov1.pdf" "file:///home/daytona/workspace/usmle-timetable/USMLE_Step1_StrategicPlan_Nov1.html" 2>&1; echo "exit: $?"
USMLE Step1 StrategicPlan Nov1
PDF Document · PDF
no pdf is not opening saying damages
python3 -c "import reportlab; print('reportlab OK', reportlab.Version)"
python3 << 'PYEOF' import json from datetime import date, timedelta from reportlab.lib.pagesizes import A4, landscape 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 # ── Load schedule ── with open("/home/daytona/workspace/usmle-timetable/schedule_v2.json") as f: raw = json.load(f) schedule = [{**s, "date": date.fromisoformat(s["date"])} for s in raw] # ── NBME block ── last_date = schedule[-1]["date"] exam_date = date(2026, 11, 1) nbme_tasks = [ ("NBME Self-Assessment 1 + full review", "Full NBME"), ("NBME Self-Assessment 2 + full review", "Full NBME"), ("Weak area FA re-read (Tier 1 gaps)", "FA Review"), ("NBME Self-Assessment 3 + full review", "Full NBME"), ("UWorld custom reset: wrong answers only", "80 Qs"), ("Weak area FA re-read (Tier 2 gaps)", "FA Review"), ("NBME Self-Assessment 4 + full review", "Full NBME"), ("UWorld custom: Cardio + Renal", "80 Qs"), ("UWorld custom: Neuro + Endo", "80 Qs"), ("UWorld custom: GI + Infec", "80 Qs"), ("Final FA rapid review pass", "Light"), ("Anki + rest", "Easy"), ("Rest day — sleep 9 hrs", "Exam Eve"), ("EXAM DAY", "NOV 1"), ] nbme_entries = [] d = last_date + timedelta(days=1) for i, (task, note) in enumerate(nbme_tasks): if d <= exam_date: nbme_entries.append({"date": d, "task": task, "note": note}) d += timedelta(days=1) # ── Colors ── C_TIER1 = colors.HexColor("#C8E6FF") C_BRIDGE = colors.HexColor("#FFE5C8") C_TIER2 = colors.HexColor("#D5E8FF") C_TIER3 = colors.HexColor("#C8F5D4") C_TIER4 = colors.HexColor("#EAD5FF") C_REV = colors.HexColor("#FFF0B3") C_NBME = colors.HexColor("#E8F5E9") C_EXAM = colors.HexColor("#FFCDD2") C_MHDR = colors.HexColor("#16213E") C_THDR = colors.HexColor("#0D1B2A") C_WHITE = colors.white C_DARK = colors.HexColor("#1A1A2E") TIER_BG = { "TIER 1": C_TIER1, "BRIDGE": C_BRIDGE, "TIER 2": C_TIER2, "TIER 3": C_TIER3, "TIER 4": C_TIER4, } DAY_BG = { "fa_read": C_TIER1, "uworld": C_TIER3, "revision": C_REV, "combined": C_TIER4, } # ── Doc setup ── out = "/home/daytona/workspace/usmle-timetable/USMLE_Step1_StrategicPlan_Nov1_v2.pdf" doc = SimpleDocTemplate(out, pagesize=landscape(A4), leftMargin=12*mm, rightMargin=12*mm, topMargin=12*mm, bottomMargin=12*mm) styles = getSampleStyleSheet() def S(name, **kw): return ParagraphStyle(name, parent=styles['Normal'], **kw) title_s = S("title", fontSize=16, textColor=C_WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold") sub_s = S("sub", fontSize=9, textColor=colors.HexColor("#CCCCCC"), alignment=TA_CENTER) label_s = S("label", fontSize=7.5, fontName="Helvetica-Bold", textColor=C_DARK) cell_s = S("cell", fontSize=7.5, textColor=C_DARK) cell_b = S("cellb", fontSize=7.5, fontName="Helvetica-Bold", textColor=C_DARK) mhdr_s = S("mhdr", fontSize=9, fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER) small_s = S("small", fontSize=7, textColor=colors.HexColor("#555555")) TYPE_LABELS = { "fa_read": "FA READ", "uworld": "UWORLD Qs", "revision": "REVISION", "combined": "FA + UW", } story = [] # ── TITLE BLOCK ── title_data = [[ Paragraph("USMLE Step 1 — Strategic Study Timetable", title_s), ]] title_tbl = Table(title_data, colWidths=[270*mm]) title_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), C_DARK), ("TOPPADDING", (0,0), (-1,-1), 10), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("ROUNDEDCORNERS", [6]), ])) story.append(title_tbl) sub_data = [[ Paragraph("Manasa Veena Mayabrahma | June 20 – Sept 29, 2026 (UWorld) | Oct–Nov 1: NBME + Final Review | TARGET EXAM: Nov 1, 2026", sub_s), ]] sub_tbl = Table(sub_data, colWidths=[270*mm]) sub_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#16213E")), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 7), ])) story.append(sub_tbl) story.append(Spacer(1, 4*mm)) # ── STATS ROW ── stats = [ ("2,595", "UWorld Qs"), ("24", "Topics"), ("80/day", "2 blocks"), ("Sep 29", "UWorld done"), ("33 days", "NBME window"), ("Nov 1", "Exam target"), ] stat_cells = [[Paragraph(f"{n}\n{l}", S("sc", fontSize=8, fontName="Helvetica-Bold", textColor=C_DARK, alignment=TA_CENTER)) for n, l in stats]] stat_tbl = Table(stat_cells, colWidths=[45*mm]*6) stat_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#F8F9FF")), ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")), ("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ])) story.append(stat_tbl) story.append(Spacer(1, 3*mm)) # ── TIER KEY ── tier_info = [ (C_TIER1, "TIER 1 — Concept-Heavy", "Renal → Cardio → Pulm"), (C_BRIDGE, "BRIDGE — GP Reinforce", "Pathology, Biochem, Pharm"), (C_TIER2, "TIER 2 — Memory-Based", "Repro → Endo → Neuro → Immuno"), (C_TIER3, "TIER 3 — High-Volume", "GI → Infec → Heme → Psych"), (C_TIER4, "TIER 4 — Standalone", "Derm, Rheum, Biostats, Social Sci"), ] tier_cells = [[Paragraph(f"{t}\n{d}", S("tc", fontSize=7, fontName="Helvetica-Bold", textColor=C_DARK, alignment=TA_CENTER)) for bg, t, d in tier_info]] tier_tbl = Table(tier_cells, colWidths=[54*mm]*5) tier_tbl.setStyle(TableStyle([ ("BACKGROUND", (i,0), (i,0), tier_info[i][0]) for i in range(5) ] + [ ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")), ("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ])) story.append(tier_tbl) story.append(Spacer(1, 4*mm)) # ── LEGEND ── leg_items = [ (C_TIER1, "FA READ — First Aid reading + Anki"), (C_TIER3, "UWORLD — 2×40 Qs tutor mode + full review"), (C_REV, "REVISION — 7 days after topic: re-read + 20 Qs"), (C_TIER4, "FA+UW — Small topic: FA read + Qs same day"), ] leg_cells = [[Paragraph(t, S("lc", fontSize=7.5, fontName="Helvetica-Bold", textColor=C_DARK, alignment=TA_CENTER)) for bg, t in leg_items]] leg_tbl = Table(leg_cells, colWidths=[67.5*mm]*4) leg_tbl.setStyle(TableStyle([ ("BACKGROUND", (i,0), (i,0), leg_items[i][0]) for i in range(4) ] + [ ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")), ("INNERGRID", (0,0), (-1,-1), 0.5, colors.HexColor("#AAAAAA")), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ])) story.append(leg_tbl) story.append(Spacer(1, 5*mm)) # ── MAIN TABLE ── # Cols: Date | Tier | Type | Topic | Activity | Qs | Time | Done COL_W = [24*mm, 14*mm, 16*mm, 65*mm, 60*mm, 18*mm, 34*mm, 10*mm] def hdr(txt): return Paragraph(txt, S("h", fontSize=8, fontName="Helvetica-Bold", textColor=C_WHITE, alignment=TA_CENTER)) def cell(txt, bold=False, align=TA_LEFT): st = S("c", fontSize=7.5, fontName="Helvetica-Bold" if bold else "Helvetica", textColor=C_DARK, alignment=align) return Paragraph(str(txt), st) table_data = [[hdr("Date"), hdr("Tier"), hdr("Type"), hdr("Topic"), hdr("Activity"), hdr("Qs"), hdr("Time"), hdr("✓")]] table_styles = [ ("BACKGROUND", (0,0), (-1,0), C_THDR), ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")), ("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, colors.HexColor("#FAFAFA")]), ("TOPPADDING", (0,0), (-1,-1), 3), ("BOTTOMPADDING", (0,0), (-1,-1), 3), ("LEFTPADDING", (0,0), (-1,-1), 3), ("RIGHTPADDING", (0,0), (-1,-1), 3), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ] current_month = None row_idx = 1 for entry in schedule: d = entry["date"] month = d.strftime("%B %Y") if month != current_month: current_month = month mrow = [Paragraph(f"── {month.upper()} ──", mhdr_s), "", "", "", "", "", "", ""] table_data.append(mrow) table_styles.append(("BACKGROUND", (0, row_idx), (-1, row_idx), C_MHDR)) table_styles.append(("SPAN", (0, row_idx), (-1, row_idx))) row_idx += 1 tier = entry.get("tier", "") dt = entry["day_type"] row_bg = DAY_BG.get(dt, colors.white) tier_bg = TIER_BG.get(tier, colors.white) table_data.append([ cell(d.strftime("%a %d %b"), bold=True, align=TA_CENTER), cell(tier, bold=True, align=TA_CENTER), cell(TYPE_LABELS.get(dt, dt), align=TA_CENTER), cell(entry["topic"], bold=(dt=="revision")), cell(entry["activity"]), cell(entry["qs_target"], align=TA_CENTER), cell(entry["hours"]), cell("", align=TA_CENTER), ]) table_styles.append(("BACKGROUND", (0, row_idx), (-1, row_idx), row_bg)) row_idx += 1 # ── NBME SECTION ── mrow = [Paragraph("── OCT 18 – NOV 1: FINAL STRETCH — NBMEs + Weak Area Review ──", mhdr_s), "", "", "", "", "", "", ""] table_data.append(mrow) table_styles.append(("BACKGROUND", (0, row_idx), (-1, row_idx), C_DARK)) table_styles.append(("SPAN", (0, row_idx), (-1, row_idx))) row_idx += 1 for ne in nbme_entries: is_exam = ne["date"] == exam_date bg = C_EXAM if is_exam else C_NBME table_data.append([ cell(ne["date"].strftime("%a %d %b"), bold=True, align=TA_CENTER), cell("FINAL", bold=True, align=TA_CENTER), cell("EXAM" if is_exam else "NBME", bold=is_exam, align=TA_CENTER), cell(ne["task"], bold=is_exam), cell(""), cell(ne["note"], align=TA_CENTER), cell(""), cell("", align=TA_CENTER), ]) table_styles.append(("BACKGROUND", (0, row_idx), (-1, row_idx), bg)) row_idx += 1 main_tbl = Table(table_data, colWidths=COL_W, repeatRows=1) main_tbl.setStyle(TableStyle(table_styles)) story.append(main_tbl) # ── BUILD ── doc.build(story) print(f"PDF saved: {out}") import os size = os.path.getsize(out) print(f"File size: {size:,} bytes ({size//1024} KB)") PYEOF
USMLE Step1 StrategicPlan Nov1 v2
PDF Document · PDF
no any other option , its not coming
cd /home/daytona/workspace/usmle-timetable && npm install docx 2>&1 | tail -3
node -e "require('/home/daytona/skills/docx/scripts/../../../node_modules/docx')" 2>/dev/null && echo "found" || find /home/daytona -name "docx" -type d 2>/dev/null | head -5; ls /home/daytona/skills/docx/scripts/
~/usmle-timetable/make_docx.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, PageOrientation, WidthType, ShadingType, BorderStyle,
VerticalAlign, HeadingLevel
} = require('./node_modules/docx');
const fs = require('fs');
const schedule = JSON.parse(fs.readFileSync('./schedule_v2.json', 'utf8'))
.map(e => ({ ...e, date: new Date(e.date) }));
// NBME block
const lastDate = schedule[schedule.length - 1].date;
const examDate = new Date('2026-11-01');
const nbmeTasks = [
["NBME Self-Assessment 1 + full review of all wrong answers", "Full NBME"],
["NBME Self-Assessment 2 + full review", "Full NBME"],
["Weak area FA re-read (Tier 1 gaps)", "FA Review"],
["NBME Self-Assessment 3 + full review", "Full NBME"],
["UWorld custom reset: wrong answers only", "80 Qs"],
["Weak area FA re-read (Tier 2 gaps)", "FA Review"],
["NBME Self-Assessment 4 + full review", "Full NBME"],
["UWorld custom: Cardio + Renal mixed", "80 Qs"],
["UWorld custom: Neuro + Endo mixed", "80 Qs"],
["UWorld custom: GI + Infec mixed", "80 Qs"],
["Final FA rapid review pass (all high-yield)", "Light"],
["Anki only + rest", "Easy day"],
["Rest — sleep 9 hrs — no study", "Exam Eve"],
["🎯 EXAM DAY — November 1, 2026", "NOV 1"]
];
const nbmeEntries = [];
let d = new Date(lastDate);
d.setDate(d.getDate() + 1);
for (let i = 0; i < nbmeTasks.length && d <= examDate; i++) {
nbmeEntries.push({ date: new Date(d), task: nbmeTasks[i][0], note: nbmeTasks[i][1] });
d.setDate(d.getDate() + 1);
}
// Colors
const COL = {
fa_read: "C8E6FF", uworld: "C8F5D4",
revision: "FFF0B3", combined: "EAD5FF",
mhdr: "16213E", thdr: "0D1B2A",
nbme: "E8F5E9", exam: "FFCDD2",
tier1: "C8E6FF", bridge: "FFE5C8",
tier2: "D5E8FF", tier3: "C8F5D4",
tier4: "EAD5FF"
};
const TYPE_LABELS = {
fa_read: "FA READ", uworld: "UWORLD Qs",
revision: "REVISION", combined: "FA + UW"
};
const DAYS = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
const MONTHS = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function fmtDate(d) {
return `${DAYS[d.getDay()]} ${String(d.getDate()).padStart(2,'0')} ${MONTHS[d.getMonth()]}`;
}
function shade(hex) {
return { type: ShadingType.SOLID, color: hex, fill: hex };
}
function cell(text, opts = {}) {
const { bg = "FFFFFF", bold = false, center = false, color = "1A1A2E", size = 16 } = opts;
return new TableCell({
shading: shade(bg),
verticalAlign: VerticalAlign.CENTER,
margins: { top: 40, bottom: 40, left: 60, right: 60 },
children: [new Paragraph({
alignment: center ? AlignmentType.CENTER : AlignmentType.LEFT,
children: [new TextRun({ text: String(text), bold, color, size, font: "Arial" })]
})]
});
}
function headerCell(text) {
return cell(text, { bg: COL.thdr, bold: true, center: true, color: "FFFFFF", size: 16 });
}
function monthRow(label) {
return new TableRow({
children: [
new TableCell({
columnSpan: 8,
shading: shade(COL.mhdr),
margins: { top: 60, bottom: 60, left: 80, right: 80 },
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: `── ${label.toUpperCase()} ──`, bold: true, color: "FFFFFF", size: 18, font: "Arial" })]
})]
})
]
});
}
// Build table rows
const headerRow = new TableRow({
tableHeader: true,
children: [
headerCell("Date"), headerCell("Tier"), headerCell("Type"),
headerCell("Topic"), headerCell("Activity"),
headerCell("Qs"), headerCell("Time"), headerCell("Done")
]
});
const tableRows = [headerRow];
let currentMonth = null;
for (const entry of schedule) {
const month = `${MONTHS[entry.date.getMonth()]} ${entry.date.getFullYear()}`;
if (month !== currentMonth) {
currentMonth = month;
tableRows.push(monthRow(month));
}
const bg = COL[entry.day_type] || "FFFFFF";
const isRev = entry.day_type === "revision";
tableRows.push(new TableRow({
children: [
cell(fmtDate(entry.date), { bg, bold: true, center: true }),
cell(entry.tier || "", { bg, bold: true, center: true }),
cell(TYPE_LABELS[entry.day_type] || entry.day_type, { bg, center: true }),
cell(entry.topic, { bg, bold: isRev }),
cell(entry.activity, { bg }),
cell(entry.qs_target, { bg, center: true }),
cell(entry.hours, { bg }),
cell("", { bg, center: true }),
]
}));
}
// NBME separator
tableRows.push(new TableRow({
children: [new TableCell({
columnSpan: 8,
shading: shade("1A1A2E"),
margins: { top: 60, bottom: 60, left: 80, right: 80 },
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "── OCT 18 – NOV 1: FINAL STRETCH — NBMEs + Weak Area Review ──", bold: true, color: "FFFFFF", size: 18, font: "Arial" })]
})]
})]
}));
for (const ne of nbmeEntries) {
const isExam = ne.date.getTime() === examDate.getTime();
const bg = isExam ? COL.exam : COL.nbme;
tableRows.push(new TableRow({
children: [
cell(fmtDate(ne.date), { bg, bold: true, center: true }),
cell("FINAL", { bg, bold: true, center: true }),
cell(isExam ? "EXAM" : "NBME", { bg, bold: isExam, center: true }),
cell(ne.task, { bg, bold: isExam }),
cell("", { bg }),
cell(ne.note, { bg, center: true }),
cell("", { bg }),
cell("", { bg, center: true }),
]
}));
}
// Column widths (landscape A4 = ~16600 twips usable)
const colWidths = [1600, 1000, 1100, 4000, 4200, 900, 2300, 600];
const mainTable = new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
columnWidths: colWidths,
rows: tableRows,
});
// Title paragraphs
function titlePara(text, size, bold, color = "FFFFFF") {
return new Paragraph({
shading: shade("0D1B2A"),
alignment: AlignmentType.CENTER,
spacing: { before: 0, after: 0 },
children: [new TextRun({ text, bold, size, color, font: "Arial" })]
});
}
const doc = new Document({
sections: [{
properties: {
page: {
size: { orientation: PageOrientation.LANDSCAPE, width: 16838, height: 11906 },
margin: { top: 500, bottom: 500, left: 600, right: 600 }
}
},
children: [
titlePara("USMLE Step 1 — Strategic Study Timetable", 32, true),
titlePara("Manasa Veena Mayabrahma | June 20 – Sep 29, 2026 (UWorld) | Oct–Nov 1: NBME + Final Review | TARGET EXAM: Nov 1, 2026", 18, false, "CCCCCC"),
new Paragraph({ spacing: { before: 100, after: 0 }, children: [] }),
// Stats row
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
columnWidths: [2733, 2733, 2733, 2733, 2733, 2733],
rows: [new TableRow({ children: [
["2,595 Questions","UWorld Qs"],
["24 Topics","All systems"],
["80 Qs / day","2 blocks"],
["Sep 29","UWorld done"],
["33 days","NBME window"],
["Nov 1, 2026","EXAM TARGET"],
].map(([n, l]) => new TableCell({
shading: shade("F0F4FF"),
margins: { top: 60, bottom: 60, left: 80, right: 80 },
children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [
new TextRun({ text: n + "\n" + l, bold: true, size: 16, color: "0D1B2A", font: "Arial" })
]})]
}))})]
}),
new Paragraph({ spacing: { before: 80, after: 0 }, children: [] }),
// Tier key
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
columnWidths: [3280, 3280, 3280, 3280, 3280],
rows: [new TableRow({ children: [
["TIER 1 — Concept-Heavy\nRenal → Cardio → Pulm", "C8E6FF"],
["BRIDGE — GP Reinforce\nPathology, Biochem, Pharm", "FFE5C8"],
["TIER 2 — Memory-Based\nRepro → Endo → Neuro → Immuno", "D5E8FF"],
["TIER 3 — High-Volume\nGI → Infec → Heme → Psych", "C8F5D4"],
["TIER 4 — Standalone\nDerm, Rheum, Biostats, Social Sci", "EAD5FF"],
].map(([t, bg]) => new TableCell({
shading: shade(bg),
margins: { top: 50, bottom: 50, left: 80, right: 80 },
children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [
new TextRun({ text: t, bold: true, size: 15, color: "1A1A2E", font: "Arial" })
]})]
}))})]
}),
new Paragraph({ spacing: { before: 80, after: 0 }, children: [] }),
// Legend
new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
columnWidths: [4100, 4100, 4100, 4100],
rows: [new TableRow({ children: [
["FA READ — First Aid reading + Anki cards", "C8E6FF"],
["UWORLD — 2x40 Qs tutor mode + full review", "C8F5D4"],
["REVISION — 7 days after topic: re-read + 20 Qs", "FFF0B3"],
["FA+UW — Small topic: FA read + Qs same day", "EAD5FF"],
].map(([t, bg]) => new TableCell({
shading: shade(bg),
margins: { top: 50, bottom: 50, left: 80, right: 80 },
children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [
new TextRun({ text: t, bold: true, size: 15, color: "1A1A2E", font: "Arial" })
]})]
}))})]
}),
new Paragraph({ spacing: { before: 100, after: 0 }, children: [] }),
mainTable,
new Paragraph({ spacing: { before: 100, after: 0 }, alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "Generated by Orris AI • UWorld expiry: Oct 16, 2026 • Target Exam: Nov 1, 2026", size: 14, color: "999999", font: "Arial" })]
}),
]
}]
});
Packer.toBuffer(doc).then(buf => {
fs.writeFileSync('./USMLE_Step1_StrategicPlan_Nov1.docx', buf);
console.log('DOCX saved: USMLE_Step1_StrategicPlan_Nov1.docx');
console.log('Size:', buf.length, 'bytes');
});
cd /home/daytona/workspace/usmle-timetable && node make_docx.js 2>&1
cd /home/daytona/workspace/usmle-timetable && python3 /home/daytona/skills/docx/scripts/office/validate.py USMLE_Step1_StrategicPlan_Nov1.docx 2>&1
# Verify the docx is a valid zip/Office file cd /home/daytona/workspace/usmle-timetable python3 -c " import zipfile z = zipfile.ZipFile('USMLE_Step1_StrategicPlan_Nov1.docx') names = z.namelist() print('Valid ZIP. Files inside:', names[:8]) print('Has word/document.xml:', 'word/document.xml' in names) "
USMLE Step1 StrategicPlan Nov1
Word Document · DOCX
.docx - opens in Microsoft Word, Google Docs, WPS Office, LibreOffice and on any phone with the Word app. Landscape layout, color-coded by tier and activity type, full timetable June 20 through the Nov 1 exam day.If DOCX still won't open, use the CSV file in Excel — it has all the same dates and plan
USMLE Step1 StrategicPlan Nov1
CSV File · CSV
USMLE Step1 StrategicPlan Nov1
Word Document · DOCX
Want me to make a text version you can paste into your notes app as backup?
╔══════════════════════════════════════════════════════════════╗
║ 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 ✓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
← DONE markers are there so you can search "DONE" to find where each topic ends.