Client work · UX Research, UI Design & Full-Stack Build · 2026

Nails by Mona:
From Instagram DMs
to a full digital service

End-to-end UX and product build for a one-woman press-on nail studio in Mirpur, Pakistan: research, wireframes, design system, live storefront, and a Filament admin panel that Mona runs herself. Since launch, redesigned and refined using real usage data.

UX ResearchUI DesignFull-Stack BuildLaravelFilamentTailwind CSSClaude Code2026
Visit nailsbymona.pk ↗
Nails by Mona homepage hero: custom-fit press-on nails, made for your hands
My Role
UX Designer + Developer
Duration
6 wks to launch + ongoing iteration
Stack
Laravel · Filament · Tailwind

A business run entirely
inside Instagram DMs

Mona is a Fine Arts graduate running a handmade press-on nail studio out of her home in Mirpur, Azad Kashmir. With ~1,000 followers, two years of word-of-mouth, and ~30 monthly orders, all handled via voice notes and back-and-forth WhatsApp photos, the business had real craft but no infrastructure. No website, no checkout, no way to be discovered outside Instagram.

But “build a website” was the wrong frame. Eight Pakistani competitors already have websites: generic Shopify storefronts that haven't moved the needle. The real challenge was to design a digital service that earns trust on the first visit, makes the artisan craft visible, and removes the friction that today only Mona-on-WhatsApp can resolve. That meant starting with users, not pages.

Six weeks to launch.
Then real usage took over.

Before any pixel or template, I spent the first week writing the plan with Claude Code as a thinking partner. The plan was reviewed and revised three times before I drew a single wireframe. That's the work that prevents Frankensteining 60% of the way through a build. Only then did I move to UX research, then to wireframes in Claude Design, then to the Laravel build. After launch, the work shifted from planning to measuring and iterating.

01
Week 1
Plan in Claude Code

Started not with a Figma file but a 90-minute planning session with Claude Code as a thinking partner. Output: a 34-section CLAUDE.md project bible covering business context, fixed decisions, brand rules, scope cuts, and explicit non-goals. That document remained the source of truth across every session that followed.

02
Week 1
Review & revise the plan

Three follow-up sessions stress-tested the plan: competitor research, payment-method trade-offs, photography rules, and what to deliberately NOT build. Locked the Fixed Decisions table: Laravel + Filament, manual payments at MVP (no SafePay until Phase 6), hand-only photography, no AI image generation for products, no founder face anywhere.

03
Week 2
UX research & strategy

3 personas (Sana, Hira, Ayesha), 3 journey maps, a 6-stage service blueprint, IA card-sort plan, pain-points → opportunities matrix, and a UX principles deck. All documented in /docs/ux/ (13 markdown files) before any UI was drawn. Real research, written down, reviewable.

04
Week 2
Wireframes in Claude Design

Used Claude Design for low-fi sketchy wireframes with annotations, the kind of margin notes that get lost in Figma comments. 18 artboards on one infinite canvas, including 2 hero variants for every key page so layout decisions could be compared side-by-side.

05
Weeks 3–4
Frontend build

Laravel + Blade + Tailwind v4 + jQuery: server-rendered, no React. 13 public pages and a live-camera state machine in vanilla JS. Six transactional email templates. Bag drawer + localStorage + multi-step checkout with separate URLs for back-button safety on Pakistan-mobile 4G.

06
Weeks 5–6
Backend admin, SEO & ship

Filament v4 admin panel with 11 resources (orders, products, customers, blog, FAQs, settings, finance, expenses, etc.). 5 cornerstone blog posts seeded. Sitemap + RSS + Schema.org JSON-LD across every page. Deployed to nailsbymona.pk on DigitalOcean with Certbot SSL and a supervised queue worker.

07
After launch
Measure real usage

Added GA4 funnel events (add to bag, checkout, sizing completed, purchase), Microsoft Clarity session recordings, Search Console and server-log checks. For the first time I could see who actually arrived and where they dropped off, instead of guessing from personas.

08
Sep – Oct 2026
Iterate with the client

Rebuilt the home page around the data, moved Add to bag up on product pages, added site-wide search, and shipped workflow changes Mona asked for once she was running the business on it every day. Then a speed, SEO and security pass.

