Case study 02 Wearable software · 2026

Typeface
955

I wanted my new Garmin to feel less like a phone than my Apple Watch did. Typeface 955 shows only the time, date, and battery, with settings that keep those three values readable.

Role
Interface design
Device engineering
Platform
Garmin Connect IQ
Monkey C
Target device
Garmin
Forerunner 955
Current scope
260 × 260 display
5 custom typefaces
01 / Motivation

I wanted less from my smartwatch.

I switched from an Apple Watch to a Garmin because I wanted a watch that felt more like a tool and less like another phone. Most available faces still put far more information on screen than I wanted.

My requirements were specific. I wanted four-digit 24-hour time, the day and date, and an exact battery percentage. Everything would be white on black. I did not want a colon, icons, fitness rings, weather, animation, seconds, or anything that required a tap.

With only three values on screen, small choices became obvious. Font width affected the largest possible time size. Vertical spacing affected how quickly I could read the face. Update frequency affected how much work the watch performed throughout the day.

02 / Interface

The hierarchy is simple on purpose.

The time is by far the largest element. The date sits above it, and the battery sits below it. I can glance at the face and find the right value without scanning a grid of complications.

TIME

Four digits, no colon

Twenty-four-hour time removes the need for AM or PM. Dropping the colon leaves more room for the numbers, which matters on a round screen.

DATE

Day and date together

The abbreviated weekday and date stay centered above the time. They are easy to find but small enough that the time still reads first.

BATTERY

Show the exact number

A percentage tells me more than a small battery icon. A setting lets me hide the percent sign if I want an even cleaner display.

COLOR

White on black

The default has maximum contrast and matches the rest of my watch setup. Color settings are there for people who want them, but the basic face stays plain.

Settings without turning the face into a dashboard

I compared several font and battery layouts before choosing the default. The finished face includes five custom typefaces, four date sizes, four battery sizes, optional color controls, and an optional percent sign. The settings preview updates on the watch, so the user can judge a choice on the real display instead of guessing from a list of names.

03 / Rendering

The face redraws often, but most of the data does not.

Garmin can call the face several times after a wrist gesture. The Forerunner 955 still needs a complete frame each time, but the strings behind that frame usually have not changed.

1 min The time string is formatted again when the minute changes.
On change Garmin reports a new battery value through its native complication API.
Each call The complete frame is drawn from cached strings for reliable hardware rendering.

The normal update path makes one clock query. It reformats the time when the minute changes and rebuilds the date once per hour. Battery updates take a different route. The app subscribes to Garmin’s battery complication when it starts, caches each value Garmin publishes, and requests a screen update only when that value changes.

When the face becomes visible, it refreshes the cached battery immediately so the first glance after charging is current. If the complication subscription is unavailable, the app falls back to reading System.getSystemStats() once per hour. Changing whether the percent sign is shown only reformats the cached value and does not trigger another battery query.

// Simplified rendering strategy
onStart() subscribeToBatteryChanges();

onBatteryChanged() {
  cacheBatteryValue();
  requestUpdate();
}

if (minuteChanged) formatTime();
if (hourChanged) formatDate();

draw(cachedDate, cachedTime, cachedBattery);
04 / Hardware testing

The simulator was not enough.

Connect IQ handles fonts, resources, packaging, and updates differently from a web project. The round display also gives every line of text a hard width limit. I used the simulator while iterating, then installed each serious version on my Forerunner 955 to check spacing and readability on the real screen.

One attempted battery optimization looked reasonable in the simulator: skip a draw when the visible values had not changed. On the watch, that could leave the screen black after a gesture. The hardware expects a complete frame on every update callback. I changed the design so every callback draws the full frame, while the code avoids repeating clock formatting, date lookup, battery polling, and font loading behind it.

Most of the work came down to small decisions

  • Preparing custom fonts that rendered consistently on the watch.
  • Making the time as large as possible without clipping near the curved edges.
  • Adding color options without cluttering the default face.
  • Finding a blank-screen bug that appeared only after installing the optimized build on the watch.
  • Separating sensible optimizations from battery claims I had not measured.
05 / Outcome

It now runs on the watch I wear every day.

Typeface 955 now runs on the watch I wear every day. It gives me the three things I check most often. I do not have to open a widget, dismiss anything, or search through extra data.

I can explain why the code avoids unnecessary formatting and resource work. I have not completed a controlled battery comparison against a stock Garmin face, so I do not claim a measured battery-life improvement. That test is still on my list.

CODE

Battery updates arrive as events

The face listens for real battery changes instead of polling for a value that usually stays the same.

INTERFACE

Fewer fields made the time larger

Less information gave me more room for the values I actually wanted to read.

TESTING

The real watch settled the layout

The simulator was useful, but the watch exposed both layout issues and a blank-screen rendering bug.

MEASUREMENT

I still need a battery benchmark

I need a controlled comparison before attaching a number to the battery impact.

Next case study Bugnut