Hey I'm a mbbs intern started last month 24th that is June and today is 10th July, and I'm thinking of preparing for neet pg , I'm from banglore, i have to punch before 8:30 and punch out after 4:40 , but it becomes around 5-5:30 till I reach home maybe even 6 , so how should I start , I have marrow subscription can u tell what should I study from marrow and what from YouTube and which subjects to begin with and how to approach for neet pg Thank u
NEET PG 2026 preparation strategy for MBBS interns Marrow subscription subject order
NEET PG best subjects to start with high yield topics 2026
https://getoncourse.ai/blog/neet-pg-high-yield-topics-subjec…
| Priority | Subject | ~Questions | What to focus on |
|---|---|---|---|
| Big 4 (MUST) | Medicine | 21-23 | Cardiology, Endo, GI, Resp |
| Surgery | 21-23 | GI Surgery, Trauma, Breast, Thyroid | |
| Pathology | 18-20 | General path, Neoplasia, Organ-wise | |
| Pharmacology | 18-20 | ANS, CVS drugs, Antibiotics, Toxicology | |
| High value short subjects | OBG | 19 | Normal labour, complications, Gynec |
| PSM/Community Medicine | 8-10 | Biostatistics, NHP, Vaccines | |
| Microbiology | 8-10 | High-yield bugs + immunity | |
| Pediatrics | 8-10 | Milestones, NNJ, nutrition | |
| Short subjects (quick wins) | Ophthalmology | 5-7 | Glaucoma, retina, lens |
| ENT | 5-7 | Otosclerosis, Ca larynx | |
| Dermatology | 5-7 | Morphology, specific diseases | |
| Forensic Medicine | 5-7 | Injuries, poisons, medico-legal | |
| Orthopedics | 4-6 | Fractures, OA, bone tumors | |
| Psychiatry | 3-5 | DSM criteria, drugs |
| Time | Activity |
|---|---|
| 5:30 AM - 7:30 AM | New topic video on Marrow (1.5x speed) |
| During lunch break (hospital) | Marrow Qs on phone - 15-20 MCQs |
| 6:00 PM - 7:30 PM | Continue/complete topic, do Marrow Qs |
| 8:00 PM - 9:30 PM | Revision of previous topic / Marrow notes |
| 9:30 PM - 10:00 PM | 15-20 more MCQs before sleep |
| Subject | Primary Resource |
|---|---|
| Pathology | Marrow (Dr. Sparsh Gupta) |
| Pharmacology | Marrow (Dr. Gobinath) |
| Surgery | Marrow (Dr. Rohan Khandelwal) |
| Medicine | Marrow + Osmosis YouTube for clinical vignettes |
| OBG | Marrow |
| Anatomy | Dr. Najeeb YouTube + Marrow PYQs only |
| Physiology | AK Lectures YouTube + Marrow PYQs only |
| PSM/Biostatistics | Dirty Medicine YouTube + Marrow Qs |
| Microbiology | Marrow RR only |
| All short subjects | Marrow RR videos + PYQs only |
Hey I'm a mbbs intern started last month 24th that is June and today is 10th July, and I'm thinking of preparing for neet pg , I'm from banglore, i have to punch before 8:30 and punch out after 4:40 , but it becomes around 5-5:30 till I reach home maybe even 6 , so how should I start , I have marrow subscription can u tell what should I study from marrow and what from YouTube and which subjects to begin with and how to approach for neet pg, I'll be writing my pg next year
NEET PG 2027 exam date schedule announcement
Marrow plan intern NEET PG 12 month study strategy subject order 2027
https://medium.com/costapg/neet-pg-preparation-during-intern…
Marrow NEET PG intern 1 year plan which subjects Marrow vs YouTube Anatomy Physiology
| Phase | Months | Goal |
|---|---|---|
| Phase 1: Foundation | July - October 2026 | Cover pre-clinicals + start high-yield subjects (1st reading) |
| Phase 2: Clinical Depth | November 2026 - March 2027 | Cover all clinical subjects thoroughly (1st + 2nd reading) |
| Phase 3: Revision | April - August 2027 | Subject-wise revision, PYQs, Grand Tests |
| Phase 4: Final Sprint | Sep 2027 - Exam | Only notes + GTs + weak areas |
| Time | Activity |
|---|---|
| 6:00 AM - 8:00 AM | Study block 1 - New topic video (Marrow) |
| Lunch break (1 hr) | 20-25 MCQs on Marrow app (phone) |
| 6:30 PM - 8:00 PM | Study block 2 - Complete topic + Marrow Qs |
| 9:00 PM - 10:00 PM | Revision of yesterday's topic / Marrow notes |
| Subject | Use YouTube Instead | Recommended Channel |
|---|---|---|
| Anatomy | Dr. Najeeb (far superior for concepts) | Dr. Najeeb Lectures |
| Physiology | AK Lectures or Armando Hasudungan | AK Lectures |
| Biostatistics (PSM) | Far clearer explanations for NNT, sensitivity/specificity | Dirty Medicine |
| Clinical vignette thinking | Case-based approach | Osmosis |
| Strategy/motivation | Marrow's own YouTube channel | Marrow YouTube |
| Feature | When to Use |
|---|---|
| Video Lectures | First reading of every subject |
| Marrow Notes PDF | Your revision material - DON'T make separate notes |
| Subject QBank | Immediately after finishing each chapter (not after full subject) |
| Rapid Revision (RR) Videos | After completing a subject's first reading |
| Previous Year Questions (PYQs) | Topic-wise during 1st reading, year-wise during Phase 3 |
| Grand Tests (GTs) | Start only in Phase 3 (April 2027 onwards) |
| Intern Mode | Marrow has a dedicated "Intern Mode" - activate this, it gives a structured daily plan for working interns |
| Tier | Subjects | ~% of paper |
|---|---|---|
| Big 4 | Medicine, Surgery, Pathology, Pharmacology | ~55-60% |
| High value | OBG, PSM, Pediatrics, Microbiology | ~20-25% |
| Short subjects | Ophtha, ENT, Derma, Forensic, Ortho, Psychiatry, Radiology, Anesthesia | ~15-20% |
The Big 4 alone = ~55% of your marks. Never compromise on these for short subjects.
| Channel | Best For |
|---|---|
| Dr. Najeeb Lectures | Anatomy, Physiology, Pathology concepts |
| Marrow (official YouTube) | Free strategy sessions, subject tips |
| Osmosis | Clinical vignette understanding |
| Dirty Medicine | Biostatistics, clinical reasoning |
| AK Lectures | Physiology |
| Dr. Bhanu Pratap (various) | Surgery mnemonics |
I have to punch in at 8:15
| Time | Activity | Duration |
|---|---|---|
| 6:00 - 6:15 AM | Wake up, freshen up, tea/coffee | 15 min |
| 6:15 - 7:30 AM | Study Block 1 - New topic (Marrow video) | 75 min |
| 7:30 AM | Leave for hospital | - |
| Lunch break (~1 hr) | 20-25 MCQs on Marrow app (phone) | 30-40 min |
| 4:40 PM | Punch out | |
| ~6:00 PM | Reach home | - |
| 6:00 - 6:30 PM | Freshen up, eat, decompress | 30 min |
| 6:30 - 8:00 PM | Study Block 2 - Complete topic + Marrow Qs | 90 min |
| 8:00 - 9:00 PM | Dinner, break | 60 min |
| 9:00 - 10:00 PM | Study Block 3 - Revision / Marrow notes | 60 min |
| 10:00 PM | Sleep |
When shall I take my bath
| Time | Activity |
|---|---|
| 6:00 - 6:10 AM | Wake up, brush, splash water on face |
| 6:10 - 7:15 AM | Study Block 1 (65 min) - Marrow video |
| 7:15 - 7:35 AM | Bath + get ready |
| 7:35 - 7:45 AM | Breakfast (keep it quick - bread, banana, anything) |
| 7:45 AM | Leave for hospital |
Generate a daily study checklist template you can print/save
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /home/daytona/workspace/neet-pg-checklist && python3 << 'EOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import mm from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.platypus import KeepTogether output_path = "/home/daytona/workspace/neet-pg-checklist/NEET_PG_Daily_Checklist.pdf" doc = SimpleDocTemplate(output_path, pagesize=A4, leftMargin=15*mm, rightMargin=15*mm, topMargin=12*mm, bottomMargin=12*mm) styles = getSampleStyleSheet() # Custom styles title_style = ParagraphStyle('Title', parent=styles['Normal'], fontSize=18, fontName='Helvetica-Bold', alignment=TA_CENTER, textColor=colors.HexColor('#1a1a2e'), spaceAfter=2) subtitle_style = ParagraphStyle('Subtitle', parent=styles['Normal'], fontSize=10, fontName='Helvetica', alignment=TA_CENTER, textColor=colors.HexColor('#555555'), spaceAfter=8) section_style = ParagraphStyle('Section', parent=styles['Normal'], fontSize=11, fontName='Helvetica-Bold', textColor=colors.HexColor('#ffffff'), spaceAfter=0) item_style = ParagraphStyle('Item', parent=styles['Normal'], fontSize=9.5, fontName='Helvetica', textColor=colors.HexColor('#222222'), leading=14) small_style = ParagraphStyle('Small', parent=styles['Normal'], fontSize=8.5, fontName='Helvetica', textColor=colors.HexColor('#444444'), leading=12) note_style = ParagraphStyle('Note', parent=styles['Normal'], fontSize=8, fontName='Helvetica-Oblique', textColor=colors.HexColor('#888888'), alignment=TA_CENTER) # Colors DARK_BLUE = colors.HexColor('#1a1a2e') MED_BLUE = colors.HexColor('#16213e') ACCENT = colors.HexColor('#0f3460') LIGHT_BLUE = colors.HexColor('#e8f4f8') LIGHT_GREEN = colors.HexColor('#e8f5e9') LIGHT_ORANGE = colors.HexColor('#fff3e0') LIGHT_PURPLE = colors.HexColor('#f3e5f5') LIGHT_RED = colors.HexColor('#fce4ec') WHITE = colors.white BOX_BG = colors.HexColor('#f9f9f9') BORDER = colors.HexColor('#cccccc') def checkbox_row(label, detail=''): """Returns a row with checkbox, label, detail""" if detail: return [Paragraph('☐', item_style), Paragraph(f'<b>{label}</b>', item_style), Paragraph(detail, small_style)] return [Paragraph('☐', item_style), Paragraph(f'<b>{label}</b>', item_style), Paragraph('', small_style)] def section_header(title, color): data = [[Paragraph(f' {title}', section_style), '', '']] t = Table(data, colWidths=[180*mm], rowHeights=[18]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('TEXTCOLOR', (0,0), (-1,-1), WHITE), ('FONTNAME', (0,0), (-1,-1), 'Helvetica-Bold'), ('FONTSIZE', (0,0), (-1,-1), 11), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('LEFTPADDING', (0,0), (-1,-1), 8), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('TOPPADDING', (0,0), (-1,-1), 3), ])) return t def checklist_table(rows, bg_color=BOX_BG): col_w = [8*mm, 90*mm, 82*mm] t = Table(rows, colWidths=col_w, rowHeights=[16]*len(rows)) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg_color), ('GRID', (0,0), (-1,-1), 0.3, BORDER), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('LEFTPADDING', (0,0), (0,-1), 4), ('LEFTPADDING', (1,0), (1,-1), 4), ('LEFTPADDING', (2,0), (2,-1), 4), ('ROWBACKGROUNDS', (0,0), (-1,-1), [bg_color, colors.HexColor('#f0f0f0')]), ])) return t story = [] # ── HEADER ────────────────────────────────────────────────────────────────── story.append(Paragraph('NEET PG 2027 — Daily Study Checklist', title_style)) story.append(Paragraph('MBBS Intern | Bangalore | Marrow Prep', subtitle_style)) # Date + Score row date_data = [ [Paragraph('Date: ___________________', item_style), Paragraph('Day of Week: ___________', item_style), Paragraph('Mood: 😴 😐 😊 🔥', item_style), Paragraph('Score: _____ / 10', item_style)] ] date_table = Table(date_data, colWidths=[47*mm, 47*mm, 47*mm, 39*mm], rowHeights=[18]) date_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LIGHT_BLUE), ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#90caf9')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) story.append(date_table) story.append(Spacer(1, 4)) # ── MORNING BLOCK ──────────────────────────────────────────────────────────── story.append(section_header('🌅 MORNING BLOCK (6:00 AM – 7:45 AM)', DARK_BLUE)) morning_rows = [ checkbox_row('6:00 AM Wake up + brush', ''), checkbox_row('6:10 AM Study Block 1 start', 'Topic: _________________________________'), checkbox_row('Video lecture watched (Marrow)', 'Chapter: ________________________________'), checkbox_row('Quick notes / annotations done', 'Pages / timestamps: _____________________'), checkbox_row('7:15 AM Bath + get ready', ''), checkbox_row('7:35 AM Breakfast done', 'Leave by 7:45 AM →'), ] story.append(checklist_table(morning_rows, LIGHT_BLUE)) story.append(Spacer(1, 4)) # ── HOSPITAL / LUNCH BLOCK ─────────────────────────────────────────────────── story.append(section_header('🏥 HOSPITAL + LUNCH BLOCK (8:15 AM – 4:40 PM)', ACCENT)) hospital_rows = [ checkbox_row('Punched in by 8:15 AM', ''), checkbox_row('Lunch break MCQs done', 'No. of Qs: ______ Subject: ___________'), checkbox_row('Correct: _____ Wrong: _____', 'Topics to revisit: ______________________'), checkbox_row('Noted 1 clinical case for MCQ angle', 'Case: ___________________________________'), checkbox_row('Punched out by 4:40 PM', ''), ] story.append(checklist_table(hospital_rows, LIGHT_GREEN)) story.append(Spacer(1, 4)) # ── EVENING BLOCK ──────────────────────────────────────────────────────────── story.append(section_header('🌆 EVENING BLOCK (6:30 PM – 10:00 PM)', MED_BLUE)) evening_rows = [ checkbox_row('6:00 PM Reached home', ''), checkbox_row('6:30 PM Study Block 2 start', 'Topic (continue/new): ___________________'), checkbox_row('Completed today\'s topic', 'Subject: ________________________________'), checkbox_row('Marrow subject QBank done', 'No. of Qs: ______ Accuracy: ______%'), checkbox_row('8:00 PM Dinner + break', ''), checkbox_row('9:00 PM Study Block 3 - Revision', 'Yesterday\'s topic: ______________________'), checkbox_row('Marrow notes / RR reviewed', 'Subject: ________________________________'), checkbox_row('9:45 PM Pre-sleep MCQ round', 'No. of Qs: ______ (aim: 15-20)'), checkbox_row('10:00 PM Sleep (non-negotiable)', ''), ] story.append(checklist_table(evening_rows, LIGHT_ORANGE)) story.append(Spacer(1, 4)) # ── TODAY'S SUBJECT TRACKER ────────────────────────────────────────────────── story.append(section_header('📚 TODAY\'S SUBJECT TRACKER', colors.HexColor('#6a1b9a'))) subject_rows = [ [Paragraph('Subject', item_style), Paragraph('Topic / Chapter', item_style), Paragraph('Videos ✓', item_style), Paragraph('MCQs done', item_style), Paragraph('Revision ✓', item_style)], [Paragraph('1. ___________', small_style), Paragraph('_____________________', small_style), Paragraph('☐', item_style), Paragraph('______', small_style), Paragraph('☐', item_style)], [Paragraph('2. ___________', small_style), Paragraph('_____________________', small_style), Paragraph('☐', item_style), Paragraph('______', small_style), Paragraph('☐', item_style)], [Paragraph('3. ___________', small_style), Paragraph('_____________________', small_style), Paragraph('☐', item_style), Paragraph('______', small_style), Paragraph('☐', item_style)], ] subj_table = Table(subject_rows, colWidths=[35*mm, 65*mm, 25*mm, 28*mm, 27*mm], rowHeights=[16]*4) subj_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#6a1b9a')), ('TEXTCOLOR', (0,0), (-1,0), WHITE), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('BACKGROUND', (0,1), (-1,-1), LIGHT_PURPLE), ('GRID', (0,0), (-1,-1), 0.4, BORDER), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LIGHT_PURPLE, colors.HexColor('#ede7f6')]), ('FONTSIZE', (0,0), (-1,0), 9), ])) story.append(subj_table) story.append(Spacer(1, 4)) # ── MCQ STATS + MISTAKE LOG ────────────────────────────────────────────────── left_col = [] right_col = [] # MCQ stats mcq_title = Table([[Paragraph(' 📊 MCQ STATS TODAY', section_style)]], colWidths=[87*mm], rowHeights=[18]) mcq_title.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#00695c')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ])) left_col.append(mcq_title) mcq_rows = [ [Paragraph('Total MCQs attempted', small_style), Paragraph('_______', small_style)], [Paragraph('Correct', small_style), Paragraph('_______', small_style)], [Paragraph('Wrong', small_style), Paragraph('_______', small_style)], [Paragraph('Accuracy %', small_style), Paragraph('_______', small_style)], [Paragraph('Skipped / Unsure', small_style), Paragraph('_______', small_style)], ] mcq_table = Table(mcq_rows, colWidths=[60*mm, 27*mm], rowHeights=[14]*5) mcq_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#e0f2f1')), ('GRID', (0,0), (-1,-1), 0.3, BORDER), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('LEFTPADDING', (0,0), (-1,-1), 5), ('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.HexColor('#e0f2f1'), colors.HexColor('#b2dfdb')]), ])) left_col.append(mcq_table) # Mistake log mistake_title = Table([[Paragraph(' ❌ MISTAKE LOG (top 3)', section_style)]], colWidths=[87*mm], rowHeights=[18]) mistake_title.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), colors.HexColor('#b71c1c')), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ])) right_col.append(mistake_title) for i in range(1, 4): mistake_rows = [ [Paragraph(f'Q{i}. Topic: _______________________________', small_style)], [Paragraph(f' Why wrong: __________________________', small_style)], ] mt = Table(mistake_rows, colWidths=[87*mm], rowHeights=[13, 13]) mt.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LIGHT_RED), ('GRID', (0,0), (-1,-1), 0.3, BORDER), ('LEFTPADDING', (0,0), (-1,-1), 5), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ])) right_col.append(mt) # Combine into two columns combined_data = [[left_col[0], right_col[0]], [left_col[1], right_col[1]]] for item in right_col[2:]: combined_data.append(['', item]) two_col = Table([[left_col[0], right_col[0]]], colWidths=[90*mm, 90*mm]) two_col.setStyle(TableStyle([('VALIGN', (0,0), (-1,-1), 'TOP')])) story.append(two_col) two_col2 = Table([[left_col[1], right_col[1]]], colWidths=[90*mm, 90*mm]) two_col2.setStyle(TableStyle([('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 0)])) story.append(two_col2) for item in right_col[2:]: two_col_n = Table([['', item]], colWidths=[90*mm, 90*mm]) two_col_n.setStyle(TableStyle([('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 0)])) story.append(two_col_n) story.append(Spacer(1, 4)) # ── END OF DAY REFLECTION ──────────────────────────────────────────────────── story.append(section_header('🌙 END OF DAY REFLECTION', colors.HexColor('#37474f'))) reflect_rows = [ checkbox_row('Completed morning study block', 'Time actually started: __________________'), checkbox_row('Completed evening study block', 'Total hours studied: ____________________'), checkbox_row('Met MCQ target for today', 'Target: 60 | Actual: ___________________'), checkbox_row('Revised previous topic', 'Subject: ________________________________'), checkbox_row('Tomorrow\'s topic decided', 'Topic: __________________________________'), ] story.append(checklist_table(reflect_rows, colors.HexColor('#eceff1'))) story.append(Spacer(1, 4)) # ── WEEKLY TARGETS STRIP ───────────────────────────────────────────────────── week_data = [ [Paragraph('WEEKLY TARGETS', ParagraphStyle('wt', parent=styles['Normal'], fontSize=8, fontName='Helvetica-Bold', textColor=WHITE, alignment=TA_CENTER)), Paragraph('Mon ☐', small_style), Paragraph('Tue ☐', small_style), Paragraph('Wed ☐', small_style), Paragraph('Thu ☐', small_style), Paragraph('Fri ☐', small_style), Paragraph('Sat ☐', small_style), Paragraph('Sun ☐', small_style)] ] week_table = Table(week_data, colWidths=[35*mm, 21*mm, 21*mm, 21*mm, 21*mm, 21*mm, 21*mm, 19*mm], rowHeights=[16]) week_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (0,0), colors.HexColor('#37474f')), ('BACKGROUND', (1,0), (-1,0), colors.HexColor('#f5f5f5')), ('GRID', (0,0), (-1,-1), 0.4, BORDER), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('ALIGN', (0,0), (-1,-1), 'CENTER'), ])) story.append(week_table) story.append(Spacer(1, 3)) # ── MOTIVATIONAL FOOTER ────────────────────────────────────────────────────── story.append(Paragraph('"Consistency beats intensity. 4 hours daily > 12 hours on Sundays only."', note_style)) story.append(Paragraph('NEET PG 2027 | Intern Mode | Marrow + YouTube Strategy', note_style)) doc.build(story) print("PDF created successfully:", output_path) EOF
NEET PG Daily Checklist
PDF Document · PDF
| Section | What's in it |
|---|---|
| Header | Date, day, mood rating, daily score out of 10 |
| Morning Block | 6:00-7:45 AM step-by-step with fill-in topic fields |
| Hospital + Lunch Block | Punch-in, lunch MCQs, clinical case note, punch-out |
| Evening Block | Full 6:30-10:00 PM breakdown with all 3 study blocks |
| Subject Tracker | Table for up to 3 subjects - chapter, videos, MCQs, revision |
| MCQ Stats | Total attempted, correct, wrong, accuracy % |
| Mistake Log | Top 3 wrong questions with "why wrong" space |
| End of Day Reflection | 5 checkboxes + tomorrow's topic planning |
| Weekly Habit Tracker | Mon-Sun checkboxes at the bottom |
Make a Marrow resource guide PDF (which videos to watch, QBank tips, how to use Intern Mode)
Marrow NEET PG intern mode features 2025 2026 QBank tips subject faculty
Marrow app best faculty subject wise NEET PG video lectures rapid revision grand test tips
https://www.instagram.com/reel/CiKkPlFBZTL
Marrow "magic module" "subject wise" QBank how to use intern mode activate plan features
mkdir -p /home/daytona/workspace/neet-pg-checklist && python3 << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import mm from reportlab.platypus import (SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable, KeepTogether, PageBreak) from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT output_path = "/home/daytona/workspace/neet-pg-checklist/Marrow_Resource_Guide.pdf" doc = SimpleDocTemplate(output_path, pagesize=A4, leftMargin=14*mm, rightMargin=14*mm, topMargin=12*mm, bottomMargin=12*mm) # ── COLOR PALETTE ───────────────────────────────────────────────────────────── C_MARROW = colors.HexColor('#e53935') # Marrow brand red C_DARK = colors.HexColor('#1a1a2e') C_NAVY = colors.HexColor('#16213e') C_BLUE = colors.HexColor('#0f3460') C_TEAL = colors.HexColor('#00695c') C_PURPLE = colors.HexColor('#6a1b9a') C_ORANGE = colors.HexColor('#e65100') C_AMBER = colors.HexColor('#f57f17') C_GREEN = colors.HexColor('#2e7d32') C_GREY_DARK = colors.HexColor('#37474f') C_GREY_MID = colors.HexColor('#546e7a') C_WHITE = colors.white L_RED = colors.HexColor('#ffebee') L_BLUE = colors.HexColor('#e3f2fd') L_TEAL = colors.HexColor('#e0f2f1') L_PURPLE = colors.HexColor('#f3e5f5') L_ORANGE = colors.HexColor('#fff3e0') L_GREEN = colors.HexColor('#e8f5e9') L_AMBER = colors.HexColor('#fffde7') L_GREY = colors.HexColor('#eceff1') L_GREY2 = colors.HexColor('#f5f5f5') BORDER = colors.HexColor('#cfd8dc') W = 182*mm # usable width # ── STYLES ──────────────────────────────────────────────────────────────────── def sty(name, **kw): base = kw.pop('parent', 'Normal') s = getSampleStyleSheet() p = ParagraphStyle(name, parent=s[base], **kw) return p H1 = sty('H1', fontSize=20, fontName='Helvetica-Bold', textColor=C_WHITE, alignment=TA_CENTER, leading=24) H2 = sty('H2', fontSize=12, fontName='Helvetica-Bold', textColor=C_WHITE, leading=16) H3 = sty('H3', fontSize=10, fontName='Helvetica-Bold', textColor=C_DARK, leading=14) BODY = sty('BODY',fontSize=9, fontName='Helvetica', textColor=colors.HexColor('#222222'), leading=13) BODY_W = sty('BODYW',fontSize=9, fontName='Helvetica', textColor=C_WHITE, leading=13) BOLD = sty('BOLD',fontSize=9, fontName='Helvetica-Bold', textColor=C_DARK, leading=13) SMALL= sty('SMALL',fontSize=8, fontName='Helvetica', textColor=colors.HexColor('#444444'), leading=11) SMALL_W=sty('SMALLW',fontSize=8,fontName='Helvetica', textColor=C_WHITE, leading=11) NOTE = sty('NOTE',fontSize=8, fontName='Helvetica-Oblique', textColor=colors.HexColor('#888888'), alignment=TA_CENTER) TAG = sty('TAG', fontSize=7.5,fontName='Helvetica-Bold', textColor=C_WHITE, alignment=TA_CENTER) CENTER=sty('CTR', fontSize=9, fontName='Helvetica', textColor=C_DARK, alignment=TA_CENTER, leading=13) CENTER_B=sty('CTRB',fontSize=9,fontName='Helvetica-Bold', textColor=C_DARK, alignment=TA_CENTER, leading=13) TITLE_NOTE=sty('TN',fontSize=8.5,fontName='Helvetica', textColor=colors.HexColor('#bbbbbb'), alignment=TA_CENTER) story = [] # ── HELPER: section banner ──────────────────────────────────────────────────── def banner(text, bg, fg=C_WHITE, size=11, pad=6): p = ParagraphStyle('_b', fontSize=size, fontName='Helvetica-Bold', textColor=fg, leading=size+4) t = Table([[Paragraph(f' {text}', p)]], colWidths=[W], rowHeights=[size+pad*2]) t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), bg), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),pad-2), ('BOTTOMPADDING',(0,0),(-1,-1),pad-2), ])) return t # ── HELPER: two-column layout ───────────────────────────────────────────────── def two_col(left_items, right_items, lw=92*mm, rw=90*mm, gap=0): t = Table([[left_items, right_items]], colWidths=[lw, rw]) t.setStyle(TableStyle([ ('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING',(0,0),(-1,-1),0), ('RIGHTPADDING',(0,0),(-1,-1),0), ])) return t # ── HELPER: info box ────────────────────────────────────────────────────────── def info_box(rows_data, bg, col_widths, header_bg=None, header_fg=C_WHITE): t = Table(rows_data, colWidths=col_widths) style = [ ('BACKGROUND',(0,0),(-1,-1), bg), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ('TOPPADDING',(0,0),(-1,-1),2), ('BOTTOMPADDING',(0,0),(-1,-1),2), ] if header_bg: style += [ ('BACKGROUND',(0,0),(-1,0), header_bg), ('TEXTCOLOR',(0,0),(-1,0), header_fg), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ] t.setStyle(TableStyle(style)) return t # ══════════════════════════════════════════════════════════════════════════════ # PAGE 1 — COVER + OVERVIEW # ══════════════════════════════════════════════════════════════════════════════ # Cover header cover = Table( [[Paragraph('MARROW', H1), Paragraph('Complete Resource Guide', sty('_sub', fontSize=13, fontName='Helvetica', textColor=colors.HexColor('#ffcdd2'), alignment=TA_CENTER)), Paragraph('NEET PG 2027 · MBBS Intern Edition', TITLE_NOTE)]], colWidths=[W], rowHeights=[28, 20, 16]) cover.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), C_MARROW), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ])) story.append(cover) story.append(Spacer(1,5)) # ── WHAT'S IN THIS GUIDE strip ──────────────────────────────────────────────── story.append(banner('📋 WHAT\'S IN THIS GUIDE', C_GREY_DARK, size=10)) chips_data = [[ Paragraph('01\nIntern Mode', TAG), Paragraph('02\nVideo Strategy', TAG), Paragraph('03\nQBank Mastery', TAG), Paragraph('04\nFaculty Guide', TAG), Paragraph('05\nRapid Revision', TAG), Paragraph('06\nGrand Tests', TAG), Paragraph('07\nNotes & PDF', TAG), Paragraph('08\nDo\'s & Don\'ts', TAG), ]] chips_row_h = 22 chips = Table(chips_data, colWidths=[W/8]*8, rowHeights=[chips_row_h]) chip_colors = [C_MARROW, C_BLUE, C_TEAL, C_PURPLE, C_ORANGE, C_GREEN, C_AMBER, C_GREY_DARK] chip_style = [ ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3), ] for i, c in enumerate(chip_colors): chip_style.append(('BACKGROUND',(i,0),(i,0), c)) chips.setStyle(TableStyle(chip_style)) story.append(chips) story.append(Spacer(1,6)) # ══ 01 INTERN MODE ═══════════════════════════════════════════════════════════ story.append(banner('01 🎓 INTERN MODE — What it is & How to Activate', C_MARROW)) im_left = [ Paragraph('<b>What is Intern Mode?</b>', H3), Spacer(1,2), Paragraph('Intern Mode is a special study path inside Marrow designed for working interns who have limited time. It trims low-yield videos and replaces them with QBank modules so you cover all concepts faster without watching every video.', BODY), Spacer(1,4), Paragraph('<b>Key Features:</b>', BOLD), Spacer(1,2), ] im_features = [ ['✓', 'Complete all 19 subjects in ~120 days at 4 hrs/day'], ['✓', 'Low-yield videos replaced by focused QBank modules'], ['✓', 'No new videos added — same content, tighter path'], ['✓', 'Available for Plan C and above'], ['✓', 'Can switch between Normal Mode & Intern Mode anytime'], ['✓', 'Tracks daily progress against your target exam date'], ] feat_t = Table(im_features, colWidths=[6*mm, 83*mm], rowHeights=[13]*6) feat_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), L_RED), ('FONTNAME',(0,0),(0,-1),'Helvetica-Bold'), ('TEXTCOLOR',(0,0),(0,-1), C_MARROW), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ('FONTSIZE',(0,0),(-1,-1),8.5), ])) im_left.append(feat_t) im_right = [ Paragraph('<b>How to Activate (Step-by-Step):</b>', H3), Spacer(1,2), ] steps = [ ('Step 1', 'Open the Marrow app'), ('Step 2', 'Go to Home → My Plan'), ('Step 3', 'Tap "Switch to Intern Mode"'), ('Step 4', 'Set your target exam date (March 2027)'), ('Step 5', 'Marrow auto-generates your daily target'), ('Step 6', 'Follow the daily task list on the home screen'), ] for num, txt in steps: row_t = Table([[Paragraph(num, sty('_sn', fontSize=7.5, fontName='Helvetica-Bold', textColor=C_WHITE, alignment=TA_CENTER)), Paragraph(txt, BODY)]], colWidths=[18*mm, 70*mm], rowHeights=[14]) row_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_MARROW), ('BACKGROUND',(1,0),(1,0), L_RED), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('LEFTPADDING',(0,0),(-1,-1),4), ('TOPPADDING',(0,0),(-1,-1),1), ('BOTTOMPADDING',(0,0),(-1,-1),1), ])) im_right.append(row_t) story.append(two_col(im_left, im_right, lw=94*mm, rw=88*mm)) story.append(Spacer(1,6)) # ══ 02 VIDEO STRATEGY ════════════════════════════════════════════════════════ story.append(banner('02 🎬 VIDEO LECTURE STRATEGY — How to Watch Efficiently', C_BLUE)) vid_tips = [ ['💡 Tip', 'Detail'], ['Watch at 1.5x–2x speed', 'Marrow videos are recorded slowly. 1.5x saves 33% time without missing content.'], ['Pause & annotate', 'Stop every 10–15 min to jot key points in Marrow notes PDF (don\'t make separate notes).'], ['Never re-watch fully', 'If you miss something, use the chapter timestamp list to jump to that section only.'], ['Phone = hospital, Laptop = home', 'Watch new videos on laptop (bigger screen, focused). Use phone only for MCQs.'], ['1 chapter = 1 sitting', 'Don\'t split a chapter across days. Finish one chapter, then immediately do MCQs.'], ['Morning = new videos', 'Watch new content in your morning block when concentration is highest.'], ['Evening = revise + Qs', 'Use evening to do QBank on that chapter — don\'t watch new videos when tired.'], ] vid_t = Table(vid_tips, colWidths=[52*mm, 130*mm], rowHeights=[15] + [13.5]*7) vid_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_BLUE), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('BACKGROUND',(0,1),(-1,-1), L_BLUE), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_BLUE, colors.HexColor('#bbdefb')]), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('FONTNAME',(0,1),(0,-1),'Helvetica-Bold'), ('LEFTPADDING',(0,0),(-1,-1),5), ])) story.append(vid_t) story.append(Spacer(1,6)) # ══ 03 QBANK MASTERY ══════════════════════════════════════════════════════════ story.append(banner('03 📝 QBANK MASTERY — The Right Way to Use It', C_TEAL)) # Left: modes of use qb_left = [ Paragraph('<b>3 Modes to Use (in order):</b>', H3), Spacer(1,3), ] modes = [ ('PHASE 1', 'Subject-wise QBank', 'Do topic-by-topic Qs immediately after watching each chapter video. Don\'t wait to finish the full subject.', C_TEAL), ('PHASE 2', 'Year-wise PYQs', 'After completing a subject fully, solve NEET PG + AIIMS PYQs year-wise. Repeat 5–7 times total.', C_BLUE), ('PHASE 3', 'Custom Module', 'Mix subjects. Simulate real exam feel. Use in the last 3 months.', C_PURPLE), ] for ph, name, desc, col in modes: m_t = Table([ [Paragraph(ph, sty('_ph', fontSize=7.5, fontName='Helvetica-Bold', textColor=C_WHITE, alignment=TA_CENTER)), Paragraph(f'<b>{name}</b>', BODY)], ['', Paragraph(desc, SMALL)], ], colWidths=[16*mm, 73*mm], rowHeights=[13, 12]) m_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,-1), col), ('BACKGROUND',(1,0),(-1,-1), L_TEAL), ('SPAN',(0,0),(0,-1)), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_left.append(m_t) qb_left.append(Spacer(1,2)) # Right: Magic Module + tips qb_right = [ Paragraph('<b>✨ Magic Module — Your Secret Weapon</b>', H3), Spacer(1,3), Paragraph('The Magic Module is an auto-curated set of MCQs you previously got wrong. Marrow tracks every wrong answer and adds it here.', BODY), Spacer(1,3), ] magic_steps = [ 'Open Marrow App', 'Go to QBank section', 'Tap "Custom Module"', 'Select "Magic Module"', 'Solve daily — 20 min minimum', ] for i, s in enumerate(magic_steps, 1): ms = Table([[Paragraph(str(i), sty('_mn', fontSize=8, fontName='Helvetica-Bold', textColor=C_WHITE, alignment=TA_CENTER)), Paragraph(s, BODY)]], colWidths=[10*mm, 78*mm], rowHeights=[13]) ms.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_AMBER), ('BACKGROUND',(1,0),(1,0), L_AMBER), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_right.append(ms) qb_right.append(Spacer(1,1)) qb_right.append(Spacer(1,4)) qb_right.append(Paragraph('<b>Daily MCQ Targets:</b>', BOLD)) qb_right.append(Spacer(1,2)) targets = [ ['Phase', 'Target/day', 'Notes'], ['Phase 1 (pre-clinicals)', '40–50 Qs', 'After each chapter'], ['Phase 2 (clinicals)', '60–80 Qs', 'Mix of subject + PYQ'], ['Phase 3 (revision)', '100–120 Qs', 'Custom + Grand Test'], ] targ_t = Table(targets, colWidths=[35*mm, 25*mm, 28*mm], rowHeights=[13]*4) targ_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_TEAL), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('BACKGROUND',(0,1),(-1,-1), L_TEAL), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_TEAL, colors.HexColor('#b2dfdb')]), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('FONTSIZE',(0,0),(-1,-1),8), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_right.append(targ_t) story.append(two_col(qb_left, qb_right, lw=93*mm, rw=89*mm)) story.append(Spacer(1,6)) # ══ 04 FACULTY GUIDE ══════════════════════════════════════════════════════════ story.append(banner('04 👨⚕️ FACULTY GUIDE — Best Teacher for Each Subject', C_PURPLE)) fac_data = [ ['Subject', 'Marrow Faculty', 'Rating', 'Notes'], ['Medicine', 'Dr. Rakesh S Nair', '⭐⭐⭐⭐⭐', 'Excellent clinical vignette approach'], ['Surgery', 'Dr. Rohan Khandelwal', '⭐⭐⭐⭐⭐', 'Best surgery teacher on any platform'], ['Pathology', 'Dr. Sparsh Gupta', '⭐⭐⭐⭐⭐', 'Very MCQ-oriented, clear explanations'], ['Pharmacology', 'Dr. Gobinath / Dr. Rajesh', '⭐⭐⭐⭐', 'Good for high-yield drug classes'], ['OBG', 'Dr. Sakshi Arora', '⭐⭐⭐⭐⭐', 'Industry gold standard for OBG'], ['Pediatrics', 'Dr. Singaram', '⭐⭐⭐⭐', 'Comprehensive, good for milestones'], ['Microbiology', 'Marrow Faculty', '⭐⭐⭐', 'Use RR only; supplement with notes'], ['PSM / Community', 'Marrow Faculty', '⭐⭐⭐⭐', 'Biostatistics — use YouTube too'], ['Ophthalmology', 'Marrow Faculty', '⭐⭐⭐⭐', 'RR videos are excellent'], ['ENT', 'Marrow Faculty', '⭐⭐⭐⭐', 'RR videos sufficient'], ['Dermatology', 'Dr. Malcolm Pinto', '⭐⭐⭐⭐', 'Good image-based coverage'], ['Forensic Medicine', 'Marrow Faculty', '⭐⭐⭐⭐', 'Well-structured, high-yield'], ['Orthopedics', 'Dr. Abbas Ali', '⭐⭐⭐⭐', 'Marrow RR very good for Ortho'], ['Psychiatry', 'Dr. Mohan Sunil Kumar', '⭐⭐⭐⭐', 'DSM criteria clearly explained'], ['Anatomy', '⚠️ Dr. Najeeb (YouTube)', '⭐⭐⭐⭐⭐', 'SKIP Marrow Anatomy videos — use Dr. Najeeb'], ['Physiology', '⚠️ AK Lectures (YouTube)', '⭐⭐⭐⭐⭐', 'SKIP Marrow Physio videos — use AK Lectures'], ['Biochemistry', 'Marrow RR only', '⭐⭐⭐', 'Low yield; RR + PYQs only'], ['Radiology', 'Marrow RR only', '⭐⭐⭐', 'Very short; 1 day max'], ['Anesthesia', 'Marrow RR only', '⭐⭐⭐', 'Very short; 1 day max'], ] col_ws = [35*mm, 42*mm, 28*mm, 77*mm] fac_t = Table(fac_data, colWidths=col_ws, rowHeights=[14]+[12]*18) fac_style = [ ('BACKGROUND',(0,0),(-1,0), C_PURPLE), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_PURPLE, colors.HexColor('#ede7f6')]), # highlight YouTube rows ('BACKGROUND',(0,15),(-1,15), colors.HexColor('#fff9c4')), ('BACKGROUND',(0,16),(-1,16), colors.HexColor('#fff9c4')), ('FONTNAME',(0,15),(0,16),'Helvetica-Bold'), ('TEXTCOLOR',(0,15),(0,16), C_ORANGE), ] fac_t.setStyle(TableStyle(fac_style)) story.append(fac_t) story.append(Spacer(1,3)) story.append(Paragraph('⚠️ Yellow rows = skip Marrow videos; use YouTube channels listed in the YouTube Resource Guide instead.', NOTE)) story.append(Spacer(1,6)) # ══ 05 RAPID REVISION ════════════════════════════════════════════════════════ story.append(banner('05 ⚡ RAPID REVISION (RR) — When & How', C_ORANGE)) rr_left = [ Paragraph('<b>What is Rapid Revision?</b>', H3), Spacer(1,2), Paragraph('RR videos are short, condensed versions of full lectures. They cover only high-yield points and are meant for revision — not first reading.', BODY), Spacer(1,4), Paragraph('<b>When to use RR:</b>', BOLD), Spacer(1,2), ] rr_when = [ ['After completing 1st reading of a subject', '✓'], ['During Phase 3 (revision phase)', '✓'], ['For Anatomy, Physio, Biochem, Micro, Radiology, Anaesthesia', '✓ (use as primary)'], ['As replacement for first reading of a full subject', '✗'], ['Before you\'ve done any MCQs on that subject', '✗'], ] rr_when_t = Table(rr_when, colWidths=[72*mm, 18*mm], rowHeights=[13]*5) rr_when_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('LEFTPADDING',(0,0),(-1,-1),4), ('ALIGN',(1,0),(1,-1),'CENTER'), ('FONTNAME',(1,0),(1,-1),'Helvetica-Bold'), ('TEXTCOLOR',(1,2),(1,4), C_GREEN), ('TEXTCOLOR',(1,3),(1,4), C_MARROW), ('ROWBACKGROUNDS',(0,0),(-1,-1),[L_ORANGE, colors.HexColor('#ffe0b2')]), ])) rr_left.append(rr_when_t) rr_left.append(Spacer(1,4)) rr_left.append(Paragraph('<b>Best RR subjects on Marrow (community rated):</b>', BOLD)) rr_left.append(Spacer(1,2)) best_rr = [['Anatomy','Surgery','OBG','Orthopedics','Physiology'], ['⭐⭐⭐⭐⭐','⭐⭐⭐⭐⭐','⭐⭐⭐⭐⭐','⭐⭐⭐⭐⭐','⭐⭐⭐⭐']] best_rr_t = Table(best_rr, colWidths=[18*mm]*5, rowHeights=[13,12]) best_rr_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_ORANGE), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),7.5), ('BACKGROUND',(0,1),(-1,1), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ])) rr_left.append(best_rr_t) rr_right = [ Paragraph('<b>RR Workflow:</b>', H3), Spacer(1,2), ] rr_flow = [ ('1', 'Finish 1st reading + MCQs of a subject', C_ORANGE), ('2', 'Take 1–2 day gap (do another subject)', C_ORANGE), ('3', 'Come back and watch RR videos', C_ORANGE), ('4', 'Annotate your Marrow notes PDF as you watch', C_ORANGE), ('5', 'Do PYQs for that subject again', C_ORANGE), ('6', 'Move to next subject', C_ORANGE), ] for num, txt, col in rr_flow: rf = Table([[Paragraph(num, TAG), Paragraph(txt, BODY)]], colWidths=[10*mm, 79*mm], rowHeights=[14]) rf.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), col), ('BACKGROUND',(1,0),(1,0), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) rr_right.append(rf) rr_right.append(Spacer(1,1)) rr_right.append(Spacer(1,4)) rr_right.append(Paragraph('<b>Marrow Notes PDF — How to use:</b>', BOLD)) rr_right.append(Spacer(1,2)) note_tips = [ '→ Download subject PDF from Marrow app', '→ Print or use on tablet with annotation app', '→ Annotate directly on PDF during RR', '→ This IS your Last Minute Revision (LMR) material', '→ Never make separate notes from scratch', ] for nt in note_tips: rr_right.append(Paragraph(nt, SMALL)) rr_right.append(Spacer(1,1)) story.append(two_col(rr_left, rr_right, lw=93*mm, rw=89*mm)) story.append(Spacer(1,6)) # ══ 06 GRAND TESTS ════════════════════════════════════════════════════════════ story.append(banner('06 🏆 GRAND TESTS (GTs) — Strategy & Schedule', C_GREEN)) gt_data = [ ['GT Phase', 'When to Start', 'Frequency', 'What to do AFTER'], ['Mini Subject Tests', 'After each subject (Phase 1–2)', '1 per subject', 'Fix weak chapters before moving on'], ['Subject-wise Full Tests', 'After 1st reading done (Phase 2)', '1–2 per week', 'Revise low-scoring topics'], ['Full Grand Tests (200Q)', 'Phase 3 — April 2027 onwards', '2–3 per week', 'Detailed analysis — 30 min per GT'], ['NEET PG Mock Series', 'Last 6–8 weeks before exam', 'Daily if possible', 'Only focus on weak areas from analysis'], ] gt_t = Table(gt_data, colWidths=[38*mm, 46*mm, 34*mm, 64*mm], rowHeights=[14]+[13]*4) gt_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_GREEN), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('BACKGROUND',(0,1),(-1,-1), L_GREEN), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_GREEN, colors.HexColor('#c8e6c9')]), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ])) story.append(gt_t) story.append(Spacer(1,4)) # GT analysis box story.append(Paragraph('<b>How to Analyze a Grand Test (the right way):</b>', BOLD)) story.append(Spacer(1,3)) gt_analysis = [ ['Step', 'Action', 'Time'], ['1', 'Look at subject-wise accuracy first — not overall score', '5 min'], ['2', 'Open every wrong answer and read the full explanation', '15 min'], ['3', 'For each wrong answer: was it a concept gap or silly mistake?', '5 min'], ['4', 'If concept gap → add to Magic Module; re-read that topic', '5 min'], ['5', 'Note the 3 weakest subjects from this GT for next week focus', '2 min'], ['6', 'Do NOT re-attempt the same GT for 2 weeks', '—'], ] ga_t = Table(gt_analysis, colWidths=[10*mm, 130*mm, 22*mm], rowHeights=[13]*7) ga_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_GREEN), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('BACKGROUND',(0,1),(-1,-1), L_GREEN), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_GREEN, colors.HexColor('#c8e6c9')]), ('GRID',(0,0),(-1,-1),0.3,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('ALIGN',(0,0),(0,-1),'CENTER'), ('FONTNAME',(0,1),(0,-1),'Helvetica-Bold'), ('TEXTCOLOR',(0,1),(0,-1), C_GREEN), ('LEFTPADDING',(0,0),(-1,-1),4), ('ALIGN',(2,0),(2,-1),'CENTER'), ])) story.append(ga_t) story.append(Spacer(1,6)) # ══ 07 NOTES & PDF ════════════════════════════════════════════════════════════ story.append(banner('07 📄 MARROW NOTES & PDF — The Golden Rule', C_AMBER)) notes_data = [ [Paragraph('<b>DO THIS ✓</b>', sty('_do', fontSize=10, fontName='Helvetica-Bold', textColor=C_GREEN, alignment=TA_CENTER)), Paragraph('<b>DON\'T DO THIS ✗</b>', sty('_dont', fontSize=10, fontName='Helvetica-Bold', textColor=C_MARROW, alignment=TA_CENTER))], [Paragraph('Download Marrow PDF notes for every subject', BODY), Paragraph('Make your own notes from scratch', BODY)], [Paragraph('Annotate/highlight the Marrow PDF as you watch videos', BODY), Paragraph('Copy entire slides into a new notebook', BODY)], [Paragraph('Add your own "trick" or mnemonic in the margin', BODY), Paragraph('Spend hours making "aesthetic" notes', BODY)], [Paragraph('Use annotated PDF as Last Minute Revision (LMR) material', BODY), Paragraph('Wait till exam month to start making notes', BODY)], [Paragraph('Revise from PDF before every GT', BODY), Paragraph('Re-read from textbooks or large references', BODY)], ] notes_t = Table(notes_data, colWidths=[91*mm, 91*mm], rowHeights=[16]+[13]*5) notes_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), colors.HexColor('#e8f5e9')), ('BACKGROUND',(1,0),(1,0), colors.HexColor('#ffebee')), ('BACKGROUND',(0,1),(-1,-1), L_AMBER), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_AMBER, colors.HexColor('#fff9c4')]), ('GRID',(0,0),(-1,-1),0.4,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),6), ('LINEAFTER',(0,0),(0,-1),1.5,BORDER), ])) story.append(notes_t) story.append(Spacer(1,6)) # ══ 08 DO's & DON'Ts ═════════════════════════════════════════════════════════ story.append(banner("08 ⚠️ MARROW DO'S & DON'TS — Common Intern Mistakes", C_GREY_DARK)) dos_donts = [ ['✅ DO', '❌ DON\'T'], ['Start with subject-wise QBank after every chapter', 'Do Grand Tests in Month 1 (demoralizing)'], ['Use Intern Mode to manage your video load', 'Watch every single Marrow video (time sink)'], ['Use Magic Module daily for 20 min', 'Ignore wrong answers — just check the score'], ['Study Anatomy / Physiology from YouTube', 'Use Marrow full lectures for Anatomy/Physio'], ['Annotate Marrow PDF notes as you go', 'Make a parallel separate notebook'], ['Do RR after completing each subject', 'Do RR instead of 1st reading'], ['Start GTs only after 4+ subjects covered', 'Skip GT analysis — just check the percentage'], ['Keep a "mistake book" of wrong Qs', 'Re-attempt the same Qs immediately after seeing answers'], ['Use the Plan page to track daily targets', 'Study randomly without subject-wise structure'], ['Solve PYQs topic-wise first, year-wise later', 'Solve all PYQs only in the last month'], ] dd_t = Table(dos_donts, colWidths=[91*mm, 91*mm], rowHeights=[15]+[13]*10) dd_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_GREEN), ('BACKGROUND',(1,0),(1,0), C_MARROW), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('BACKGROUND',(0,1),(-1,-1), L_GREY2), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_GREY2, L_GREY]), ('GRID',(0,0),(-1,-1),0.4,BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ('LINEAFTER',(0,0),(0,-1),1.5,BORDER), ('FONTNAME',(0,1),(0,-1),'Helvetica'), ('TEXTCOLOR',(0,1),(0,-1), C_GREEN), ('TEXTCOLOR',(1,1),(1,-1), C_MARROW), ])) story.append(dd_t) story.append(Spacer(1,5)) # ── FOOTER ──────────────────────────────────────────────────────────────────── story.append(HRFlowable(width=W, thickness=0.5, color=BORDER)) story.append(Spacer(1,3)) story.append(Paragraph( 'Marrow Resource Guide | NEET PG 2027 | MBBS Intern, Bangalore | Prepared July 2026', NOTE)) story.append(Paragraph( '"The QBank is your real teacher. Videos are just the introduction."', NOTE)) doc.build(story) print("SUCCESS:", output_path) PYEOF
python3 << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import mm from reportlab.platypus import (SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable) from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT output_path = "/home/daytona/workspace/neet-pg-checklist/Marrow_Resource_Guide.pdf" doc = SimpleDocTemplate(output_path, pagesize=A4, leftMargin=14*mm, rightMargin=14*mm, topMargin=12*mm, bottomMargin=12*mm) C_MARROW = colors.HexColor('#e53935') C_DARK = colors.HexColor('#1a1a2e') C_NAVY = colors.HexColor('#16213e') C_BLUE = colors.HexColor('#0f3460') C_TEAL = colors.HexColor('#00695c') C_PURPLE = colors.HexColor('#6a1b9a') C_ORANGE = colors.HexColor('#e65100') C_AMBER = colors.HexColor('#f57f17') C_GREEN = colors.HexColor('#2e7d32') C_GREY = colors.HexColor('#37474f') C_WHITE = colors.white L_RED = colors.HexColor('#ffebee') L_BLUE = colors.HexColor('#e3f2fd') L_TEAL = colors.HexColor('#e0f2f1') L_PURPLE = colors.HexColor('#f3e5f5') L_ORANGE = colors.HexColor('#fff3e0') L_GREEN = colors.HexColor('#e8f5e9') L_AMBER = colors.HexColor('#fffde7') L_GREY = colors.HexColor('#eceff1') L_GREY2 = colors.HexColor('#f5f5f5') BORDER = colors.HexColor('#cfd8dc') W = 182*mm def ps(name, size=9, bold=False, color=None, center=False, italic=False, leading=None): fn = 'Helvetica-Bold' if bold else ('Helvetica-Oblique' if italic else 'Helvetica') col = color or colors.HexColor('#222222') align = TA_CENTER if center else TA_LEFT ld = leading or (size + 4) return ParagraphStyle(name, fontName=fn, fontSize=size, textColor=col, alignment=align, leading=ld) def banner(text, bg, size=10): t = Table([[Paragraph(f' {text}', ps('_b', size=size, bold=True, color=C_WHITE))]], colWidths=[W]) t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), bg), ('TOPPADDING',(0,0),(-1,-1),5), ('BOTTOMPADDING',(0,0),(-1,-1),5), ('LEFTPADDING',(0,0),(-1,-1),6), ])) return t def two_col(L, R, lw=93*mm, rw=89*mm): t = Table([[L, R]], colWidths=[lw, rw]) t.setStyle(TableStyle([ ('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING',(0,0),(-1,-1),0), ('RIGHTPADDING',(0,0),(-1,-1),0), ('TOPPADDING',(0,0),(-1,-1),0), ])) return t story = [] # ── COVER HEADER ────────────────────────────────────────────────────────────── hdr = Table([ [Paragraph('MARROW', ps('h1', size=22, bold=True, color=C_WHITE, center=True))], [Paragraph('Complete Resource Guide', ps('h1s', size=13, color=colors.HexColor('#ffcdd2'), center=True))], [Paragraph('NEET PG 2027 · MBBS Intern Edition · Bangalore', ps('h1n', size=9, color=colors.HexColor('#bbbbbb'), center=True))], ], colWidths=[W]) hdr.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), C_MARROW), ('TOPPADDING',(0,0),(-1,-1),4), ('BOTTOMPADDING',(0,0),(-1,-1),4), ])) story.append(hdr) story.append(Spacer(1,5)) # ── INDEX CHIPS ─────────────────────────────────────────────────────────────── chip_labels = ['01 Intern Mode','02 Videos','03 QBank','04 Faculty','05 Rapid Revision','06 Grand Tests','07 Notes','08 Dos & Donts'] chip_colors = [C_MARROW, C_BLUE, C_TEAL, C_PURPLE, C_ORANGE, C_GREEN, C_AMBER, C_GREY] chip_row = [[Paragraph(lb, ps(f'_c{i}', size=7.5, bold=True, color=C_WHITE, center=True)) for i, lb in enumerate(chip_labels)]] chip_t = Table(chip_row, colWidths=[W/8]*8, rowHeights=[20]) cs = [('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('TOPPADDING',(0,0),(-1,-1),3), ('BOTTOMPADDING',(0,0),(-1,-1),3)] for i, c in enumerate(chip_colors): cs.append(('BACKGROUND',(i,0),(i,0), c)) chip_t.setStyle(TableStyle(cs)) story.append(chip_t) story.append(Spacer(1,6)) # ══ 01 INTERN MODE ═══════════════════════════════════════════════════════════ story.append(banner('01 🎓 INTERN MODE — What It Is & How to Activate', C_MARROW)) left_items = [ Paragraph('<b>What is Intern Mode?</b>', ps('_h3', size=10, bold=True, color=C_DARK)), Spacer(1,3), Paragraph('A special study path inside Marrow for working interns. It replaces low-yield videos with QBank modules so you cover all 19 subjects faster — completing everything in ~120 days at 4 hrs/day.', ps('_b1', size=9)), Spacer(1,4), Paragraph('<b>Key Features:</b>', ps('_bld', size=9, bold=True, color=C_DARK)), Spacer(1,2), ] feats = [ '✓ Complete 19 subjects in ~120 days at 4 hrs/day', '✓ Low-yield videos replaced by QBank modules', '✓ Same content — tighter, smarter path', '✓ Available for Plan C and above', '✓ Switch between Normal & Intern Mode anytime', '✓ Tracks daily progress against your exam date', ] feat_rows = [[Paragraph(f, ps(f'_f{i}', size=8.5))] for i, f in enumerate(feats)] ft = Table(feat_rows, colWidths=[90*mm], rowHeights=[13]*6) ft.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), L_RED), ('ROWBACKGROUNDS',(0,0),(-1,-1),[L_RED, colors.HexColor('#ffcdd2')]), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),6), ])) left_items.append(ft) right_items = [ Paragraph('<b>How to Activate (Step-by-Step):</b>', ps('_h3r', size=10, bold=True, color=C_DARK)), Spacer(1,3), ] steps = [ ('1','Open the Marrow app'), ('2','Go to Home → My Plan'), ('3','Tap "Switch to Intern Mode"'), ('4','Set target exam date (March 2027)'), ('5','Marrow auto-generates daily targets'), ('6','Follow the daily task list on Home screen'), ] for num, txt in steps: sr = Table([[Paragraph(num, ps(f'_sn{num}', size=8, bold=True, color=C_WHITE, center=True)), Paragraph(txt, ps(f'_st{num}', size=9))]], colWidths=[14*mm, 74*mm], rowHeights=[15]) sr.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_MARROW), ('BACKGROUND',(1,0),(1,0), L_RED), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ('TOPPADDING',(0,0),(-1,-1),1), ('BOTTOMPADDING',(0,0),(-1,-1),1), ])) right_items.append(sr) right_items.append(Spacer(1,1)) story.append(two_col(left_items, right_items)) story.append(Spacer(1,6)) # ══ 02 VIDEO STRATEGY ════════════════════════════════════════════════════════ story.append(banner('02 🎬 VIDEO LECTURE STRATEGY — How to Watch Efficiently', C_BLUE)) vid_rows = [ [Paragraph('Tip', ps('_vh', size=9, bold=True, color=C_WHITE)), Paragraph('Detail', ps('_vd', size=9, bold=True, color=C_WHITE))], [Paragraph('Watch at 1.5x–2x speed', ps('_v1', size=8.5, bold=True)), Paragraph('Marrow videos are recorded slowly. 1.5x saves 33% time without missing content.', ps('_v1d', size=8.5))], [Paragraph('Pause & annotate every 10–15 min', ps('_v2', size=8.5, bold=True)), Paragraph('Jot key points in Marrow notes PDF — not in a separate notebook.', ps('_v2d', size=8.5))], [Paragraph('Never re-watch a full video', ps('_v3', size=8.5, bold=True)), Paragraph('If you missed something, use the chapter timestamp list to jump to that section only.', ps('_v3d', size=8.5))], [Paragraph('Phone = MCQs, Laptop = videos', ps('_v4', size=8.5, bold=True)), Paragraph('Bigger screen, better focus for new content. Save phone for hospital MCQ sessions.', ps('_v4d', size=8.5))], [Paragraph('1 chapter = 1 sitting', ps('_v5', size=8.5, bold=True)), Paragraph("Don't split one chapter across days. Finish it, then immediately do MCQs.", ps('_v5d', size=8.5))], [Paragraph('Morning = new videos only', ps('_v6', size=8.5, bold=True)), Paragraph('Your morning block is peak concentration. New content goes here, not evenings.', ps('_v6d', size=8.5))], [Paragraph('Evening = QBank + revision', ps('_v7', size=8.5, bold=True)), Paragraph("Don't watch new videos when tired after internship. Do MCQs or revise instead.", ps('_v7d', size=8.5))], ] vt = Table(vid_rows, colWidths=[52*mm, 130*mm], rowHeights=[14]+[13]*7) vt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_BLUE), ('TEXTCOLOR',(0,0),(-1,0), C_WHITE), ('FONTNAME',(0,0),(-1,0),'Helvetica-Bold'), ('FONTSIZE',(0,0),(-1,-1),8.5), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_BLUE, colors.HexColor('#bbdefb')]), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('FONTNAME',(0,1),(0,-1),'Helvetica-Bold'), ('LEFTPADDING',(0,0),(-1,-1),5), ])) story.append(vt) story.append(Spacer(1,6)) # ══ 03 QBANK ═════════════════════════════════════════════════════════════════ story.append(banner('03 📝 QBANK MASTERY — The Right Way to Use It', C_TEAL)) qb_left = [ Paragraph('<b>3 Modes (use in this order):</b>', ps('_qh', size=10, bold=True, color=C_DARK)), Spacer(1,3), ] modes = [ ('PHASE 1','Subject-wise QBank','Do topic-by-topic MCQs right after each chapter. Don\'t wait to finish the full subject.', C_TEAL), ('PHASE 2','Year-wise PYQs','After finishing a subject, solve NEET PG + AIIMS PYQs year-wise. Repeat 5–7 times total.', C_BLUE), ('PHASE 3','Custom Module','Mix subjects to simulate real exam feel. Use in the last 3 months only.', C_PURPLE), ] for ph, name, desc, col in modes: mt = Table([ [Paragraph(ph, ps(f'_mp{ph}', size=7.5, bold=True, color=C_WHITE, center=True)), Paragraph(f'<b>{name}</b>', ps(f'_mn{ph}', size=9, bold=True))], ['', Paragraph(desc, ps(f'_md{ph}', size=8))], ], colWidths=[16*mm, 74*mm], rowHeights=[13,12]) mt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,-1), col), ('BACKGROUND',(1,0),(-1,-1), L_TEAL), ('SPAN',(0,0),(0,-1)), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_left.append(mt) qb_left.append(Spacer(1,2)) qb_right = [ Paragraph('<b>✨ Magic Module — Your Secret Weapon</b>', ps('_mgh', size=10, bold=True, color=C_DARK)), Spacer(1,3), Paragraph('Marrow automatically tracks every question you get wrong and adds it to the Magic Module. This is your personalised weak-spot revision list.', ps('_mgb', size=9)), Spacer(1,4), Paragraph('<b>How to access:</b>', ps('_mgs', size=9, bold=True, color=C_DARK)), Spacer(1,2), ] magic = ['Open Marrow App','Go to QBank section','Tap "Custom Module"','Select "Magic Module"','Solve 20 min daily — every day'] for i, s in enumerate(magic, 1): mt2 = Table([[Paragraph(str(i), ps(f'_mi{i}', size=8, bold=True, color=C_WHITE, center=True)), Paragraph(s, ps(f'_ms{i}', size=9))]], colWidths=[10*mm, 78*mm], rowHeights=[13]) mt2.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_AMBER), ('BACKGROUND',(1,0),(1,0), L_AMBER), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_right.append(mt2) qb_right.append(Spacer(1,1)) qb_right.append(Spacer(1,5)) qb_right.append(Paragraph('<b>Daily MCQ Targets:</b>', ps('_dmt', size=9, bold=True, color=C_DARK))) qb_right.append(Spacer(1,2)) tgts = [ [Paragraph('Phase', ps('_th', size=8.5, bold=True, color=C_WHITE)), Paragraph('Target/day', ps('_th2', size=8.5, bold=True, color=C_WHITE)), Paragraph('Notes', ps('_th3', size=8.5, bold=True, color=C_WHITE))], [Paragraph('Phase 1 (pre-clinicals)', ps('_tr1', size=8)), Paragraph('40–50 Qs', ps('_tr1b', size=8)), Paragraph('After each chapter', ps('_tr1c', size=8))], [Paragraph('Phase 2 (clinicals)', ps('_tr2', size=8)), Paragraph('60–80 Qs', ps('_tr2b', size=8)), Paragraph('Subject + PYQ mix', ps('_tr2c', size=8))], [Paragraph('Phase 3 (revision)', ps('_tr3', size=8)), Paragraph('100–120 Qs', ps('_tr3b', size=8)), Paragraph('Custom + Grand Test', ps('_tr3c', size=8))], ] tgt_t = Table(tgts, colWidths=[34*mm, 24*mm, 30*mm], rowHeights=[13]*4) tgt_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_TEAL), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_TEAL, colors.HexColor('#b2dfdb')]), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) qb_right.append(tgt_t) story.append(two_col(qb_left, qb_right)) story.append(Spacer(1,6)) # ══ 04 FACULTY ═══════════════════════════════════════════════════════════════ story.append(banner('04 👨⚕️ FACULTY GUIDE — Best Teacher Per Subject', C_PURPLE)) fac_rows = [ [Paragraph(h, ps(f'_fh{i}', size=8.5, bold=True, color=C_WHITE)) for i, h in enumerate(['Subject','Marrow Faculty','Rating','Notes'])], ['Medicine','Dr. Rakesh S Nair','⭐⭐⭐⭐⭐','Excellent clinical vignette approach'], ['Surgery','Dr. Rohan Khandelwal','⭐⭐⭐⭐⭐','Best surgery teacher on any platform'], ['Pathology','Dr. Sparsh Gupta','⭐⭐⭐⭐⭐','Very MCQ-oriented, clear explanations'], ['Pharmacology','Dr. Gobinath / Dr. Rajesh','⭐⭐⭐⭐','Good for high-yield drug classes'], ['OBG','Dr. Sakshi Arora','⭐⭐⭐⭐⭐','Industry gold standard for OBG'], ['Pediatrics','Dr. Singaram','⭐⭐⭐⭐','Comprehensive; good for milestones'], ['Microbiology','Marrow Faculty','⭐⭐⭐','Use RR only; supplement with notes'], ['PSM / Community','Marrow Faculty','⭐⭐⭐⭐','Biostat — supplement with YouTube (Dirty Medicine)'], ['Ophthalmology','Marrow Faculty','⭐⭐⭐⭐','RR videos are excellent for Ophtho'], ['ENT','Marrow Faculty','⭐⭐⭐⭐','RR videos sufficient; 2 days max'], ['Dermatology','Dr. Malcolm Pinto','⭐⭐⭐⭐','Good image-based question coverage'], ['Forensic Medicine','Marrow Faculty','⭐⭐⭐⭐','Well-structured, very high-yield'], ['Orthopedics','Dr. Abbas Ali','⭐⭐⭐⭐','Marrow RR very good for Ortho'], ['Psychiatry','Dr. Mohan Sunil Kumar','⭐⭐⭐⭐','DSM criteria very clearly explained'], ['⚠️ Anatomy','Dr. Najeeb (YouTube)','⭐⭐⭐⭐⭐','SKIP Marrow Anatomy — use Dr. Najeeb YouTube'], ['⚠️ Physiology','AK Lectures (YouTube)','⭐⭐⭐⭐⭐','SKIP Marrow Physio — use AK Lectures YouTube'], ['Biochemistry','Marrow RR only','⭐⭐⭐','Low yield; RR + PYQs only (2 days max)'], ['Radiology','Marrow RR only','⭐⭐⭐','Very short; 1 day max'], ['Anesthesia','Marrow RR only','⭐⭐⭐','Very short; 1 day max'], ] # Convert string rows to Paragraph def fac_row(row, i): bg_row = colors.HexColor('#fff9c4') if '⚠️' in row[0] else (L_PURPLE if i%2==0 else colors.HexColor('#ede7f6')) return [Paragraph(row[0], ps(f'_fa{i}0', size=8, bold='⚠️' in row[0], color=C_ORANGE if '⚠️' in row[0] else C_DARK)), Paragraph(row[1], ps(f'_fa{i}1', size=8)), Paragraph(row[2], ps(f'_fa{i}2', size=8, center=True)), Paragraph(row[3], ps(f'_fa{i}3', size=8))] fac_table_data = [fac_rows[0]] + [fac_row(r, i) for i, r in enumerate(fac_rows[1:])] ft2 = Table(fac_table_data, colWidths=[34*mm, 44*mm, 24*mm, 80*mm], rowHeights=[14]+[12.5]*19) fac_sty = [ ('BACKGROUND',(0,0),(-1,0), C_PURPLE), ('FONTSIZE',(0,0),(-1,-1),8.5), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_PURPLE, colors.HexColor('#ede7f6')]), ('BACKGROUND',(0,15),(-1,16), colors.HexColor('#fff9c4')), ] ft2.setStyle(TableStyle(fac_sty)) story.append(ft2) story.append(Spacer(1,3)) story.append(Paragraph('⚠️ Yellow rows = skip Marrow videos entirely; use the YouTube channels listed for those subjects.', ps('_fn', size=8, italic=True, color=colors.HexColor('#888888'), center=True))) story.append(Spacer(1,6)) # ══ 05 RAPID REVISION ════════════════════════════════════════════════════════ story.append(banner('05 ⚡ RAPID REVISION (RR) — When & How to Use It', C_ORANGE)) rr_left = [ Paragraph('<b>What is Rapid Revision?</b>', ps('_rrh', size=10, bold=True, color=C_DARK)), Spacer(1,3), Paragraph('Short, condensed versions of full lectures covering only high-yield points. Meant for revision after 1st reading — NOT as a replacement for it.', ps('_rrb', size=9)), Spacer(1,4), Paragraph('<b>When to use RR:</b>', ps('_rrwh', size=9, bold=True, color=C_DARK)), Spacer(1,2), ] rr_when = [ ('After completing 1st reading of a subject', '✓'), ('During Phase 3 revision', '✓'), ('Anatomy, Physio, Biochem, Micro, Radiology, Anaes', '✓ primary'), ('Instead of 1st reading of a full subject', '✗'), ('Before you have done any MCQs on that topic', '✗'), ] for txt, mark in rr_when: is_yes = '✓' in mark rt = Table([[Paragraph(txt, ps(f'_rw{txt[:5]}', size=8.5)), Paragraph(mark, ps(f'_rm{txt[:5]}', size=8.5, bold=True, color=C_GREEN if is_yes else C_MARROW, center=True))]], colWidths=[73*mm, 16*mm], rowHeights=[13]) rt.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ])) rr_left.append(rt) rr_left.append(Spacer(1,1)) rr_left.append(Spacer(1,4)) rr_left.append(Paragraph('<b>Best RR on Marrow (community rated):</b>', ps('_brrh', size=9, bold=True, color=C_DARK))) rr_left.append(Spacer(1,2)) best_rr = Table([ [Paragraph(s, ps(f'_br{i}', size=8, bold=True, color=C_WHITE, center=True)) for i, s in enumerate(['Anatomy','Surgery','OBG','Ortho','Physio'])], [Paragraph('⭐⭐⭐⭐⭐', ps(f'_bs{i}', size=8, center=True)) for i in range(5)], ], colWidths=[18*mm]*5, rowHeights=[13,12]) best_rr.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_ORANGE), ('BACKGROUND',(0,1),(-1,1), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ])) rr_left.append(best_rr) rr_right = [ Paragraph('<b>RR Workflow (follow this order):</b>', ps('_rrwfh', size=10, bold=True, color=C_DARK)), Spacer(1,3), ] rr_steps = [ ('1','Finish 1st reading + MCQs of a subject'), ('2','Take 1–2 day gap (study another subject)'), ('3','Come back, watch RR videos for that subject'), ('4','Annotate Marrow PDF notes as you watch'), ('5','Redo PYQs for that subject after RR'), ('6','Move to next subject in your plan'), ] for num, txt in rr_steps: rs = Table([[Paragraph(num, ps(f'_rrs{num}', size=8, bold=True, color=C_WHITE, center=True)), Paragraph(txt, ps(f'_rrt{num}', size=9))]], colWidths=[10*mm, 78*mm], rowHeights=[14]) rs.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), C_ORANGE), ('BACKGROUND',(1,0),(1,0), L_ORANGE), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) rr_right.append(rs) rr_right.append(Spacer(1,1)) rr_right.append(Spacer(1,5)) rr_right.append(Paragraph('<b>Marrow Notes PDF — The Golden Rule:</b>', ps('_mrh', size=9, bold=True, color=C_DARK))) rr_right.append(Spacer(1,2)) note_tips = [ '→ Download subject PDF from Marrow app', '→ Print it or annotate on tablet', '→ Mark key points as you watch videos', '→ This IS your Last Minute Revision (LMR)', '→ Never make separate notes from scratch', '→ Revise from this PDF before every Grand Test', ] for nt in note_tips: rr_right.append(Paragraph(nt, ps(f'_nt{nt[:5]}', size=8.5))) rr_right.append(Spacer(1,1)) story.append(two_col(rr_left, rr_right)) story.append(Spacer(1,6)) # ══ 06 GRAND TESTS ════════════════════════════════════════════════════════════ story.append(banner('06 🏆 GRAND TESTS — Strategy & Analysis Protocol', C_GREEN)) gt_rows = [ [Paragraph(h, ps(f'_gth{i}', size=9, bold=True, color=C_WHITE)) for i, h in enumerate(['GT Type','When to Start','Frequency','After Each GT'])], ['Mini Subject Tests','After each subject (Phase 1–2)','1 per subject','Fix weak chapters before moving on'], ['Subject-wise Full Tests','Phase 2 — after 1st reading done','1–2 per week','Revise low-scoring topics next week'], ['Full Grand Tests (200Q)','Phase 3 — April 2027 onwards','2–3 per week','30-min analysis per GT (below)'], ['NEET PG Mock Series','Last 6–8 weeks before exam','Daily if possible','Focus only on weak areas from analysis'], ] def gt_para(row, i): return [Paragraph(c, ps(f'_gtr{i}{j}', size=8.5)) for j, c in enumerate(row)] gt_data = [gt_rows[0]] + [gt_para(r, i) for i, r in enumerate(gt_rows[1:])] gt_t = Table(gt_data, colWidths=[40*mm, 46*mm, 32*mm, 64*mm], rowHeights=[14]+[13]*4) gt_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_GREEN), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_GREEN, colors.HexColor('#c8e6c9')]), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ])) story.append(gt_t) story.append(Spacer(1,4)) story.append(Paragraph('<b>Post-GT Analysis Protocol (30 minutes after every Grand Test):</b>', ps('_gta', size=9, bold=True, color=C_DARK))) story.append(Spacer(1,3)) analysis = [ [Paragraph('Step', ps('_ath', size=8.5, bold=True, color=C_WHITE)), Paragraph('Action', ps('_ath2', size=8.5, bold=True, color=C_WHITE)), Paragraph('Time', ps('_ath3', size=8.5, bold=True, color=C_WHITE))], ['1','Check subject-wise accuracy first — not overall score','5 min'], ['2','Open EVERY wrong answer and read the full explanation','15 min'], ['3','Classify each wrong Q: concept gap vs. silly mistake','5 min'], ['4','Add concept-gap Qs to Magic Module; re-read that topic','3 min'], ['5','Note the 3 weakest subjects for next week focus','2 min'], ] def an_para(row, i): return [Paragraph(row[0], ps(f'_an{i}0', size=8.5, bold=True, color=C_GREEN, center=True)), Paragraph(row[1], ps(f'_an{i}1', size=8.5)), Paragraph(row[2], ps(f'_an{i}2', size=8.5, center=True))] an_data = [analysis[0]] + [an_para(r, i) for i, r in enumerate(analysis[1:])] an_t = Table(an_data, colWidths=[10*mm, 140*mm, 18*mm], rowHeights=[14]+[13]*5) an_t.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0), C_GREEN), ('ROWBACKGROUNDS',(0,1),(-1,-1),[L_GREEN, colors.HexColor('#c8e6c9')]), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),5), ('ALIGN',(0,1),(0,-1),'CENTER'), ('ALIGN',(2,0),(2,-1),'CENTER'), ])) story.append(an_t) story.append(Spacer(1,6)) # ══ 07 + 08 NOTES / DOS & DONTS (side by side) ════════════════════════════════ story.append(banner("07 📄 Notes Rule + 08 ⚠️ Marrow Do's & Don'ts", C_GREY)) # Notes rules (left) notes_left = [ Paragraph('<b>07 Notes — Golden Rule</b>', ps('_nh', size=10, bold=True, color=C_DARK)), Spacer(1,3), ] notes = [ ('✅ DO', C_GREEN, [ 'Download Marrow PDF notes for every subject', 'Annotate PDF while watching videos', 'Add your own mnemonics in the margin', 'Use annotated PDF as LMR material', 'Revise from PDF before every GT', ]), ('✗ DON\'T', C_MARROW, [ 'Make your own notes from scratch', 'Copy slides into a new notebook', 'Spend hours making "aesthetic" notes', 'Wait till exam month to start annotating', ]), ] for label, col, items in notes: lh = Table([[Paragraph(label, ps(f'_nl{label}', size=8.5, bold=True, color=C_WHITE, center=True))]], colWidths=[89*mm], rowHeights=[13]) lh.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1), col), ('VALIGN',(0,0),(-1,-1),'MIDDLE')])) notes_left.append(lh) for it in items: nr = Table([[Paragraph(it, ps(f'_ni{it[:5]}', size=8.5))]], colWidths=[89*mm], rowHeights=[13]) nr.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1), L_AMBER), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),6), ])) notes_left.append(nr) notes_left.append(Spacer(1,2)) # Do's & Don'ts (right) dd_right = [ Paragraph("<b>08 Common Intern Mistakes to Avoid</b>", ps('_ddh', size=10, bold=True, color=C_DARK)), Spacer(1,3), ] dos = [ ('✅','Use Magic Module daily for 20 min'), ('✅','Start subject-wise QBank after every chapter'), ('✅','Study Anatomy/Physio from YouTube (not Marrow)'), ('✅','Start GTs only after 4+ subjects covered'), ('✅','Keep a mistake log of wrong Qs'), ('✅','Solve PYQs topic-wise first, year-wise later'), ] donts = [ ('✗','Do Grand Tests in Month 1 — demoralizing'), ('✗','Watch every Marrow video — huge time sink'), ('✗','Ignore wrong answers in QBank'), ('✗','Use Marrow RR instead of 1st reading'), ('✗','Re-attempt same Qs right after seeing answers'), ('✗','Study randomly without a subject-wise plan'), ] for (dm, dt), (xm, xt) in zip(dos, donts): row = Table([ [Paragraph(f'{dm} {dt}', ps(f'_do{dt[:5]}', size=8.5, color=C_GREEN)), Paragraph(f'{xm} {xt}', ps(f'_dx{xt[:5]}', size=8.5, color=C_MARROW))], ], colWidths=[44*mm, 44*mm], rowHeights=[13]) row.setStyle(TableStyle([ ('BACKGROUND',(0,0),(0,0), colors.HexColor('#e8f5e9')), ('BACKGROUND',(1,0),(1,0), colors.HexColor('#ffebee')), ('GRID',(0,0),(-1,-1),0.3, BORDER), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),4), ])) dd_right.append(row) dd_right.append(Spacer(1,1)) story.append(two_col(notes_left, dd_right)) story.append(Spacer(1,5)) # ── FOOTER ──────────────────────────────────────────────────────────────────── story.append(HRFlowable(width=W, thickness=0.5, color=BORDER)) story.append(Spacer(1,3)) story.append(Paragraph( 'Marrow Resource Guide | NEET PG 2027 | MBBS Intern, Bangalore | July 2026', ps('_ft', size=8, italic=True, color=colors.HexColor('#888888'), center=True))) story.append(Paragraph( '"The QBank is your real teacher. Videos are just the introduction."', ps('_fq', size=8, italic=True, color=colors.HexColor('#aaaaaa'), center=True))) doc.build(story) print("SUCCESS:", output_path) PYEOF
Marrow Resource Guide
PDF Document · PDF
| Section | What's covered |
|---|---|
| 01 Intern Mode | What it is, 6 key features, 6-step activation walkthrough |
| 02 Video Strategy | 7 tips - speed, annotation, phone vs laptop, chapter-per-sitting rule |
| 03 QBank Mastery | 3 modes in order (Subject → PYQ → Custom), Magic Module step-by-step, daily MCQ targets by phase |
| 04 Faculty Guide | All 19 subjects with best faculty name, star rating, and notes - including which 2 subjects to skip Marrow for and use YouTube instead |
| 05 Rapid Revision | When to use RR (with ✓/✗ table), 6-step RR workflow, best RR subjects, Marrow Notes PDF rules |
| 06 Grand Tests | 4 GT phases with timing and frequency, full 30-minute post-GT analysis protocol |
| 07 Notes Rule | Do/Don't table for note-making |
| 08 Do's & Don'ts | 6 most common intern mistakes side-by-side with the right approach |