Open-source smartwatch · LVGL · ESP32-S3

A watch you can
actually hack.

JNKWatch is a round smartwatch built in the open — a platform-independent LVGL v9 interface that runs on a desktop emulator and on a 466×466 AMOLED ESP32-S3, paired with an Android companion app.

Apache-2.0 · Emulator complete — on-device drivers are the next milestone

Live preview · real renders below

466×466AMOLED
LVGL v9UI toolkit
8watch faces
6accent teintes
Apache-2.0licensed

Features

Everything on your wrist, nothing locked down.

A swipeable deck of faces and apps, a motion-reactive aura, and a fully customizable action grid that talks to your phone over BLE.

⤬

Swipeable faces

Faces and apps live in an lv_tileview — swipe horizontally between them, swipe vertically to flip Clock ⇄ Aura and Apps ⇄ Level.

◷

Dual-display clock

A Casio-style face: a big LCD time next to a status column with date, battery, weather, activity and an unread-notification bell.

✺

“Aura” motion field

A particle watchface driven by the IMU — calm cyan at rest, vivid magenta the moment you move.

▦

2×3 action grid

Six customizable buttons. Each tap fires a BLE event your phone turns into an HTTP POST webhook — control anything.

◉

Notifications

Phone notifications, SMS and calls forwarded to a card on the watch, with an unread bell and tap-to-dismiss.

◐

Six accent teintes

Recolor the whole UI in a tap — Rose, Vert, Cyan, Violet, Or or Bleu.

Eight JNKWatch faces rendered on round dials
Rendered on the PC emulator — the exact same UI source that runs on-device.

The deck

Eight faces & apps, one swipe apart.

  • Actions2×3 shortcut grid firing BLE signals
  • NotificationsLatest card, unread bell, tap to clear
  • ClockDual-display Casio time + status column
  • AuraMotion-reactive particle field
  • SettingsBrightness, wrist-wake, accent teintes
  • StepsProgress ring to a daily goal, green at target
  • LevelSpirit/bubble level from the accelerometer
  • ProbesLive server values pushed from your phone

Hardware

Built for the Waveshare ESP32-S3 Touch AMOLED 1.43″.

An off-the-shelf round dev board — no custom PCB required to start hacking. Every driver and pinout is documented in the repo.

JNKWatch action grid rendered on a round AMOLED dial
MCU
ESP32-S3R8 · dual LX7 @ 240 MHz
Memory
16 MB flash · 8 MB PSRAM
Display
1.43″ round AMOLED 466×466 · SH8601 QSPI
Touch
FT3168 capacitive (I²C)
Motion
QMI8658 6-axis IMU
Clock
PCF85063 RTC
Power
3.7 V Li-ion · light-sleep + watch-only mode
Wireless
Bluetooth LE (NimBLE)

Android companion

Your phone does the heavy lifting.

A Kotlin / Jetpack Compose app connects over BLE and feeds the watch everything it needs — built around a documented GATT protocol.

🔔

Notifications relay

Forwards app notifications, SMS and incoming calls straight to the watch.

⛅

Weather

Pulls local conditions from Open-Meteo and syncs temp & condition.

🔗

Action webhooks

Maps each of the six action buttons to a configurable HTTP POST with your own body & headers.

📡

Server probes

Polls GET endpoints on a schedule and pushes the values to the watch’s Probes face.

🕑

Time & settings sync

Keeps the RTC and your preferences mirrored between phone and watch.

📖

Open protocol

Every characteristic is specified in docs/ble-protocol.md — build your own client.

Under the hood

Designed to be developed on a laptop.

Platform-independent UI

The entire watchface is plain LVGL with a thin driver layer. The same UI source compiles for the PC emulator and for the device — only the HAL changes. Build it, screenshot it, and unit-test it before any hardware is on your desk.

Emulator + headless renders

watch_sim opens an SDL2 window; a headless target emits PNGs (the images on this page). Core logic lives in pure, LVGL-free C modules.

Test-driven

15 Unity test suites cover the logic modules — pedometer, steps, timer, settings, notifications, probes, level math and more — run via ./test.sh.

Power-aware

Screen-off standby, esp_pm light-sleep, low-power BLE and an ultra-low “watch-only” mode that keeps the clock alive with the radio off.

Quick start

Run it in three commands.

No hardware needed to try the UI — the emulator builds on any desktop. Flashing a device uses ESP-IDF 5.3+.

# 1 · get the source
git clone https://github.com/jnkwatch/watch
cd watch

# 2 · build & run the emulator
./build.sh
./watch_sim

# 3 · flash a device (ESP-IDF 5.3+)
idf.py -C firmware flash monitor