MEDPLANNER - STUDY TRACKER

Your personal exam tracker

Systematic, week-by-week preparation for USMLE Step 1, NEET PG, and custom exam workflows with daily logs, AI tutor support, and progress tracking.

USMLE Step 1 · Ready NEET PG · Ready AI Planner · Included Free Forever
Welcome back
Sign in or create account
Cloud sync keeps your progress safe across every device while daily logs, AI tools, and tracker changes stay connected.
Step 1 of 2
What's your name?
We'll personalise your dashboard just for you.
Step 2 of 2
Which tracker, friend?
Pick your exam and MedPlanner will load the matching weekly tracker, daily logging tools, and AI support flow automatically.
USMLE Step 1
USMLE Step 1 Tracker
18-week plan · Pathoma, First Aid, Sketchy, UWorld, Anki
Ready
NEET PG
NEET PG Tracker
Standard 12 month plan · All 19 subjects, 196 chapters
Ready
✏️
Custom Tracker i
Build your own plan — any exam, any timeline, AI-powered
Ready
crafted with care
For Planning

Weekly study plans that stay realistic

Use MedPlanner to organize USMLE Step 1, NEET PG, or custom exam prep with a clean weekly system that is easy to follow every day.

For Tracking

Daily logs, scores, and progress in one place

Track study blocks, to-dos, streaks, daily work, and exam scores so your preparation history is visible and useful.

For Adjusting

AI tutor support that uses real study data

Get analytics, weak-area guidance, and plan help based on progress, daily logs, and recent score trends inside your tracker.

