Enterprise IoT
Automotive
B2C + B2B
One dashboard.
Eight integrated systems.
One vehicle, three readers.
One dashboard.
Eight integrated systems.
One vehicle, three readers.
I led design for a connected-vehicle platform that translated raw telemetry into decisions - for drivers who've never popped the hood, for service centers deciding who to call, and eventually for fleet managers watching dozens of vehicles at once.

Role
Role
Lead UX + Frontend +
Mobile development
Platform
Platform
iOS · Android · Web
Team
Team
5 - 7 designers led,
25+ mentored
Client
Client
Enterprise · Oil & Gas
01 - The Problem
01 - The Problem
Most car owners don't want more data. They want to know if something's wrong.
Most car owners don't want more data. They want to know if something's wrong.
An automotive enterprise wanted to bring more customers into their service centers - not by advertising harder, but by helping people actually understand their own vehicle. If the app helped drivers understand their car, they'd visit service centers when they actually needed to, not after something broke.
For someone who's never opened the hood, the entire product came down to one question: is my car okay right now, and what should I do about it?
The complication - a vehicle doesn't speak in plain language. It speaks in fault codes, sensor thresholds, and raw GPS traces.
The design challenge was translation: make complex telemetry feel simple, actionable, and trustworthy.
An automotive enterprise wanted to bring more customers into their service centers - not by advertising harder, but by helping people actually understand their own vehicle. If the app helped drivers understand their car, they'd visit service centers when they actually needed to, not after something broke.
For someone who's never opened the hood, the entire product came down to one question: is my car okay right now, and what should I do about it?
The complication - a vehicle doesn't speak in plain language. It speaks in fault codes, sensor thresholds, and raw GPS traces.
The design challenge was translation: make complex telemetry feel simple, actionable, and trustworthy.
02 - Scope
02 - Scope
Not one app. One ecosystem.
Not one app. One ecosystem.
The product connected to eight-plus integrated services - each with its own data shape, failure modes, and business logic - and had to feel like a single calm experience regardless of what was happening underneath.
The product connected to eight-plus integrated services - each with its own data shape, failure modes, and business logic - and had to feel like a single calm experience regardless of what was happening underneath.
01
OBD-II Bluetooth onboarding
02
Maintenance & diagnostics
03
Trips & driver score
04
Milestones & badges
05
Emissions testing
06
Roadside assistance
07
Geofencing & place detection
08
Voice assistance
09
Digital glovebox
10
Vehicle insurance scoring
11
Nearby services & search
12
Coupons & promotions
01
OBD-II Bluetooth onboarding
02
Maintenance & diagnostics
03
Trips & driver score
04
Milestones & badges
05
Emissions testing
06
Roadside assistance
07
Geofencing & place detection
08
Voice assistance
09
Digital glovebox
10
Vehicle insurance scoring
11
Nearby services & search
12
Coupons & promotions
01
OBD-II Bluetooth onboarding
02
Maintenance & diagnostics
03
Trips & driver score
04
Milestones & badges
05
Emissions testing
06
Roadside assistance
07
Geofencing & place detection
08
Voice assistance
09
Digital glovebox
10
Vehicle insurance scoring
11
Nearby services & search
12
Coupons & promotions


Home dashboard - six surface areas, each backed by a different integrated service
03 - Design Decisions
03 - Design Decisions
Each decision started with a user tension. Each answer cascaded through the whole product.
Each decision started with a user tension. Each answer cascaded through the whole product.
Decision A
Decision A
Status Ring - safety signal without location tracking
Status Ring - safety signal without location tracking
The core tension: family members wanted to know their loved ones were safe while driving. But nobody wants to feel watched. Showing location data felt like surveillance. Hiding everything felt unsafe.
The answer: show status, not coordinates. A coloured ring around each family member's avatar - green (safe), amber (alert), red (needs attention) - communicates driving state in one glance without any location data. Tapping it surfaces a contextual update: trip summary, a licence expiry reminder, feedback suggestions.
The core tension: family members wanted to know their loved ones were safe while driving. But nobody wants to feel watched. Showing location data felt like surveillance. Hiding everything felt unsafe.
The answer: show status, not coordinates. A coloured ring around each family member's avatar - green (safe), amber (alert), red (needs attention) - communicates driving state in one glance without any location data. Tapping it surfaces a contextual update: trip summary, a licence expiry reminder, feedback suggestions.

