Toit
Program your microcontrollers in a fast and robust high-level language.
Install / Use
/learn @toitlang/ToitREADME
Toit programming language
This repository contains the Toit language implementation. It consists of the compiler, virtual machine, and standard libraries that together enable Toit programs to run on an ESP32.
Jaguar: Live reloading for the ESP32
If you are developing for the ESP32, we recommend to use Jaguar. It automatically downloads the Toit SDK. For host development, see below.
With Jaguar you can use Toit to develop, update, and restart your ESP32 applications in less than two seconds. Once set up, it is as easy as:
jag watch examples/hello.toit
It is also straightforward to install extra drivers and services that can extend the core functionality of your device. Add automatic NTP-based time synchronization without having to write a single line of code:
jag container install ntp examples/ntp/ntp.toit
You can watch a short video that shows how you can experience Jaguar on your ESP32 in less two minutes:
<a href="https://youtu.be/cU7zr6_YBbQ"><img width="543" alt="Jaguar demonstration" src="https://user-images.githubusercontent.com/133277/146210503-24811800-bb26-4244-817d-6422b20e6786.png"></a>
Community
Use this invite to join our Discord server, and follow the development and get help. We're eager to hear of your experience building with Toit. The Discord chat is publicly accessible through our Linen.
We also use GitHub Discussions to discuss and learn.
We follow a code of conduct in all our community interactions.
References
The Toit language is the foundation for the Toit platform that brings robust serviceability to your ESP32-based devices. You can read more about the language and the standard libraries in the platform documentation:
Contributing
We welcome and value your open source contributions to the language implementation and the broader ecosystem. Building or porting drivers to the Toit language is a great place to start. Read about how to get started building I2C-based drivers and get ready to publish your new driver to the package registry.
If you're interested in pitching in, we could use your help with these drivers and more!
Licenses
The Toit compiler, the virtual machine, and all the supporting infrastructure is licensed under
the LGPL-2.1 license. The standard libraries contained in the lib/ directory
are licensed under the MIT license. The examples contained in the examples/
directory are licensed under the 0BSD license.
Certain subdirectories are under their own open source licenses, detailed in those directories and the files they contain. These subdirectories are:
- The subdirectory
lib/font/matthew_welch/ - Every subdirectory under
packages/ - Every subdirectory under
lib/font/x11_100dpi/ - Every subdirectory under
src/compiler/third_party/ - Every subdirectory under
src/third_party/ - Every subdirectory under
third_party/
Installation
The instructions in this section don't cover the IDE integration. Follow the instructions below to set up Toit support for your editor.
Arch Linux
For Arch Linux (or variants such as Manjaro) use your favorite AUR helper to install the toit or toit-git package.
For example:
yay -S toit
Other Linux distributions
We are actively working on providing packages for other Linux distributions. In the meantime, you can use the 'tar.gz' file from the release page.
Windows
On Windows 10+ you can use the Windows package manager:
winget install --id=Toit.Toit -e
Remember to run winget upgrade --id=Toit.Toit -e (or simply winget upgrade) from
time to time to keep Toit up to date.
MacOS
We hope to have a Toit package available for Homebrew soon. In the meantime, you can use the DMG or tar.gz file from the release page.
Building
Dependencies
Build system
Linux and Mac
To build Toit and its dependencies the build host requires:
- GNU Make
- CMake >= 3.13.3
- Ninja
- GCC
- Go >= 1.19
- python-is-python3: on Ubuntu machines
- glibc-tools: optional and only available on newer Ubuntus
If you are using a Linux distribution with apt capabilities, you can
issue the following command to install these:
sudo apt install build-essential cmake ninja-build golang
You can then build Toit by running the following commands in a checkout of this repository:
git submodule update --init --recursive
make
For builds targeting ESP32 hardware additional requirements might be in effect depending on the build host's architecture, see paragraph ESP32 tools.
For builds targeting RISC-V, ARM32, or ARM64 hardware, see the Other platforms README.
Windows
If you are using Windows you can use Chocolatey to install the required dependencies.
After installing Chocolatey, you can install the required dependencies by running the following command in an elevated shell (usually the same you just used to install Chocolatey):
choco install git ninja mingw make golang ccache
choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"'
After that you can use the bash that comes with Git ('git-bash') and compile Toit in a checkout of this repository by running the following commands:
git submodule update --init --recursive
make
ESP-IDF
The Toit VM has a requirement for the Espressif IoT Development Framework, both for Linux and ESP32 builds (for Linux it's for the Mbed TLS implementation).
We recommend you use Toitware's ESP-IDF fork that comes with a few changes:
- Custom malloc implementation
- Allocation-fixes for UART, etc.
- LWIP fixes
The fork's repository has been added as a submodule reference to this repository, so doing a recursive submodule init & update will establish everything nedded:
git submodule update --init --recursive
If the submodule update step fails with:
Submodule path 'esp-idf/components/coap/libcoap': checked out '98954eb30a2e728e172a6cd29430ae5bc999b585'
fatal: remote error: want 7f8c86e501e690301630029fa9bae22424adf618 not valid
Fetched in submodule path 'esp-idf/components/coap/libcoap/ext/tinydtls', but it did not contain 7f8c86e501e690301630029fa9bae22424adf618. Direct fetching of that commit failed.
try following the steps outlined here. It is an issue in the upstream ESP-IDF repository
caused by the tinydtls component having changed its remote URL.
To use the offical ESP-IDF, or any other variation, you need to add the Toit specific patches first.
Then make sure it is available in your file system and point IDF_PATH to its path instead before building.
export IDF_PATH=<A_DIFFERENT_ESP_IDF>
ESP32 tools
If you want to build an image for the ESP32, install the ESP32 tools.
On Linux:
$IDF_PATH/install.sh
The default location of $IDF_PATH is under ./third_party/esp-idf
For other platforms, see Espressif's documentation.
Remember to update your environment variables:
source $IDF_PATH/export.sh
Build for host machine
Make sure the required build tools are installed as described in dependency sections ESP-IDF and Build system above.
Then run the following commands at the root of your checkout.
make all
NOTE
These instructions have been tested on Linux and macOS.
Windows support is still preliminary, and the build instructions may differ for Windows. Let us know on the discussions forum how we can improve this README.
This builds the Toit VM, the compiler, the language server and the package manager.
You should then be able to execute a toit file:
build/host/sdk/bin/toit examples/hello.toit
The toit executable also serves as the package manager:
build/host/sdk/bin/toit pkg init --project-root=<some-directory>
build/host/sdk/bin/toit pkg install --project-root=<some-directory> <package-id>
Debugging
See https://github.com/toitlang/toit/wiki/Debugging.
IDE integration
Toit has a VS Code extension. You can either use the published extension or build it yourself from the sources.
In the VS Code extension (version 1.3.7+) set the toitLanguageServer.command setting to
`["PATH_TO_SDK/bin/toit", "tool"
Related Skills
node-connect
337.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
337.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.2kCommit, push, and open a PR