document.getElementById('step2').classList.add('active'); } // 4. Handle Password Reset Form if triggered by recovery hash if (window.location.hash.includes('type=recovery')) { const loginForm = document.getElementById('auth-login-form'); if (loginForm) { loginForm.innerHTML = `
Enter your new password below.
`; } } }); async function submitNewPassword(){ const pass = document.getElementById('new-pass').value; const confirm = document.getElementById('new-pass-confirm').value; const errEl = document.getElementById('reset-err'); const btn = document.querySelector('#auth-login-form .auth-btn'); if(!pass || pass.length < 6){ errEl.textContent='Password must be at least 6 characters.' ; return; } if(pass !==confirm){ errEl.textContent='Passwords do not match.' ; return; } btn.disabled=true; btn.textContent='Updating...' ; try { const { error }=await _supabase.auth.updateUser({ password: pass }); if(!error){ let t=document.createElement('div'); t.style.cssText='position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#1c2238;border:1px solid #34c5b0;color:#eeecea;padding:10px 20px;border-radius:8px;font-size:13px;z-index:9999;' ; t.textContent='✅ Password updated! Please sign in.' ; document.body.appendChild(t); setTimeout(()=> { t.remove(); location.reload(); }, 2500); } else { errEl.textContent = error.message || 'Update failed.'; btn.disabled = false; btn.textContent = 'Set New Password →'; } } catch(e) { errEl.textContent = 'Something went wrong.'; btn.disabled = false; btn.textContent = 'Set New Password →'; } } function goBack(){ document.getElementById('step2').classList.remove('active'); document.getElementById('step1').classList.add('active'); } function selectTracker(t){ selectedTracker = t; document.querySelectorAll('.tracker-opt').forEach(o=>o.classList.remove('selected')); document.getElementById('opt-'+t).classList.add('selected'); } function launch(){ const name = localStorage.getItem('med_welcome_name') || 'Friend'; const tracker = selectedTracker; const info = TRACKER_INFO[tracker]; // Save to localStorage so target tracker can read name localStorage.setItem('med_welcome_name', name); localStorage.setItem('med_welcome_tracker', tracker); localStorage.setItem('med_welcome_done', '1'); // Save into each tracker's own key if(tracker === 'usmle'){ try{ const s = JSON.parse(localStorage.getItem('pub_usmle_v1')||'{}'); s._ws_name = name; s._ws_tracker = 'step1'; s._welcome_done = true; localStorage.setItem('pub_usmle_v1', JSON.stringify(s)); }catch(e){} } else if(tracker === 'neetpg'){ try{ const s = JSON.parse(localStorage.getItem('pub_neet_v1')||'{}'); s._neet_name = name; // Do NOT set _neet_welcome here — neetpg.html needs to show the plan // duration selection (6m/12m/18m) before marking welcome as done localStorage.setItem('pub_neet_v1', JSON.stringify(s)); }catch(e){} } else if(tracker === 'custom'){ try{ const s = JSON.parse(localStorage.getItem('pub_usmle_v1')||'{}'); s._ws_name = name; s._ws_tracker = 'custom'; s._welcome_done = true; localStorage.setItem('pub_usmle_v1', JSON.stringify(s)); }catch(e){} } // Quick beautiful exit transition — no loading screen const activeStep = document.getElementById('step2'); const overlay = document.getElementById('launch-overlay'); // Animate the current card out activeStep.classList.add('launch-exit'); // Fade overlay in after a tiny delay setTimeout(() => { overlay.classList.add('active'); }, 150); // Navigate as soon as animation completes setTimeout(() => { window.location.href = TRACKER_URLS[tracker]; }, 450); } function togglePw(id, btn) { const inp = document.getElementById(id); const isHidden = inp.type === 'password'; inp.type = isHidden ? 'text' : 'password'; btn.style.opacity = isHidden ? '1' : '0.45'; btn.title = isHidden ? 'Hide password' : 'Show password'; } document.getElementById('login-pass').addEventListener('keydown', e=>{ if(e.key === 'Enter') handleAuth(); }); document.getElementById('signup-pass').addEventListener('keydown', e=>{ if(e.key === 'Enter') handleAuth(); }); document.getElementById('guest-name').addEventListener('keydown', e=>{ if(e.key === 'Enter') submitGuestName(); }); // ── Support the Creator ───────────────────────────────────────────────── (function(){ // Main panel toggle (International / UPI) window.supportToggle = function(panel) { var panels = ['intl', 'upi']; panels.forEach(function(p) { var el = document.getElementById('support-panel-' + p); var btn = document.getElementById('support-btn-' + p); if (!el || !btn) return; var isOpen = el.classList.contains('open'); if (p === panel) { el.classList.toggle('open', !isOpen); btn.classList.toggle('active', !isOpen); // reset QR sub-panels when closing if (isOpen) { ['support-qr-intl','support-qr-upi'].forEach(function(id){ var q = document.getElementById(id); if (q) { q.classList.remove('open'); q.style.opacity='0'; } }); ['btn-qr-bmc','btn-qr-paypal','btn-qr-paypal-upi'].forEach(function(id){ var b = document.getElementById(id); if (b) b.classList.remove('active'); }); } } else { el.classList.remove('open'); btn.classList.remove('active'); } }); }; // QR sub-panel toggle var _currentQR = null; window.supportShowQR = function(type) { var qrMap = { 'bmc': 'support-qr-intl', 'paypal': 'support-qr-intl', 'paypal-upi': 'support-qr-upi' }; var btnMap = { 'bmc': 'btn-qr-bmc', 'paypal': 'btn-qr-paypal', 'paypal-upi': 'btn-qr-paypal-upi' }; var qrContentMap = { 'bmc': 'MedPlanner illustration
Scan with phone camera or BMC app
', 'paypal': 'MedPlanner illustration
Scan with PayPal app · Uzair Abdullah
' }; var panelId = qrMap[type]; var btnId = btnMap[type]; var panel = document.getElementById(panelId); var btn = document.getElementById(btnId); if (!panel) return; var isOpen = panel.classList.contains('open'); // If same one, toggle off if (_currentQR === type && isOpen) { panel.classList.remove('open'); panel.style.opacity = '0'; if (btn) { btn.classList.remove('active'); btn.textContent = btn.textContent.replace('Hide','Show'); } _currentQR = null; return; } // Fill content if needed var inner = document.getElementById(panelId + '-inner'); if (inner && qrContentMap[type]) inner.innerHTML = qrContentMap[type]; // Close any open QR panel in this group ['support-qr-intl','support-qr-upi'].forEach(function(id){ var q = document.getElementById(id); if (q && q !== panel) { q.classList.remove('open'); q.style.opacity='0'; } }); ['btn-qr-bmc','btn-qr-paypal','btn-qr-paypal-upi'].forEach(function(id){ var b = document.getElementById(id); if (b && b !== btn) { b.classList.remove('active'); if(b.textContent.includes('Hide')) b.textContent=b.textContent.replace('Hide','Show'); } }); panel.classList.add('open'); panel.style.opacity = '1'; if (btn) { btn.classList.add('active'); } _currentQR = type; }; // Copy UPI ID window.supportCopyUPI = function() { var upi = 'umd3689@oksbi'; var btn = document.getElementById('upi-copy-btn'); if (navigator.clipboard) { navigator.clipboard.writeText(upi).then(function() { if (btn) { btn.textContent = 'Copied!'; setTimeout(function(){ btn.textContent = 'Copy'; }, 2000); } }); } else { var ta = document.createElement('textarea'); ta.value = upi; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); if (btn) { btn.textContent = 'Copied!'; setTimeout(function(){ btn.textContent = 'Copy'; }, 2000); } } }; // Hover effects on payment links (via JS, no inline handlers) document.addEventListener('DOMContentLoaded', function() { var bmcEl = document.getElementById('bmc-link'); var ppEl = document.getElementById('paypal-link'); if (bmcEl) { bmcEl.addEventListener('mouseenter', function(){ this.style.transform='translateY(-2px)'; this.style.boxShadow='0 8px 22px rgba(255,200,0,0.38)'; }); bmcEl.addEventListener('mouseleave', function(){ this.style.transform=''; this.style.boxShadow='0 4px 14px rgba(255,200,0,0.22)'; }); } if (ppEl) { ppEl.addEventListener('mouseenter', function(){ this.style.transform='translateY(-2px)'; this.style.boxShadow='0 8px 22px rgba(0,48,135,0.45)'; }); ppEl.addEventListener('mouseleave', function(){ this.style.transform=''; this.style.boxShadow='0 4px 14px rgba(0,48,135,0.3)'; }); } }); // ── Toast after 45s (once per session) ────────────────────────────── if (sessionStorage.getItem('support_toast_shown')) return; var toast = document.createElement('div'); toast.id = 'support-toast'; toast.innerHTML = '
Enjoying the tracker? Support keeps it free ☕
'; document.body.appendChild(toast); window.supportCloseToast = function(){ toast.classList.remove('show'); }; window.supportScrollAndClose = function(){ supportCloseToast(); var sec = document.getElementById('support-section'); if (sec) sec.scrollIntoView({ behavior: 'smooth', block: 'center' }); }; setTimeout(function(){ toast.classList.add('show'); sessionStorage.setItem('support_toast_shown','1'); }, 45000); })();
✉️

Check your email

We sent a verification link to

📌 Check your inbox, spam, and promotions folder. The email may take a minute to arrive.