Built a virtual try-on application that lets users try on garments over WhatsApp. A user sends a photo through WhatsApp, and the app returns a realistic image of them wearing the selected garment, no app download or website visit required.
Designed and built the system end-to-end, from the WhatsApp messaging integration through to the try-on generation pipeline, as a self-contained product demonstrating conversational commerce for fashion/retail use cases.
Key Challenges:
- Frictionless UX over a messaging app: WhatsApp isn't built for structured app interactions, so the flow had to feel natural through simple image and text messages, not clunky commands.
- Reliable image handling: Incoming photos vary wildly in quality, lighting, and pose, and had to be received, processed, and matched with garment images reliably.
- Fast turnaround: Users expect a near-instant reply on a messaging app, so the backend had to handle image processing and model inference without long delays.
- Stitching third-party services together: Twilio's WhatsApp API and Gradio's try-on model weren't built to talk to each other, so the app had to bridge them cleanly.
Approach:
WhatsApp integration via Twilio
-Set up Twilio's WhatsApp API to receive incoming user images and send outgoing try-on results, handling the messaging layer end-to-end.
Flask backend as the orchestration layer
-Built a Flask application to receive Twilio webhooks, manage the request flow, and coordinate between incoming user images and the try-on model.
Virtual try-on generation with Gradio
- Integrated Gradio's virtual try-on model to generate the final garment-on-user image, returning a realistic composite result.
End-to-end flow design
- Connected the pieces so a user's WhatsApp message triggers the full pipeline automatically: receive image → process → generate try-on → send result back, all within a single conversation.
Results & Impact
- A working conversational shopping experience built entirely on a messaging app users already have open every day.
- Zero-download, zero-signup try-on flow — removes the biggest friction point in getting users to try a new AI-powered feature.
- A reusable integration pattern connecting Twilio, Flask, and a generative vision model, applicable to other WhatsApp-based commerce or personalization tools.
Provided Services & Solutions
📌 Conversational App Development
📌 WhatsApp API Integration (Twilio)
📌 Backend Development (Flask)
📌 Generative AI Integration (Gradio virtual try-on model)
📌 Third-Party API Orchestration
Designed and developed ClubTree, a SaaS platform that helps membership organizations manage their websites, members, events, and communications from one centralized system.
ClubTree combines a public-facing website with an administrative dashboard, giving organizations the tools to manage membership applications, member directories, attendance, newsletters, documents, and organizational workflows.
The platform was designed around real-world service club needs, with an emphasis on intuitive navigation, role-based access, and simplifying administrative tasks.
My role: Product strategy, user research, UI/UX design, full-stack development, testing, and launch.
Key features:
- Membership applications and directories
- Event and attendance management
- Website content management
- Newsletters and member communications
- Role-based access and administrative dashboards
- Integrated organizational workflows
Outcome: A functional membership management platform with a live implementation for the Rotary Club of Charlottesville.
Going live with one real club in Charlottesville and building around how they actually run is the right way to do it. Club admin tools usually feel stuck in 2010, so this looks like a big upgrade. How did you land them, through someone in the club?
Malware in a WordPress backup, disguised as a photo
A client wanted me to restore a WordPress site from a zip backup and asked for one thing before paying: a screenshot of the site running on my own computer, with localhost in the address bar.
Loading a WordPress site runs its PHP on whatever machine serves it. So I read the zip with a script first and didn't extract it.
WordPress core matched the official checksums. In wp-content/mu-plugins, though, there was a file that looked for a 4.6 MB "JPEG" in uploads, renamed it to .exe and tried nine ways to launch it. The first two bytes of that "JPEG" were MZ, which is how a Windows executable starts. Opening localhost for the screenshot would have been enough to run it.
My first script missed it because it trusted file extensions. Now it reads the first bytes of every file.
The MZ check is such a good catch. Worth adding for anyone restoring sites: mu-plugins run on every request and can't be switched off from the dashboard, so they're a favourite hiding spot. Did the client ever reply after you flagged it?
Introducing VERAÉ — a premium wellness and skincare eCommerce experience.
Designed to blend luxury aesthetics with intuitive shopping, featuring elegant product visuals, responsive layouts, and a seamless user experience.
From UI/UX design to React development, the focus was on creating a refined digital experience that connects product storytelling with effortless shopping.