Status ring states: idle · new trip update · reminder · all caught up
Status ring states:
idle · new trip update · reminder · all caught up
Why this cascaded: This single decision changed notification architecture, widget design, backend prioritisation, and the home screen information hierarchy - all to serve one insight: what matters to families isn't location, it's status.
Why this cascaded: This single decision changed notification architecture, widget design, backend prioritisation, and the home screen information hierarchy - all to serve one insight: what matters to families isn't location, it's status.
Decision B
Decision B
Driver Score — a diagnosis, not a verdict
Driver Score — a diagnosis, not a verdict
A single 0 - 100 score tells you nothing actionable. "Your score dropped to 72" doesn't help anyone improve. The question was: how do you make a metric feel like a coaching tool, not a judgment?
A single 0 - 100 score tells you nothing actionable. "Your score dropped to 72" doesn't help anyone improve. The question was: how do you make a metric feel like a coaching tool, not a judgment?
Split the score into dimensions. Efficient driving, safe driving, trip frequency - each visible separately, each with a trend. Drivers could see exactly which habit was moving the needle instead of watching a number change for no visible reason.
Split the score into dimensions. Efficient driving, safe driving, trip frequency - each visible separately, each with a trend. Drivers could see exactly which habit was moving the needle instead of watching a number change for no visible reason.


Score view - overall gauge + behaviour breakdown (Behaviour / Safety / Efficiency tabs)
The score wasn't a black box
The score wasn't a black box
The gauge and the trip log were the same data - two zoom levels apart. A driver could see why Thursday's trip pulled their score down: two harsh accelerations, one speeding event, one phone pickup. Making events traceable to the score was what turned Driver Score from a mystery metric into something people trusted enough to act on.
The gauge and the trip log were the same data - two zoom levels apart. A driver could see why Thursday's trip pulled their score down: two harsh accelerations, one speeding event, one phone pickup. Making events traceable to the score was what turned Driver Score from a mystery metric into something people trusted enough to act on.
Key principle: Show the cause, not just the effect. Transparency earns trust faster than any score alone.
Key principle: Show the cause, not just the effect. Transparency earns trust faster than any score alone.

Decision C
Decision C
Milestones & Badges - progress that keeps you opening the app
Milestones & Badges - progress that keeps you opening the app
A good score alone doesn't change behaviour. People need a reason to open the app on an ordinary Tuesday - not because something is wrong, but because they're close to the next milestone.
A good score alone doesn't change behaviour. People need a reason to open the app on an ordinary Tuesday - not because something is wrong, but because they're close to the next milestone.
Badges were made repeatable. "Smooth Operator" could be earned every month - turning a one-time reward into an ongoing habit loop. Milestones tracked real-world progress: 500 miles, 1000 miles, a third vehicle onboarded.
Badges were made repeatable. "Smooth Operator" could be earned every month - turning a one-time reward into an ongoing habit loop. Milestones tracked real-world progress: 500 miles, 1000 miles, a third vehicle onboarded.


Milestones: real-world usage streaks with completion dates - Badges: repeatable (×12, ×10, ×7 earned) alongside locked ones still to unlock
Decision D
Decision D
Goal-setting - conversational, not a form
Goal-setting - conversational, not a form
Drivers don't engage with dropdown forms. They engage with decisions they feel they made themselves. Instead of asking users to fill fields, I designed a sentence-builder: "I want to reduce speeding by 10% for the next 15 trips with sensitivity level strict."
Drivers don't engage with dropdown forms. They engage with decisions they feel they made themselves. Instead of asking users to fill fields, I designed a sentence-builder: "I want to reduce speeding by 10% for the next 15 trips with sensitivity level strict."
The system also suggested goals based on actual driving patterns - so the goal felt personal, not prescribed. Once set, goals tracked live alongside the driving data that caused them.
The system also suggested goals based on actual driving patterns - so the goal felt personal, not prescribed. Once set, goals tracked live alongside the driving data that caused them.
Why this mattered: Users who constructed their goal themselves showed 3× higher retention than those who skipped goal-setting. The interaction pattern - writing it rather than selecting it - created ownership.
Why this mattered: Users who constructed their goal themselves showed 3× higher retention than those who skipped goal-setting. The interaction pattern - writing it rather than selecting it - created ownership.

