Most smartwatches are closed appliances. The vendor decides which apps exist, which watch faces you may use and how the battery is spent, and a developer’s only way in is an SDK with an approval queue at the end of it. The Bangle.js 2 from Espruino starts from the other side. Its firmware is open, its apps are JavaScript files in a public repository, and its interpreter answers over Bluetooth from a browser tab.
That changes what a review has to ask. The question is less whether it matches a mainstream fitness watch, which it does not try to do, and more whether it is a good small computer that happens to live on a wrist. On that measure it is the most enjoyable watch I have owned as a developer, and Espruino’s own store sells it for £99.60 including VAT.
The hardware is modest on purpose, and the modesty is what makes the rest work. A slow processor, a low colour display and a small battery are the reason it runs for weeks, and Espruino publishes enough numbers to reason about every one of those trade-offs before writing a line of code.
Microcontroller hardware with a long sensor list
Espruino’s Bangle.js 2 page lists a Nordic nRF52840, a 64 MHz ARM Cortex-M4 with Bluetooth LE on the same chip, alongside 256 kB of RAM, 1024 kB of on-chip flash and 8 MB of external flash. That puts it firmly in microcontroller territory, and it is the right choice for a watch meant to last weeks between charges.

The sensor list is longer than the price suggests. There is a GPS and GLONASS receiver, an optical heart rate monitor, a three axis accelerometer (Kionix KX022), a three axis magnetometer, and an air pressure and temperature sensor. For several of these Espruino names two possible parts, Bosch BMP280 or Goertek SPL06 for pressure for example, which reflects production supply and changes nothing for an app.
The body measures 36 x 43 x 12 mm and takes standard 20 mm straps. There is one physical button on the side, a full touchscreen and a vibration motor. Espruino states that the watch is based on the SMA Q3, an existing watch, running its own firmware. I count that as a strength. The case, display and sensors come from a product that was already in production, and the engineering effort went into making them programmable.
For a developer, 256 kB of RAM is the number to keep in view. It is plenty for a clock face, a step counter, a timer or a small data logger. It is not a place for large JSON payloads or big bitmap assets, and good apps for the watch are written with that limit in mind.
The display is the battery strategy
The screen is a 1.3 inch, 176 x 176 pixel always-on LCD with 3 bit colour, which Espruino identifies as the LPM013M126, with a backlight and a Hynitron CST816D touch controller. Three bits give eight colours. Nobody will mistake it for an OLED panel, and that is deliberate.

Espruino’s power table puts an idle watch at 0.3 mA with the accelerometer polling at 12.5 Hz, and the same watch with its backlight on at 17 mA. Those two figures explain the design. The display you read all day costs almost nothing, and the backlight is something you switch on briefly and let time out. A watch with a bright, full colour panel spends its battery on exactly the thing this one avoids.
The display is buffered. Drawing calls write into a buffer, and g.flip() sends the changes to the panel. Anyone who has written for a small embedded display will recognise the model, and it rewards tidy code: draw what changed, then flip. Brightness is exposed through Bangle.setLCDBrightness, so each app can decide how much light it actually needs.
Designing for eight colours is a pleasant constraint. It pushes toward high contrast layouts with large type, which is what a glance at a wrist needs anyway.
A power budget you can read
Few consumer devices publish their current draw per subsystem. Espruino does, and it turns the Bangle.js 2 into a small lesson in embedded power budgeting. The battery is 175 mAh. Idle draw falls to 0.15 mA when the accelerometer drops to 1.25 Hz, which the firmware does by default after about two minutes without movement. A clock face updating once a second raises idle draw to 0.5 mA. A Bluetooth connection in high bandwidth mode costs 0.75 mA, the heart rate monitor brings the total to 1.0 mA, the unlocked touchscreen to 2.8 mA, and a CPU running JavaScript flat out to 4 mA.
The expensive line is the GPS at 26 mA, or 20 mA when set to GPS only. On a 175 mAh cell, simple division puts continuous positioning at well under a working day. That makes the receiver a logging tool for a hike or a ride rather than an always-on tracker, and it is the right way to think about it.
Espruino’s headline estimate follows from the same table: around a month of battery life with a clock that updates once a minute on current firmware, about two weeks when the clock updates every second, and four weeks of standby in the store listing. The gap between those two clock faces is a single design decision about a seconds display. Most smartwatches hide that relationship. Here it is printed next to the product, and it changes how you write an app. Polling a sensor less often, drawing less and releasing the touchscreen sooner become choices with a known cost.
For completeness, Espruino lists 0.03 mA with the watch turned off through Bangle.softOff, and 0.02 mA fully off without the real time clock.
JavaScript on the wrist
Espruino’s firmware is a JavaScript interpreter built for microcontrollers, and the Bangle.js 2 page says you can write apps “using JavaScript or a graphical programming language (Blockly)”. The main tool is the Web IDE, which connects to the watch over Web Bluetooth. Espruino lists Chrome, Edge and Opera as the browsers to use, so on a Mac the IDE runs in Chrome rather than Safari.
The IDE has a REPL on the left and an editor on the right. Type a line into the REPL and it runs on the watch immediately. That loop is the reason the Bangle.js 2 is such a pleasure. There is no build, no signing step and no deploy pipeline between an idea and a result on your wrist.
The development guide is clear about upload targets. RAM is the normal choice while iterating. Storage is where persistent app files go. The Flash option carries a warning in capitals not to use it on Bangle.js, because it overwrites the bootloader. The same guide points to an online emulator for working without the watch, with the fair caveat that it has no sensors, Bluetooth or vibration motor. Output from console.log appears on the watch display while disconnected only if debug output is enabled in Settings, a detail that saves time when a bug goes quiet.
Firmware updates also travel over Bluetooth, either through the app loader or Espruino’s DFU process. Nothing about owning the watch requires a cable except charging.
The app loader and an open stack
Espruino’s Bangle.js site advertises more than 600 free apps, installed through the app loader in the browser after selecting Bangle.js 2 as the device. Apps, clock faces and widgets all install the same way, and a type field in each app’s metadata tells the loader which is which.
The app loader is itself a public project. The BangleApps repository states that all software in it, including the apps, is MIT licensed. Each app is a folder with a metadata.json describing its id, name, icon, type and files, and code files follow a naming convention such as appid.app.js for the application and appid.wid.js for a widget. The README explains how to fork the repository, enable GitHub Pages and run a personal app loader at your own GitHub address.
That last detail matters most to a developer. A private app, or a modified copy of someone else’s, is one fork away, with the same install experience as the public catalogue. Contributing back goes through the same public repository.
The firmware lives in the Espruino repository under the Mozilla Public License 2.0, and Espruino publishes the board file and pinout information for the watch. This is a device you can read all the way down, which is rare in wearables at any price.
Phones: Android first, iPhone with some effort
On Android, Espruino supports a modified build of Gadgetbridge, available as Bangle.js Gadgetbridge from the Play Store or from F-Droid. Paired with the Android Integration app on the watch, it delivers notifications without a proprietary companion app. Espruino’s build adds features the standard Gadgetbridge lacks, including HTTP requests and Android Intents, with the caveat that requests must use HTTPS. That turns the phone into a network gateway for watch apps, which opens the door to small, practical projects such as pulling a status value from your own service. Espruino also notes that Amazfish implements the same interface on Sailfish OS, Ubuntu Touch and Flatpak.
On iPhone, the iOS Integration app receives notifications through Apple’s Notification Center Service, can sync the time, and works with iOS Shortcuts that send weather, calendar and location data to the watch. The friction sits elsewhere. Safari has no Web Bluetooth, so Espruino directs iPhone users to a browser such as WebBLE for the app loader. In practice, iPhone owners will install and develop from a desktop browser and use the phone for notifications.
Water, straps and the charging cable
Espruino rates the Bangle.js 2 IP67 and adds a plain qualifier: everyday use, not swimming or baths. Buyers who swim should take that at face value.

