Essay Migration - Implementation Summary
✅ What’s Been Completed
1. Jekyll Infrastructure Setup
- ✅
_config.yml- Jekyll configuration with essay collections - ✅
Gemfile- Ruby dependencies (Jekyll 4.3, plugins) - ✅
_layouts/default.html- Base template with nav/footer - ✅
_layouts/essay.html- Essay-specific layout - ✅
_includes/header.html- Navigation component - ✅
_includes/footer.html- Footer component
2. Essay System Features
- ✅
essays.html- Listing page with:- Search functionality (real-time filtering)
- Category filters (All, Opinion, Events, Student Life, TWTW, Community)
- Chronological listing (newest first)
- Auto-generated from
_essays/collection
- ✅ Essay template with:
- Title, subtitle, date, read time
- LaTeX-inspired typography
- Medium attribution footer
- Back to essays navigation
3. Conversion Tool
- ✅
convert_medium_to_jekyll.py- Automated script that:- Parses Medium HTML exports
- Extracts title, subtitle, date, content
- Downloads images (when accessible)
- Converts HTML → Markdown
- Auto-categorizes essays
- Calculates read time
- Generates Jekyll front matter
4. First Batch Migration
- ✅ 15 essays converted (test batch from 2017-2018)
- ✅ 23 images downloaded and saved locally
- ✅ Essays include:
- “Dear Freshman, from Sophomore” (student advice)
- “The 6 kinds of people in CSE” (opinion)
- Hackathon writeups (Angelhack Bangalore/Kochi)
- TWTW weekly reflections
- “Mastering the art of letting it go”
5. Documentation
- ✅
docs/ESSAY_MIGRATION.md- Full migration guide - ✅
docs/SETUP.md- Updated with Jekyll info - ✅
MIGRATION_SUMMARY.md- This file
6. Deployment
- ✅ Code pushed to GitHub
- ✅ GitHub Pages will build with Jekyll
- ✅ Essays will be live at
joelvzach.com/essays/
📊 Current Status
| Metric | Value |
|---|---|
| Essays converted | 15 / 200 published |
| Essays remaining | 185 |
| Drafts | 139 (not converted) |
| Images downloaded | 23 (some failed with 403) |
| Site size increase | ~2.5MB |
🔧 How It Works
Essay Workflow
Medium HTML Export → Python Script → Markdown + Front Matter → Jekyll Build → HTML Page
File Structure
_essays/
└── 2018-06-04-dear-freshman-from-sophomore.md
├── Front matter (YAML): title, date, categories, etc.
└── Content (Markdown): converted from Medium HTML
essays.html
└── Loops through site.essays collection
└── Displays searchable/filterable list
_layouts/essay.html
└── Template for individual essay pages
🎯 Next Steps
Immediate (For You to Review)
- Test the site locally (optional):
cd site/ bundle install bundle exec jekyll serve # Visit http://localhost:4000/essays - Check GitHub Pages build:
- Go to: https://github.com/joelvzach/joelvzach.github.io/actions
- Wait for build to complete (~2-3 minutes)
- Visit: https://joelvzach.com/essays
- Review converted essays:
- Check formatting quality
- Verify images display correctly
- Test search/filter functionality
Optional: Convert Remaining Essays
When ready to migrate all 185 remaining essays:
cd site/
python3 convert_medium_to_jekyll.py
git add .
git commit -m "Migrate all remaining Medium essays"
git push origin main
Note: This will add ~15-20MB to the repo with all images.
🛠️ Maintenance & Updates
Add New Essay (Manual)
# Create file: _essays/2026-01-01-my-essay.md
---
layout: essay
title: "My Essay"
date: 2026-01-01 00:00:00 +0000
categories: [general]
read_time: 5
---
Write in Markdown here...
Update Categories
Edit convert_medium_to_jekyll.py line ~260 to add new category detection rules.
Change Design
- Edit
_layouts/essay.htmlfor essay page design - Edit
essays.htmlfor listing page design - Edit
assets/css/style.cssfor styling
⚠️ Known Issues & Limitations
Image Downloads
- Issue: Medium CDN returns 403 Forbidden for some images
- Impact: ~30-40% of images couldn’t be downloaded
- Workaround: Script keeps original Medium URLs (may break in future)
- Manual fix: Download failed images manually and update Markdown
Formatting
- Issue: HTML → Markdown conversion is imperfect
- Impact: Some complex formatting may be lost
- Recommendation: Review important essays manually
Drafts
- Status: 139 draft essays not converted
- Recommendation: Review drafts separately, convert selectively
📈 Performance Metrics
Site Size
- Before: ~100KB (5 HTML pages)
- After: ~2.6MB (15 essays + images)
- Full migration estimate: ~15-20MB (200 essays + all images)
Build Time
- GitHub Pages: ~2-3 minutes with Jekyll
- Local (bundle exec jekyll build): ~30-60 seconds
Page Load
- Essays listing: ~50-100KB (fast)
- Individual essay: ~20-50KB (fast)
🎨 Design Features
Essay Listing Page (/essays)
- Search bar: Real-time filtering by title
- Category filters: One-click filtering by topic
- Responsive: Works on mobile and desktop
- Clean design: LaTeX-inspired typography
Individual Essay Page
- Typography: Computer Modern font (LaTeX style)
- Read time: Auto-calculated from word count
- Attribution: “Originally published on Medium” footer
- Navigation: Easy back to essays list
📚 Documentation Files
| File | Purpose |
|---|---|
docs/ESSAY_MIGRATION.md |
Full migration guide with technical details |
docs/SETUP.md |
Website setup and maintenance |
docs/PORKBUN_DNS.md |
DNS configuration for joelvzach.com |
MIGRATION_SUMMARY.md |
This summary document |
🤝 Feedback Requested
Please review and provide feedback on:
- Essay formatting - Does the Markdown conversion look good?
- Design - Is the LaTeX-inspired style working well?
- Functionality - Does search/filter work as expected?
- Next steps - Should we:
- Convert all remaining 185 essays now?
- Wait and convert selectively?
- Add more features first?
📞 Support
If you encounter issues:
- Jekyll build fails: Check Ruby version (need 2.7+)
- Essays not appearing: Verify front matter syntax
- Images broken: Check if downloaded successfully
- GitHub Pages error: Check Actions tab for build logs
Documentation: See docs/ESSAY_MIGRATION.md for troubleshooting