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.

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 · plan → ship
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. Six phases.
Plan first. Then design. Then code.

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.

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, 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 11 + Blade + Tailwind v4 + jQuery — server-rendered, no React. 13 public pages live-camera state machine in vanilla JS. Six transactional email templates. Lighthouse mobile ≥ 90 on every page. 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.

Tools across the project: Claude Code (planning, code), Claude Design (wireframes), Figma & FigJam (research artefacts), Laravel + Filament (build), DigitalOcean + Certbot (deploy).

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. Lighthouse mobile ≥ 90 isn't a polish goal — 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 — 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 linkShopClick setAdd to bagBag drawerCheckout"Have you ordered before?"Phone + email matchSizing skipped ✓Details prefilledPay (JazzCash)Upload proofConfirmation
2.
Hira buys the Bridal Trio (high-stakes, first-time)
Google "bridal press on nails Pakistan"Bridal page"Order 4 weeks before mehendi" rule visibleAdd Trio to bagSizing — live cameraFingers photoThumb photoOptional: other handSubmitDetailsFull advance · Bank transferProof uploadAdmin verifies <24h ✓
3.
Ayesha lands on the wudu blog post (organic-first journey)
Google "press on nails wudu"Cornerstone blog postReads "Yes — remove before, reapply after"Internal link → ShopBrowsesReads care guideWishlistsReturns 2 weeks laterBuys 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.

Palette tokens
#F4EFE8
bone
Page bg
#FBF8F2
paper
Cards
#EAE3D9
shell
Alt sections
#BFA4CE
lavender
Accent · CTAs
#9B7FB4
lavender-dark
Hover · pressed
#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). Lighthouse mobile targets ≥ 90 across the board.

Nails by Mona homepage — final design
Homepage — hero, 4-pillar trust strip, fit-difference deep dive, featured sets, bridal callout, blog teaser, dark aubergine footer.
Shop — Nails by Mona final design
Shop
Filter-by-default, tier badges, trust signals on every card.
Product detail — Nails by Mona final design
Product detail
Bridal Trio Classic — bag CTA, FAQ schema, related sets.
Bridal — Nails by Mona final design
Bridal
Champagne hero. "Order 4 weeks before mehendi" in the H1 paragraph.
Size guide — Nails by Mona final design
Size guide
Real photos replaced placeholders. Good vs Avoid gallery with corner pills.
About — Nails by Mona final design
About
Hand-only hero. Founder named in copy; never shown in photography.
Journal — Nails by Mona final design
Journal
5 cornerstone posts at launch — 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 — turning it into 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 — camera permission is requested oncefor 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 — 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.

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
9 active sets across 5 tiers. Slug, price, stock status, active toggle — all editable inline.
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, lead times, deposit %, 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` — never block the request thread, never `User::all()`.

The numbers that tell us
whether the design landed

The site launched recently. These are the 12-month targets — not Dribbble likes or Lighthouse scores, but the business metrics the design decisions were built to move.

Metric
Baseline (DM era)
12-month target
Organic search visitors / month
0
5,000–15,000
Live-camera adoption (first-time orders)
n/a
≥ 60%
Refit-request rate
n/a
≤ 6%
Repeat-customer rate
~10% qualitative
≥ 25%
Bridal Trio share of revenue
~0%
25–35%
Average order value
PKR ~2,200
PKR 2,800–3,500
Lighthouse mobile (every page)
n/a
≥ 90

The thing I'm most
proud of isn't a screen.

It's 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. Premature features are the enemy of a one-woman studio that needs to ship and survive.

What I'm least certain about is live-camera adoption. The whole sizing differentiation rests on it. If only 20% of customers grant permission and the rest fall back to upload, we still ship a working product — but the wedge gets smaller. That's why sizing_capture_method is tracked in the schema from day one, and the first round of usability testing is scoped for the week the first 20 organic orders land.

← Back to portfolio