A modern, responsive portfolio website showcasing AI/ML expertise, creative technology solutions, and professional case studies.
🚀 Live Site: https://michael-evans-port.vercel.app
This portfolio site is built with Next.js 15 and features a clean, minimalist design that highlights professional work in AI, software development, and product management. The site includes comprehensive case studies, an AI-powered chatbot assistant, and detailed project documentation.
- AI Chatbot Assistant: Interactive chatbot powered by Google Gemini 1.5 Pro with RAG (Retrieval Augmented Generation)
- Smart Content Sync: Automatic content updates via Sanity webhooks (< 30s latency)
- Dynamic Case Studies: 7 comprehensive case studies with detailed metrics and results
- Responsive Design: Fully responsive layout that works seamlessly across all devices
- Performance Optimized: Next.js 15 with zero TypeScript errors/warnings
- Modern UI: Clean, professional design with Tailwind CSS and shadcn/ui components
- Type Safe: Full TypeScript implementation for robust code
- SEO Ready: Optimized for search engines with metadata and structured data
- CMS Integrated: Sanity CMS for dynamic content management
- Framework: Next.js 15.5 (App Router)
- React: 19.0
- Language: TypeScript 5.8
- Styling: Tailwind CSS 3.4
- UI Components: shadcn/ui with Radix UI primitives
- CMS: Sanity Studio (embedded at
/studio) - Database: Supabase (PostgreSQL with pgvector)
- LLM: Google Gemini 1.5 Pro
- Vector DB: Supabase pgvector
- AI SDK: Vercel AI SDK
- Embeddings: text-embedding-004
- Knowledge Base: 170 chunks from transcripts + Sanity CMS content
- Build Tool: Next.js with Turbopack
- Linting: ESLint
- Package Manager: npm
- Version Control: Git & GitHub
- Deployment: Vercel
michael-evans-port/
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── (public)/ # Public pages (home, about, case studies)
│ │ ├── (admin)/ # Admin dashboard
│ │ ├── api/ # API routes (chat, webhooks)
│ │ └── studio/ # Embedded Sanity Studio
│ ├── components/ # React components
│ │ ├── ui/ # shadcn/ui components (50+)
│ │ ├── chatbot/ # AI chatbot components
│ │ ├── navigation/ # Navigation components
│ │ └── ai-showcase/ # AI project showcase components
│ ├── lib/
│ │ ├── sanity/ # Sanity client & queries
│ │ ├── chatbot/ # Chatbot logic & content ingestion
│ │ └── supabase/ # Database client & types
│ └── hooks/ # Custom React hooks
├── sanity/
│ └── schemas/ # Sanity CMS schemas (project, profile, aiProject, etc.)
├── docs/
│ ├── content-specs/ # Case study content specifications (7 files)
│ ├── chatbot/ # Chatbot documentation
│ └── design/ # Design concepts and explorations
├── memory-bank/ # Development documentation
│ ├── CURRENT.md # Active work tracking
│ ├── PROGRESS.md # Development log
│ └── ... # Additional docs
├── public/
│ └── chatbot-content/
│ └── transcripts/ # Source of truth for chatbot knowledge (9 files)
└── supabase/
└── migrations/ # Database migrations
- Node.js 18+ and npm
- Git
- Sanity account (for CMS)
- Supabase account (for vector database)
Create a .env.local file with the following:
# Sanity CMS
NEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id
NEXT_PUBLIC_SANITY_DATASET=production
SANITY_AUTH_TOKEN=your_token
SANITY_WEBHOOK_SECRET=your_webhook_secret
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
# Google AI
GOOGLE_GENERATIVE_AI_API_KEY=your_google_ai_key
# Optional: Enable Sanity content ingestion
INGEST_SANITY_CONTENT=true- Clone the repository:
git clone https://github.com/mevans2120/michael-evans-port.git
cd michael-evans-port- Install dependencies:
npm install- Start the development server:
npm run dev- Open your browser to
http://localhost:3000
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run ingest # Sync chatbot content to vector DB
npm run memory:start # View current development status- Home (
/) - Dynamic hero with introduction - About (
/about) - Professional background and experience - AI Showcase (
/ai-showcase) - AI/ML project demonstrations/ai-showcase/[slug]- Individual AI project pages
- Case Studies (
/case-studies/[slug]):- Virgin America - First responsive airline website
- Before Launcher - Helping thousands focus (40,000+ downloads)
- Casa Bonita - 40,000-person queue, 100% capacity
- Target - Enterprise e-commerce transformation
- Peddle - 15% conversion increase
- Lyft - 8% driver acquisition improvement
- Aesop - 12% conversion improvement (luxury e-commerce)
- Admin (
/admin/chatbot-content) - Chatbot content management dashboard - Sanity Studio (
/studio) - Embedded CMS
- Answers questions about Michael's background, projects, and expertise
- RAG-powered responses using vector similarity search
- Follow-up question suggestions
- Streaming responses for better UX
- Automatic Updates: Sanity webhook triggers sync on content changes (< 30s)
- Manual Sync: Admin dashboard for on-demand syncing
- Dual Sources: Syncs from Sanity CMS + transcript files
- Incremental Updates: Only re-embeds changed content (98% API cost savings)
- Content Hash Tracking: SHA-256 fingerprinting for change detection
- 170 chunks from 9 transcript files
- Sanity CMS content (case studies, profile, AI projects)
- Technical architecture documentation
- Career history and achievements
Access at /admin/chatbot-content to:
- View sync statistics
- Monitor content sources
- Trigger manual syncs
- Check last sync timestamp
- Single Source of Truth:
public/chatbot-content/transcripts/(9 markdown files) - Flat Structure: Preserves narrative flow of comprehensive transcripts
- Vector Database: Unified search layer for chatbot
- Auto-Sync: Sanity webhooks + manual transcript ingestion
- Atomic Design: Reusable, composable components
- Server Components: Next.js App Router with RSC
- Client Components: Interactive elements with 'use client'
- shadcn/ui Pattern: Components copied into codebase for customization
For detailed architecture, see ARCHITECTURE.md and docs/chatbot/MAINTAINABLE-CONTENT-SYSTEM.md.
This project uses a Memory Bank system for maintaining development continuity:
- CURRENT.md: Active sprint tracking with detailed accomplishments
- PROGRESS.md: Historical development log
- TECHNICAL_DECISIONS.md: Architecture decisions and rationale
- CHANGELOG.md: Version history
Learn more in memory-bank/README.md.
- Typography:
- Headings: DM Sans (sans-serif)
- Body: Crimson Pro (serif)
- Colors: Dark theme with purple gradients (#c084fc, #a855f7)
- Spacing: Tailwind's default spacing scale
- Components: 50+ shadcn/ui components
- Responsive: Mobile-first design approach
- Virgin America - First responsive airline website (20+ awards)
- Before Launcher - Focus app with 40,000+ downloads
- Casa Bonita - Queue system handling 40,000 people at 100% capacity
- Target - 20+ concurrent work streams for enterprise e-commerce
- Peddle - 15% conversion increase for car marketplace
- Lyft - 8% conversion improvement on driver acquisition
- Aesop - 12% conversion improvement for luxury e-commerce
All case studies include:
- Detailed problem/solution narratives
- Measurable results and metrics
- Technical architecture
- Key learnings and insights
The site is deployed on Vercel with automatic deployments from the main branch.
- Configure environment variables in Vercel
- Set up Sanity webhook:
- Go to Sanity dashboard → API → Webhooks
- Add webhook URL:
https://your-domain.com/api/webhooks/sanity - Set secret: Use your
SANITY_WEBHOOK_SECRET - Trigger on: Create, Update, Delete
- Run database migration:
# Apply migration to Supabase psql $DATABASE_URL < supabase/migrations/20251028_add_content_tracking.sql
- Initial content sync:
npm run ingest
-
Via Sanity Studio (
/studio):- Edit case studies, profile, AI projects
- Changes auto-sync to chatbot within 30 seconds
-
Via Transcript Files (
public/chatbot-content/transcripts/):- Add or edit markdown files
- Run
npm run ingestto sync to vector DB
- Create content spec in
docs/content-specs/ - Use export script:
npx tsx src/scripts/export-case-studies-ndjson.ts [slug] - Import to Sanity:
sanity dataset import case-studies.ndjson production - Add images in Sanity Studio
- Content auto-syncs to chatbot
- Check
/admin/chatbot-contentfor sync status - Verify environment variables are set
- Run
npm run ingestto force sync - Check Supabase logs for errors
- Run
npm run lintto check for errors - Clear
.nextfolder and rebuild - Verify all environment variables are set
- Check webhook configuration in Sanity dashboard
- Verify
SANITY_WEBHOOK_SECRETmatches - Test webhook with Sanity's webhook testing tool
- Build: Zero TypeScript errors, zero warnings
- Lighthouse Score: 90+ (target)
- Production Build: All 21 routes optimized
- API Costs: 98% reduction through smart content sync
While this is a personal portfolio, suggestions and feedback are welcome!
This project is proprietary and confidential. All rights reserved.
Michael Evans
- GitHub: @mevans2120
- Email: mevans212@gmail.com
- Website: https://michael-evans-port.vercel.app
- Built with Next.js, Sanity, and shadcn/ui
- AI powered by Google Gemini
- Vector database by Supabase
- Deployed on Vercel
- Icons by Lucide
Last Updated: October 30, 2025