All work

Making a Bluetooth scanner readable at a glance

I redesigned CVM Scanner, an Android app that reads live data from emergency-vehicle equipment over Bluetooth. Then I critiqued my own redesign and built a second pass you can try below.

Skip to the interactive prototype

Role
UX/UI Designer
Type
Freelance
Platform
Android
Tools
Figma
Second-pass CVM Scanner screens: a live scan finding devices, and a device that has lost signal, flagged in red.
Overview

A small tool with a lot of live data

A German company that builds radio technology for fire and rescue vehicles fits its equipment with CVM modules: small sensors that show whether a device, like a radio, is plugged in and charging. CVM Scanner finds these modules over Bluetooth and lists their signal and live voltage, current and power. It worked, but every screen asked users to decode it.

Constraints: keep every existing feature, a German-language UI on Android, and people who check the phone at a glance, standing next to a vehicle.

What changed: a clear scan state, signal shown with a word and not only a color, and readings that line up. A second pass adds charging status, honest "last seen" times and the missing error states.

The problem

What the old app asked users to guess

I reviewed the old screens one by one and marked every place where users had to stop and interpret.

01

Signal was shown by color alone

A colored icon and a raw number with no unit: unreadable without color vision or knowing the scale.

Design response

A word (Good, Fair, Weak) plus the value in dBm.

02

Was it scanning or not?

A small spinning arc next to "Scan", easy to miss.

Design response

A clear "Scanning…" state with a radar and a way to stop.

03

Finding one device took scrolling

No search, and sorting hid behind a top-bar icon.

Design response

Search and filter side by side above the list.

04

Icons and layout sent mixed signals

A gear opened renaming, readings had no hierarchy, and the empty state was one small line.

Design response

An edit icon, a card hierarchy from name to readings, and an empty state that explains itself.

Before → after

Every feature kept, every screen rethought

Every feature is still there. Each screen now says what is happening and what to do next.

Empty state

The scan is now visible: a large radar while searching, a scan bar that can stop it, and a plain "no devices found" when nothing is nearby.

Before Old app: empty list with a small line of text and a spinner
After Redesign: scanning screen with an animated radar while no devices have been found yet

Device list

Each device is a card: name, then signal with a word and dBm, then readings in monospace so the numbers line up.

Before Old app: device list with colored wifi icons and right-aligned names
After Redesign: device cards with signal labels, live readings, search and filter

Renaming a device

Renaming starts from an edit icon instead of a gear, and opens a focused dialog.

Before Old app: rename dialog
After Redesign: rename dialog with a focused input, cancel and save buttons

Settings

The checkbox became a toggle with a short description, and the signal slider shows its value.

Before Old app: settings with a checkbox and an RSSI slider
After Redesign: settings with an auto-scan toggle and a minimum signal slider
Device cards

Two ways to show a device

The card carries most of the app, so I designed two variations: same order (name, signal, readings), different weight. The second pass builds on them.

Device list with card variation one, while scanning
Variation 1 · while scanning
Device list with card variation two, after scanning stopped
Variation 2 · scan stopped

These are early variations, so the device names and numbers are placeholders.

Design system

A small system for live data

Two typefaces, two jobs. Inter for text, IBM Plex Mono for live values, so changing digits don't jump.

A calm dark palette. Navy surfaces, one blue accent, and green, yellow and red kept for signal quality, always with a word.

Type

Pumpe HLF 1Inter · names, labels, text

12.6 VIBM Plex Mono · live values

Color

  • Text#FFFFFF
  • Background#002037
  • Surface#0C2741
  • Line#00385E
  • Accent#2BA7FF

Signal

  • Good#4ADE80
  • Fair#FACC15
  • Weak#F87171

Buttons

Start Scan Scan Stopp

Signal

Good-48 dBm Fair-71 dBm Weak-88 dBm

Toggle

On Off

Device card

Pumpe HLF 1
Good-52 dBm
Volt
12.6 V
Ampere
0.84 A
Watt
10.6 W
Core components, rebuilt from the Figma library. View the original board
Explorations

Trying other colors and variations

I tried gray and black themes and more colorful cards. I dropped them: the navy felt calmer, and extra colors competed with green, yellow and red, the one place where color has to mean something.

Draft screens exploring different colors and card variations
Draft explorations, not part of the final design
Second pass

Critiquing my own redesign

I then reviewed my redesign the way a crew member would use it: next to a vehicle, glancing at the phone to check every device is in place and charging. Eight questions were still open. This second pass answers them.

Interactive prototype

Try the second pass

Pick a scenario to jump straight into a state, or just use the app.

Scenarios

Try this

  1. Watch devices appear while it scans, then tap × in the scan bar to stop.
  2. Open Filter and show only devices that are not plugged in.
  3. Tap the pencil on the unnamed device and give it a name.
  4. In Connection lost, tap the red banner to jump to the problem.
  5. Open settings and raise the minimum signal strength.

The UI is in German, just like the real app. The data is simulated.

The eight changes

  1. 01

    Volts don't say "charging"

    Users had to read voltage and current to work out a device's state.

    Every card leads with a status chip: Lädt (charging), Voll geladen (full) or Nicht eingesteckt (not plugged in).

  2. 02

    IDs aren't names

    The technical ID competed with the name the crew gave the device.

    The nickname is the title, the ID sits below, and unnamed devices are one tap from a name.

  3. 03

    "Nothing found" too early

    The empty state appeared the moment a scan started.

    While scanning it says Suche nach Geräten… (searching). Only after a timeout comes an empty state with Erneut suchen (search again).

  4. 04

    No obvious way to stop

    Scanning drains the battery, but stopping was not clearly offered.

    A labeled stop button (×) sits inside the scan bar.

  5. 05

    Old data looked live

    A device that went out of range kept showing its last values as if nothing happened.

    Each card shows vor X s (X s ago). After 30 s it turns into Verbindung verloren (connection lost) and a banner points to it.

  6. 06

    Problems hid in the list

    There was no device count and the default order was arbitrary.

    A device count, problems first by default, and a sheet for sorting and filters.

  7. 07

    Small targets, quiet icons

    Some icons had no label, some targets were too small for gloves, and logout sat next to everyday actions.

    48dp targets, labeled icon buttons, higher contrast, and logout moved to a header icon.

  8. 08

    Missing system states

    Bluetooth off, missing permission and a lost connection were not designed at all.

    Each gets its own state that explains what happened and offers the one fix.

Outcome

Every screen, plus a clickable second pass

Every screen and state of the app, the components and styles behind them, and a second-pass proposal as a clickable prototype.

What I learned

Color alone wasn't enough for the signal. Once I paired it with a word, everyone could read it. Setting the values in a monospace font made the whole device list calmer, because the numbers finally lined up.

I also learned to design the error states early. Stale data or Bluetooth switched off are exactly the moments when people need the app most.