Case study · Portfolio Website

Personal Portfolio

This site: a responsive portfolio that presents my projects, skills, certificates and contact details, with light and dark themes and an AI chatbot that answers questions about my work.

Role
Designer & Developer
Year
2026
Type
Website
Status
Live

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

  1. 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.

  2. 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.

  3. 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

Screens

A closer look at Personal Portfolio.