The back of the watch carries four contacts. The middle two are SWD debug pins, and Espruino warns that sweat or other conductive conditions can corrode them. Kickstarter units shipped with protective tape, and Espruino recommends that owners without it cover the pins with tape, paint, a sticker or lacquer. It is a small job and belongs on the list for the first day.
Charging uses a magnetic USB cable whose contacts carry USB power, so Espruino advises against leaving it plugged in unattended where it can pick up conductive objects. It also warns never to connect a Bangle.js 1 cable, which has a different number of pins. Sound output comes from the vibration motor, which Espruino describes as extremely weak, so alarms and alerts are felt rather than heard.
The 20 mm strap width means any standard strap of that size fits. Espruino’s store offers black, blue and pink straps as add-ons at £2.39 each.
Who should buy something else
The Bangle.js 2 is a developer’s watch first. Anyone who wants detailed training analytics, all day GPS tracking, swim tracking or a bright full colour screen should buy a mainstream fitness watch, because the published power budget makes clear that continuous GPS and a lit display are not what this hardware is for. Buyers whose only computer is an iPhone will find the browser-based tooling awkward. People who never intend to open the IDE still get a long-running watch with notifications and hundreds of free apps, but they would be paying for an openness they do not use.
Verdict
The Espruino Bangle.js 2 is the smartwatch I would hand to any developer who has wanted to put their own code on their wrist, and the most enjoyable watch I have owned as a developer. It is a small, open computer that runs for weeks, and Espruino sells it for £99.60 including VAT. It did everything I asked of it, and it has earned its place on my wrist.
Why I recommend it
- A REPL on your wrist. A line typed into the Web IDE runs on the watch immediately over Web Bluetooth, with no build, signing step or deploy pipeline in between.
- Weeks between charges. Espruino quotes around a month from a 175 mAh cell with a clock that updates once a minute. It also publishes the current draw of each subsystem, so every app decision has a known cost.
- Open all the way down. The apps and the app loader are MIT licensed, the firmware is under the Mozilla Public License 2.0, and a fork of BangleApps on GitHub Pages becomes a private app loader.
- More sensors than the price suggests. GPS and GLONASS, optical heart rate, an accelerometer, a magnetometer, and an air pressure and temperature sensor.
- Android as a gateway. Espruino’s Bangle.js Gadgetbridge build delivers notifications without a proprietary companion app and adds HTTP requests (HTTPS only) and Android Intents.
Why it may not be for you
- 256 kB of RAM. Plenty for a clock face or a small data logger. No place for large JSON payloads or big bitmap assets.
- GPS for logging, not tracking. The receiver draws 26 mA, so continuous positioning lasts well under a working day.
- Eight colours. The 176 x 176 LCD has 3 bit colour and a backlight you switch on briefly. Nobody will mistake it for an OLED panel.
- Not for the pool. It is rated IP67, but Espruino’s own qualifier is everyday use, not swimming or baths. The SWD pins on the back can corrode with sweat and need covering.
- Awkward from an iPhone alone. Safari has no Web Bluetooth, so in practice the app loader and development live in a desktop browser.
Buy it if you want your own code on your wrist and are happy to write within a microcontroller’s limits. Anyone who wants detailed training analytics, all day GPS tracking, swim tracking or a bright full colour screen should buy a mainstream fitness watch. People who never intend to open the IDE would be paying for an openness they do not use.
Product images: Espruino.
One email a month: new articles, reviews and the upcoming live webinar + free recording. No spam, unsubscribe anytime.