Goal flow - empty state · personalised · sentence builder · live tracking


UX: Conversational approach




04 - Scaling the system
04 - Scaling the system
One system, four brands, different rules
One system, four brands, different rules
After launch, the same core product had to ship again - and again - under different brand names, each with its own regulatory constraints. Some regions couldn't show emissions data at all. Some partners didn't offer roadside assistance. One brand's insurance partner scored risk differently from another's.
Instead of forking the product per brand, I built brand and feature governance into the design system itself - same components, same interaction patterns, different theme and feature flags per deployment. A new brand variant went from a multi-month redesign to a configuration exercise.
After launch, the same core product had to ship again - and again - under different brand names, each with its own regulatory constraints. Some regions couldn't show emissions data at all. Some partners didn't offer roadside assistance. One brand's insurance partner scored risk differently from another's.
Instead of forking the product per brand, I built brand and feature governance into the design system itself - same components, same interaction patterns, different theme and feature flags per deployment. A new brand variant went from a multi-month redesign to a configuration exercise.
05 - The pivot
05 - The pivot
Same vehicle data.
A completely different reader.
Same vehicle data.
A completely different reader.
Consumer adoption was hard to earn - most people won't download an app just for their car. The business shifted toward fleet operators, who had a much clearer reason to care: visibility across dozens of vehicles at once, not just one.
I designed a parallel, web-first fleet management platform on the same underlying data model. A driver's single trip in the consumer app became one row in a fleet manager's risk report. The interface changed completely - dashboards instead of trip cards, aggregates instead of individual scores - but the translation logic underneath, raw signal to actionable insight, stayed the same.
Consumer adoption was hard to earn - most people won't download an app just for their car. The business shifted toward fleet operators, who had a much clearer reason to care: visibility across dozens of vehicles at once, not just one.
I designed a parallel, web-first fleet management platform on the same underlying data model. A driver's single trip in the consumer app became one row in a fleet manager's risk report. The interface changed completely - dashboards instead of trip cards, aggregates instead of individual scores - but the translation logic underneath, raw signal to actionable insight, stayed the same.
06 - Team & Leadership
06 - Team & Leadership
Design had no fixed lane in this team
Design had no fixed lane in this team
In an agile org where roles were fluid, I led design directly, stayed close to how it got built, and mentored across functions - not just within the design team.
In an agile org where roles were fluid, I led design directly, stayed close to how it got built, and mentored across functions - not just within the design team.
5-7
5-7
Designers led directly across consumer and fleet platforms
Designers led directly across consumer and fleet platforms
25+
25+
Cross-functional designers and engineers mentored over four years
Cross-functional designers and engineers mentored over four years
2
2
Parallel platforms kept in sync - mobile-first consumer, web-first fleet
Parallel platforms kept in sync - mobile-first consumer, web-first fleet
Thoughts - What I'd do differently
Thoughts - What I'd do differently
If I designed this today I'd push that translation one step further. Instead of "harsh braking detected," show the pattern: "harsh braking is up 40% on Thursday evenings." With the reasoning visible, not just the alert. That's the shift from reporting what happened to explaining why - and it's the design problem I want to work on next.
If I designed this today I'd push that translation one step further. Instead of "harsh braking detected," show the pattern: "harsh braking is up 40% on Thursday evenings." With the reasoning visible, not just the alert. That's the shift from reporting what happened to explaining why - and it's the design problem I want to work on next.