Cove Laundry: from the room to the folding table, with every item counted.
Guests scan a code in their room, photograph their basket and list every item. Staff collect it, tick each piece off, wash, dry and fold, then close the job with a photo. The guest gets a notification the moment it's done.
This is a portfolio version of a laundry app I built for a working accommodation operator. It's shown with a fictional hotel, Cobalt Cove Hotel, and made-up guests and staff. The live demo runs entirely in your browser, so you can play both the guest and the staff side. These demo app concepts are owened by the company that requested them.

cove-laundry/hero-1.png
cove-laundry/hero-2.png
cove-laundry/hero-3.png
cove-laundry/hero-4.pngThe problem
Laundry requests came in by message or at the door, and nothing recorded what was in each bag. When a sock or a shirt went missing there was no way to show what had been handed over, and guests had to keep asking whether their washing was ready.
What I built
Two apps from one codebase. Guests use a web app opened from a QR code in their room, with nothing to install. The laundry team uses an Android app. Every basket is photographed and counted item by item when it's sent, and checked off again before it goes back.
How a basket moves through it
Guest scans the room code
A card in each room has its own QR code, so the order already knows the room and the property.
Guest photographs the basket and lists the items
A photo plus a count of each item, like 3 shirts and 2 towels, becomes the record of what was handed over.
Staff collect it
The basket appears in the staff queue. Tapping Collect Order moves it to in progress.
Tick, wash, dry and fold
Staff tick off every item and mark each stage as they go.
Close it with a photo
The complete button only unlocks once every item and stage is done. Staff add a photo of the finished laundry as they close it.
The guest is notified
A push notification tells the guest their laundry is ready, even if the web app is closed.
Key features

cove-laundry/feature-items.pngEvery item counted twice
The guest lists what's in the basket, and staff tick each item off before it can be marked complete. Photos at both ends settle any question about what was handed over.

cove-laundry/feature-limits.pngLimits the system enforces
One open basket per room, five per room a day, fifty per property a day, and only real room numbers. The database checks these rules itself, so a public QR page can't be used to flood the team with fake orders.

cove-laundry/feature-offline.pngWorks with no signal
Staff can log a basket themselves, for example when a guest hands one over in person, and work through it fully offline. It uploads by itself once the phone reconnects.

cove-laundry/feature-dashboard.pngA dashboard for managers
Orders per day, turnaround time, the status of every basket, what each staff member has done and which rooms use the service most.
Under the hood
React Native and Expo Router build both the staff Android app and the guest web app from the same screens. Supabase is the backend, and the ordering limits are enforced in the database rather than in the app.
When staff mark a basket complete, a server function sends the guest a web push notification through Firebase.
The portfolio demo recreates both apps in the browser with sample data, so anyone can try the whole flow without installing anything.
- React Native
- Expo Router
- TypeScript
- Supabase
- Edge Functions
- Web push
- Offline sync
Results
since every basket started being counted
handled through the app so far
A line from a manager or staff member about using it