Skip to content
Live on Google Play, startup product

Cloth Lab

Laundry pickup for Jaipur, on Android, iPhone and the web. I designed it with the founder and I'm building every part of it.

Role
Product design and engineering
Platforms
Android, iOS, web, admin web
Stack
Kotlin Multiplatform, Firebase
Started
September 2026
Cloth Lab home screen: a 50% off banner and the laundry services

Two problems, one app.

For the people using it

Food, groceries and rides come to you in one tap. Laundry still doesn't.

I lived it, first in Pune and now in Jaipur. The man who pressed our clothes closed his shop, and we were back to asking around for someone new. A quick-commerce app for laundry, where you book a pickup and your clothes come back clean, was nowhere to be found here.

For the founder

An idea and partner laundries, but no product and no team.

He needed customers on Android, iPhone and the web, an app for the laundries and an admin panel to run it all, quickly and on a startup budget. With cash on delivery and a launch offer, the money had to be impossible to cheat. That's where I came in: we worked out the product together, I designed every screen, and I'm building all of it.

What was at stake.

  1. Premium on a startup budget

    The app had to feel premium while the costs stayed as low as possible.

  2. Three builds would mean three bills

    Separate Android, iPhone and web apps would triple the time and cost for a team of one.

  3. Laundries had to want it

    If the partner side was hard to use outdoors, with one hand and cash in the other, orders would stall.

  4. Trust from day one

    In a city this size, one wrong bill or lost order spreads by word of mouth. The launch had to be right.

If you only read one part, read this.

1 codebase Android, iPhone, web and the admin portal

Kotlin Multiplatform shares the screens, rules and models, so a fix lands once.

1 click to change banners, prices or promos

The catalogue, prices, promos, service areas and notifications change from the admin portal, with no app update.

40× cheaper sign-in codes

One-time codes go over WhatsApp's Cloud API at about ₹0.14, against roughly ₹6 for SMS.

47 test files

Pricing, promos, the order state machine, OTP and settlements are tested.

Booking a pickup, start to finish.

  1. Sign in

    A WhatsApp code, never a password.

    Sign-in screen with a mobile number and a Send code button

    Codes come over WhatsApp: no password to forget, about 40× cheaper than SMS.

    The code arrives where people already are and fills itself in on Android. It's stored as a salted hash with an expiry and an attempt limit, checked inside a transaction.

    • WhatsApp Cloud API
    • Cloud Functions
    • Firebase Auth
  2. Home

    Only areas we actually serve.

    Home screen with the delivery area, offer banner and services

    A service-area check decides what you can order; the banner and services come from the admin portal.

    Location is asked right after sign-in, with a screen that explains why first. Outside the launch area, people join a waiting list instead of hitting a dead end.

    • Precise location
    • Service areas
    • Remote config
  3. Pick clothes

    A live estimate while you pick.

    Item picker with shirts and trousers added and an estimated total of ₹410

    The estimate is honest about being one. The real count is agreed at your door.

    Steppers on every item and a running total at the bottom. It's an estimate on purpose: the partner counts with you at pickup and the bill updates there and then.

    • Offline-first catalogue
    • Room
  4. Pickup and bill

    Every rupee is priced on the server.

    Pickup time slots with cash on delivery and the bill

    Totals come from a Cloud Function, never from the phone.

    The app sends item ids and counts only. One Firestore transaction checks the price, the slot, the service area and the promo, and takes the order number, so a failed order can never use up a promo.

    • Cloud Functions
    • Firestore transaction
    • Cash on delivery
  5. Order placed

    Clear about what happens next.

    Order placed confirmation with pickup time and cash to pay

    Permissions are asked when they're needed: notifications only after the first order.

    The order number, the pickup window and the cash amount, plus one line about what to do. Notifications are only asked for now, after the first order, never at launch.

    • Just-in-time permissions
    • Cloud Messaging
  6. Track

    The partner moves the order, you watch.

    Order tracker showing confirmed, collected, washed and ironing stages

    Only Cloud Functions can move an order; the app can't skip a step.

    Each tap in the partner app stamps a time and reaches the customer and the admin board. No live GPS, just a clear, timed list and a button to call your partner.

    • State machine
    • Firestore rules
    • Push

One app, taken apart.

Layer 1

What you tap

