All work
Resume

Personal project · Early testing

RouteLah

A free mobile webapp that puts a driver’s delivery stops in the fastest order, then hands each leg to Google Maps or Waze.

Role
Solo designer and builder. Flows, design system and build.
Scope
Mobile webapp for delivery drivers to plan their routes efficiently
Timeline
Under 1 month, testing under way
Methods
Requirements from a working delivery driver, flow design, design system
Tools
Figma, Claude, React, Vite, TypeScript, Cloudflare Pages, openrouteservice, OneMap
Open the app

TL;DR

RouteLah

Mobile webappLogisticsEarly testing

The Challenge

No free route planner takes more than 10 addresses, so drivers plan their waves on pen and paper.

  • About 16 stops a wave, 3 waves a day
  • Priority deliveries get missed, then the driver rushes
  • It had to stay free for drivers and free to run
RouteLah route with stops on a phone
Role

Solo designer and builder

Tools

Figma, Claude, React, Cloudflare Pages

Outcome

Live at routelah.pages.dev
Currently testing

The Flow

Start time screen with standard and priority window lengths and a starting point 01

Set the start

Wave start, window lengths, optional start point.

Paste a list screen with a pasted list of addresses 02

Paste stops

Addresses or bare postal codes, in one go.

Review list with window toggles per stop and one postal code not found 03

Review

Standard, priority or custom time per stop.

Optimised route with ETAs and a Navigate to stop 1 button 04

Optimise

ETAs per stop. Navigate opens Maps or Waze.

Route with a stop marked done and an Undo toast 05

Mark done

Undo toast, then the next stop scrolls up.

Decisions

01

No GPS in v1

“Navigate to stop N” hands turn-by-turn to the driver’s map app.

02

“Mark done”, not “Delivered”

It plans routes. It doesn’t confirm deliveries, so v1 has no failed-delivery path.

03

Unfixed stops don’t block

A postal code the app can’t find moves to Needs fixing. The rest still optimise.

04

Custom times inside the wave

A 9:30 to 10:30 slot in an 8:00 to 11:00 wave. The route plans around it.

05

1 fixed stop time

3 minutes a stop lets the app calculate every ETA and warn early when running late.

06

The driver picks the map app

Google Maps or Waze, set once in Settings, used by every Navigate button.

Outcomes

MEASURED

Live and installable at routelah.pages.dev.

SUCCESS METRICS

Completed routes, priority stops on time and repeat use.

Route complete screen with done, priority on time and late counts

What’s Next?

01

Extend from the LateBanner

When a route runs late, the banner offers “Extend window to 4 hr”, so the driver doesn’t go back to Start time.

02

Add stops from a photo

Drivers get a printed address list. A photo fills the paste list, and the review screen catches any misread address.

Context

No free route planner takes more than 10 addresses. A delivery driver runs about 16 stops a wave, 3 waves a day.

So the driver plans on pen and paper, misses priority deliveries and ends up rushing. Each stop has a delivery window, and some are priority.

The constraint: free for drivers and free to run. That set the stack: no accounts, no database, routes saved on the phone.

The flow

5 screens take a driver from a pasted list to a finished wave.

  1. 01

    Set the start

    The driver picks when the wave starts and sets the window lengths: 3 hours standard, 1 hour priority. A starting point is optional: type an address or use the phone’s location.

    Start time screen with standard and priority window lengths and a starting point
  2. 02

    Paste stops

    Addresses or bare postal codes, separated by commas, all in one go. Drivers already get their stops as a list, so the app takes the list as it comes.

    Paste a list screen with a pasted list of addresses
  3. 03

    Review

    Each stop gets a standard window, a priority window or a custom time. Postal codes the app can’t find get Fix or delete, and they don’t block the rest.

    Review list with window toggles per stop and one postal code not found
  4. 04

    Optimise

    Each row shows an ETA, and “Navigate to stop N” opens Google Maps or Waze, whichever the driver set in Settings.

    Optimised route with ETAs and a Navigate to stop 1 button
  5. 05

    Mark done

    An Undo toast confirms it, the stop greys out and the next one scrolls to the top. If the route runs late, a banner offers Re-optimise.

    Route with a stop marked done and an Undo toast

Decisions

Left out of v1

No GPS

The main button always reads “Navigate to stop N”, and the driver’s map app does the turn-by-turn. Settings offers Google Maps or Waze, and that choice becomes the default for every Navigate button.

Rejected: a failed-delivery path

“Mark done”, not “Delivered”

RouteLah plans routes. It doesn’t confirm deliveries, so v1 has no failed-delivery path.

Unfixed stops don’t block

A postal code the app can’t find moves to a Needs fixing row, and the driver can still optimise the rest.

Custom times inside the wave

A wave can run 8:00 to 11:00 with one scheduled delivery at 9:30 to 10:30. The route plans around that slot and the priority stops, so the driver reaches the scheduled stop neither too early nor too late.

Drivers get waves by area, for example Jurong with Bukit Batok, Tengah and Choa Chu Kang, so stops sit close together and clashes are rare. When the stops still don’t fit, the driver lengthens the standard window from 3 to 4 or 5 hours. Drivers have no hard end time, only a minimum of 3 waves a day.

Rejected: a per-stop setting

1 fixed stop time

Every stop gets 3 minutes. A fixed time lets the app calculate every ETA and warn early when the route will run late.

Warn only where it matters

The “No unit number” warning shows only for HDB flats and condos, not landed houses. It can guess wrong, which is fine while drivers don’t use the app to find unit numbers.

Built for reading at a glance

I set Atkinson Hyperlegible Next, a typeface designed for legibility, instead of Inter. I gave the add icon weight 600 because 400 looked too thin, and lightened the dark-mode blue for contrast.

Outcomes

Measured

Live and installable on a phone at routelah.pages.dev.

Success metrics

Testing is under way. I will track completed routes, priority stops delivered on time (the Priority on time count on the Route complete screen), and whether the driver keeps using the app.

Route complete screen showing 5 done, 2 priority on time, 0 late
The Route complete screen already counts priority stops on time.

Next

  • Test on the driver’s real waves, then add a Reflection chapter with what changed.
  • Finish launch: Search Console sitemap, privacy policy, app icon.

Next version

  • Extend from the LateBanner. When a route runs late, the banner offers “Extend window to 4 hr” directly, so the driver doesn’t go back to Start time.
  • Add stops from a photo. Drivers receive a printed address list. A photo of it fills the paste list, and the review screen catches any address read wrongly.

Try it on your phone. routelah.pages.dev

Open the app