*Rolls up sleeves* Okay, here’s how it works:


Let’s dig into the software first. This software is designed to work on Tessel’s specific hardware, but we’re working on making it portable to other platforms as well.

The basic interaction with Tessel is this:

  1. `npm install tessel -g` - Installs Tessel’s command line interface (CLI)
  2. `tessel run <file.js>` - Runs your JavaScript file on Tessel
  3. From here, the CLI looks at your JavaScript file’s dependencies and includes those needed files from `package.json` and the `node_modules` folder
  4. Tessel then uses its Colony Compiler to translate the JavaScript to machine-friendly Lua
  5. The CLI creates a tarball and sends it off to Tessel’s firmware via USB
  6. The firmware receives the script, puts it in flash, and loads the tarball into the Lua VM in Tessel runtime
  7. The runtime environment takes over and defines all the global functions and node modules that the Lua code called into
  8. When hardware is accessed, runtime simply calls into the appropriate C functions
  9. When the process completes, runtime is shut down and the script is freed from memory

To separate this out by components instead of chronology, there are four basic parts of Tessel’s software:

CLI: Command line interface for interacting with Tessel over USB (repo: https://github.com/tessel/cli)

Colony: JavaScript to Lua compiler (repo: https://github.com/tessel/colony-compiler)

Runtime: Lua VM running the compiled Lua code. The runtime layer also includes the compatibility layer for core JS function (such as String and Number) and core Node function (such as fs and buffers). (repo: https://github.com/tessel/runtime)

Firmware: C code interfacing the Lua runtime with all of the hardware components (Wifi, RAM, Flash, SPI/UART/I2C busses). The firmware layer also runs the event queue and handles interrupts. (repo: https://github.com/tessel/firmware)

All right, that’s the software basics. There are more details overall and for each subsystem on our contribution guide (https://github.com/tessel/contribution-guide), so for the sake of brevity I’ll let you investigate on your own. Let’s move on to Tessel’s hardware.


At its core, Tessel runs a 180mHz ARM Cortex-M3 LPC1830.

Since Tessel was designed to support web programming, we needed a bit more memory to play around with than, say, an Arduino. So we also have 32 Megabytes each of Flash and SDRAM. Tessel’s cli gives you the option to either `push` or `run` any given JS file. When you `run`, the code is run over RAM and is not persistent across resets. If you `push`, the files are pushed into Flash memory and run when Tessel boots up.

Tessel’s Wifi chip is the TI CC3000.

The primary interaction for Tessel takes place through the four module ports. Each (more or less) is configured for SPI, I2C, and UART communication, as well as three GPIO digital pins. These are designed for hardware modularity; currently we have fourteen single-function modules (BLE, servo, accelerometer, etc.) that you can swap into any of these ports. Their drivers and APIs are npm installed with the package name written on the silk. These are also all OSS/OSHW.

There’s also a GPIO bank on the board set up to interface with other hardware.

You can power Tessel with a microUSB, or over solderable Vin headers.

You can find links to all of Tessel’s hardware designs here: https://tessel.io/docs/designFiles