Featured Projects

Professional

Products shipped in role at Fareportal.

CheapOair AI Chatbot

0→1 → Gen AI rearchitecture · Owned end-to-end at Fareportal

The chatbot behind post-booking flight support at cheapoair.com, live today — owned end-to-end from a rule-based launch through a full rearchitecture into a multi-agent Gen AI system, as customers increasingly expected free-form, ChatGPT-style conversation.

Dialogflow ES chatbot → Gen AI chatbot (Vertex AI)

58% 70%Engagement
48% 53%Containment
62% 80%CSAT
Show full case study Hide details

Problem

Call and email were the only support channels — expensive for the ~60% of bookings that are international, too slow for time-sensitive issues.

Approach

Launched on Dialogflow ES, then rearchitected onto Vertex AI as a multi-agent system (orchestrator + specialist agents) as users expected free-form, ChatGPT-style conversation.

Evaluation & rollout

Offline (golden/adversarial/regression) and online (LLM-as-judge) evals, cleared with Legal, InfoSec, and an AI committee before a staged 5% traffic rollout.

Ask the chatbot for more

Architecture details, functionality shipped, and the full Dialogflow → Gen AI migration story are one question away — try the chat icon.

Biggest challenge: developing prompt engineering mastery — the discipline the entire multi-agent system's reliability hinged on.

Dialogflow ESDialogflow CXVertex AIMulti-Agent OrchestrationLLM EvalsPrompt Engineering

Oli — AI Trip Planner

0→1 product strategy · phased launch · CheapOair (Fareportal)

A conversational, AI-powered trip-planning assistant embedded in the CheapOair mobile app — owned from problem framing and PRD through a phased launch roadmap. The vision: collapse destination discovery, flight search, itinerary planning, and personalized guidance into one journey-aware conversational interface, and make Oli the primary way travelers plan.

Outcome after end-to-end launch

+15%Engagement
65+Daily flight conversions
3Personas served
Show full case study Hide details

The bet, written down first

  • Problem — Travelers could only express intent through filters, and the product only worked for users who already knew their destination; there was no support for the "I don't know where to go yet" stage. Mid-funnel, the only way to get a question answered was to leave the flow and contact a human agent — killing momentum right before conversion.
  • Bet — If we replace filter-based search and forced human handoff with a conversational assistant that answers free-form destination and booking questions in context, users will explore more and convert at a higher rate than users who never engage with it — observable within each rollout stage.
  • Success criteria — CTR into Oli from its entry points; active engagement rather than open-and-abandon; positive ratings on suggested destinations and itineraries; ≥80% CSAT on per-message feedback; users acting on suggested flights; ≥20% conversion among users who engaged mid-flight-funnel, and ≥2% across everyone who interacted.
  • Evaluation — A gated rollout where two checks had to hold together at every stage: transcript audits confirming Oli was genuinely useful (not merely being clicked), and A/B metrics showing no cannibalization of app-wide CR and bookings. Either one failing was the kill signal; both holding was the signal to scale.

Who it's for — three planning mindsets

Explorer

"I don't know where to go." Wants inspiration, destination recommendations, and budget-driven ideas.

Planner

"I know where I want to go." Wants itinerary creation, recommendations, and comparison options.

Shopper

"I want the best flight." Wants flight discovery plus alternate-airport and alternate-date suggestions.

Approach

One conversational assistant personalized via geolocation, behavioral signals, and conversation memory — backed by competitive research across Trip.com and Mindtrip, and a month of UX iteration.

Execution

Coordinated 3 engineering pods (Chatbot, RPA, App) via daily syncs, grooming requirements and closing gaps as they surfaced.

Ask the chatbot for more

Feature-by-feature capabilities, the phased roadmap, and the full rollout story are one question away — try the chat icon.

North star: a personalized AI assistant that retains context, understands intent, and proactively guides every traveler throughout their journey — from first spark of inspiration to a booked trip.

Product StrategyPRDConversational AIPersonalizationRoadmappingVertex AICompetitive AnalysisCross-functional Execution

Priority Leads Tool

0→1 · Rules engine for Ops · Fareportal

A SQL-driven rules engine flagging high-risk leads — like users who'd repeatedly contacted support — for Ops to resolve before they escalated into complaints.

-12%Complaints
Show full case study Hide details

Problem

Support complaints were reactive — by the time a lead surfaced as a complaint, the pattern that predicted it had already repeated multiple times.

Approach

Codified rules with Ops leaders from real support patterns (e.g. 3+ contacts across call/email/chat) as SQL queries controlling lead generation in the CRM, each with its own SLA tracked via dashboards.

Outcome

Complaints down 12%. The system still runs today, fully automated, with no ongoing manual intervention.

Ask the chatbot for more

Rule design, SLA tracking, and how it plugged into the CRM are one question away — try the chat icon.

SQL Rules EngineCRM IntegrationOps PartnershipDashboarding

Assisted Selling

0→1 · Chat-assisted booking · Fareportal

Trigger-based chat launched directly on the flight listing page so travel experts could help users mid-booking-funnel, paired with Search Explorer's predictive flight filtering.

