
Hackable smartwatch platform: Nordic silicon, Zephyr firmware, open hardware.
KWatch is a full-stack, open hardware kit to build a wearable that feels production-ready but stays mod-friendly. One PCB set, one Zephyr firmware, one place to script apps and demos quickly.
- 🔍 What this repo delivers
- 🧭 Platform at a glance
- ⚙️ Hardware highlights
- 🧠 Firmware snapshot
- 🖼️ Quick gallery – real device
- 🛠️ PCB views
- 🚦 Status & roadmap
- 🧭 Repository map
- 🚀 Fast start (Zephyr)
- ✅ Build/test checklist
- 🛠️ Writing apps
- 📜 Licence
- 🙏 Thanks
- Fabrication-ready hardware: KiCad sources and manufacturing files for the watch mainboard, aligned with the photo set and BOM.
- Zephyr firmware baseline: BLE, sensors, display, haptics, and power tuned for wearables on nRF52840.
- App hooks: An app-manager direction so you can prototype UX without forking the platform.
- Expectations you can see: Real-build photos and PCB views to match your assembly to ours.
- A mod-friendly platform: Keep experiments fast—swap sensors, iterate watchfaces, ship demos without redoing the core.
| Layer | Highlights |
|---|---|
| 🛠️ Hardware | nRF52840 mainboard, PMIC, external flash, baro + IMU + magnetometer + ALS, RGB LED, MIP display. |
| 🧠 Firmware | Zephyr RTOS, BLE services, gesture wake, low-power policies, haptics, display, app-manager direction. |
| 📱 App | Roadmap: companion workflows for sync, OTA, and pushing watch apps. |
- nRF52840 BLE SoC (u-blox NINA-B301-00B): 64 MHz Cortex-M4F, 256 KB RAM, 1 MB flash, ANT/802.15.4/Thread/Zigbee/NFC-A, CryptoCell
- Nordic nPM1300 PMIC for power + system management
- Macronix W25Q16JVUXIQ TR 16 MB external flash
- Bosch BMP581 barometric sensor (≈20 cm resolution)
- ST LSM6DSLTR 6-axis IMU (gestures, lift-to-wake)
- ST LIS3MDLTR magnetometer
- Broadcom APDS-9306-065 ambient light sensor
- Knowles SPK0641HT4H-1 I2S microphone
- Micro Crystal RV-8263-C8 RTC
- Texas Instruments ADS1115IRUGR 16-bit, 4-channel I²C ADC
- Texas Instruments DRV2603RUNT haptic driver for LRA/ERM
- Worldsemi WS2812B addressable RGB LED
- Japan Display LPM013M126A 1.28" 176×176 Memory-in-Pixel TFT with custom backlight
- Zephyr-based project with custom board definition in firmware/boards (K_watch).
- Application lives in firmware/app;
prj.confcaptures feature toggles and power/peripheral policies. - Focus: BLE connectivity, low-power idle, gesture-driven wake, haptics, display pipeline, and an app-manager path for user apps.
- Hardware: Rev v0.1 validated (see galleries). Next: refine power/PMIC tuning and add strap/closure options.
- Firmware: Core bring-up on Zephyr complete; prioritizing display pipeline polish, haptics tuning, and app-manager ABI.
- Companion app: Roadmap item—planned for sync, OTA, and app delivery; interim control via BLE scripts.
- firmware/app: Main application sources and
prj.conffeature toggles. - firmware/boards: Board definition (K_watch) for Zephyr.
- hardware: Schematics, layout, fabrication outputs.
- production: Manufacturing assets and photos.
- resources: Logos and build photos used in this README.
Assembly detail
|
Build angle
|
Component close-up
|
Workbench shot
|
On-wrist view
|
Packaging / kit
|
If images do not render, open them directly from resources/image.
- Install Zephyr prerequisites (Python, west, CMake, ARM GCC toolchain or Zephyr SDK). See the Zephyr Getting Started guide for your OS.
- From repo root, initialize workspace once:
west init -l firmwarewest update
- Export CMake package:
west zephyr-export. - Build:
west build -b K_watch firmware/app - Flash via your probe (J-Link/CDC):
west flash
If you use a non-default toolchain, set ZEPHYR_TOOLCHAIN_VARIANT and GNUARMEMB_TOOLCHAIN_PATH before building.
- ✅ Configure workspace with
west init -l firmware && west update. - ✅ Build:
west build -b K_watch firmware/app. - ✅ Flash:
west flash(probe connected). - ✅ Smoke test: BLE advertises, display backlight cycles, haptic tick works, IMU responds over shell.
⚠️ If power draw is high, reviewprj.conflow-power options and disable unused peripherals.
- User apps are planned as Zephyr subsys-style modules with a small ABI. For now, keep code in firmware/app/src and guard features with Kconfig in
prj.conf. - Prefer event-driven patterns and avoid long busy loops to keep power low and wake latency tight.
This project is licensed under the GNU GPLv3. Compared to permissive licences like MIT, GPLv3 requires that if you modify this code and distribute your version (including in commercial products), you must also release your changes under the same GPLv3 licence and provide the corresponding source code.
This way, everyone can benefit from improvements built on top of this project. If this licence causes issues for your intended use, feel free to contact me – I’m open to discussing alternatives.
Community contributions are welcome: hardware bring-up notes, power traces, UI sketches, test logs, and app experiments all help the project move faster.







