My personal website, built with Next.js 13, Tailwind CSS, Upstash Redis, Contentlayer and deployed to Vercel.
- ⚡️ Next.js 13 App Router
- 🎨 Tailwind CSS for styling
- 📈 Upstash Redis for view counting
- 📝 MDX for content management via Contentlayer
- 🎭 Framer Motion animations
- 📊 Vercel Analytics integration
- 🌓 Dark mode optimized
- 📱 Responsive design
- 🔍 SEO optimized with meta tags
- 🔗 Social media integration
- 📄 Blog support
- 🖼️ Project showcase
- 📊 Page view counter
- 🎨 Custom animations
- 🔒 TypeScript support
- 📃 Resume request support
- 🕺 Fun zone with an interactive snake game with stats and Redis leaderboard
- 💡 Development tips fetched async & randomly, with auto-update
- 🪪 Virtual business card — QR code, vCard/VCF download, WhatsApp link
- 🎓 Certifications carousel — 79 certs, 9 authorities, 10 domains
- 📲 PWA — installable on iOS and Android
MDX project files processed by Contentlayer at build time into typed Project objects. Each project page increments a view counter in Upstash Redis (INCR) server-side on load. Content is static; only the counter is dynamic.
app/certifications/data.ts (803 lines): 79 certifications from Meta (20), LinkedIn Learning (39), Coursera (12), Duke University, DeepLearning.AI, HackerRank, Udemy, SoloLearn, HackerX. Domains: Backend, Frontend, Mobile, Data Science, Blockchain, Security, DevOps, Languages, AI/ML, Fundamentals. Rendered in a client-side filtered CertificationCarousel — no server round-trip for domain switching.
BusinessCardPanel.tsx (373 lines): VCF served at /eric-gitangu.vcf (importable by iOS Contacts, Android, Outlook, macOS Contacts). QR code generated client-side via qrcode.react pointing to the VCF URL. WhatsApp deep-link QR. Fixed left-edge tab on desktop, floating bottom-left pill on mobile.
SnakeGame.tsx (383 lines): canvas rendering with a 20px grid, responsive sizing (300–400px), keyboard arrows + react-swipeable for mobile, speed curve 200ms → 50ms floor, Vibration API haptics via useHaptics, ZADD to Upstash Redis sorted set snake:leaderboard on game over, top-10 leaderboard rendered alongside the game.
Snake game + TipFetcher (random dev tip from edge route handler, auto-refreshes every 30s) + Particles (canvas particle system, zero library dependencies).
PWAInstallPrompt hooks the beforeinstallprompt browser event for a custom install prompt. manifest.json generated at build. Installable on iOS (Add to Home Screen) and Android.
app/lib/structured-data.ts: Schema.org JSON-LD for Person, WebSite, ProfilePage, BreadcrumbList, ItemList, AboutPage. Per-page generateMetadata for og/twitter tags — no third-party SEO library.
- Framework: Next.js 13 App Router
- Styling: Tailwind CSS
- Content: MDX + Contentlayer
- Database: Upstash Redis
- Analytics: Vercel Analytics
- Deployment: Vercel
- Animations: Framer Motion
- Icons: Lucide React
- QR code: qrcode.react
- Mobile input: react-swipeable
- Markdown: Rehype + Remark plugins
- Code Formatting: Rome
- Font: Inter (Google Fonts) + CalSans
I'm a seasoned software engineering leader with over 11 years of experience. I specialize in architecting scalable systems, driving technical strategy, and building high-performing engineering teams.
- 🎯 Technical Leadership & Strategy
- 🛡️ AI/ML Security Solutions
- 🏗️ Scalable System Architecture
- 👥 Team Building & Mentorship
- 🚀 Product Development Lifecycle
- Languages: Python, Java, Golang, React, C++, JavaScript, Solidity, TypeScript, Rust
- Cloud & Infrastructure: AWS, Google Cloud, Azure
- Data & Analytics: Big Data, Google BigQuery
- Blockchain: Smart Contracts, DApps
- DevOps: Kubernetes, CI/CD, Docker
- 🎓 Microsoft Scholarship Recipient (2012–2013)
- 🏆 Google Scholarship Recipient (2011–2012)
- 📚 Dean's List — University of Massachusetts Lowell
pnpm install
pnpm devRequires UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN in .env.local.