Porting to Pebble

HomeAbout
Tue 16 Dec 2025

Pebble watches are back! Pebble was the original smart watch. I backed their original Kickstarter campaign, wrote my own watch face using their SDK, and upgraded every time they released a new watch. When they went out of business, I switched to a Fitbit Versa, and wrote a watch face for it. Fitbit bought Pebble's assets, and was in turn bought by Google. I switched to the Bangle.js 2 watch, and wrote a watch face for it, too. The Bangle was great, and had perhaps the nicest development environment of the three, but when Core Devices recently announced that they would be selling Pebble watches again, I was thrilled! The hardware for the Pebble watches, especially the upcoming Pebble Time 2, is great; Pebble watches have much better haptics (it's easier to feel your alarms); the PebbleOS Timeline feature is great; and the battery lasts for weeks (yes, I've tested it).

My Bangle.js 2 watch face, which I call Laconic, is only 379 lines long, plus metadata. Laconic displays the time, of course, but it also uses Bluetooth to communicate with the Bangle fork of the Gadgetbridge app for Android. That lets it contact my web server, from which it fetches my calendar and alarms every few minutes. That way, it can show all of my alarms and events for the next twelve hours.

Pebble supports both a C API and a Javascript API, but the Javascript API is limited, so I decided to port Laconic to the C API. Since I would be going from a garbage-collected language back to C, and switching between APIs that are quite different, I figured that the first 80% of the porting effort would go quickly, but that the remaining 20% would take a few days. In the end, thanks to Claude Code, the whole project took just a few hours, including adjusting for the new resolution, switching to a better version of the Raleway font, and adding a better battery status display. Even porting to Pebble's packaging format was easy.

As usual for LLMs, Claude made many mistakes, dropped features silently, and repeatedly declared victory when the work was far from done. Still, the work went faster than it would have. When I started using LLMs, the best I could expect was that they could write short shell scripts. Now they can port small programs across languages and APIs. Best of all, I get to skip much of the grunt work. In some ways, fixing their mistakes is motivating, and helps keep me focused. I'm learning more APIs, trying more ideas, and getting projects done more quickly than ever!