Back

Case study

Building in 2026

The day my portfolio started answering back.

Álvaro Velasco
Álvaro VelascoWork: 2025 – 2026 · Published · Updated
Role: Solo, end to endDuration: 2025 – 2026Team: Just me + Claude Code

Owned: Product strategy, design, prompt and system logic, lead scoring, frontend, backend, deploy

Everything's changing, the ground is shaking. What we knew a year ago and what we were capable of has dramatically changed.

How does the continuous shipping of tech affect us as creative human beings? We're in a world where opportunities to make good use of this technology keep multiplying by the second. Every great product idea you had back in the day but weren't capable of getting done because of complex technical constraints (which translated into money) is now a feasible thing when you have a bit of time and cash to spare.

My name is Álvaro, and for the first time in 20 years I feel “Flowers are truly blooming for us” (Tom Misch's new song, on repeat). Let me tell you how I found out.

What I shipped, in a couple of months of evenings

A new portfolio at albruv.com. A chatbot on top of it that answers questions about my work in my voice. A lead qualifier that quietly reads each conversation and emails me only the ones worth my time. Three layers, each one on top of the last. The rest of this case study is how each one came together.

Where I was when I started

Twenty years of product and design leadership. Regulated gaming, consumer AI, B2B SaaS. I know how to pick the right problem, hold a visual language tight, and partner with engineers on what to build.

What I hadn't done in a long time was ship a working product entirely on my own. For years, the shape of my ideas had been constrained by a simple equation: engineers cost money, money is scarce, so every idea I had needed to be negotiated against ten others. The best ones usually lost on cost. “Nice, but not this quarter.”

That equation broke sometime last year.

Installing Claude Code

I'd read enough about what people were building with Claude Code to know it was real, not hype. Full applications. Refactors of large codebases. Production systems shipped by one person in an evening. I didn't believe it would work for me. I'm a designer with product instincts who can read a codebase, not a software engineer.

I installed it anyway.

The first few hours weren't about whether it could code. It obviously could. The question I was quietly asking myself was different: can I lead a build where the engineer is an AI?

Turns out, that's the exact same job I've been doing for twenty years. Picking the right problem. Saying no to scope that doesn't earn its place. Holding the visual language tight. Asking “what's the smallest thing that teaches us the most?” The tools changed. The work did not.

The portfolio came first

I started with albruv.com because it was the safest place to learn. Low stakes, high polish. If I made a mess, only I would see it. And rebuilding a portfolio is the kind of problem where I could bring strong product judgment to bear: I know what a good portfolio looks like, I know what I want visitors to feel, I know which of my projects deserve room on the page and which don't.

I designed the whole thing in Figma first. Components. States. Hover treatments. Spacing system. Then I sat with Claude Code and pointed at the Figma node IDs as the source of truth. Components got built one by one: the hero, the stats tiles, the case study cards, the career arc timeline, the receipts section with the contributions chart from SellerCrowd. I read every file it produced. When something didn't feel right I said so, and we iterated.

The surprise wasn't that it was fast. It was that I was still the bottleneck. Claude would produce a component in thirty seconds that looked almost right, and then I'd spend ten minutes deciding whether the weight on the h2 was wrong, whether the hairline under the section header needed more breathing room, whether the description on the third card was too clever. The job was constantly choosing which right, not writing the code to get there.

Shipped in about a week of evenings. The portfolio you're reading right now is the result.

Then the chatbot

The portfolio looked good. But a portfolio is a brochure. A brochure says “here's me, find me if you're curious.” The actual question a hiring manager or founder has when they land on my site is sharper than that: is he a fit for my specific thing?

A brochure can't answer that. A conversation can.

So I added one. Bottom-right of every page, a pill that reads “Ask about Álvaro.” Click it, and you get a chatbot that knows my work, my voice, the throughline across 20 years, and can tell you honestly whether I'm a fit for what you're describing or whether you should look elsewhere.

Underneath, there's some plumbing. The bot remembers you while you're here so the conversation flows naturally. It types out replies as it's thinking them up, so it doesn't feel like a wall of text dumping on you. It walks you through a few small steps: greeting, who-are-you, what-brings-you-by, anything to pass to me. Nothing flashy, just the bones of a real conversation.

The hard part wasn't any of that. The hard part was writing the instructions that tell the bot how to be me. That document took longer to write than any of the code. It tells the bot I say “thank you” a lot and not as filler, that I drop Spanish refranes into conversations with a specific pattern, that I'm based in Estepona, remote-first, and senior-IC-by-design at SellerCrowd. It tells the bot exactly which stories to tell from my career (the Barcelona workshop, the GVC self-exclusion flow, the SellerCrowd flywheel) and which to skip. It tells the bot to never blurt my email address; instead, offer to carry the message to me directly. Every paragraph in there is a small product decision I had to make about what my portfolio should feel like to talk to.

A screenshot of Albot in conversation, listing proof points: 'I led AI feedback UX at Fretello, featured at WWDC19, and built a white-label design system at GVC that scaled across 15+ global brands.' followed by 'Want the product growth story, the AI work, or the design leadership work?'
Albot answering a real visitor question. Proof points first, qualifying question second.
src/prompts/system.md · excerptv1.9.2
## Before every reply: the decision loop

Run this list top-down. Stop at the first
match and act on it.

1. Explicit contact intent? (Asked how to reach
   me, for my email, for a meeting.)
   → Offer handoff. Stop.

2. Disengagement signals? (Terse, distracted,
   "just browsing," clipped one-word replies,
   "this is irrelevant," repeated pushback.)
   → Short verdict + soft handoff. Stop.

3. Unsafe, private, unverified, or explicitly
   deflected topic? (Comp, references, family,
   unverified facts.)
   → Reduce detail or deflect. Don't invent.
   Stop.

4. Is a discovery beat due?
   → Ask exactly that beat. Stop.

5. Is the soft email ask eligible and not
   yet placed? (Real signal landed, ≥ 2
   discovery turns deep, no beat is due.)
   → Ride a statement-form email ask.
   Stop.

6. Otherwise → Answer naturally.

Hard constraints on every reply:
≤ 200 words, at most one question mark,
first person as Álvaro, no em-dashes,
no preamble.
The decision loop Albot runs before every reply. The full prompt runs to ~38 pages.

Then the qualifier

Here's where it got interesting. A chatbot on a personal site is nice. But what happens when it works? You get conversations. A few of them matter a lot. Most are exploratory, friendly, not urgent. A couple are spam. If every conversation emails me, my inbox becomes noise.

So before writing a line of code, I wrote a plain-English specification for how leads should be scored and prioritized. Five axes: Fit (is the role or project in my space?), Legitimacy (is the company and person real?), Value (is there evidence of real resources behind the opportunity?), Timing (when is this actually happening?), and Asked Explicitly (did the visitor actually ask to meet, or are they just browsing?). A tier table: Very High, High, Medium, Low, Drop. A few disqualify rules: templated outreach, fake names, agency recruiters who won't name their client.

Then I handed that spec to Claude and we built the scorer together. After every conversation, a smaller and faster AI quietly reads through what was said and assigns a tier. Non-Drop leads email me with a color-coded priority: 🟢 Very High, 🔴 High, 🟡 Medium, ⚪ Low. Drops get filed silently and never reach my inbox. Each email opens with a five-second-triage header so I can decide whether to follow up before I've finished my coffee.

The trickiest part was the timing. I wanted the scoring to happen sixty seconds after the visitor stopped typing, not while they were still mid-thought. There's no easy way to tell a website to “wait a minute and then check back,” so I plugged in a small scheduler that does exactly that. Each chat turn schedules a check; new turns supersede old ones; when the visitor finally walks away, the most recent check fires and the email lands. The visitor never sees a thing.

/ 01Chat

Visitor talks to Albot. Albot replies in my voice.

Visitorin browser
Albot UINext.js
Claude Sonnetsystem prompt = me
transcript
/ 02Score

Each turn is read by a second model. Structured fields fall out.

Transcriptfrom Layer 01
Claude Sonnetscorer prompt
Redisscored fields
on close / cadence
/ 03Digest

When a conversation matters, I get an email I'll actually open.

Composerscore + transcript
Resendemail API
My inboxiCloud
The three layers, end to end. Each one runs on its own trigger.
Two Albruv Chatbot lock-screen notifications: a High-priority lead about a Senior Product Designer role, and a Very High-priority lead about a Director of Product Design role.
The lock-screen view: Álvaro's iPhone, two real digest notifications. Priority dot first (red = High, green = Very High), tier label next, then the 5-second-triage subject line. He decides whether to open from the lock screen alone.
From:Albruv Chatbot <onboarding@resend.dev>
To:alvaro@albruv.com
Subject:🟢 Very High · Sarah at [Series B AI startup] — needs senior IC for AI prod…
Priority:        🟢 Very High
Fit:             yes
Company:         [REDACTED], verified: yes
Contact:         Sarah, Head of Product
Seat:            full-time, senior IC
Why now:         shipping 2 AI features in next quarter,
                 design lead just left
Outcome:         get the AI product surface to feel like
                 one product, not three
Value:           Series B, $24M raised
Timing:          ASAP, interviewing this month
Asked:           yes (explicit intent)
Flags:           none
Visitor email:   sarah@[REDACTED].com
Company context: verified via web search

Conversation snippet:
> "We're shipping two AI features this quarter and
>  our design lead just left. We need someone senior
>  who can both ship and lead, and who actually gets
>  AI product UX. Are you taking calls?"

Full transcript:
https://www.albruv.com/api/chat/debug/transcript/[ID]
A redacted Very High lead, in the format the digest layer actually sends. Five-second triage header, conversation snippet, transcript link. Drops never reach the inbox.

Splitting the brain in two

The first version of the bot did everything from a single document. Personality, facts, rules, stories, opinions, the whole lot crammed into one long script. It worked, but two problems surfaced fast.

Adding anything new meant editing that one giant document. A new project, a fresh anecdote, a tweak to how I talk about AI: every change risked nudging the bot's tone for the rest of the conversation. And the more facts I packed in, the more the voice got diluted. The personality was fighting with an encyclopedia for room.

So I split it.

The personality lives in one short document. How it greets people. What it won't talk about. How it handles tricky questions. What its voice sounds like. That file is small and sharp, and the bot reads it on every single reply so the voice never wavers.

The facts live in a library.Each topic is its own little file: one for SellerCrowd, one for Fretello, one for the WWDC19 keynote, one for “why I left gambling,” and so on. When a visitor asks a question, the bot scans the library, picks the two or three files that match the question, and reads just those.

Adding a new project is now as simple as dropping a file in the library. The personality file never changes. The voice stays consistent. And because the bot only reads the relevant files for any given question, it isn't carrying around the whole encyclopedia in its head. It just pulls what it needs for the conversation in front of it.

The mechanics have a name (RAG, short for retrieval- augmented generation), but the gain is human. The bot feels less scripted, because it's no longer reciting from memory. It's reaching for the right material the same way I would if someone asked me about a project I haven't talked about in a while.

The small wars (and why they matter)

If I stopped the story here, it would sound too clean. The truth is the last stretch of this build was a parade of small bugs, each interesting in its own way, each teaching me something about the difference between “works on my machine” and “works for a real visitor on a real network with a real email provider that has real policies.” I'll list the ones I remember, because they're the honest part of the story.

Apple's iCloud quietly refused my test emails. I had email sending set up, my domain verified, all the usual security boxes ticked. My first test chat sent a notification to my iCloud address and Apple bounced it with a generic, unhelpful rejection code. After a couple of hours of digging, I learned I was missing a specific kind of public declaration in my domain settings, the digital equivalent of saying “yes, this is really me.” Once I added it, emails started landing.

The scheduler refused my server seven times in a row. That small scheduler I told you about? It spent a week refusing to talk to my server, each refusal for a completely different reason. Wrong format on the address. Wrong character in an internal ID. Wrong region (it lives in Europe; my code was knocking on the wrong door). A tiny mismatch where my server thought it was at one address and the scheduler thought it was at a slightly different one. A difference in how two pieces of software encoded the same data, off by literally a few characters. A network hiccup that just happened to land mid-test. Seven walls. Each one teaching me one specific, weird thing that no tutorial would ever cover. The seventh attempt finally landed.

The scorer correctly filtered my own test leads. I'd been running smoke tests with fake identities: “Ali Baba” at “40digital,” “John McClain” at “PIP.com.” When the first scored email actually landed in my inbox, it wasn't about any of my fake people. The scorer had quietly recognized them as fake and dropped them without emailing me. That was the exact behavior I'd written into the spec. The filter working correctly on the first real test of it felt like the most validating moment of the whole build.

What I learned

Three things, now that the dust has settled.

The bottleneck was never the code.Every time I pushed on the build, the work I had to do was the same work I'd been doing for 20 years: picking the right problem, holding taste tight, deciding what to cut, writing the brief, reviewing the output. Claude is a fast, literal, occasionally wrong engineer. I was the product leader. That division of labor is not new. What's new is that I can now staff it on my own.

An AI coworker changes what a senior IC can ship alone. Not in the naive way of “one person does the job of ten.” More subtly: projects that used to require negotiating budget, headcount, and priority against other projects are now projects I can just build. The cost of finding out whether an idea is good collapsed. As we say in Spanish, poco a poco se anda lejos; little by little, you go far. You just get to start walking much sooner.

What gets built is shaped by judgment, not by capability. For better and for worse. We're about to see an enormous amount of stuff shipped, and the differentiator won't be who can build it. The differentiator will be who had the taste to know what was worth building. That's good news for product people who have been sharpening that muscle for decades. It's also a loud reminder to keep sharpening it, because the pressure to build anything has never been higher. And when the pressure lands, you don't put it down. The chatbot I shipped two months ago already isn't the chatbot it is today.

Try the thing you've just been reading about.

The chatbot this story is about is one click away. Say hi. If you describe a real role or project, the scorer will notice; if you're exploring, that's fine too. Thanks for reading this far.

Other case studies