Tools across the project: Claude Code (planning, code), Claude Design (wireframes), Figma & FigJam (research artefacts), Laravel + Filament (build), DigitalOcean + Cloudflare (deploy), GA4, Microsoft Clarity & Search Console (measure).

The category was crowded
but undifferentiated

I audited 8 Pakistani press-on competitors across Instagram, websites, pricing, and DM reviews. Three signals jumped out: every brand says “custom” but none demonstrate it; bridal is over-promised and under-served; and not one brand owns the religious-fit angle that Mona stumbled into for personal reasons.

Competitive landscape
8
Pakistani brands already running
4
at 20–43k followers (20–40× Mona's reach)
0
demonstrating real custom fit
Competitor claim
How they prove it
Our wedge
Custom-fit nails
Generic copy on PDP
Live-camera with SVG overlay
Made for brides
1-2 bridal product cards
Dedicated Trio package + page
Handmade in Pakistan
Watermark on Reels
Hand-only photography rule, signed packaging
Reusable / non-damaging
One-line product copy
Free first refit + saved-sizing reorder

Three women.
Three completely different clocks.

I synthesised three personas from competitor IG reviews, Mona's DM records, and market data on Pakistani working women. I chose the personas with the most distinct trigger moments, not the most distinct demographics, because the trigger shapes the whole journey. Per the brand's no-face discipline, the avatars are hand-and-symbol illustrations rather than portraits.

Sana persona avatar
Persona
Sana
28 · Lahore
Marketing manager at a tech startup
Trigger
Acrylic damage

"I love acrylics but my real nails are destroyed. I want something that looks salon-finished without the 3-hour trip."

Volume buyer: reorders every 4–6 weeks.
Hira persona avatar
Persona
Hira
26 · Karachi
Bride-to-be, wedding in 6 weeks
Trigger
Wedding date

"I need three coordinated looks (Mehendi, Baraat, Valima) that I can trust completely."

Bridal buyer: single high-stakes purchase, high emotional investment.
Ayesha persona avatar
Persona
Ayesha
31 · Rawalpindi
Teacher, practicing Muslim
Trigger
Wudu conflict

"I can't wear regular polish. Water can't reach my nail bed during ablution. Press-ons solve this exactly."

Values buyer: buys on fit with religious practice.

The bridal arc
is six weeks of vulnerability

Hira's journey starts at engagement and ends at her Valima. In between are five distinct emotional states. I mapped the friction, the trust-broken moments, and the exact points where Mona's offering replaces what salons currently fail at.

1 · Engagement2 · Research3 · Trust crisis4 · Trial order5 · Bridal Trio
FeelingEuphoricOverwhelmedScared, suspiciousCautiously hopefulConfident, proud
DoingPinterest, IG savesComparing 8 PK brandsReading scam storiesFirst small order (Rs. 2,200)Books Mehendi · Baraat · Valima trio
PainInformation overload"Custom" means nothingNo accountability on PK IGSizing fear before unboxingLead-time anxiety
NeedInspiration that's realA brand that proves the claimA name + face she can verifyVisible, hand-only proofA 4-week timeline she can trust
NBM momentHand-only IG + journalLive-camera sizing demoMirpur location + free refitSaved-sizing reorderBridal page + WhatsApp handoff if <4 wk

Stage 3 is the moment most Pakistani brands lose her, and it's also where craft can break through. Naming Mirpur, naming Mona, and showing the studio (without showing the person) does more for trust than any badge or testimonial.

What we found that nobody
else was saying

01
"Custom" is meaningless until you show the measurement.

Every competitor uses the word "custom." None demonstrate it. The differentiator isn't being custom, it's looking custom. That's why we invested in a guided live-camera capture with SVG overlays: 2 close-up photos (fingers + thumb), a green/red alignment heuristic, and macro framing that reads each nail width directly off a coin reference.

02
The wudu pain point is invisible to non-Muslim designers.

Practicing Muslim women cannot wear traditional polish: water can't reach the nail bed during ablution. Press-ons solve this exactly: they remove cleanly. Mona started this business for that reason. Surfacing it as the 4th brand pillar opens a content moat with zero competition on the exact-match search query.

03
The brand is "Nails by Mona," not Mona personally.

A face on the website would invite DM spam, conflate the brand with the person, and cap scaling. The discipline is hand-only photography and brand-addressed WhatsApp pre-fills ("Hello Nails by Mona…"). A small detail that compounds: every customer interaction reinforces a brand, not a phone number.

04
Bridal time-pressure is the most under-served emotional state.

A bride 4 weeks before her mehendi is a fundamentally different user from a working professional browsing on her commute. The Bridal Trio gets its own page, distinct champagne-and-gold photography style, a 4-week lead-time rule surfaced in the hero, and a WhatsApp handoff for orders placed too close to the date.

05
Pakistan-mobile is the design constraint, not a responsive afterthought.

A 3-year-old Android on patchy 4G, in landscape, in a salon waiting room. Speed isn't a polish goal here, it's a market-fit requirement. Every flow has a graceful degradation path. The live camera itself falls back to file upload, which falls back to "send via WhatsApp."

13 pages.
One five-link nav.

Nav locked early: Shop · Bridal · About · Journal · Help. Five links, no mega-menu, no dropdowns. Every other page is reachable within two taps from the homepage. The order flow is a separate spine (not in the main nav) entered only from the bag drawer.

Public storefront
Home
/
Shop
/shop
Product detail
/shop/{slug}
Bridal
/bridal
About
/about
Journal index
/blog
Journal post
/blog/{slug}
Size guide
/size-guide
Help
/contact
404 / sitemap.xml / feed.xml
+ Privacy · Terms · Shipping
Order flow (guest checkout, no accounts)
Bag drawer
→
Sizing capture
→
Order details
→
Payment
→
Confirmation
→
Tracking

Each step is its own URL with server-rendered state, so it's back-button safe on patchy Pakistan 4G. Returning customers (matched by phone + email, normalised across +92 / 0 prefixes) skip sizing and get a 5% reorder discount surfaced immediately.

Admin panel (Filament, authenticated)
Dashboard
Orders + kanban
Products + UGC photos
Customers + sizing CRM
Blog posts
FAQs
Messages
Subscribers
Finance overview
Expenses
Settings

Three flows.
Each one a deliberate split-path.

I mapped three end-to-end flows to validate the IA before any UI was built. Each one has at least one graceful-degradation branch. Pakistan-mobile-first means assuming things will fail.

1.
Sana orders her usual everyday set (returning customer)
Open IG link→Shop→Click set→Add to bag→Bag drawer→Checkout→"Have you ordered before?"→Phone + email match→Sizing skipped ✓→Details prefilled→Pay (JazzCash)→Upload proof→Confirmation
2.
Hira buys the Bridal Trio (high-stakes, first-time)
Google "bridal press on nails Pakistan"→Bridal page→"Order 4 weeks before mehendi" rule visible→Add Trio to bag→Sizing: live camera→Fingers photo→Thumb photo→Optional: other hand→Submit→Details→Full advance · Bank transfer→Proof upload→Admin verifies <24h ✓
3.
Ayesha lands on the wudu blog post (organic-first journey)
Google "press on nails wudu"→Cornerstone blog post→Reads "Yes: remove before, reapply after"→Internal link → Shop→Browses→Reads care guide→Wishlists→Returns 2 weeks later→Buys everyday set

Eighteen artboards.
One infinite canvas.

I used Claude Design to wireframe the entire product on one infinite canvas. The mid-fi sketchy style kept the focus on layout, hierarchy, and annotated decisions: the kind of margin notes that get lost in Figma comments. Two hero variants for every key page so layout calls could be compared side-by-side before the build began. The board below became the brief for the Laravel + Blade port that followed.

Wireframes · 18 artboards
2 hero variants per page · annotated decisions
Wireframes on the Claude Design canvas: annotated sketches of every page including Home, Shop, Product, Bridal, and the Order flow

A warm-neutral atelier system,
lavender used only as accent

The discipline that holds the brand together is restraint. The page is bone-coloured; cards are paper; alt sections are shell. Lavender (the logo colour, #BFA4CE) appears in eight specific spots only: CTAs, focus rings, prices, active nav, step indicators, accent rules under H2s, selected payment tiles, and eyebrow labels. Nowhere else. Saturation is what makes accents work.

A consistency pass after launch tightened it further. Plain lavender text was only about 1.8:1 against the shell background, so every lilac word and line icon now uses one darker shade,#8A6CA5, and the logo lilac is kept for fills. Every icon was redrawn as an outline at one line weight, with one icon per meaning across the whole site.

Palette tokens
#F4EFE8
bone
Page bg
#FBF8F2
paper
Cards
#EAE3D9
shell
Alt sections
#BFA4CE
lavender
Accent · CTAs
#8A6CA5
lavender-dark
All lilac text · icons
#EDE2C8
bridal bg
Bridal hero
#D4A948
gold
Bridal accent
#2C1F2E
aubergine
Footer
#1C1727
ink
Headings · body
#4A4158
graphite
Body text
Typography
Display · Fraunces (variable serif)
Custom-fit, made by hand.
Three nights. Three looks.
Body · DM Sans
Handmade gel sets, sized from two close-up photos of your fingers and thumb. Wudu-friendly. Reusable three to five times. Shipped across Pakistan.
Rs. 2,500 · Made to Order · Ships in 5–7 days
Non-negotiable brand rules
Do
Hand-only photography
Don't
Founder face anywhere
Do
"Hello Nails by Mona…" WhatsApp prefills
Don't
"DM Mona" / "Ask Mona" copy
Do
"Add to bag"
Don't
"Order Now" button
Do
Lavender as 8 specific accents
Don't
Lavender as a background colour
Do
Champagne + gold = bridal-only
Don't
Mixing gold into Everyday/Signature tiers
Do
Rule-line under every H2
Don't
Drop shadows or heavy borders

Live at nailsbymona.pk

Built in Laravel + Blade + Tailwind v4 + jQuery. No JS framework on the public storefront: Pakistan-mobile means smaller JS bundles, faster TTI, fewer hydration costs. Every page is server-rendered with Schema.org JSON-LD (Organization, Product, Article, FAQPage, BreadcrumbList). The screens below are the current live site, after the post-launch redesign.

Nails by Mona homepage, current design
Homepage: uncovered hero photo with a starting price, the collection with prices straight after, fit in 3 steps, why press-ons, Bridal Trio banner.
Shop page, Nails by Mona
Shop
Search and filter pills in one sticky toolbar, price and tier on every card.
Product detail page, Nails by Mona
Product detail
Bridal Trio Classic. Add to bag sits right under the price, with the three sets linked below.
Bridal page, Nails by Mona
Bridal
Real wedding photos, one flat Rs. 10,000 price, each night linked to its set.
Size guide page, Nails by Mona
Size guide
Real photos replaced placeholders. Good vs Avoid gallery with corner pills.
About page, Nails by Mona
About
Hand-only hero. Founder named in copy, never shown in photography.
Journal page, Nails by Mona
Journal
Cornerstone posts with cover images. The wudu post is the priority SEO bet.
Nails by Mona product: deep burgundy with gold accent
The product

Every set is hand-built,
individually cured, and
custom-fitted.

Gel base, colour layers, and topcoat applied by hand. Custom measurements read from coin-scale photos. A free first refit guarantee backs every order. The photography brief: hands only, never faces. Disciplined brand identity disguised as aesthetic choice.

The differentiator gets
its own state machine.

Eight competitors say “custom.” None show how. So I designed and built a guided live-camera capture: two close-up photos (fingers row + thumb) inside a single permission session, with per-state SVG overlays and a green/red alignment heuristic. Sizing is the most common DM question Mona gets, so a 90-second guided flow turns the most error-prone moment into the most differentiated one.

We'll need 2 close-up photos.
Fingers, then thumb. About 90 seconds.
Start camera
01 · Explainer
Photo 1 of 2 · Fingers
02 · Fingers
Photo 2 of 2 · Thumb
03 · Thumb
Looks good?
Fingers
Thumb
Submit
+ add other hand →
04 · Preview

The state machine lives at a single URL, so camera permission is requested once for the whole flow. Brightness sampling runs every 500ms; a Sobel-style edge-contrast heuristic paints the overlay green when something looks right, red when it doesn't. The thumb state uses halved thresholds (fewer edges by definition). Desktop users hit a QR-handoff state with a wa.me deep-link instead, because laptop webcams face the user, not the nails.

Live camera
Default for mobile users with permission granted.
File upload fallback
Permission denied or no rear camera: same 2-photo schema.
WhatsApp later
Customer overwhelmed: opt out, send photos to Mona, order continues.
After launch
100%
of orders so far were sized with the live camera. Nobody needed the fallbacks.
The bug real users found
“Stuck on Submitting…” on iPhone Chrome

Customers on iPhone Chrome waited about a minute after taking their photos. Server logs showed the server handled the upload in under half a second, so the delay was on the phone. The cause: the page was still holding the camera on the review screen, and iOS slows uploads while capture is active. Releasing the camera as soon as the last photo is taken brought the upload from ~66 seconds to ~3 seconds. Errors now show inline with an “upload from my gallery instead” link, rather than a silent spinner.

Mona runs the whole business
from one screen.

Built on Filament v4, a Laravel admin framework. Every resource was scoped to Mona's actual workflow: morning glance at orders needing attention, one-tap WhatsApp prefills, a payment-age SLA badge that turns red after 24 hours, bulk-confirm for the overnight stack. No training documentation needed.

Admin · Dashboard
Dashboard
Stat cards + recent orders + "Orders needing attention", designed for Mona's morning glance.
Admin · Orders
Orders
SLA badges (green/amber/red by age). One-tap confirm, WhatsApp row action, bulk confirm for the overnight stack.
Admin · Products
Products
Every set across 5 tiers. Slug, price, stock status and active toggle, all editable inline. Optional shape, length, finish and colour details feed the product page.
Admin · Customers
Customers
Saved sizing on file. Pakistani phone normalisation: +92 / 92 / 0 all resolve to the same customer.
Admin · Blog editor
Blog editor
Rich-text editor, category, target keyword, view counter, related-products pivot, scheduled publish.
Admin · Settings
Settings
Single source of truth: WhatsApp number, payment account details, a show/hide switch per payment method, lead times, reorder discount %.
Production hardening: things that aren't visible but matter
Bag-tampering closed
Cart prices re-fetched server-side by slug at order creation. A customer setting localStorage `price_pkr: 1` cannot place a Bridal Trio for Rs. 1.
Race-safe order numbers
`Order::generateOrderNumber()` wraps in `DB::transaction` + `lockForUpdate` + 5-retry on unique-violation. Soft-deletes use `withTrashed()` checks.
Private file storage
Payment proofs + sizing photos on the `local` disk, never web-accessible. Only readable via an auth-gated admin route with path-traversal guards.
Order-page authorisation
Confirm/track URLs use UUID, not integer ID. A session allowlist controls access. UUID alone is not enough.
Pakistan-phone normalisation
`+92 300…`, `0300…`, `923…` all resolve to the same customer for returning-customer lookup.
Queued notifications
All admin notifications `implements ShouldQueue`, so they never block the request thread.
Cloudflare in front
Static files served from the edge in well under a second instead of 1.5–2 s from Singapore. Real visitor IPs restored so per-route rate limits on checkout and uploads hit the right person.
Backups + server lockdown
Nightly database dump on the server plus a weekly off-site copy. SSH key-only, firewall, fail2ban and security headers after logs showed thousands of password attempts a day.
Automated test suite
Feature tests cover every checkout path (tampered prices, returning customers, custom links, photo upload) and every admin page. Run before each deploy.
Spam guard on the contact form
Honeypot field, timer token, fixed subject list and a duplicate filter. Invisible to real customers, no CAPTCHA.

The visitor who arrived
wasn't the one I designed for.

The personas assumed someone researching press-ons: reading about fit, comparing brands, taking her time. Analytics and Clarity recordings told a different story. Most visitors came from Instagram ads, browsing inside Instagram's in-app browser on a phone, and left the home page within seconds having scrolled only a fraction of it.

~60%
of visitors came from Instagram ads
~80%
browsed in Instagram’s in-app browser
~6 s
spent on the home page
~12%
of the home page scrolled

On a phone, the first design and its first price sat about four screens down. The average ad visitor scrolled about two, so most people saw no nails and no prices. She tapped a Reel of a design she liked; in the first five seconds she needs to know: is this the thing from the ad, how much is it, will it fit, and can I trust this shop? The old page answered those in the reverse order.

Nails by Mona home page, before the redesign
Before
Frosted card covers the nails. Trust strip and sizing explainer come before any product.
Nails by Mona home page, after the redesign
After
Photo uncovered, “Sets from Rs. 2,000” in the hero, eight designs with prices straight after.

What changed

Home: product in the first screen

Compact hero with the photo uncovered and a starting price, then a two-column grid of designs with prices and quick Add to bag. Fit, price-vs-salon and trust each got one short block, in the order the objections come up. Half the length.

Product page: buy button up front

Add to bag moved directly under the price, above the description, with four short buy facts beside it. On phones, a sticky price-and-button bar appears whenever the main button scrolls away.

Shop: search + one sticky toolbar

A search box that understands local spellings (mehndi/mehendi, walima/valima, shaadi → bridal), sort, and every category as visible pills. Hidden categories in a sideways-scrolling row weren’t being discovered.

Search on every page

Full-screen on phones, a dropdown on desktop. Shows matching designs with prices plus relevant guides, and offers a custom set over WhatsApp when nothing matches.

The first phone screen, after the redesign
Nails by Mona home page on a phone
Home
Nails by Mona shop page on a phone
Shop
Nails by Mona product page on a phone
Product

Running the business on it
showed what the plan missed.

Once Mona was handling real orders every day, her feedback became the best usability test. Each change below came from something that slowed her down or confused a customer.

Custom order links
Pain: Designs agreed in Instagram DMs were invisible to the system

Mona creates a private link from the admin with the agreed sets and price. The customer sizes and pays through the normal checkout, so custom orders show up in revenue, tracking and saved sizing like any other order.

Full payment up front
Pain: Chasing a second payment by email

Every set is made to measure and can’t be resold, and many customers never read the balance-due email. The advance-then-balance flow was replaced with one payment before production. Older orders keep their original terms.

Payment methods on/off
Pain: No way to hide a method without deleting its details

Each payment method has a “Show on checkout” switch. The checkout, the order rules on the server and every line of payment copy on the site follow whatever is switched on.

Fewer manual messages
Pain: A WhatsApp message for every order stage

Per-stage WhatsApp prompts were built, then trimmed back at Mona’s request. Emails are the automatic channel; WhatsApp stays as an optional button.

Honest bridal offer
Pain: Claims the business couldn’t back yet

One flat Rs. 10,000 Trio with real wedding photos, each night linked to its real set. A price comparison that no longer matched the shop and packaging that wasn’t ready yet were removed.

Admin that keeps up
Pain: Missing new payment proofs

A bell and push notification when a customer uploads a payment proof, whole rows tappable on a phone, and a faster dashboard that no longer refreshes every few seconds.

In parallel: a speed pass (photos resized into phone-sized versions, self-hosted fonts, analytics loaded after the page), SEO work (unique product titles, product details, Google Merchant Center feed, old product links redirected instead of 404ing) and a site-wide consistency pass on copy, colour and icons.

Measured, then improved.
Before and after.

Approximate figures from Lighthouse, Search Console, server logs and on-device tests, comparing the launch version with today's site.

Measure
At launch
Now
Home page length on a phone
~18 screens
~8 screens
First design + price on the phone home page
~4 screens down
First screen
Add to bag on a phone product page
~1.5 screens down
First screen + sticky bar
Mobile PageSpeed score (home)
~67
~80 (desktop ~99)
Shop page download on a phone
~20 MB
~1 MB
Sizing photo upload, iPhone Chrome
~66 s
~3 s
Pages indexed by Google
~20
~40
Orders sized with the live camera
Untested
100%

Launch wasn't the finish line.
It was the first real research.

I'm still proud of the discipline of what we deliberately did not build. No “Order Now” buttons, no AI chatbot, no founder face, no payment gateway at launch. Each “no” was a decision, not an oversight, and it kept a one-woman studio able to ship.

The risk I worried about most turned out fine: every order so far has used the live camera, so the sizing wedge holds. What I got wrong was the visitor. Personas built from research described a careful shopper; the data showed someone arriving from an ad with a thumb on the back button. The biggest improvements came from watching real behaviour and from listening to the person running the business, not from the original plan.

Next: real customer reviews with photos, category landing pages for the designs people search for most, and a usability test of the new home page with first-time visitors.

← Back to portfolio