hi can you guide me to prepare for fmge exam January 7 th
FMGE January 2027 exam syllabus pattern subject wise weightage
| Subject | Questions |
|---|---|
| Medicine | 33 |
| General Surgery | 32 |
| OBG | 30 |
| PSM / Community Medicine | 30 |
| Anatomy | 17 |
| Physiology | 17 |
| Biochemistry | 17 |
| Pediatrics | 15 |
| Ophthalmology | 15 |
| ENT | 15 |
| Pathology | 13 |
| Microbiology | 13 |
| Pharmacology | 13 |
| Forensic Medicine | 10 |
| Dermatology | 5 |
| Psychiatry | 5 |
| Anesthesia | 5 |
| Orthopedics | 5 |
| Radiodiagnosis | 5 |
| Radiotherapy | 5 |
| Subject | Recommended Book/Source |
|---|---|
| Anatomy | BD Chaurasia (key chapters) + Across |
| Physiology | Ganong / AK Jain Rapid Review |
| Biochemistry | Vasudevan + PrepLadder notes |
| Pathology | Harsh Mohan or Robins Review |
| Pharmacology | KD Tripathi key drug tables |
| Microbiology | Ananthnarayan or Rachna Chaurasia |
| Medicine | Harrison's Review MCQ / API Medicine |
| Surgery | Bailey & Love MCQ / SRB Surgery |
| OBG | Dutta Obstetrics + Shaw's Gynecology |
| PSM | Park's Textbook of PSM (essential) |
| Pediatrics | OP Ghai / Meharban Singh |
| FMT | Reddy's FMT |
| Week | Target |
|---|---|
| Each week in Phase 1 & 2 | Complete 1 subject theory + 300 MCQs solved |
| Each week in Phase 3 | 700+ MCQs solved, 2 subjects fully revised |
| Each week in Phase 4 | 2 full mock tests, analyze 100% of mistakes |
iam prepping from august and doin cerebellum
e
i meant cerebellum app iam using to study and prepping from august
| Week | Subject | Cerebellum Focus |
|---|---|---|
| Week 1 | Anatomy | Neuroanatomy, Upper & Lower Limb, Embryology |
| Week 2 | Physiology | CVS, Respiratory, Renal, Neuro |
| Week 3 | Biochemistry | Metabolism, Enzymes, Vitamins, Mol. Bio |
| Week 4 | Pharmacology | General pharmacology + high-yield drug classes |
| Week | Subject |
|---|---|
| Week 1 | Pathology (General + Systemic) |
| Week 2 | Microbiology (Bacteriology, Virology, Parasitology) |
| Week 3 | Forensic Medicine + Dermatology + Psychiatry |
| Week 4 | Ophthalmology (15 Qs in exam - don't underestimate) |
| Week | Subject | Key Areas |
|---|---|---|
| Week 1 | Medicine (33 Qs) | CVS, Respiratory, Nephrology, Neurology, Endocrine |
| Week 2 | Surgery (32 Qs) | GI, Thyroid, Breast, Trauma, Urology |
| Week 3 | OBG (30 Qs) | Normal/Abnormal Obstetrics, Gynecology, Contraception |
| Week 4 | PSM (30 Qs) | Epidemiology, Biostatistics, National Programs, Vaccines |
| Week | Task |
|---|---|
| Week 1 | ENT (15 Qs) + Pediatrics (15 Qs) + Ortho/Anaes/Radio (20 Qs) |
| Week 2-4 | First full revision of ALL subjects on Cerebellum |
| Week | Task |
|---|---|
| Week 1-2 (Dec 1-14) | Full-length 300-question mock tests daily or every other day |
| Week 3 (Dec 15-21) | Analyze mistakes, revise weak subjects |
| Week 4 (Dec 22-31) | Short notes revision only, light Qs |
| Jan 1-6 | Very light revision, sleep well, no new topics |
| Priority | Subjects | Qs in Exam |
|---|---|---|
| 🔴 Must ace | Medicine, Surgery, OBG, PSM | 125 |
| 🟠 High yield | Anatomy, Physiology, Biochem, ENT, Ophtho, Peds | 96 |
| 🟡 Don't skip | Patho, Micro, Pharma, FMT | 49 |
| 🟢 Bonus | Derma, Psych, Ortho, Anaes, Radio, RT | 30 |
Generate a daily study schedule template for August-September
ls /home/daytona/workspace/ 2>/dev/null && echo "EXISTS" || mkdir -p /home/daytona/workspace/fmge-schedule && echo "CREATED"
~/fmge-schedule/create_schedule.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
AlignmentType, HeadingLevel, BorderStyle, WidthType, ShadingType,
VerticalAlign, PageNumber, Header, Footer, PageBreak
} = require('docx');
const fs = require('fs');
// Color palette
const COLOR_DARK_BLUE = "1A3A5C";
const COLOR_MED_BLUE = "2E6DA4";
const COLOR_LIGHT_BLUE = "D6E8F7";
const COLOR_ORANGE = "E07B39";
const COLOR_LIGHT_ORANGE = "FDEBD0";
const COLOR_GREEN = "27AE60";
const COLOR_LIGHT_GREEN = "D5F5E3";
const COLOR_RED = "C0392B";
const COLOR_LIGHT_RED = "FADBD8";
const COLOR_YELLOW = "F0C050";
const COLOR_LIGHT_YELLOW = "FEF9E7";
const COLOR_GRAY = "5D6D7E";
const COLOR_LIGHT_GRAY = "EAF0F6";
const COLOR_WHITE = "FFFFFF";
const COLOR_PURPLE = "7D3C98";
const COLOR_LIGHT_PURPLE = "E8DAEF";
function heading1(text) {
return new Paragraph({
children: [new TextRun({ text, bold: true, size: 32, color: COLOR_WHITE, font: "Calibri" })],
heading: HeadingLevel.HEADING_1,
alignment: AlignmentType.CENTER,
shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
spacing: { before: 200, after: 200 },
});
}
function heading2(text, color = COLOR_MED_BLUE) {
return new Paragraph({
children: [new TextRun({ text, bold: true, size: 26, color: COLOR_WHITE, font: "Calibri" })],
heading: HeadingLevel.HEADING_2,
alignment: AlignmentType.LEFT,
shading: { type: ShadingType.SOLID, fill: color },
spacing: { before: 200, after: 100 },
indent: { left: 0 },
});
}
function subheading(text, color = COLOR_LIGHT_BLUE) {
return new Paragraph({
children: [new TextRun({ text, bold: true, size: 22, color: COLOR_DARK_BLUE, font: "Calibri" })],
alignment: AlignmentType.LEFT,
shading: { type: ShadingType.SOLID, fill: color },
spacing: { before: 120, after: 80 },
});
}
function bodyPara(text, bold = false, color = "000000") {
return new Paragraph({
children: [new TextRun({ text, bold, size: 20, color, font: "Calibri" })],
spacing: { before: 60, after: 60 },
indent: { left: 200 },
});
}
function bullet(text, bold = false) {
return new Paragraph({
children: [new TextRun({ text: `• ${text}`, bold, size: 20, font: "Calibri", color: "222222" })],
spacing: { before: 40, after: 40 },
indent: { left: 400 },
});
}
function spacer() {
return new Paragraph({ children: [new TextRun("")], spacing: { before: 80, after: 80 } });
}
function makeTableCell(text, { fill = COLOR_WHITE, bold = false, color = "000000", align = AlignmentType.LEFT, width = null } = {}) {
const cell = new TableCell({
children: [new Paragraph({
children: [new TextRun({ text, bold, size: 19, font: "Calibri", color })],
alignment: align,
spacing: { before: 60, after: 60 },
})],
shading: { type: ShadingType.SOLID, fill },
verticalAlign: VerticalAlign.CENTER,
margins: { top: 80, bottom: 80, left: 120, right: 120 },
...(width ? { width: { size: width, type: WidthType.DXA } } : {}),
});
return cell;
}
function scheduleTable(rows) {
const headerRow = new TableRow({
children: [
makeTableCell("TIME", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1500 }),
makeTableCell("ACTIVITY", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 3500 }),
makeTableCell("DETAILS / CEREBELLUM TASK", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4000 }),
makeTableCell("DURATION", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1200 }),
],
tableHeader: true,
});
const dataRows = rows.map((r, i) => new TableRow({
children: [
makeTableCell(r[0], { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE, align: AlignmentType.CENTER }),
makeTableCell(r[1], { fill: r[3] || (i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE), bold: r[4] || false }),
makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE }),
makeTableCell(r[5] || "", { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE, align: AlignmentType.CENTER }),
],
}));
return new Table({
rows: [headerRow, ...dataRows],
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
left: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
right: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
insideH:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
insideV:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
},
});
}
function weekTable(weeks) {
const headerRow = new TableRow({
children: [
makeTableCell("WEEK", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1200 }),
makeTableCell("SUBJECT", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2200 }),
makeTableCell("TOPICS TO COVER", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4500 }),
makeTableCell("CEREBELLUM MCQs", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2300 }),
],
tableHeader: true,
});
const dataRows = weeks.map((r, i) => new TableRow({
children: [
makeTableCell(r[0], { fill: COLOR_LIGHT_ORANGE, bold: true, align: AlignmentType.CENTER, color: COLOR_RED }),
makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE, bold: true, color: COLOR_DARK_BLUE }),
makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE }),
makeTableCell(r[3], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE, align: AlignmentType.CENTER }),
],
}));
return new Table({
rows: [headerRow, ...dataRows],
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
left: { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
right: { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
insideH:{ style: BorderStyle.SINGLE, size: 2, color: "F5CBA7" },
insideV:{ style: BorderStyle.SINGLE, size: 2, color: "F5CBA7" },
},
});
}
function tipsTable(tips, fillColor = COLOR_LIGHT_GREEN) {
return new Table({
rows: tips.map((t, i) => new TableRow({
children: [
makeTableCell(`${i + 1}`, { fill: COLOR_GREEN, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 600 }),
makeTableCell(t, { fill: i % 2 === 0 ? fillColor : COLOR_WHITE }),
],
})),
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
left: { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
right: { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
insideH:{ style: BorderStyle.SINGLE, size: 2, color: "A9DFBF" },
insideV:{ style: BorderStyle.SINGLE, size: 2, color: "A9DFBF" },
},
});
}
// ─── DAILY SCHEDULE ROWS ──────────────────────────────────────────────────────
// [time, activity, details, fillColor, bold, duration]
const dailyRows = [
["5:00 – 5:30 AM", "Wake Up & Morning Routine", "Freshen up, light stretching or walk, hydrate", COLOR_LIGHT_YELLOW, false, "30 min"],
["5:30 – 6:00 AM", "Quick Revision (Flashcards)", "Review yesterday's Cerebellum incorrect Qs / key points", COLOR_LIGHT_YELLOW, false, "30 min"],
["6:00 – 8:30 AM", "🧠 STUDY SESSION 1", "New topic theory – video lecture or standard textbook", COLOR_LIGHT_BLUE, true, "2.5 hrs"],
["8:30 – 9:00 AM", "Breakfast + Short Break", "Eat well, step outside briefly, rest eyes", COLOR_LIGHT_YELLOW, false, "30 min"],
["9:00 – 11:30 AM", "🧠 STUDY SESSION 2", "Continue new topic OR start next sub-topic from same subject", COLOR_LIGHT_BLUE, true, "2.5 hrs"],
["11:30 AM – 12:30 PM", "📝 MCQ Practice (Cerebellum)", "Topic-wise MCQs on Cerebellum – aim 60–80 Qs, timed mode", COLOR_LIGHT_PURPLE, true, "1 hr"],
["12:30 – 1:30 PM", "Lunch + Rest", "Eat lunch, short 20–30 min nap if needed", COLOR_LIGHT_YELLOW, false, "1 hr"],
["1:30 – 4:00 PM", "🧠 STUDY SESSION 3", "New topic or revision of morning topic with notes", COLOR_LIGHT_BLUE, true, "2.5 hrs"],
["4:00 – 4:30 PM", "Tea Break + Relaxation", "Walk, light snack, avoid screens for 30 min", COLOR_LIGHT_YELLOW, false, "30 min"],
["4:30 – 6:30 PM", "📝 MCQ Practice (Cerebellum)", "Subject-wise random Qs – aim 50–60 Qs, read ALL explanations", COLOR_LIGHT_PURPLE, true, "2 hrs"],
["6:30 – 7:00 PM", "Mistake Analysis", "Go through wrong answers, note key facts in personal notes", COLOR_LIGHT_RED, false, "30 min"],
["7:00 – 8:00 PM", "Dinner + Free Time", "Relax, do not study during dinner", COLOR_LIGHT_YELLOW, false, "1 hr"],
["8:00 – 9:30 PM", "🧠 STUDY SESSION 4 (Revision)", "Revise TODAY's topic – read your notes, do rapid recall", COLOR_LIGHT_GREEN, true, "1.5 hrs"],
["9:30 – 10:00 PM", "Daily Summary + Planning", "Write 5 key points learned today, plan tomorrow's topics", COLOR_LIGHT_YELLOW, false, "30 min"],
["10:00 – 10:30 PM","Light Reading / Wind Down", "Optional: skim high-yield tables or mnemonics only", COLOR_LIGHT_GRAY, false, "30 min"],
["10:30 PM", "Sleep", "7 hours minimum – memory consolidation happens during sleep", COLOR_LIGHT_YELLOW, false, "—"],
];
// ─── SUNDAY SCHEDULE ROWS ─────────────────────────────────────────────────────
const sundayRows = [
["7:00 – 8:00 AM", "Wake Up + Light Morning", "Relax start, light breakfast, review weekly targets", COLOR_LIGHT_YELLOW, false, "1 hr"],
["8:00 – 10:00 AM", "📝 Weekly Mock Test", "150-Q timed test on Cerebellum covering current week's subjects", COLOR_LIGHT_PURPLE, true, "2 hrs"],
["10:00 – 11:00 AM","Mock Analysis", "Go through every wrong answer, note down patterns", COLOR_LIGHT_RED, false, "1 hr"],
["11:00 AM – 1:00 PM","Weak Topic Revision", "Pick the 2 lowest-scoring topics from mock and revise them", COLOR_LIGHT_BLUE, true, "2 hrs"],
["1:00 – 3:00 PM", "Lunch + Afternoon Rest", "Full break – rest and recharge for the week", COLOR_LIGHT_YELLOW, false, "2 hrs"],
["3:00 – 5:00 PM", "Previous Year Questions", "Solve PYQs from the week's subject on Cerebellum", COLOR_LIGHT_GREEN, true, "2 hrs"],
["5:00 – 6:00 PM", "Notes Consolidation", "Update short notes with new points from the week", COLOR_LIGHT_GRAY, false, "1 hr"],
["6:00 PM onwards", "Family / Personal Time", "Fully switch off – rest is essential for retention", COLOR_LIGHT_YELLOW, false, "—"],
];
// ─── AUGUST WEEK PLAN ─────────────────────────────────────────────────────────
const augustWeeks = [
["Week 1\n(Aug 1–7)", "Anatomy", "Upper Limb (bones, muscles, nerves, vessels), Lower Limb basics, Surface Anatomy", "80–100 Qs"],
["Week 2\n(Aug 8–14)", "Anatomy", "Head & Neck, Neuroanatomy (cranial nerves, tracts), Embryology (high-yield: heart, gut, neural tube)", "80–100 Qs"],
["Week 3\n(Aug 15–21)", "Physiology", "CVS (cardiac cycle, BP regulation, ECG), Respiratory (mechanics, control of breathing, hypoxia)", "80–100 Qs"],
["Week 4\n(Aug 22–28)", "Physiology", "Renal (GFR, tubular functions, acid-base), Neurophysiology (synaptic transmission, reflexes, special senses)", "80–100 Qs"],
["Week 5\n(Aug 29–31)", "Biochemistry", "Enzymes, carbohydrate metabolism, TCA cycle (3 day jumpstart)", "50–60 Qs"],
];
// ─── SEPTEMBER WEEK PLAN ──────────────────────────────────────────────────────
const septemberWeeks = [
["Week 1\n(Sep 1–7)", "Biochemistry", "Lipid metabolism, protein metabolism, vitamins (fat & water soluble), minerals, clinical biochemistry", "80–100 Qs"],
["Week 2\n(Sep 8–14)", "Pharmacology", "General pharmacology, ANS drugs, CVS drugs (anti-hypertensives, anti-anginals, anti-arrhythmics)", "80–100 Qs"],
["Week 3\n(Sep 15–21)", "Pharmacology", "CNS drugs, antimicrobials, anti-cancer, autacoids, endocrine pharmacology", "80–100 Qs"],
["Week 4\n(Sep 22–28)", "Microbiology", "General bacteriology, Gram +ve/-ve bacteria (Staph, Strep, E.coli, Salmonella, Mycobacteria, Clostridia)", "80–100 Qs"],
["Week 5\n(Sep 29–30)", "Microbiology", "Virology (HIV, Herpes, Hepatitis, Influenza), Parasitology (Plasmodium, Entamoeba, Wuchereria)", "50–60 Qs"],
];
// ─── WEEKLY TARGETS TABLE ─────────────────────────────────────────────────────
const weeklyTargets = [
["Mon – Sat", "Theory + MCQs", "Complete 1 topic/day, 80–100 Qs/day on Cerebellum", "480–600 Qs/week"],
["Sunday", "Revision + Mock", "Full week revision + 150 Q mock test + PYQs", "150–200 Qs"],
["Monthly", "Total MCQs", "All weeks combined", "~2500–3200 Qs"],
["Monthly", "Subjects Done", "Aug: Anatomy + Physiology + Biochem start", "3 subjects"],
["Monthly", "Subjects Done", "Sep: Biochem complete + Pharmacology + Microbiology", "3 subjects"],
];
// ─── CEREBELLUM TIPS ──────────────────────────────────────────────────────────
const cerebellumTips = [
"Always use TOPIC-WISE mode first when learning a new subject – don't jump to random mode until you've covered 70% of the subject.",
"After solving any MCQ, read the FULL explanation even if you got it right – nuances in wrong options are examinable.",
"Use the INCORRECT QUESTIONS filter every Sunday – this is your personal weak-topic detector.",
"Enable SPACED REPETITION reminders – Cerebellum's algorithm shows cards just before you forget them. Never skip these.",
"Solve PYQ mode at least once per subject before moving on – FMGE repeats questions across years.",
"Track your subject-wise ACCURACY % – anything below 60% needs an immediate extra revision session.",
"Use TIMED MODE for MCQs at least 3 times per week – FMGE allows 1 min/question, speed matters.",
"Do NOT solve MCQs passively (just clicking answers). After every 10 Qs, recall what concept was tested.",
];
// ─── MNEMONIC / HIGH-YIELD NOTE ───────────────────────────────────────────────
const highYield = [
["Anatomy", "Brachial plexus roots, carpal tunnel structures, cranial nerve nuclei, embryological derivatives"],
["Physiology", "Frank-Starling law, Henderson-Hasselbalch, GFR formula, lung volumes (values), JGA"],
["Biochemistry", "Enzyme deficiency diseases (PKU, galactosemia, etc.), vitamin deficiency symptoms, metabolic pathways"],
["Pharmacology", "Drug of choice lists, receptor types per drug class, side effect profiles, contraindications"],
["Microbiology", "Gram stain results, special media, virulence factors, lab diagnosis of each organism"],
];
function highYieldTable(rows) {
const header = new TableRow({
children: [
makeTableCell("SUBJECT", { fill: COLOR_PURPLE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2000 }),
makeTableCell("MUST-KNOW HIGH-YIELD AREAS", { fill: COLOR_PURPLE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 8200 }),
],
tableHeader: true,
});
const dataRows = rows.map((r, i) => new TableRow({
children: [
makeTableCell(r[0], { fill: COLOR_LIGHT_PURPLE, bold: true, color: COLOR_PURPLE, align: AlignmentType.CENTER }),
makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_PURPLE : COLOR_WHITE }),
],
}));
return new Table({
rows: [header, ...dataRows],
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
left: { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
right: { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
insideH:{ style: BorderStyle.SINGLE, size: 2, color: "D2B4DE" },
insideV:{ style: BorderStyle.SINGLE, size: 2, color: "D2B4DE" },
},
});
}
function weeklyTargetsTable(rows) {
const header = new TableRow({
children: [
makeTableCell("PERIOD", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1500 }),
makeTableCell("FOCUS", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2000 }),
makeTableCell("DETAILS", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4500 }),
makeTableCell("MCQ TARGET", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2200 }),
],
tableHeader: true,
});
const dataRows = rows.map((r, i) => new TableRow({
children: [
makeTableCell(r[0], { fill: COLOR_LIGHT_BLUE, bold: true, align: AlignmentType.CENTER, color: COLOR_DARK_BLUE }),
makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_BLUE : COLOR_WHITE }),
makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_BLUE : COLOR_WHITE }),
makeTableCell(r[3], { fill: COLOR_LIGHT_GREEN, bold: true, align: AlignmentType.CENTER, color: COLOR_GREEN }),
],
}));
return new Table({
rows: [header, ...dataRows],
width: { size: 100, type: WidthType.PERCENTAGE },
borders: {
top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
left: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
right: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
insideH:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
insideV:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
},
});
}
// ─── BUILD DOCUMENT ───────────────────────────────────────────────────────────
const doc = new Document({
styles: {
default: {
document: {
run: { font: "Calibri", size: 20 },
},
},
},
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 900, right: 900 },
},
},
headers: {
default: new Header({
children: [new Paragraph({
children: [new TextRun({ text: "FMGE PREPARATION SCHEDULE | August – September 2026 | Cerebellum App", size: 16, color: COLOR_GRAY, font: "Calibri" })],
alignment: AlignmentType.CENTER,
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE } },
})],
}),
},
footers: {
default: new Footer({
children: [new Paragraph({
children: [new TextRun({ text: "FMGE Jan 2027 | Target: 150+/300 | Keep going, you've got this!", size: 16, color: COLOR_GRAY, font: "Calibri" })],
alignment: AlignmentType.CENTER,
border: { top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE } },
})],
}),
},
children: [
// ── TITLE ──
new Paragraph({
children: [new TextRun({ text: "FMGE PREPARATION SCHEDULE", bold: true, size: 44, color: COLOR_WHITE, font: "Calibri" })],
alignment: AlignmentType.CENTER,
shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
spacing: { before: 0, after: 0 },
}),
new Paragraph({
children: [new TextRun({ text: "August – September 2026 | Cerebellum App | FMGE Jan 7, 2027", bold: true, size: 24, color: COLOR_LIGHT_BLUE, font: "Calibri" })],
alignment: AlignmentType.CENTER,
shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
spacing: { before: 0, after: 300 },
}),
// ── OVERVIEW BOX ──
new Paragraph({
children: [new TextRun({ text: "📌 PHASE 1 OVERVIEW: PRECLINICAL FOUNDATION", bold: true, size: 24, color: COLOR_DARK_BLUE, font: "Calibri" })],
shading: { type: ShadingType.SOLID, fill: COLOR_LIGHT_YELLOW },
spacing: { before: 200, after: 80 },
indent: { left: 200 },
}),
bodyPara("Subjects covered: Anatomy • Physiology • Biochemistry • Pharmacology • Microbiology", true),
bodyPara("Daily study hours: 8–9 hours | MCQ target: 80–100 per day | Total MCQs in 2 months: ~5,000+"),
bodyPara("Tool: Cerebellum App (topic-wise MCQs + PYQs + spaced repetition + incorrect Qs filter)"),
spacer(),
// ── SECTION 1: DAILY SCHEDULE (WEEKDAY) ──
heading2("📅 DAILY STUDY SCHEDULE (Monday to Saturday)"),
spacer(),
scheduleTable(dailyRows),
spacer(),
new Paragraph({
children: [new TextRun({ text: "Total Active Study: ~8.5 hours/day | MCQs: 110–140 per day", bold: true, size: 20, color: COLOR_GREEN, font: "Calibri" })],
shading: { type: ShadingType.SOLID, fill: COLOR_LIGHT_GREEN },
alignment: AlignmentType.CENTER,
spacing: { before: 100, after: 200 },
}),
// ── SECTION 2: SUNDAY SCHEDULE ──
heading2("☀️ SUNDAY SCHEDULE (Weekly Review Day)", COLOR_ORANGE),
spacer(),
scheduleTable(sundayRows),
spacer(),
// ── PAGE BREAK ──
new Paragraph({ children: [new PageBreak()] }),
// ── SECTION 3: AUGUST WEEK PLAN ──
heading2("📘 AUGUST WEEK-BY-WEEK PLAN (Anatomy → Physiology → Biochemistry start)"),
spacer(),
weekTable(augustWeeks),
spacer(),
// ── SECTION 4: SEPTEMBER WEEK PLAN ──
heading2("📗 SEPTEMBER WEEK-BY-WEEK PLAN (Biochemistry → Pharmacology → Microbiology)", COLOR_GREEN),
spacer(),
weekTable(septemberWeeks),
spacer(),
// ── SECTION 5: WEEKLY + MONTHLY TARGETS ──
heading2("🎯 WEEKLY & MONTHLY MCQ TARGETS", COLOR_MED_BLUE),
spacer(),
weeklyTargetsTable(weeklyTargets),
spacer(),
// ── PAGE BREAK ──
new Paragraph({ children: [new PageBreak()] }),
// ── SECTION 6: HIGH YIELD AREAS ──
heading2("⭐ HIGH-YIELD AREAS PER SUBJECT (FMGE Focus)", COLOR_PURPLE),
spacer(),
highYieldTable(highYield),
spacer(),
// ── SECTION 7: CEREBELLUM TIPS ──
heading2("📱 TIPS FOR USING CEREBELLUM APP EFFECTIVELY", COLOR_GREEN),
spacer(),
tipsTable(cerebellumTips),
spacer(),
// ── SECTION 8: MONTHLY MILESTONES ──
heading2("🏁 END-OF-MONTH MILESTONES TO CHECK", COLOR_ORANGE),
spacer(),
subheading("August 31 – Targets"),
bullet("Anatomy: All major sections complete, Cerebellum accuracy > 60%"),
bullet("Physiology: CVS, Respiratory, Renal, Neuro complete, accuracy > 60%"),
bullet("Biochemistry: First 2 weeks started (enzymes + carbs)"),
bullet("Total MCQs solved: 2,500 – 3,000"),
bullet("PYQs done: Anatomy + Physiology PYQ sets"),
bullet("Sunday mocks: 4 mocks completed, score improving week by week"),
spacer(),
subheading("September 30 – Targets"),
bullet("Biochemistry: Fully complete, accuracy > 60%"),
bullet("Pharmacology: All major drug classes done, accuracy > 60%"),
bullet("Microbiology: Bacteriology + Virology + Parasitology complete"),
bullet("Total MCQs solved (cumulative 2 months): 5,000 – 6,000"),
bullet("PYQs done: All 5 subjects' PYQ sets"),
bullet("Sunday mocks: 8 mocks completed, score trending above 120/300"),
spacer(),
// ── CLOSING MOTIVATION ──
new Paragraph({
children: [new TextRun({ text: "\"Discipline over motivation. Show up every single day. FMGE Jan 7, 2027 – you've got this!\"", bold: true, size: 22, color: COLOR_WHITE, font: "Calibri", italics: true })],
alignment: AlignmentType.CENTER,
shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
spacing: { before: 200, after: 200 },
}),
],
}],
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx", buffer);
console.log("SUCCESS: File written.");
}).catch(err => {
console.error("ERROR:", err);
process.exit(1);
});
cd /home/daytona/workspace/fmge-schedule && node create_schedule.js 2>&1
python3 /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx 2>&1
ls -lh /home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx && python3 -c "import zipfile; z=zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx'); print('Valid ZIP, files:', z.namelist()[:6])"
FMGE Study Schedule Aug Sep
Word Document · DOCX
| Section | Content |
|---|---|
| Daily Schedule (Mon-Sat) | Hour-by-hour timetable from 5 AM to 10:30 PM with 8.5 hrs active study |
| Sunday Schedule | Weekly mock test + revision + PYQ day |
| August Week-by-Week Plan | Anatomy (Wk 1-2) → Physiology (Wk 3-4) → Biochemistry start (Wk 5) |
| September Week-by-Week Plan | Biochemistry complete → Pharmacology → Microbiology |
| MCQ Targets | Daily, weekly, and monthly targets (2,500+ Aug / 5,000+ cumulative) |
| High-Yield Areas | Per-subject FMGE focus topics |
| Cerebellum App Tips | 8 specific tips to maximize the app |
| End-of-Month Milestones | Checkpoints for Aug 31 and Sep 30 |
Create a daily schedule template for October-November (clinical subjects)
the downloaded document is showing error
cd /home/daytona/workspace/fmge-schedule && python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('FMGE_Study_Schedule_Aug_Sep.docx') xml = z.read('word/document.xml') try: ET.fromstring(xml) print('XML is valid') except ET.ParseError as e: print('XML ERROR:', e) "
cd /home/daytona/workspace/fmge-schedule && python3 -c " import zipfile z = zipfile.ZipFile('FMGE_Study_Schedule_Aug_Sep.docx') print('Files in docx:', z.namelist()) # Check relationships rels = z.read('word/_rels/document.xml.rels').decode() print('RELS:', rels[:500]) "
python3 -c "import docx; print('python-docx OK', docx.__version__)"
pip install --user python-docx -q && python3 -c "import docx; print('OK', docx.__version__)"
~/fmge-schedule/build_schedule.py
from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
doc = Document()
# ── Page margins ──────────────────────────────────────────────────────────────
for section in doc.sections:
section.top_margin = Cm(1.5)
section.bottom_margin = Cm(1.5)
section.left_margin = Cm(1.8)
section.right_margin = Cm(1.8)
# ── Helpers ───────────────────────────────────────────────────────────────────
def hex_to_rgb(h):
h = h.lstrip('#')
return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
def set_cell_bg(cell, hex_color):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), hex_color.lstrip('#'))
tcPr.append(shd)
def set_cell_borders(cell, color="AACCE0"):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
tcBorders = OxmlElement('w:tcBorders')
for side in ['top', 'left', 'bottom', 'right']:
border = OxmlElement(f'w:{side}')
border.set(qn('w:val'), 'single')
border.set(qn('w:sz'), '4')
border.set(qn('w:space'), '0')
border.set(qn('w:color'), color.lstrip('#'))
tcBorders.append(border)
tcPr.append(tcBorders)
def cell_text(cell, text, bold=False, font_size=9, color="000000", align=WD_ALIGN_PARAGRAPH.LEFT):
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
p = cell.paragraphs[0]
p.alignment = align
run = p.add_run(text)
run.bold = bold
run.font.size = Pt(font_size)
r, g, b = hex_to_rgb(color)
run.font.color.rgb = RGBColor(r, g, b)
# cell padding
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
mar = OxmlElement('w:tcMar')
for side in ['top', 'bottom', 'left', 'right']:
m = OxmlElement(f'w:{side}')
m.set(qn('w:w'), '80')
m.set(qn('w:type'), 'dxa')
mar.append(m)
tcPr.append(mar)
def add_title_para(doc, text, sub=""):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), '1A3A5C')
pPr.append(shd)
spacing = OxmlElement('w:spacing')
spacing.set(qn('w:before'), '120')
spacing.set(qn('w:after'), '120')
pPr.append(spacing)
run = p.add_run(text)
run.bold = True
run.font.size = Pt(20)
run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
if sub:
p2 = doc.add_paragraph()
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr2 = p2._p.get_or_add_pPr()
shd2 = OxmlElement('w:shd')
shd2.set(qn('w:val'), 'clear')
shd2.set(qn('w:color'), 'auto')
shd2.set(qn('w:fill'), '1A3A5C')
pPr2.append(shd2)
r2 = p2.add_run(sub)
r2.font.size = Pt(11)
r2.font.color.rgb = RGBColor(0xD6, 0xE8, 0xF7)
def add_section_heading(doc, text, fill="2E6DA4", text_color="FFFFFF"):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.LEFT
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), fill.lstrip('#'))
pPr.append(shd)
sp = OxmlElement('w:spacing')
sp.set(qn('w:before'), '160')
sp.set(qn('w:after'), '80')
pPr.append(sp)
run = p.add_run(f" {text}")
run.bold = True
run.font.size = Pt(12)
r, g, b = hex_to_rgb(text_color)
run.font.color.rgb = RGBColor(r, g, b)
def add_body(doc, text, bold=False, indent=True):
p = doc.add_paragraph()
if indent:
pf = p.paragraph_format
pf.left_indent = Inches(0.25)
run = p.add_run(text)
run.bold = bold
run.font.size = Pt(9.5)
sp = OxmlElement('w:spacing')
sp.set(qn('w:before'), '40')
sp.set(qn('w:after'), '40')
p._p.get_or_add_pPr().append(sp)
def add_bullet(doc, text):
p = doc.add_paragraph(style='List Bullet')
run = p.add_run(text)
run.font.size = Pt(9.5)
def add_spacer(doc):
p = doc.add_paragraph()
sp = OxmlElement('w:spacing')
sp.set(qn('w:before'), '40')
sp.set(qn('w:after'), '40')
p._p.get_or_add_pPr().append(sp)
def add_colored_para(doc, text, fill="D6E8F7", text_color="1A3A5C", bold=True, size=9.5):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), fill.lstrip('#'))
pPr.append(shd)
run = p.add_run(text)
run.bold = bold
run.font.size = Pt(size)
r, g, b = hex_to_rgb(text_color)
run.font.color.rgb = RGBColor(r, g, b)
# ── Schedule table builder ─────────────────────────────────────────────────────
def add_schedule_table(doc, rows):
"""rows: [time, activity, details, duration, row_color]"""
headers = ["TIME", "ACTIVITY", "DETAILS / CEREBELLUM TASK", "DURATION"]
widths = [Inches(1.2), Inches(2.0), Inches(3.5), Inches(0.9)]
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
hdr = tbl.rows[0]
for i, (h, w) in enumerate(zip(headers, widths)):
cell = hdr.cells[i]
cell.width = w
set_cell_bg(cell, '1A3A5C')
set_cell_borders(cell, '2E6DA4')
cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for row in rows:
tr = tbl.add_row()
bg = row[4] if len(row) > 4 else 'FFFFFF'
data = [row[0], row[1], row[2], row[3]]
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT,
WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [False, True if '🧠' in row[1] or '📝' in row[1] else False, False, False]
for i, (d, a, b) in enumerate(zip(data, aligns, bolds)):
cell = tr.cells[i]
set_cell_bg(cell, bg)
set_cell_borders(cell, 'AACCE0')
cell_text(cell, d, bold=b, font_size=8.5, color='111111', align=a)
# ── Week plan table builder ────────────────────────────────────────────────────
def add_week_table(doc, rows, accent='E07B39'):
"""rows: [week, subject, topics, mcq_target]"""
headers = ["WEEK", "SUBJECT", "KEY TOPICS TO COVER", "CEREBELLUM MCQs"]
widths = [Inches(1.0), Inches(1.4), Inches(4.2), Inches(1.0)]
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
hdr = tbl.rows[0]
for i, (h, w) in enumerate(zip(headers, widths)):
cell = hdr.cells[i]
cell.width = w
set_cell_bg(cell, accent)
set_cell_borders(cell, accent)
cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'FEF9E7' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt)
set_cell_borders(cell, 'F5CBA7')
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT,
WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [True, True, False, True]
colors = ['C0392B', '1A3A5C', '111111', '27AE60']
cell_text(cell, d, bold=bolds[i], font_size=8.5,
color=colors[i], align=aligns[i])
# ── Tips table ─────────────────────────────────────────────────────────────────
def add_tips_table(doc, tips, accent='27AE60'):
tbl = doc.add_table(rows=0, cols=2)
tbl.style = 'Table Grid'
for idx, tip in enumerate(tips):
tr = tbl.add_row()
alt = 'D5F5E3' if idx % 2 == 0 else 'FFFFFF'
# number cell
c0 = tr.cells[0]
c0.width = Inches(0.4)
set_cell_bg(c0, accent)
set_cell_borders(c0, accent)
cell_text(c0, str(idx + 1), bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
# tip cell
c1 = tr.cells[1]
set_cell_bg(c1, alt)
set_cell_borders(c1, 'A9DFBF')
cell_text(c1, tip, font_size=8.5, color='111111')
# ── High yield table ────────────────────────────────────────────────────────────
def add_hy_table(doc, rows, accent='7D3C98'):
headers = ["SUBJECT", "MUST-KNOW HIGH-YIELD AREAS"]
widths = [Inches(1.4), Inches(6.2)]
tbl = doc.add_table(rows=1, cols=2)
tbl.style = 'Table Grid'
hdr = tbl.rows[0]
for i, (h, w) in enumerate(zip(headers, widths)):
cell = hdr.cells[i]
cell.width = w
set_cell_bg(cell, accent)
set_cell_borders(cell, accent)
cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'E8DAEF' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt)
set_cell_borders(cell, 'D2B4DE')
bolds = [True, False]
colors = ['7D3C98', '111111']
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT]
cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])
# ── Milestone table ─────────────────────────────────────────────────────────────
def add_milestone_table(doc, rows, accent='2E6DA4'):
tbl = doc.add_table(rows=0, cols=3)
tbl.style = 'Table Grid'
# header
hr = tbl.add_row()
for i, h in enumerate(["CHECKPOINT", "TARGET", "STATUS"]):
c = hr.cells[i]
set_cell_bg(c, accent)
set_cell_borders(c, accent)
cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'EAF0F6' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt)
set_cell_borders(cell, 'AACCE0')
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [True, False, False]
cell_text(cell, d, bold=bolds[i], font_size=8.5, color='111111', align=aligns[i])
# ══════════════════════════════════════════════════════════════════════════════
# CONTENT
# ══════════════════════════════════════════════════════════════════════════════
# ── TITLE ──────────────────────────────────────────────────────────────────────
add_title_para(doc,
"FMGE PREPARATION SCHEDULE | AUGUST – SEPTEMBER 2026",
"Cerebellum App • Phase 1: Preclinical Foundation • FMGE Jan 7, 2027")
add_spacer(doc)
# ── OVERVIEW ───────────────────────────────────────────────────────────────────
add_colored_para(doc,
"PHASE 1 OVERVIEW: Preclinical Foundation (Aug–Sep)",
fill='FEF9E7', text_color='1A3A5C', bold=True, size=10.5)
add_body(doc, "Subjects: Anatomy | Physiology | Biochemistry | Pharmacology | Microbiology", bold=True)
add_body(doc, "Daily study hours: 8–9 hrs | MCQ target: 80–120/day | Total MCQs in 2 months: ~5,000+")
add_body(doc, "Tool: Cerebellum App — use topic-wise mode, PYQs, spaced repetition & incorrect Qs filter")
add_spacer(doc)
# ── DAILY SCHEDULE (MON–SAT) ───────────────────────────────────────────────────
add_section_heading(doc, "DAILY STUDY SCHEDULE — Monday to Saturday", fill='2E6DA4')
add_spacer(doc)
daily_rows = [
# time activity details dur color
["5:00 – 5:30 AM", "Wake Up & Morning Routine", "Freshen up, light stretch or walk, hydrate well", "30 min", "FEF9E7"],
["5:30 – 6:00 AM", "Flashcard Revision", "Review Cerebellum incorrect Qs from yesterday", "30 min", "FEF9E7"],
["6:00 – 8:30 AM", "🧠 STUDY SESSION 1", "New topic theory — video lecture or standard textbook notes", "2.5 hrs", "D6E8F7"],
["8:30 – 9:00 AM", "Breakfast + Break", "Eat well, rest eyes, step outside briefly", "30 min", "FEF9E7"],
["9:00 – 11:30 AM", "🧠 STUDY SESSION 2", "Continue topic OR move to next sub-topic, make brief notes", "2.5 hrs", "D6E8F7"],
["11:30AM–12:30PM", "📝 MCQ Block 1 (Cerebellum)", "Topic-wise Qs, timed mode, target 60–80 Qs", "1 hr", "E8DAEF"],
["12:30 – 1:30 PM", "Lunch + Rest", "Full break — short 20 min nap if needed, no study", "1 hr", "FEF9E7"],
["1:30 – 4:00 PM", "🧠 STUDY SESSION 3", "New topic or notes revision from morning session", "2.5 hrs", "D6E8F7"],
["4:00 – 4:30 PM", "Tea Break", "Walk, light snack, avoid screens for 30 min", "30 min", "FEF9E7"],
["4:30 – 6:30 PM", "📝 MCQ Block 2 (Cerebellum)", "Subject-wise random Qs — 50–60 Qs, read ALL explanations", "2 hrs", "E8DAEF"],
["6:30 – 7:00 PM", "Mistake Analysis", "Review wrong answers, note key facts in personal notes", "30 min", "FADBD8"],
["7:00 – 8:00 PM", "Dinner + Free Time", "Completely relax — no study during dinner", "1 hr", "FEF9E7"],
["8:00 – 9:30 PM", "🧠 STUDY SESSION 4 (Revision)","Revise TODAY's topic — use your notes, do rapid recall", "1.5 hrs", "D5F5E3"],
["9:30 – 10:00 PM", "Daily Summary + Planning", "Write 5 key points learned today, plan tomorrow's topics", "30 min", "FEF9E7"],
["10:00 – 10:30 PM","Light Reading (Optional)", "High-yield tables or mnemonics only — no new topics", "30 min", "EAF0F6"],
["10:30 PM", "SLEEP", "7 hours minimum — memory consolidation happens during sleep", "—", "FEF9E7"],
]
add_schedule_table(doc, daily_rows)
add_spacer(doc)
add_colored_para(doc,
"Total Active Study: ~8.5 hours/day | Daily MCQ Target: 110–140 Qs",
fill='D5F5E3', text_color='1E8449', bold=True, size=9.5)
add_spacer(doc)
# ── SUNDAY SCHEDULE ─────────────────────────────────────────────────────────────
add_section_heading(doc, "SUNDAY SCHEDULE — Weekly Review Day", fill='E07B39')
add_spacer(doc)
sunday_rows = [
["7:00 – 8:00 AM", "Wake Up + Light Morning", "Relax start, light breakfast, review weekly study targets", "1 hr", "FEF9E7"],
["8:00 – 10:00 AM", "📝 Weekly Mock Test", "150-Q timed test on Cerebellum — current week's subjects", "2 hrs", "E8DAEF"],
["10:00 – 11:00 AM","Mock Analysis", "Go through every wrong answer, identify weak patterns", "1 hr", "FADBD8"],
["11:00AM – 1:00PM","Weak Topic Revision", "Pick 2 lowest-scoring topics from mock, revise thoroughly", "2 hrs", "D6E8F7"],
["1:00 – 3:00 PM", "Lunch + Afternoon Rest", "Full break — rest and recharge for the coming week", "2 hrs", "FEF9E7"],
["3:00 – 5:00 PM", "Previous Year Questions", "Solve PYQs from this week's subject on Cerebellum", "2 hrs", "D5F5E3"],
["5:00 – 6:00 PM", "Notes Consolidation", "Update short notes with new points discovered this week", "1 hr", "EAF0F6"],
["6:00 PM onwards", "Family / Personal Time", "Fully switch off — rest is essential for long-term retention", "—", "FEF9E7"],
]
add_schedule_table(doc, sunday_rows)
add_spacer(doc)
# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()
# ── AUGUST WEEK PLAN ───────────────────────────────────────────────────────────
add_section_heading(doc, "AUGUST WEEK-BY-WEEK PLAN — Anatomy → Physiology → Biochemistry Start", fill='2E6DA4')
add_spacer(doc)
aug_weeks = [
["Week 1\nAug 1–7", "Anatomy", "Upper Limb (bones, muscles, nerves, vessels, spaces), Lower Limb (hip, knee, arches), Surface Anatomy", "80–100 Qs"],
["Week 2\nAug 8–14", "Anatomy", "Head & Neck (cranial nerves, triangles, spaces), Neuroanatomy (tracts, basal ganglia), Embryology (heart, gut, NTD)", "80–100 Qs"],
["Week 3\nAug 15–21", "Physiology", "CVS (cardiac cycle, Frank-Starling, ECG, BP regulation), Respiratory (volumes, compliance, control of breathing)", "80–100 Qs"],
["Week 4\nAug 22–28", "Physiology", "Renal (GFR, tubular functions, acid-base, JGA), Neurophysiology (synaptic transmission, reflexes, special senses)", "80–100 Qs"],
["Week 5\nAug 29–31", "Biochemistry", "Enzymes (kinetics, inhibition), Carbohydrate metabolism (glycolysis, gluconeogenesis, TCA cycle, glycogen)", "50–60 Qs"],
]
add_week_table(doc, aug_weeks, accent='2E6DA4')
add_spacer(doc)
# ── SEPTEMBER WEEK PLAN ────────────────────────────────────────────────────────
add_section_heading(doc, "SEPTEMBER WEEK-BY-WEEK PLAN — Biochemistry → Pharmacology → Microbiology", fill='27AE60')
add_spacer(doc)
sep_weeks = [
["Week 1\nSep 1–7", "Biochemistry", "Lipid metabolism (fatty acids, ketone bodies, lipoproteins), Protein metabolism (urea cycle, transamination), Vitamins (fat & water soluble), Minerals", "80–100 Qs"],
["Week 2\nSep 8–14", "Pharmacology", "General pharmacology (pharmacokinetics, pharmacodynamics), ANS drugs, CVS drugs (anti-hypertensives, anti-anginals, anti-arrhythmics, heart failure)", "80–100 Qs"],
["Week 3\nSep 15–21", "Pharmacology", "CNS drugs (sedatives, antidepressants, antiepileptics, antipsychotics), Antimicrobials (penicillins, cephalosporins, aminoglycosides, fluoroquinolones)", "80–100 Qs"],
["Week 4\nSep 22–28", "Microbiology", "General bacteriology (Gram stain, culture media), Gram +ve/-ve cocci & bacilli (Staph, Strep, E.coli, Salmonella, Mycobacterium, Clostridia)", "80–100 Qs"],
["Week 5\nSep 29–30", "Microbiology", "Virology (HIV, Herpes, Hepatitis B & C, Influenza, Dengue), Parasitology (Plasmodium, Entamoeba, Wuchereria, Leishmania)", "50–60 Qs"],
]
add_week_table(doc, sep_weeks, accent='27AE60')
add_spacer(doc)
# ── WEEKLY / MONTHLY TARGETS ────────────────────────────────────────────────────
add_section_heading(doc, "WEEKLY & MONTHLY MCQ TARGETS", fill='2E6DA4')
add_spacer(doc)
target_rows = [
["Mon – Sat", "Theory + MCQs", "1 topic/day, 80–120 Qs/day on Cerebellum", "480–720 Qs/week"],
["Sunday", "Revision + Mock", "Full week revision + 150 Q mock test + PYQs", "150–200 Qs"],
["August", "Monthly Total", "Anatomy + Physiology complete + Biochem started", "~2,500–3,000 Qs"],
["September", "Monthly Total", "Biochem complete + Pharmacology + Microbiology complete", "~2,500–3,000 Qs"],
["Cumulative", "Aug + Sep Total", "All 5 preclinical subjects covered", "~5,000–6,000 Qs"],
]
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
for i, h in enumerate(["PERIOD", "FOCUS", "DETAILS", "MCQ TARGET"]):
c = tbl.rows[0].cells[i]
set_cell_bg(c, '2E6DA4')
set_cell_borders(c, '2E6DA4')
cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(target_rows):
tr = tbl.add_row()
alt = 'EAF0F6' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
bolds = [True, False, False, True]
colors = ['1A3A5C', '111111', '111111', '27AE60']
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bg = 'D5F5E3' if i == 3 else alt
set_cell_bg(cell, bg)
set_cell_borders(cell, 'AACCE0')
cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])
add_spacer(doc)
# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()
# ── HIGH YIELD AREAS ───────────────────────────────────────────────────────────
add_section_heading(doc, "HIGH-YIELD AREAS PER SUBJECT (FMGE Focus)", fill='7D3C98')
add_spacer(doc)
hy_rows = [
["Anatomy\n(17 Qs)", "Brachial plexus roots & injuries, carpal tunnel structures, cranial nerve nuclei & lesions, embryological derivatives (pharyngeal arches, heart, gut rotation), thoracic outlet, femoral triangle"],
["Physiology\n(17 Qs)", "Frank-Starling law, JVP waveforms, Henderson-Hasselbalch equation, lung volumes & capacities (values), O2 dissociation curve shifts, GFR formula, tubular max, JGA function"],
["Biochemistry\n(17 Qs)", "Enzyme deficiency diseases (PKU, galactosemia, Gaucher, MCAD), vitamin deficiency symptoms & sources, metabolic pathway regulation, Km & Vmax concepts, lipoprotein types & clinical correlations"],
["Pharmacology\n(13 Qs)", "Drug of choice lists, receptor types per drug class, side effect profiles (e.g., ototoxicity, nephrotoxicity), contraindications, first-pass effect drugs, zero-order kinetics drugs"],
["Microbiology\n(13 Qs)", "Gram stain results & special stains (ZN, India ink, Giemsa), special culture media, virulence factors, serological tests (Widal, VDRL, Paul-Bunnell), anti-microbial resistance mechanisms"],
]
add_hy_table(doc, hy_rows)
add_spacer(doc)
# ── CEREBELLUM APP TIPS ──────────────────────────────────────────────────────
add_section_heading(doc, "TIPS FOR USING CEREBELLUM APP EFFECTIVELY", fill='27AE60')
add_spacer(doc)
tips = [
"Use TOPIC-WISE mode first when learning a new subject — don't switch to random mode until you've covered 70% of the subject.",
"After solving any MCQ, read the FULL explanation even if you got it right — nuances in wrong options are commonly re-tested.",
"Use the INCORRECT QUESTIONS filter every Sunday — this is your personal weak-topic detector. Re-solve them until accuracy > 70%.",
"Enable SPACED REPETITION reminders — the algorithm shows cards just before you forget them. Never skip these notifications.",
"Solve PYQ mode at least once per subject before moving on — FMGE frequently repeats questions across years.",
"Track your subject-wise ACCURACY % — anything below 60% needs an immediate extra revision session the same day.",
"Use TIMED MODE at least 3x per week — FMGE allows 1 min/question (300 Qs in 300 min). Speed is a real factor.",
"After every 10 Qs, pause and recall: what concept was just tested? Passive clicking without reflection wastes your time.",
]
add_tips_table(doc, tips)
add_spacer(doc)
# ── MILESTONES ─────────────────────────────────────────────────────────────────
add_section_heading(doc, "END-OF-MONTH MILESTONES — Check These on Aug 31 & Sep 30", fill='E07B39')
add_spacer(doc)
add_colored_para(doc, "August 31 Targets", fill='FDEBD0', text_color='C0392B', bold=True, size=10)
milestone_aug = [
["Anatomy", "All major sections done, Cerebellum accuracy > 60%", "[ ]"],
["Physiology", "CVS, Respiratory, Renal, Neuro complete, accuracy > 60%", "[ ]"],
["Biochemistry", "Enzymes + Carbohydrate metabolism started", "[ ]"],
["MCQs", "Total 2,500–3,000 MCQs solved across subjects", "[ ]"],
["PYQs", "Anatomy + Physiology PYQ sets completed", "[ ]"],
["Mock Tests", "4 Sunday mocks done, scores improving each week", "[ ]"],
]
add_milestone_table(doc, milestone_aug, accent='E07B39')
add_spacer(doc)
add_colored_para(doc, "September 30 Targets", fill='D5F5E3', text_color='1E8449', bold=True, size=10)
milestone_sep = [
["Biochemistry", "Fully complete, accuracy > 60%", "[ ]"],
["Pharmacology", "All major drug classes done, accuracy > 60%", "[ ]"],
["Microbiology", "Bacteriology + Virology + Parasitology complete", "[ ]"],
["MCQs", "Cumulative total (Aug+Sep): 5,000–6,000 MCQs solved", "[ ]"],
["PYQs", "All 5 subjects' PYQ sets completed", "[ ]"],
["Mock Tests", "8 Sunday mocks done, score trending above 120/300", "[ ]"],
]
add_milestone_table(doc, milestone_sep, accent='27AE60')
add_spacer(doc)
# ── CLOSING ─────────────────────────────────────────────────────────────────────
add_title_para(doc,
'"Discipline over motivation. Show up every single day."',
"FMGE Jan 7, 2027 — Target: 150+/300 — You've got this!")
# ── SAVE ───────────────────────────────────────────────────────────────────────
out = "/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx"
doc.save(out)
print(f"SUCCESS: {out}")
cd /home/daytona/workspace/fmge-schedule && python3 build_schedule.py 2>&1
# Test save to a simple path first python3 -c " from docx import Document doc = Document() doc.add_paragraph('Test') doc.save('/tmp/test.docx') import shutil; shutil.copy('/tmp/test.docx', '/home/daytona/workspace/fmge-schedule/test.docx') print('OK') " 2>&1
# Check permissions and try saving directly to workspace ls -la /home/daytona/workspace/fmge-schedule/ && echo "---" && python3 -c " from docx import Document doc = Document() doc.add_paragraph('Test') import io, os buf = io.BytesIO() doc.save(buf) buf.seek(0) with open('/home/daytona/workspace/fmge-schedule/test_out.docx', 'wb') as f: f.write(buf.read()) print('saved OK, size:', os.path.getsize('/home/daytona/workspace/fmge-schedule/test_out.docx')) " 2>&1
~/fmge-schedule/build_schedule.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/fmge-schedule/build_schedule.py'
cd /home/daytona/workspace/fmge-schedule && python3 build_schedule.py 2>&1
python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx') xml = z.read('word/document.xml') ET.fromstring(xml) print('XML valid. Files:', len(z.namelist())) "
~/fmge-schedule/build_oct_nov.py
from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import io, os
doc = Document()
for section in doc.sections:
section.top_margin = Cm(1.5)
section.bottom_margin = Cm(1.5)
section.left_margin = Cm(1.8)
section.right_margin = Cm(1.8)
def hex_to_rgb(h):
h = h.lstrip('#')
return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
def set_cell_bg(cell, hex_color):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), hex_color.lstrip('#'))
tcPr.append(shd)
def set_cell_borders(cell, color="AACCE0"):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
tcBorders = OxmlElement('w:tcBorders')
for side in ['top', 'left', 'bottom', 'right']:
border = OxmlElement(f'w:{side}')
border.set(qn('w:val'), 'single')
border.set(qn('w:sz'), '4')
border.set(qn('w:space'), '0')
border.set(qn('w:color'), color.lstrip('#'))
tcBorders.append(border)
tcPr.append(tcBorders)
def cell_text(cell, text, bold=False, font_size=9, color="000000", align=WD_ALIGN_PARAGRAPH.LEFT):
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
p = cell.paragraphs[0]
p.alignment = align
run = p.add_run(text)
run.bold = bold
run.font.size = Pt(font_size)
r, g, b = hex_to_rgb(color)
run.font.color.rgb = RGBColor(r, g, b)
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
mar = OxmlElement('w:tcMar')
for side in ['top', 'bottom', 'left', 'right']:
m = OxmlElement(f'w:{side}')
m.set(qn('w:w'), '80')
m.set(qn('w:type'), 'dxa')
mar.append(m)
tcPr.append(mar)
def add_title_para(doc, text, sub=""):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), '1A3A5C')
pPr.append(shd)
sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '120'); sp.set(qn('w:after'), '120')
pPr.append(sp)
run = p.add_run(text)
run.bold = True; run.font.size = Pt(20); run.font.color.rgb = RGBColor(0xFF,0xFF,0xFF)
if sub:
p2 = doc.add_paragraph()
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr2 = p2._p.get_or_add_pPr()
shd2 = OxmlElement('w:shd')
shd2.set(qn('w:val'), 'clear'); shd2.set(qn('w:color'), 'auto'); shd2.set(qn('w:fill'), '1A3A5C')
pPr2.append(shd2)
r2 = p2.add_run(sub)
r2.font.size = Pt(11); r2.font.color.rgb = RGBColor(0xD6,0xE8,0xF7)
def add_section_heading(doc, text, fill="2E6DA4", text_color="FFFFFF"):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.LEFT
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), fill.lstrip('#'))
pPr.append(shd)
sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '160'); sp.set(qn('w:after'), '80')
pPr.append(sp)
run = p.add_run(f" {text}")
run.bold = True; run.font.size = Pt(12)
r, g, b = hex_to_rgb(text_color)
run.font.color.rgb = RGBColor(r, g, b)
def add_body(doc, text, bold=False, indent=True):
p = doc.add_paragraph()
if indent: p.paragraph_format.left_indent = Inches(0.25)
run = p.add_run(text)
run.bold = bold; run.font.size = Pt(9.5)
sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '40'); sp.set(qn('w:after'), '40')
p._p.get_or_add_pPr().append(sp)
def add_spacer(doc):
p = doc.add_paragraph()
sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '40'); sp.set(qn('w:after'), '40')
p._p.get_or_add_pPr().append(sp)
def add_colored_para(doc, text, fill="D6E8F7", text_color="1A3A5C", bold=True, size=9.5):
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), fill.lstrip('#'))
pPr.append(shd)
run = p.add_run(text)
run.bold = bold; run.font.size = Pt(size)
r, g, b = hex_to_rgb(text_color)
run.font.color.rgb = RGBColor(r, g, b)
def add_schedule_table(doc, rows):
headers = ["TIME", "ACTIVITY", "DETAILS / CEREBELLUM TASK", "DURATION"]
widths = [Inches(1.2), Inches(2.0), Inches(3.5), Inches(0.9)]
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
for i, (h, w) in enumerate(zip(headers, widths)):
cell = tbl.rows[0].cells[i]
cell.width = w
set_cell_bg(cell, '1A3A5C'); set_cell_borders(cell, '2E6DA4')
cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for row in rows:
tr = tbl.add_row()
bg = row[4] if len(row) > 4 else 'FFFFFF'
data = [row[0], row[1], row[2], row[3]]
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [False, True if any(e in row[1] for e in ['🧠','📝','🔴','📋']) else False, False, False]
for i, (d, a, b) in enumerate(zip(data, aligns, bolds)):
cell = tr.cells[i]
set_cell_bg(cell, bg); set_cell_borders(cell, 'AACCE0')
cell_text(cell, d, bold=b, font_size=8.5, color='111111', align=a)
def add_week_table(doc, rows, accent='C0392B'):
headers = ["WEEK", "SUBJECT\n(FMGE Qs)", "KEY TOPICS TO COVER", "CEREBELLUM\nMCQs/Day"]
widths = [Inches(0.9), Inches(1.3), Inches(4.4), Inches(1.0)]
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
for i, (h, w) in enumerate(zip(headers, widths)):
cell = tbl.rows[0].cells[i]
cell.width = w
set_cell_bg(cell, accent); set_cell_borders(cell, accent)
cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'FADBD8' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt); set_cell_borders(cell, 'F5B7B1')
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [True, True, False, True]
colors = ['C0392B', '1A3A5C', '111111', '27AE60']
cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])
def add_tips_table(doc, tips, accent='27AE60'):
tbl = doc.add_table(rows=0, cols=2)
tbl.style = 'Table Grid'
for idx, tip in enumerate(tips):
tr = tbl.add_row()
alt = 'D5F5E3' if idx % 2 == 0 else 'FFFFFF'
c0 = tr.cells[0]; c0.width = Inches(0.4)
set_cell_bg(c0, accent); set_cell_borders(c0, accent)
cell_text(c0, str(idx + 1), bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
c1 = tr.cells[1]
set_cell_bg(c1, alt); set_cell_borders(c1, 'A9DFBF')
cell_text(c1, tip, font_size=8.5, color='111111')
def add_milestone_table(doc, rows, accent='C0392B'):
tbl = doc.add_table(rows=1, cols=3)
tbl.style = 'Table Grid'
for i, h in enumerate(["CHECKPOINT", "TARGET", "DONE?"]):
c = tbl.rows[0].cells[i]
set_cell_bg(c, accent); set_cell_borders(c, accent)
cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'FADBD8' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt); set_cell_borders(cell, 'F5B7B1')
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
bolds = [True, False, False]
cell_text(cell, d, bold=bolds[i], font_size=8.5, color='111111', align=aligns[i])
def add_hy_table(doc, rows, accent='7D3C98'):
tbl = doc.add_table(rows=1, cols=2)
tbl.style = 'Table Grid'
for i, h in enumerate(["SUBJECT", "MUST-KNOW HIGH-YIELD AREAS FOR FMGE"]):
c = tbl.rows[0].cells[i]
set_cell_bg(c, accent); set_cell_borders(c, accent)
cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(rows):
tr = tbl.add_row()
alt = 'E8DAEF' if idx % 2 == 0 else 'FFFFFF'
for i, d in enumerate(row):
cell = tr.cells[i]
set_cell_bg(cell, alt); set_cell_borders(cell, 'D2B4DE')
bolds = [True, False]
colors = ['7D3C98', '111111']
aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT]
cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])
# ══════════════════════════════════════════════════════════════════════════════
# CONTENT
# ══════════════════════════════════════════════════════════════════════════════
add_title_para(doc,
"FMGE PREPARATION SCHEDULE | OCTOBER – NOVEMBER 2026",
"Cerebellum App • Phase 2: Clinical Subjects • FMGE Jan 7, 2027")
add_spacer(doc)
add_colored_para(doc,
"PHASE 2 OVERVIEW: The Big Clinical Subjects — This Phase Decides Your Result",
fill='FADBD8', text_color='C0392B', bold=True, size=10.5)
add_body(doc, "Subjects: Medicine (33 Qs) | Surgery (32 Qs) | OBG (30 Qs) | PSM (30 Qs) | Pediatrics (15 Qs) | ENT (15 Qs) | Ophthalmology (15 Qs)", bold=True)
add_body(doc, "Combined = 170 questions = 57% of the entire FMGE paper. Mastering these = guaranteed pass.")
add_body(doc, "Daily study hours: 8–9 hrs | MCQ target: 120–150/day | Total MCQs in 2 months: ~7,000+")
add_body(doc, "Strategy shift: Clinical subjects need CASE-BASED thinking, not just memorization. Understand the LOGIC.")
add_spacer(doc)
# ── DAILY SCHEDULE MON-SAT ─────────────────────────────────────────────────────
add_section_heading(doc, "DAILY STUDY SCHEDULE — Monday to Saturday (Clinical Phase)", fill='C0392B')
add_spacer(doc)
daily_rows = [
["5:00 – 5:30 AM", "Wake Up & Morning Routine", "Freshen up, light stretch, hydrate — get mentally ready", "30 min", "FEF9E7"],
["5:30 – 6:00 AM", "Previous Day Rapid Recall", "Cover your short notes from yesterday — 10 min recall drill", "30 min", "FEF9E7"],
["6:00 – 8:00 AM", "🧠 STUDY SESSION 1 (Theory)", "New clinical topic — video lecture (Marrow/PrepLadder) + notes", "2 hrs", "D6E8F7"],
["8:00 – 8:30 AM", "Breakfast + Break", "Eat, rest eyes, short outdoor walk if possible", "30 min", "FEF9E7"],
["8:30 – 10:30 AM", "🧠 STUDY SESSION 2 (Theory)", "Continue topic — focus on clinical features + investigations", "2 hrs", "D6E8F7"],
["10:30–11:30 AM", "📝 MCQ Block 1 (Cerebellum)", "Topic-wise clinical Qs — 60–80 Qs, timed mode", "1 hr", "E8DAEF"],
["11:30AM–12:00PM", "Mistake Analysis (Block 1)", "Review every wrong answer immediately — write key fact down", "30 min", "FADBD8"],
["12:00 – 1:00 PM", "Lunch + Rest", "Full break — rest mind, 20 min nap if needed", "1 hr", "FEF9E7"],
["1:00 – 3:00 PM", "🧠 STUDY SESSION 3 (Theory)", "New sub-topic OR treatment/management section of current topic", "2 hrs", "D6E8F7"],
["3:00 – 3:30 PM", "Tea Break", "Walk, light snack — no screens", "30 min", "FEF9E7"],
["3:30 – 5:00 PM", "📝 MCQ Block 2 (Cerebellum)", "Subject-wise random + image-based Qs — 60–70 Qs", "1.5 hrs", "E8DAEF"],
["5:00 – 5:30 PM", "Mistake Analysis (Block 2)", "Review wrong Qs — update notes with missed points", "30 min", "FADBD8"],
["5:30 – 7:00 PM", "🔴 PYQ Practice (Cerebellum)", "Solve previous year Qs from today's topic/subject", "1.5 hrs", "FEF3CD"],
["7:00 – 8:00 PM", "Dinner + Free Time", "Completely relax — no study during dinner", "1 hr", "FEF9E7"],
["8:00 – 9:00 PM", "📋 REVISION SESSION", "Re-read today's short notes + key tables + drug of choice lists","1 hr", "D5F5E3"],
["9:00 – 9:30 PM", "Daily Summary + Planning", "Write 5 key clinical facts, plan tomorrow's topic", "30 min", "FEF9E7"],
["9:30 – 10:00 PM", "Light Revision (Optional)", "High-yield tables, mnemonics, recent guideline updates only", "30 min", "EAF0F6"],
["10:00 PM", "SLEEP", "7 hours minimum — non-negotiable for clinical retention", "—", "FEF9E7"],
]
add_schedule_table(doc, daily_rows)
add_spacer(doc)
add_colored_para(doc,
"Total Active Study: ~8.5 hours/day | Daily MCQ Target: 120–150 Qs | Daily PYQs: 30–40 Qs",
fill='D5F5E3', text_color='1E8449', bold=True, size=9.5)
add_spacer(doc)
# ── SUNDAY ─────────────────────────────────────────────────────────────────────
add_section_heading(doc, "SUNDAY SCHEDULE — Weekly Review + Full Mock Day", fill='E07B39')
add_spacer(doc)
sunday_rows = [
["7:00 – 8:00 AM", "Wake Up + Light Morning", "Review this week's short notes summary (15 min only)", "1 hr", "FEF9E7"],
["8:00 – 10:30 AM", "📝 Full Mock Test", "300-Q or 150-Q timed mock on Cerebellum — full exam simulation", "2.5 hrs", "E8DAEF"],
["10:30AM–12:00PM", "Mock Analysis + Weak Spotting", "Go through EVERY wrong answer — identify subject-wise weak areas","1.5 hrs", "FADBD8"],
["12:00 – 1:00 PM", "Lunch + Rest", "Full break", "1 hr", "FEF9E7"],
["1:00 – 3:00 PM", "Weak Topic Deep Dive", "Pick the 2 lowest-scoring subjects from mock — revise concepts", "2 hrs", "D6E8F7"],
["3:00 – 5:00 PM", "📝 PYQ Marathon", "Solve PYQs from any 2 subjects covered this week", "2 hrs", "D5F5E3"],
["5:00 – 6:00 PM", "Notes Update", "Add new points to short notes from mock and PYQ analysis", "1 hr", "EAF0F6"],
["6:00 PM onwards", "Family / Personal Time", "Completely switch off — recovery is part of the strategy", "—", "FEF9E7"],
]
add_schedule_table(doc, sunday_rows)
add_spacer(doc)
# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()
# ── OCTOBER WEEK PLAN ──────────────────────────────────────────────────────────
add_section_heading(doc, "OCTOBER WEEK-BY-WEEK PLAN — Medicine → Surgery → OBG → PSM", fill='C0392B')
add_spacer(doc)
oct_weeks = [
["Week 1\nOct 1–7",
"Medicine\n(33 Qs)",
"CVS: IHD, heart failure, hypertension, valvular diseases, ECG interpretation, arrhythmias\nRespiratory: Pneumonia, TB, COPD, asthma, pleural effusion, lung cancer",
"100–120 Qs"],
["Week 2\nOct 8–14",
"Medicine\n(33 Qs)",
"Nephrology: AKI, CKD, nephrotic/nephritic syndromes, RTA\nNeurology: Stroke, meningitis, Parkinson's, epilepsy, dementia\nEndocrine: Diabetes, thyroid disorders, adrenal diseases, pituitary",
"100–120 Qs"],
["Week 3\nOct 15–21",
"Medicine\n(33 Qs)",
"GI: GERD, peptic ulcer, IBD, liver cirrhosis, hepatitis, pancreatitis\nRheumatology: RA, SLE, gout, ankylosing spondylitis\nHaematology: Anaemias, leukaemias, coagulation disorders",
"100–120 Qs"],
["Week 4\nOct 22–28",
"Surgery\n(32 Qs)",
"GI Surgery: Appendicitis, cholecystitis, intestinal obstruction, hernia, colorectal Ca\nThyroid & Breast: Goiter, thyroid Ca, breast Ca, mastitis, fibroadenoma\nVascular: DVT, varicose veins, peripheral arterial disease",
"100–120 Qs"],
["Week 5\nOct 29–31",
"Surgery\n(32 Qs)",
"Urology: BPH, renal calculi, bladder Ca, urethral stricture\nTrauma & Surgical Principles: ATLS, wound healing, burns, blood transfusion, sterilisation\nAnaesthesia basics: Pre-op assessment, local anaesthesia, complications",
"60–80 Qs"],
]
add_week_table(doc, oct_weeks, accent='C0392B')
add_spacer(doc)
# ── NOVEMBER WEEK PLAN ─────────────────────────────────────────────────────────
add_section_heading(doc, "NOVEMBER WEEK-BY-WEEK PLAN — OBG → PSM → Pediatrics → ENT → Ophthalmology", fill='7D3C98')
add_spacer(doc)
nov_weeks = [
["Week 1\nNov 1–7",
"OBG\n(30 Qs)",
"Normal Obstetrics: ANC, fetal development, normal labour (stages), puerperium\nAbnormal Obstetrics: PIH/pre-eclampsia, APH (placenta previa, abruption), PPH, preterm labour, PROM",
"100–120 Qs"],
["Week 2\nNov 8–14",
"OBG\n(30 Qs)",
"Gynecology: Menstrual disorders (PCOS, fibroids, endometriosis), cervical Ca, ovarian tumours\nContraception: OCP, IUDs, sterilisation, emergency contraception\nInfertility: Causes, investigations, treatment options",
"100–120 Qs"],
["Week 3\nNov 15–21",
"PSM\n(30 Qs)",
"Epidemiology: Study designs, measures of disease frequency (incidence, prevalence), bias, association vs causation\nBiostatistics: Mean/SD/SEM, sensitivity/specificity, p-value, confidence intervals, screening tests\nNational Health Programs: RCH, NVBDCP, NTEP, NPCDCS, immunisation schedule, NHM",
"100–120 Qs"],
["Week 4\nNov 22–28",
"PSM cont. +\nPediatrics (15 Qs)",
"PSM: Nutrition (PEM, vitamins, food fortification), environment health (water, air, waste), vital statistics\nPediatrics: Growth & development milestones, neonatology (birth asphyxia, jaundice, NEC), vaccine schedule\nPediatric diseases: Respiratory (pneumonia, asthma), GI (diarrhoea, intussusception), nephrotic syndrome",
"100–120 Qs"],
["Week 5\nNov 29–30",
"ENT (15 Qs) +\nOphthalmology (15 Qs)",
"ENT: CSOM (types, complications), otosclerosis, SNHL, sinusitis, laryngeal Ca, epistaxis management\nOphthalmology: Glaucoma (types, drugs), cataract, retinal detachment, uveitis, squint, corneal ulcer, trachoma",
"60–80 Qs"],
]
add_week_table(doc, nov_weeks, accent='7D3C98')
add_spacer(doc)
# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()
# ── HIGH YIELD AREAS ───────────────────────────────────────────────────────────
add_section_heading(doc, "HIGH-YIELD AREAS PER CLINICAL SUBJECT (FMGE Pattern)", fill='7D3C98')
add_spacer(doc)
hy_rows = [
["Medicine\n(33 Qs)",
"Drug of choice lists (must memorise), ECG patterns (MI, arrhythmias, blocks), Jones criteria for RF, SLE criteria, diabetic complications & management, thyroid function tests interpretation, nephrotic vs nephritic syndrome differences"],
["Surgery\n(32 Qs)",
"Hernia types & contents, Courvoisier's law, Murphy's sign, staging of cancers (TNM), wound healing phases, types of shock, blood transfusion reactions, pre-op/post-op complications, sterilisation methods"],
["OBG\n(30 Qs)",
"Bishops score, partogram interpretation, APGAR scoring, Obstetric conjugate vs True conjugate, placenta previa grading, Sheffield table (gestational age landmarks), contraceptive failure rates, PCOS criteria, Bethesda system for Pap smear"],
["PSM\n(30 Qs)",
"Sensitivity vs Specificity (formulas), vaccine cold chain & storage temperatures, National Health Program targets & goals, notifiable diseases, attributable risk vs relative risk, case fatality rate vs mortality rate, ASHA role"],
["Pediatrics\n(15 Qs)",
"Developmental milestones (motor, language, social) at key ages, vaccination schedule (India), WHO classification of PEM, fluid management in diarrhoea (ORS), neonatal jaundice thresholds, paediatric dose calculations"],
["ENT\n(15 Qs)",
"Safe vs unsafe CSOM (key differences), cholesteatoma features, Rinne & Weber test interpretation, otosclerosis (Schwartze sign), Trotter's triad, Killian's dehiscence, voice disorders (laryngeal pathologies)"],
["Ophthalmology\n(15 Qs)",
"Glaucoma types (open vs closed angle, drugs used), RAPD (afferent pupillary defect), Kayser-Fleischer ring, trachoma stages (WHO), retinoblastoma (leukocoria), corneal ulcer management, squint types (convergent vs divergent)"],
]
add_hy_table(doc, hy_rows)
add_spacer(doc)
# ── CLINICAL STRATEGY TIPS ──────────────────────────────────────────────────────
add_section_heading(doc, "CLINICAL PHASE STRATEGY — How to Approach These Subjects", fill='C0392B')
add_spacer(doc)
tips = [
"MEDICINE: Build a 'Drug of Choice' master list as you go — FMGE loves asking first-line treatment. Add to it every day.",
"SURGERY: For each condition, remember the TRIAD: Presentation → Investigation of choice → Treatment. This covers 90% of Qs.",
"OBG: Obstetrics and Gynecology have the most formula-based and value-based questions in FMGE. Memorise all normal values, Bishop score, APGAR, and timelines.",
"PSM: Biostatistics formulas MUST be at your fingertips. 2x2 tables for sensitivity/specificity. National program data is directly asked — revise yearly.",
"Use CEREBELLUM image-based Qs heavily for Ophthalmology and ENT — FMGE includes clinical images (fundus photos, ear drums, throat, X-rays).",
"For each disease, practice answering: 'What is the MOST LIKELY diagnosis?' and 'What is the NEXT BEST STEP?' — these are the 2 most common FMGE question formats.",
"Pediatrics vaccine schedule is DIRECTLY asked in FMGE — know the IAP immunisation schedule cold (age, route, dose, interval).",
"FMGE repeats clinical scenario questions from previous papers. After each subject, do at least 2 years' PYQs from that subject on Cerebellum.",
]
add_tips_table(doc, tips, accent='C0392B')
add_spacer(doc)
# ── MILESTONES ─────────────────────────────────────────────────────────────────
add_section_heading(doc, "END-OF-MONTH MILESTONES — Check on Oct 31 & Nov 30", fill='E07B39')
add_spacer(doc)
add_colored_para(doc, "October 31 Targets", fill='FADBD8', text_color='C0392B', bold=True, size=10)
milestone_oct = [
["Medicine", "All 3 weeks done (CVS, Respiratory, Nephro, Neuro, Endo, GI, Rheum, Haem), accuracy > 60%", "[ ]"],
["Surgery", "GI, Thyroid, Breast, Vascular, Urology, Trauma complete, accuracy > 60%", "[ ]"],
["PYQs", "Medicine + Surgery PYQ sets completed on Cerebellum", "[ ]"],
["MCQs", "Total cumulative (all subjects): ~10,000+ MCQs solved", "[ ]"],
["Mock Tests", "4 Sunday mocks done, score trending above 140/300", "[ ]"],
["Drug List", "Personal 'Drug of Choice' master list updated for Medicine + Surgery", "[ ]"],
]
add_milestone_table(doc, milestone_oct, accent='C0392B')
add_spacer(doc)
add_colored_para(doc, "November 30 Targets", fill='E8DAEF', text_color='7D3C98', bold=True, size=10)
milestone_nov = [
["OBG", "Obstetrics + Gynecology + Contraception fully complete, accuracy > 60%", "[ ]"],
["PSM", "Epidemiology, Biostatistics, NHPs, Nutrition complete — formulas memorised", "[ ]"],
["Pediatrics", "Growth milestones, vaccine schedule, common diseases complete", "[ ]"],
["ENT + Ophtho", "Both complete, image-based Qs practiced, accuracy > 60%", "[ ]"],
["MCQs", "Cumulative total (all subjects to date): ~17,000+ MCQs solved", "[ ]"],
["Mock Tests", "8 Sunday mocks done since Aug — latest score consistently above 150/300", "[ ]"],
["Revision", "First GRAND REVISION of all subjects started in last week of November", "[ ]"],
]
add_milestone_table(doc, milestone_nov, accent='7D3C98')
add_spacer(doc)
# ── WHAT'S NEXT ────────────────────────────────────────────────────────────────
add_section_heading(doc, "WHAT COMES NEXT — December to January 6 (Final Sprint)", fill='2E6DA4')
add_spacer(doc)
add_body(doc, "December 1–15: Complete minor subjects (FMT, Derma, Psychiatry, Ortho, Anaes, Radio — 35 Qs total)", bold=True)
add_body(doc, "December 16–31: Grand Revision of ALL subjects. Full 300-Q mock tests daily. Target 160+ per mock.")
add_body(doc, "January 1–6: Short notes only. No new topics. Sleep 8 hrs/night. Light revision from personal notes.")
add_body(doc, "January 7: EXAM DAY — Attempt ALL 300 questions (no negative marking). Trust your preparation.")
add_spacer(doc)
# ── CLOSING ─────────────────────────────────────────────────────────────────────
add_title_para(doc,
'"The clinical subjects are the battle. Win them, and FMGE is yours."',
"FMGE Jan 7, 2027 | Target: 150+/300 | Phase 2: Own the clinicals!")
# ── SAVE ───────────────────────────────────────────────────────────────────────
out = "/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Oct_Nov_2026.docx"
buf = io.BytesIO()
doc.save(buf)
buf.seek(0)
with open(out, 'wb') as f:
f.write(buf.read())
print(f"SUCCESS: {out} ({os.path.getsize(out):,} bytes)")
cd /home/daytona/workspace/fmge-schedule && python3 build_oct_nov.py 2>&1
python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Oct_Nov_2026.docx') xml = z.read('word/document.xml') ET.fromstring(xml) print('XML valid. Files:', len(z.namelist())) # Also verify Aug-Sep fixed file z2 = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx') xml2 = z2.read('word/document.xml') ET.fromstring(xml2) print('Aug-Sep also valid. Files:', len(z2.namelist())) "
FMGE Schedule Aug Sep 2026
Word Document · DOCX
FMGE Schedule Oct Nov 2026
Word Document · DOCX
| Section | Details |
|---|---|
| Phase 2 Overview | Why this phase decides your result (170 Qs = 57% of paper) |
| Daily Schedule (Mon-Sat) | 8.5 hrs/day with 2 MCQ blocks + dedicated PYQ time + mistake analysis |
| Sunday Schedule | Full 300-Q mock + deep weak-topic revision |
| October Week Plan | Week 1-3: Medicine (CVS, Resp, Nephro, Neuro, Endo, GI, Rheum) + Week 4-5: Surgery |
| November Week Plan | Week 1-2: OBG + Week 3-4: PSM + Pediatrics + Week 5: ENT + Ophthalmology |
| High-Yield Areas | Subject-wise FMGE-specific must-know points for all 7 subjects |
| Clinical Strategy Tips | 8 tips specific to clinical subject MCQ approach |
| Oct 31 + Nov 30 Milestones | Checklist to self-assess progress |
| December-January Preview | Brief roadmap for the final sprint phase |