← all projects

Case study · Portfolio Website

Personal Portfolio

My personal portfolio: 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

01 — 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.

02 — 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.

03 — 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

04 — 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.

05 — stack

  • Next.jsApp Router pages, API route for the chatbot, static case studies
  • ReactInteractive components like the chatbot and previews
  • CSSHand-written responsive styles and theme tokens
  • Gemini APIPowers the Chat with Carl assistant
  • VercelHosting and analytics

06 — 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.

07 — 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.

08 — outcomes

  • Live at carldev.vercel.app, with Vercel Analytics tracking page visits.
  • New projects can be added by editing a single data file.

09 — 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

10 — screens