Compose Multiplatform draws the same screens on Android, iPhone and the web, in Cloth Lab's own design system.

  • Compose Multiplatform
  • Design system
  • Navigation

Layer 2

What's shared

Every feature, view model and rule lives once, in shared Kotlin: data, domain and presentation layers, wired with Koin.

  • auth
  • catalogue
  • cart
  • checkout
  • orders
  • profile
  • money
  • connectivity

Layer 3

What owns the rules

Firebase Cloud Functions price orders, check promos, move order stages and send the pushes. Deny-all Firestore rules mean nothing else can.

  • createOrder
  • confirmPickup
  • advanceOrderStatus
  • sendOtp
  • assignVendor
  • recordSettlement

Three apps for three very different people.

Customer app home screen
Customer appAndroid, iPhone and web from one Compose Multiplatform codebase.
Partner app home with clothes to pick up and deliver
Partner appFor the laundries: big buttons and plain words, made for one hand outdoors, with cash in the other.
Admin live board with order columns from To assign to Done
Admin portalA live board to verify and assign orders, set commission per order and settle cash with partners.

Change the app without shipping an update.

The founder runs Cloth Lab from the admin portal. Almost everything a customer sees comes from data, so a new banner, price or service area is live in one click.

Admin order detail with verification checklist and partner assignment
  • Catalogue and pricesServices, items, variants, icons and images
  • Home bannersImages, links, order and on/off
  • Promo codesPercent or flat, limits, expiry, audiences
  • Service areasWhere Cloth Lab delivers, with a waiting list
  • Checkout rulesPickup slots and the delivery charge
  • OrdersAssign, edit items, set delays, resolve problems
  • Partners and cashCommission per order and settlements
  • NotificationsScheduled pushes to customers or partners

Eight stages, and only the server can move them.

  1. Placed: By the customer, in the app
  2. Assigned: By the admin, after checking the order
  3. On the way to pick up: Partner app
  4. Picked up: Partner confirms the count with the customer
  5. Ready: Partner app, cleaned and packed
  6. Out for delivery: Partner app
  7. Delivered: Partner app, at the door
  8. Cash collected: Partner taps “Got ₹410 cash”

Washing, drying and ironing can be added between Picked up and Ready.

CustomerAdminPartner app

Calls I made, and why.

Order state lives on the server only.

A state machine in the Cloud Functions decides every move, and deny-all Firestore rules mean no app can write an order, a user or a settlement directly.

Sign-in goes over WhatsApp, not SMS.

My own OTP flow on Meta's Cloud API: salted hashes, rate limits and attempt counts, with Android autofill. SMS verification costs about forty times more.

≈ 40× cheaper per sign-in

Offline first, and permissions only when needed.

The catalogue, orders and addresses sit in Room with a connection banner, so a weak signal never blanks the app. Location is asked after sign-in with a reason, notifications after the first order.

New orders alert exactly once.

The admin board treats the first snapshot as a baseline and ignores cached ones, so every genuinely new order rings once, and never twice. It's covered by tests.

Where it stands.

The customer app and the partner app are live on Google Play, and the admin portal runs the business. The marketing launch in Jaipur comes next.

surfaces: Android, iPhone, web and admin
4
customer features, from sign-in to reorder
9
Cloud Functions and triggers
25+
test files across app, admin and backend
47

What I'd build for you.

If you're a founder with an idea

The whole product: customer apps, an app for your partners, an admin portal and the backend, designed and built by one person who answers for all of it.

If your business still runs offline

An app that puts your service in people's pockets and gives you one screen to run the day: orders, partners, cash and offers.

If you're hiring for Kotlin Multiplatform

Someone building one codebase for Android, iPhone and the web, who knows where to share code and where not to.

If you need a freelancer

Product thinking, design and engineering in one, with the security and tests a real business needs.

What's next.

  • The marketing launch in the first Jaipur neighbourhoods
  • The marketing site with a pincode check

Built with.

  • Kotlin Multiplatform
  • Compose Multiplatform
  • Koin
  • Room
  • Ktor
  • Firebase Auth
  • Firestore
  • Cloud Functions
  • TypeScript
  • WhatsApp Cloud API
See the whole stack
Next projectOMNIAA super-app for Guinea: payments, chat, rides, shopping and more in one app, for people and for the businesses that serve them.