Skip to content
All posts

Post

My Digital Twin

TLDR: "Do I REALLY need a chatbot on this site?"

· Jim Tierney
My Digital Twin

Answer: No, no I don't, but since I'm just messing around and this IS supposed to be a proof of both concept and an example of how I think about things, why not? Also, why not have fun with it?

How it started

As I'd mentioned in a previous post about this website, the inspo came from a udemy course, specifically giving an example of having an AI agent like cursor or copilot make a simple portfolio from a pdf of data (in this case created by exporting a linkedin profile) and adding a simple digital twin utilizing OpenRouter.

While this was cool, I found the end result of my own digital twin to be rather boring, and honestly, as someone who rarely uses a chatbot unless forced to, I decided I needed to spice it up a bit. OBVIOUSLY I needed to tweak it to at the very least speak in Big Lebowski quotes, so I decided to see how that would go while building my portfolio.

As far as the setup went, I utilized Claude in plan mode to help write out a spec doc outlining the basic details of what I wanted. The ask was to create a digital twin, to utilize my portfolio and skills for the source of info, to utilize a dataset of Big Lebowski quotes, and for there to be two characters. The main character is Jimbo-T, and the other character is 'The Stranger', who only chimes in if Jimbo-T swears. You can checkout the full spec in doc folder on the repo, but the basic summary is as follows:

  1. Feature overview:
    1. Let's visitors ask questions about me.
    2. Spells out the personas.
    3. Clarifies it must stay on topic and give real, accurate answers
  2. Character summary
    1. Personality traits
    2. Sample voice
  3. Model reco: In this case google gemini-2.5-flash via OpenRouter and a brief explanation of why
  4. API Route
    1. Location
    2. Request Schema
    3. Request Details
    4. Response Schema
  5. Stranger Trigger Rules -spelling out when to add the second character
  6. Topic Constraints - What to answer, not answer, and how to respond to off-topic questions
  7. Career Context Injection - Plan to pull career info from Contentful at request, with some basic fallback on request failure.
  8. UI Component Spec - Spelling out how it behaves:
    1. Placement
    2. Collapsed State
    3. Expanded State
    4. Opening State
    5. Mobile Behavior
    6. Accessability
    7. State (React)
  9. New Files - what files will be added during implementation
  10. Environment Variables - what variables need to be server-side
  11. Implementation Checklist - The steps to take broken up by phases
  12. Summary of design decisions

All in all, I preferred planning this before just YOLOing a build, as it let me assess what Claude was thinking, and allowed to make adjustments before coding, although, I wasn't super picky about this, as this feature was more for LOLs than anything else.

Overall, this worked alright, but even with my review of the plan, it really didn't live up to what I wanted. I did a little user acceptance testing (UAT) while trying out different questions, and I realized I didn't like when the the bot would talk about my work and career like it did it. While the bot is based on me, I just didn't like it trying to be me, so I wanted to update it.

Planning the update

Ok, so admittedly, I really didn't do UAT until this feature was already live. I did do some basic QA to make sure it MOSTLY functioned as expected, but wasn't overly concerned, as I figured it wouldn't get much use anyways. That said, I eventually decided I wanted to show the site to some peers, and I had to make sure I was happy enough with the chatbot before saying anything about it. This brought me to a something I always just thought was theoretical in web development... The mythical 'Phase 2' of a project.

Phase 2

In this case, the planning was MUCH simpler. I flipped Claude into plan mode, and pointed to the feature and data, and explained that I wanted more quotes in the data, I wanted Jimbo-T to be it's own being, and if Claude had any other suggestions, I was open to them. I also asked it to ask me questions about this while planning to make sure it understood what I was trying to do. This ended up working out pretty well. Claude clarified what I was looking for, gave me a few multiple-choice questions, then came up with some decisions about next steps:

  • Persona: digital twin / hype-man — third person about Jim, but promotes him.
  • Third-person strictness: mostly third person; rare first-person-plural slips OK for comedic effect. I/me is reserved for Jimbo-t's own banter/opinions, not Jim's accomplishments.
  • Quote pool: add more Dude & Walter lines + activate existing supporting characters + expand Stranger lines.
  • Also: update welcome/suggestion chips, the spec doc, tests, and CLAUDE.md.

I reviewed the new plan, green-lit the suggested changes (while manually approving file changes) and spent a decent amount of time laughing at some of of the details of the implementation. In particular, while Jimbo-T is allowed to swear (it'd be hard to use Lebowski quotes without a bit of light profanity) for some reason, Claude decided to add 'EXCLUDED_QUOTES' and drop what it called 'overtly sexual' lines, in particular Maude's "vagina" quote. I mean, I guess this is supposed to be a website kinda used in a professional setting, but I don't know, man...

Regardless, I was generally happy with this update (although I added one minor visual bug fix into the mix on top of this) and as far as I'm concerned, phase 2 was a success!