A modern, full-stack portfolio website built with Next.js 14, featuring an integrated blog system, automated resume generation, and responsive design optimized for both mobile and desktop experiences.
This project serves as both a personal portfolio and digital garden, showcasing professional experience while providing a platform for sharing technical insights through blog articles. The system includes an automated resume generation pipeline that maintains consistency between web and PDF formats.
- 📱 Responsive Design: Mobile-first approach with optimized layouts across all device sizes
- 📝 Blog System: MDX-powered articles with syntax highlighting and RSS feed generation
- 📄 Resume Generation: Automated LaTeX-to-PDF resume creation from YAML configuration
- 🎨 Modern UI: Built with shadcn/ui components and Tailwind CSS
- 🌙 Dark Mode: Full theme switching with next-themes
- ⚡ Performance: Optimized for Core Web Vitals with Next.js 14 App Router
- 🔍 SEO Optimized: Automatic metadata generation and structured data
- Frontend: Next.js 14 with App Router, TypeScript, Tailwind CSS
- UI Components: shadcn/ui component system with Radix UI primitives
- Content: MDX for articles with remark/rehype plugins
- Animation: Framer Motion for page transitions and micro-interactions
- Analytics: Vercel Analytics integration
- Resume: Python + LaTeX pipeline for PDF generation
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── articles/ # Blog articles (MDX files)
│ │ ├── feed.xml/ # RSS feed generation
│ │ └── globals.css # Global styles
│ ├── components/ # React components
│ │ ├── ui/ # shadcn/ui components
│ │ └── motion/ # Framer Motion wrappers
│ └── lib/ # Utilities and configurations
├── config.yaml # Portfolio content configuration
├── generate-resume.py # Resume generation script
├── resume-template.tex # LaTeX resume template
├── requirements.txt # Python dependencies for resume
├── setup.sh # Resume dependency installation script
├── Makefile # Resume build automation
├── public/ # Static assets and generated resume
│ └── resume.pdf # Final resume PDF (regenerated by CI on push to main)
├── docs/runbooks/release.md # PR → main → tagged release workflow
├── .github/workflows/ # CI: builds resume PDF on every relevant change
└── CLAUDE.md # Development guidelines
Every PR that touches config.yaml, generate-resume.py,
resume-template.tex, or the Makefile triggers CI that regenerates the
resume PDF. On main the workflow auto-commits the regenerated artifacts;
on tagged releases it attaches public/resume.pdf to the GitHub Release.
Full procedure in
docs/runbooks/release.md.
- Node.js 18+ and npm
- Python 3.x (for resume generation)
- LaTeX distribution (for PDF compilation)
-
Clone the repository
git clone <repository-url> cd portfolio-and-digital-garden
-
Install dependencies
npm install
-
Set up environment
# Create .env.local file echo "NEXT_PUBLIC_SITE_URL=http://localhost:3000" > .env.local
-
Start development server
npm run dev
-
View the site Open http://localhost:3000 in your browser
Articles are stored as MDX files in src/app/articles/[slug]/page.mdx:
// Required article metadata
export const article = {
author: 'Sherod Taylor',
date: 'YYYY-MM-DD',
title: 'Article Title',
description: 'Brief description'
}
// Article content in MDX format
# Article Content
Your content here with full MDX support...All portfolio content is managed through config.yaml:
- Personal Information: Name, title, location, description
- Contact Details: Email, website, social links
- Skills & Experience: Categorized skills with experience levels
- Work History: Detailed position information with achievements
- Projects: Personal and professional project showcases
- Community: Leadership and volunteer activities
The automated resume system converts YAML configuration to professional PDF resumes using a complete LaTeX pipeline.
-
Install dependencies:
make setup
-
Generate resume:
make all
Your resume PDF will be created at public/resume.pdf.
| Command | Description |
|---|---|
make setup |
Install all dependencies (Python venv, PyYAML) |
make all |
Generate PDF from config.yaml (default) |
make clean |
Remove temporary files |
make clean-all |
Remove all generated files |
make help |
Show all available commands |
# Generate LaTeX from config.yaml
python3 generate-resume.py
# Compile to PDF (requires LaTeX installation)
xelatex generated-resume.tex
# or
pdflatex generated-resume.tex- Python 3 with PyYAML (installed automatically by
make setup) - XeLaTeX (TeX Live or MacTeX)
- FiraCode Nerd Font Mono (
brew install font-fira-code-nerd-font)
- YAML Configuration (
config.yaml) → Single source of truth for all resume data - Python Script (
generate-resume.py) → Converts YAML to LaTeX template - LaTeX Compilation (
xelatex) → Generates professional PDF resume
- Consistent Branding: Matches web portfolio design language
- Professional Layout: Single-page optimized format
- Color-Coded Sections: Visual hierarchy with custom highlight boxes
- LaTeX Quality: Publication-ready typography and formatting
- Automated Updates: Content syncs automatically from config.yaml
- Clean Typography: FiraCode Nerd Font Mono with FontAwesome icons
- Responsive Layout: Proper spacing and professional formatting
- Character Escaping: Safe handling of special LaTeX characters
- Mobile:
< 768px- Single column, touch-optimized - Tablet:
768px - 1024px- Balanced layouts - Desktop:
> 1024px- Multi-column, full features
- Mobile-First: Progressive enhancement from mobile base
- CSS Variables: HSL-based color system for theming
- Component Variants: shadcn/ui patterns for consistency
- Performance-First: Optimized animations and image loading
# Development
npm run dev # Start dev server (includes resume build)
npm run build # Production build
npm run start # Start production server
# Code Quality
npm run lint # Run ESLint
npm run prettier # Format code
npm run check # Run all checks
npm run fix # Fix formatting and linting
# Resume Generation
npm run resume:build # Build resume PDF (runs make)
npm run resume:clean # Clean build artifacts (runs make clean)
npm run resume:clean-all # Remove all generated files (runs make clean-all)
make setup # Install resume dependencies
make all # Generate PDF from config.yaml
make clean # Remove temporary files
make clean-all # Remove all generated files- Next.js Image Optimization: Automatic responsive images with lazy loading
- Static Generation: Pre-built pages for optimal loading speeds
- Code Splitting: Automatic bundle optimization
- RSS Feed: Auto-generated from articles with full content
- SEO Optimization: Structured data and meta tag generation
- Create directory:
src/app/articles/YYYY.M.D-slug/ - Add
page.mdxwith required metadata export - Articles automatically appear in listings and RSS feed
- Edit
config.yamlwith new information - Changes reflect immediately on web portfolio
- Regenerate resume PDF for updated resume:
make all # or npm run resume:build
To modify the resume design, edit the LaTeX template section in generate-resume.py. The template includes:
- Modern, professional design with clean typography
- Color-coded sections and highlights from config.yaml
- FontAwesome icons for visual enhancement
- Automatic LaTeX character escaping for special symbols
- Responsive layout with proper spacing
- Follow existing Tailwind utility patterns
- Use CSS variables for theme consistency
- Implement responsive design with mobile-first approach
- Test across all breakpoints and devices
This project is based on the Tailwind UI Spotlight template and is licensed under the Tailwind UI license.