All projects
WebLive

This site + Digital Twin

My portfolio, with an AI chat that answers questions about my career using only facts from my CV.
Overview

My online CV and portfolio, built with Nuxt 4 and Nuxt UI. Its standout feature is the Digital Twin: an AI chat that answers questions about my career in the first person, grounded only in the facts from my CV, so recruiters can ask what they actually want to know.

Home page hero
Home page hero
Career timeline
Career timeline
Project case study page
Project case study page
Digital Twin preview on the home page
Digital Twin preview on the home page

How it works

  1. 1Ask

    A visitor types a question on the Digital Twin page.

  2. 2Server route

    A Nuxt server route receives the conversation, keeps the last 20 valid messages and drops anything malformed.

  3. 3Grounded prompt

    The system prompt is built from the same typed profile data the pages render, with rules against inventing technologies, metrics or client names.

  4. 4Model with fallbacks

    OpenRouter tries a list of free models in order until one answers.

  5. 5Answer

    The reply comes back to the chat, written as me, in the language the question was asked in.

One source of truth
  • Career facts and projects live in typed data files shared by the pages and the server
  • Updating the CV means editing one file; the site and the Digital Twin can’t drift apart
  • Adding a project means adding one entry; its card and case study page are generated
Stack & delivery
  • Nuxt 4, Nuxt UI and Tailwind CSS 4, written in TypeScript
  • English and European Portuguese versions with @nuxtjs/i18n
  • Deployed on Vercel with Vercel Analytics
  • Home page prerendered for fast first load

Design decisions

Grounded, not creative

Low temperature and explicit rules: the twin says it doesn’t have the information rather than guessing.

API key stays on the server

The browser only talks to the site’s own endpoint; the OpenRouter key never reaches the client.

Free models with fallbacks

Free models get rate-limited or retired without notice, so the twin lists several and uses the first that answers.

Rate-limited chat

A per-visitor limit (5 a minute, 50 a day) stops bots from using up the daily free-model quota.

Content as data

Pages are templates over typed data, which keeps the content easy to update and type-checked.

Stack
Nuxt 4Nuxt UITailwind CSSTypeScriptOpenRouterVercel

© 2026 Daniel Paulino • Built with Nuxt • Updated October 2026