A Pebble application that complements the default firmware by adding customizable menus, widgets, and shortcuts to a watchface-like interface. It runs as an app rather than a watchface, which gives it access to all four hardware buttons. The firmware continues to run normally behind it, and the user can exit at any time to access other applications.
On Pebble, watchfaces can only react to time ticks and wrist shakes. They have no access to button presses (except back, which is reserved by the system). By running as an app, Din Clean can use all four buttons to offer menus, widgets, and shortcuts alongside the usual time display.
The watch shows time and weather exactly like a watchface would, but short-presses, long-presses, and the select button all become available. On Aplite in particular, the select button has never been usable from a watchface context, so this is new.
This does not replace the firmware or other Pebble apps. It covers a good part of everyday needs (time, weather, quick tools, shortcuts), but users will still want to leave the app regularly to use other applications.
The app is designed to be easy to leave and come back to. Three quick presses on the back button exit the app immediately.
A good setup is to use TicToc as the default watchface, because it launches almost instantly after exiting an app. From TicToc (or any watchface that supports it), configure a long-press shortcut to relaunch Din Clean App. This way, the round trip is fast: back-back-back to exit, pick another app if needed, then long-press to return. In practice, this covers most daily use without friction.
The primary screen shows time with four large bitmap digits arranged in a 2x2 grid. The typography is inspired by the Din Time watchface, using a custom Clearview-based font for maximum readability.
Below and around the digits, an information bar displays:
- Day of the week and date (localized in French, English, German, Spanish)
- Current temperature and weather icon
- Min/max temperatures for the next 24 hours
- Humidity percentage
- Wind speed (km/h, m/s, or mph)
- Bluetooth connection status
- Quiet time indicator
| Button | Action |
|---|---|
| Back | Returns to main view if on an alternate view. On the main view: first press wakes the screen, second press shows an exit hint, third press exits the app. |
| Up | Opens the up-button content: either a custom menu or a widget screen, depending on configuration. |
| Down | Opens the down-button content: menu or widgets, same as up but independently configured. |
| Select | Cycles through the configured views (main time, weather detail, date/battery info). |
Each of the three right-side buttons (up, down, select) can be assigned a long-press action:
- Launch a pseudo-application (stopwatch, timer, or alarm)
- Execute a webhook (HTTP POST to a user-defined URL)
The select button supporting long-press is unusual for Pebble, and was not possible in a watchface context on Aplite.
Pressing select cycles through up to four views. Each view can be toggled on or off from the configuration page.
Shows the current weather icon, temperature, min/max, wind speed, humidity, and the last data refresh time. Displays "Offline" if the data is stale.
Shows a battery gauge, and optionally a countdown to a target date (displayed as "J-X" followed by a custom label).
When a button (up or down) is configured in menu mode, pressing it opens a hierarchical menu. The menu supports up to 3 levels of depth, with folders, pseudo-app launchers, and webhook triggers as item types.
Menu navigation is done with up/down to browse and select to enter a folder or execute an action. Pressing back returns to the parent level or closes the menu at the root.
When a button is configured in widget mode, pressing it opens a full-screen widget viewer. Multiple widgets can be assigned to the same button, and the user navigates between them with up/down. Select cycles through the pages of the current widget.
Displays up to 5 stock panels, each showing symbol, current price, percentage change, and a sparkline chart with 8 data points. The chart includes dotted grid lines and min/max price labels. Data comes from Yahoo Finance, with configurable period (1 week, 1 month, or 3 months). Symbols can be entered manually or picked from presets (DJIA, S&P 500, NASDAQ, BTC, Gold, EUR/USD, etc.).
On Aplite, the stock widget is disabled to save memory.
Shows a 24-hour forecast split into two pages (0-12h and 12-24h). Each page displays a temperature curve with data points, rain bars (dithered), wind speeds, and hour labels. Dotted reference lines subdivide the graph area.
Shows up to 5 days of forecast, two days per page. Each day row includes the weekday name, a weather icon, temperature, rain amount, and wind speed.
Three small apps are built in and can be launched from long-press actions or from menu items.
- Select: start/stop
- Up/Down: reset (when stopped)
- Display: MM:SS, updated every second while running
- Up/Down: adjust duration in minutes (1-99) when stopped
- Select: start the countdown
- Display: remaining time in MM:SS
- When the timer expires, the watch vibrates repeatedly for about 20 seconds
- Any button press dismisses the alarm
- Select: toggles between editing hours, editing minutes, and arming
- Up/Down: adjust the selected field (hours by 1, minutes by 5)
- When armed, the title changes to "ARMED"
- Triggers once daily at the set time with a vibration sequence
- Arming and firing happen in the background even if the pseudo-app screen is closed
All three pseudo-apps keep their state as long as the application is running. The timer and alarm continue to count down in the background after leaving their screen.
Webhooks send an HTTP POST request to a URL configured in the settings page. The payload contains a JSON object with a source identifier, a timestamp, and the webhook index. Execution triggers a vibration and a brief "Action sent!" overlay on screen. Timeout is 10 seconds.
This can be used to integrate with home automation systems, IFTTT, or any HTTP endpoint.
Two weather API providers are supported, both free and requiring no API key:
- Open-Meteo with the Meteo-France AROME model (1.5 km resolution, best for France)
- MET Norway (worldwide coverage, used as fallback)
Data collected includes current conditions, a 48-hour hourly forecast (temperature, rain, wind), and a 5-day daily forecast with icons. The refresh interval is configurable (30 or 60 minutes). If a request fails, the app retries up to 3 times with 10-second intervals. Stale data remains displayed for up to one hour with an "Offline" indicator.
If an IOPool API token is provided in the settings, pool monitoring data (temperature, pH, ORP) is fetched alongside each weather update and displayed on the date view.
An optional timeout (0-300 seconds, configurable) automatically returns the watch to the main time view and closes any open menu, widget, or pseudo-app after a period of inactivity. Setting 0 disables the timeout. Any button press resets the timer.
Since this is an app and not a watchface, the back button exists and needs handling. Accidental exits are prevented with a triple-press mechanism:
- First press: the screen wakes up, nothing visible happens
- Second press (within 2 seconds): a "Press < to exit" hint appears with a short vibration
- Third press (within 2 seconds): the app exits
If the user is on an alternate view, back returns to the main time screen first, then the exit sequence starts from there.
Settings are managed through a web page hosted on GitHub Pages, opened from the Pebble phone app. The configuration covers:
- Button assignments (menu or widgets for up/down)
- Long-press actions for all three buttons (pseudo-app or webhook, with URL)
- Menu tree construction (folders, items, up to 3 levels)
- Widget selection and ordering
- View toggles (weather detail, date/battery)
- Countdown target date and label
- Stock symbols, period, and preset picker
- Weather API provider and refresh interval
- Inactivity timeout duration
- Vibration pattern (short, long, urgent)
- Animated window transitions toggle
Compatible with all Pebble SDK 3 platforms:
- Aplite (Pebble, Pebble Steel) -- 144x168, black and white, 24 KB memory limit
- Basalt (Pebble Time, Pebble Time Steel) -- forced black and white rendering
- Diorite (Pebble 2)
The stock widget is conditionally disabled on Aplite to stay within the 24 KB memory constraint. All rendering is strictly monochrome regardless of hardware capabilities.
Requires the Pebble SDK 3.
pebble build
pebble install --phone <phone_ip>
MIT







