The Espruino JavaScript interpreter - Official Repo
Failed to load latest commit information.
benchmark fix benchmark Nov 11, 2014
boards Pixl.js: reduce saved code area to 9 x 4kb to allow for extra features Oct 16, 2018
doxygen Code changes for SPI testing. Sep 29, 2015
gen re-adding deleted files, remove mkdir gen as not needed with older files Nov 2, 2015
libs net.Server to set SO_REUSEADDR by default Oct 16, 2018
make add compile-time checks for Storage overlap Oct 16, 2018
misc permissions Feb 16, 2017
scripts fix invalid hrefs pointed to by #1498 (comment) Oct 17, 2018
src Fix Serial port path regression on Linux, and add docs Oct 17, 2018
targetlibs Fix issue where STM32F4 USB could lock up if TX during heavy RX Sep 4, 2018
targets sanity check (for #1525) Oct 16, 2018
tests Added 'heatshrink' library to expose built-in heatshrink compression … Sep 27, 2018
.gdbinit Fixing issues with getters/setters in classes May 25, 2018
.gitattributes Converted file from Windows to Unix EOL markers. Oct 9, 2015
.gitignore first attempt at SDK15 port. Not working yet, but compiling at least Jun 12, 2018
.travis.yml adding RAK8212 support Aug 1, 2018 Update May 4, 2017
ChangeLog Fix Serial port path regression on Linux, and add docs Oct 17, 2018
Dockerfile renaming of provision files - make it obvious that vagrant's provisio… Mar 9, 2017
Doxyfile Updates for issue #599. Oct 6, 2015
LICENSE First commit Sep 26, 2013
Makefile Revert "deal with 3 digit releases" Oct 2, 2018 add docs Aug 17, 2017 docs Mar 8, 2017 Remove HASH/hashlib from all builds as it was confusingly in some and… Sep 27, 2018 update build info May 31, 2018
Vagrantfile Updated * scripts to get a valid VM Jan 21, 2018
dist_licences.txt Remove LZ4, disable Heatshrink if low on flash (Extra 1.5k not worth … Jan 5, 2016
dist_readme.txt Remove Olimexino from build (too difficult to slim down build and ver… Sep 26, 2018

Espruino JavaScript for Microcontrollers

 _____                 _
|   __|___ ___ ___ _ _|_|___ ___
|   __|_ -| . |  _| | | |   | . |
|_____|___|  _|_| |___|_|_|_|___|
          |_|           Join the chat at


Espruino is a JavaScript interpreter for microcontrollers. It is designed for devices with as little as 128kB Flash and 8kB RAM.

Please support Espruino by ordering one of our official boards or donating


If you have an Espruino board, please read the Quick Start Guide first.

Browse the Espruino Website (try using search in the top right), and read the FAQ.

There's also a Reference for JavaScript commands as well as Tutorials. However the documentation on the Espruino website will match the version available for download but not the latest version on GitHub.

Builds for the Espruino Board and Pico Board (built automatically for each Git commit) are available from here

Other documentation of use is:

Support / Bugs

First, please try and check that your problem hasn't already been found or covered on our forum.

Submit bugs with clear steps to reproduce them: a small test case (not your whole program), and an actual and expected result. If you can't come up with these, please post on the forum first as it may just be something in your code that we can help out with.

Work on Espruino is supported by sales of our boards.

If your board isn't made by us but came pre-installed with Espruino then you should contact the manufacturers.

We try and support users of the boards we sell, but if you bought a non-official board your issue may not get addressed. In this case, please consider donating to help cover the time it takes to fix problems (even so, we can't guarantee to fix every problem).


Please see the LICENSE file


Check out the page on building Espruino


There are a bunch of tests in the tests directory. See tests/ for examples on how to run them.

Current State

The officially supported boards are the Original Espruino Board and the Espruino Pico Board. The Web IDE is able to automatically download and flash the latest version of Espruino for you.

While Espruino can run on other boards, we make no money from them and so cannot afford to test, fix or support the firmware on them. We're dependent on the community.

You can download binaries from (these aren't the latest, but are more likely to work with your board).

If you are a board manufacturer interested in getting your board officially supported, please Contact Us.

  • Original Espruino Board - great support.
  • Espruino Pico Board - great support.
  • Puck.js - great support.
  • Espruino WiFi Board - great support.
  • Linux - WORKING
  • BBC micro:bit - WORKING
  • STM32VLDISCOVERY - WORKING - limited memory so some features removed
  • STM32F401CDISCOVERY - appears WORKING, but very little testing done
  • STM32F429IDISCOVERY - WORKING over serial (A9/A10). No USB and no LCD support
  • NRF51822 Development Kit - WORKING
  • NRF52832 Development Kit - WORKING
  • HY STM32 2.4" - WORKING
  • HY STM32 2.8" - WORKING - limited memory so some features removed
  • HY STM32 3.2" - WORKING
  • Olimexino STM32 / Leaflabs Maple - WORKING - limited memory so some features removed
  • Carambola - WORKING - GPIO via filesystem (no I2C)
  • Raspberry Pi - WORKING - GPIO via filesystem or wiringPi (no I2C)
  • Sony SmartWatch - NOT WORKING - USB VCP support for F2 still needed
  • LC-TECH STM32F103RBT6 - WORKING, but with some issues (LED inverted logic, BTN needs pullup to work)
  • ESP8266 - WORKING - Reasonably stable, but expect to find issues
  • Arduino (AVR) - NOT POSSIBLE due to the Hardward architecture of AVRs, even though it would fit into an ATMEGA2560. If avr-gcc ever gains an easy way to emulate Von Neumann architecture then it might be portable, but for now it isn't.


Check out the documentation on the build process first - this should clear up a lot of potential questions about the Espruino architecture.

Please see for some hints about code style/etc.

You can auto-build documentation for all source files - see doxygen/

Any more questions? ask on the forum.

Porting to new devices

If you're using an existing architecture everything can be done from boards/ See a similar board's .py file as an example.

However for a new architecture there are a bunch of different files to modify.

  • boards/*.py files describe the CPU, available pins, and connections - so the relevant linker script, headers + docs can be created
  • boards/pins/*.csv are copies of the 'pin definitions' table in the chip's datasheet. They are read in for STM32 chips by the boards/*.py files, but they are not required - see boards/ for an example.
  • Global build options are handled in Makefile
  • The make directory contains arch-specific Makefile fragments
  • Extra libraries like USB/LCD/filesystem are in Makefile
  • Processor-specific code in targets/ARCH - eg. targets/stm32, targets/linux
  • Processor-specific libs (like the SDK) in targetlibs/ARCH
  • src/jshardware.h is effectively a simple abstraction layer for SPI/I2C/etc, which should be implemented in targets/ARCH/jshardware.c

Adding libraries

  • Create jswrap_mylib.c/h in libs/
  • Create library functions (see examples in other jswrap files, also the comments in scripts/

See libs/ for a short tutorial on how to add your own libraries.

Using Espruino in your Projects

If you're using Espruino for your own personal projects - go ahead, we hope you have fun - and please let us know what you do with it on!

If you're planning on selling the Espruino software on your own board, please:

  • Let us know, we might be able to help.
  • Read the terms of the MPLv2 Licence that Espruino is distributed under, and make sure you comply with it
  • MPLv2 dictates that any files that you modify must be made available in source form. New files that you create don't need to be made available (although we'd encourage it!)
  • You won't be able to call your board an 'Espruino' board unless it's agreed with us (we own the trademark)
  • You must explain clearly in your documentation that your device uses Espruino internally
  • Please don't fork Espruino - improvements get very hard to share, and in the long run everyone loses.
  • Please give something back to the project - be it code improvements, documentation or support.

We spend a lot of time supporting Espruino on the forums, but can only do so because we make money from the sales of Espruino boards. If your users request support from us then we have absolutely no obligation to help them. However, we'll be a lot more motivated if you're actively helping to improve Espruino for all its users (not just your own).