+40%Conversion (Search Explorer)
Show full case study Hide details

Problem

High-intent users were dropping off mid-funnel — idle on the listing page, comparing flights, or hitting no-results — with no way for an agent to step in before they left.

Approach

Identified and tested triggers (low conversion, idle customers, senior travelers, multi-city trips, sold-out cases), built rule-based routing to top-performing agents, and integrated with the agent booking engine so a single click carried the customer's exact search over.

Search Explorer

A companion feature using predictive filtering and value-focused tiles (e.g. "faster by 3hrs for $20 more") to guide users to better flights.

Ask the chatbot for more

Trigger logic, the UX experiments on the chat icon, and the A/B validation are one question away — try the chat icon.

Trigger-Based RoutingAgent Booking EnginePredictive FilteringA/B Testing

Curiosity Builds

Products designed, built, and shipped end-to-end for the joy of it.

Arthritis Companion

0→1 · Designed, built, and shipped end-to-end

A login-free daily companion for tracking arthritis symptoms and gentle exercises — designed around one real person's arthritic hands, not a generic user persona. Grown into a clinical-grade tool with a body map, medication tracking, and a doctor-ready report.

Show full case study Hide details

Problem

Existing symptom trackers assume fine motor control: sliders, drag gestures, small tap targets, multi-step forms. For someone managing arthritis, the tool meant to help was itself hard to use.

Design constraints

Large tap targets, no sliders or drag gestures, voice-friendly notes, and a fixed bottom "Done" button reachable one-handed. No login, no account — every extra step is a barrier.

Approach

Local-first architecture: all data stored on-device via IndexedDB, no backend, exportable backups. An interactive body map for logging and visualizing symptoms, replacing flat checkbox lists.

Outcome

A daily companion that's grown into a clinical-grade tool — tracking medications, screening for patterns worth a doctor's attention, and generating a doctor-ready visit summary.

How I built it — vibe-coded, PM-led

No engineering team — I shipped this solo by vibe-coding with AI. My job was the product: framing the problem, setting the design constraints, making the calls on scope and UX, and reviewing every screen against a real user. AI coding tools turned those decisions into working, shipped code, and I iterated in tight loops — prototype, test on-device, refine — until it was something someone actually opens daily. The hard part wasn't the syntax; it was the product judgment about what to build and what to cut.

Body map

An interactive front-view silhouette (18 joints) for logging symptoms and visualizing which joints flare up most, sized for accessible, one-handed tapping.

Inflammatory signal screening

A conservative, non-diagnostic pattern check — recurring long morning stiffness with symmetric small-joint pain — that nudges a doctor visit without over-alerting on sparse data.

Medications & adherence

Full medication tracking with dosage, time slots, and daily dose logging, rolling up into an adherence rate.

Doctor report

A printable 30-day summary — pain and stiffness trends, top affected joints, adherence, and any flagged patterns — built to bring to a visit.

Skills this build demonstrates

Product JudgmentVibe CodingAI-Assisted Dev (Claude Code / Cursor)Rapid Prototyping0→1 ShippingUX for AccessibilityLocal-First PWAHealth Data Design

Ship Gate

0→1 · PM-operable AI eval harness · Designed, built, and shipped end-to-end

A tool that turns a product description or a batch of real production traces into a golden and adversarial test suite, runs it against a live conversational AI product, and returns a ship/hold verdict — including checking whether its own LLM judge can be trusted.

Show full case study Hide details

Problem

PMs shipping conversational AI usually eyeball a handful of replies and ship on vibes. Writing a real test suite means knowing which failure classes to look for; running it means waiting on an eng-built eval pipeline — so the check that matters most gets skipped.

Approach

Two paths into a suite: from real traces (read them, note what went wrong, cluster into failure modes, generate tests that target them) or from a written brief pre-launch. Tests run against any chatbot via a live endpoint, or a manual paste-the-reply mode for the hosted bots that block CORS.

Scoring

Deterministic assertions run first and are free; an LLM judge handles the fuzzy rubric only on what assertions can't decide. A judge-alignment panel then measures the judge's own hit rate and false-alarm rate against your own labels — reported separately, never averaged into one accuracy figure that would hide a judge that misses real failures.

Ask the chatbot for more

The prompt-injection defenses, the CORS constraint that forced two connection modes, and the judge-validation math are one question away — try the chat icon.

How I built it — vibe-coded, PM-led

Built solo in Claude Code, iterating the way the tool itself argues PMs should work: no PRD, a one-page bet written down first, then shipped and tested against real usage. Every version was QA'd end-to-end in a live browser before I trusted it — including catching a data-loss bug where a reload silently wiped hand-reviewed traces, and a disabled button that looked identical to an enabled one. The judgment calls were mine: what counts as a fair adversarial test, when a judge should be trusted, and when a "no API key" path is worth building versus a quality compromise not worth shipping.

Skills this build demonstrates

PM-Operable EvalsError Analysis (Open/Axial Coding)LLM-as-JudgeJudge Calibration (TPR/TNR)Prompt Injection DefenseVibe Coding (Claude Code)React / TypeScriptClient-Side Architecture