Portfolio Website

Value statement: High-performance developer portfolio showcasing data engineering projects and technical blog with perfect Lighthouse scores and modern web standards.

Overview

Built personal portfolio website using modern web technologies emphasizing performance, accessibility, and developer experience. Astro framework provides static-site generation with React islands for interactivity, Tailwind CSS for utility-first styling, and MDX for content authoring.

Achieved perfect 100/100 Lighthouse scores across all metrics (Performance, Accessibility, Best Practices, SEO). Features include dynamic project showcase, technical blog with syntax highlighting, dark mode, responsive design, and optimized image loading.

Goals

Architecture

┌─────────────────────────────────────────────────────────────┐
│ Astro Framework (SSG) │
│ Static Site Generation | Partial Hydration │
└──────────────────────────┬──────────────────────────────────┘
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Content │ │ React │ │ Styling │
│ (MDX) │ │ Islands │ │ (Tailwind) │
│ │ │ │ │ │
│ - Blog posts │ │ - Theme │ │ - Utility │
│ - Projects │ │ toggle │ │ classes │
│ - Resume │ │ - Giscus │ │ - Dark mode │
│ │ │ comments │ │ - Responsive │
│ │ │ - Search │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└──────────────────┼──────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Build Pipeline │
│ TypeScript | Vite | Image Optimization | Minification │
└──────────────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Static Assets │
│ HTML | CSS | JS | Images (WebP/AVIF) | Fonts │
└──────────────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Deployment (Vercel) │
│ CDN | Edge Functions | Analytics | Auto-HTTPS │
└─────────────────────────────────────────────────────────────┘

Technology Stack

LayerTechnologies
FrameworkAstro 4.x, React 18
LanguageTypeScript (strict mode)
StylingTailwind CSS 3.x, CSS custom properties
ContentMDX, Markdown, Content Collections
ImagesAstro Image, Sharp (WebP/AVIF)
IconsHeroicons, Lucide React
Syntax HighlightingShiki (VS Code highlighting)
CommentsGiscus (GitHub Discussions)
AnalyticsVercel Analytics, Plausible
DeploymentVercel (CDN + Edge Functions)
Version ControlGit, GitHub

Implementation Details

Astro Framework for Performance: Astro’s partial hydration strategy delivers:

React Islands for Interactivity: Strategic use of React for dynamic features:

Tailwind CSS + Dark Mode: Utility-first styling with:

MDX Blog with Syntax Highlighting: Rich content authoring capabilities:

Image Optimization: Automatic image transformations:

SEO Optimization: Comprehensive metadata strategy:

Performance Metrics

Lighthouse Scores (Mobile):

MetricScore
Performance100/100
Accessibility100/100
Best Practices100/100
SEO100/100

Core Web Vitals:

MetricValueTarget
LCP (Largest Contentful Paint)0.8s<2.5s ✓
FID (First Input Delay)8ms<100ms ✓
CLS (Cumulative Layout Shift)0.001<0.1 ✓
TTFB (Time to First Byte)120ms<600ms ✓

Bundle Sizes:

Features & Capabilities

Content Management:

User Experience:

Developer Experience:

Lessons Learned

Astro vs Next.js: Initially considered Next.js but Astro’s content-first approach and zero-JS default made it perfect for portfolio/blog use case. Simpler mental model and better performance out of box.

Islands architecture: Over-hydrating with React everywhere hurts performance. Identifying truly interactive components and using client:visible reduced JS bundle by 60%.

Tailwind adoption curve: Initial resistance to utility classes but quickly appreciated speed of iteration and consistency. Dark mode implementation was trivial compared to traditional CSS.

MDX power: Ability to import React components into Markdown unlocked rich content possibilities (interactive demos, embedded visualizations) without complex CMS.

Image optimization matters: Switching from <img> to <Image> component with automatic WebP/AVIF conversion improved LCP from 1.8s to 0.8s.

Future Improvements