Overview
My portfolio is the one link I share with recruiters, classmates and collaborators. It brings together my projects, skills, certificates, resume and contact details, and includes a chatbot that answers questions about me in my own voice.
The problem
A PDF resume can't show working software. I needed a place where someone can see what I've built in a couple of minutes, on any device, and reach me easily.
Goals
- Present projects with real screenshots and a written case study for each
- Work well on phones, since many visitors come from social links
- Be easy to find by name in search results
Approach
Content such as skills and projects lives in data files and is rendered by reusable components, so adding a project means adding one entry. Case study pages are generated at build time from the same data.
Key features
Chat with Carl
An AI assistant that answers questions about my projects, skills and contact details in first person.
Light and dark themes
Follows your system setting by default and remembers your choice.
Project case studies
Desktop and mobile previews, a screenshot gallery and a write-up for every project.
Certificates and resume
Dedicated pages to view each credential and my resume.
Search-friendly
Page metadata, Open Graph tags, a sitemap and Person structured data.
Challenges & solutions
Keeping the AI key private
Problem
Calling the Gemini API from the browser would expose the API key to anyone who opens developer tools.
Solution
The chatbot sends messages to a Next.js API route, which adds the key on the server and calls Gemini. Only the last 12 messages are sent, and the instructions keep answers limited to facts on my portfolio.
Theme flashing on page load
Problem
Pages briefly rendered in the wrong theme before React loaded.
Solution
A tiny script in the layout sets the theme before the page is shown, using the saved choice or the system preference.
Fitting a lot of content on small screens
Problem
The navigation and hero didn't fit well on narrow phones.
Solution
The navigation scrolls sideways on small screens, the hero reorders its content, and layouts adjust at several breakpoints down to 360px wide.
Outcomes
- Live at carldev.vercel.app, with Vercel Analytics tracking page visits.
- New projects can be added by editing a single data file.
What I learned
- How to write chatbot instructions that keep answers grounded in real facts
- Using the Next.js Metadata API for SEO
- Designing mobile-first instead of shrinking a desktop layout