tinygo README

The project's README from github.com/tinygo-org/tinygo. As one markdown file: README.md.

TinyGo - Go compiler for small places

Linux macOS Windows Docker Nix

TinyGo is a Go compiler intended for use in small places such as microcontrollers, WebAssembly (wasm/wasi), and command-line tools.

It reuses libraries used by the Go language tools alongside LLVM to provide an alternative way to compile programs written in the Go programming language.

[!IMPORTANT] You can help TinyGo with a financial contribution using OpenCollective. Please see https://opencollective.com/tinygo for more information. Thank you!

Embedded

Here is an example program that blinks the built-in LED when run directly on any supported board with onboard LED:

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 1000)

        led.High()
        time.Sleep(time.Millisecond * 1000)
    }
}

The above program can be compiled and run without modification on an Arduino Uno, an Adafruit Circuit Playground Express, a Seeed Studio XIAO-ESP32S3 or any of the many supported boards that have a built-in LED, just by setting the correct TinyGo compiler target. For example, this compiles and flashes an Arduino Uno:

tinygo flash -target arduino-uno examples/blinky1

WebAssembly

TinyGo is very useful for compiling programs both for use in browsers (WASM) as well as for use on servers and other edge devices (WASI).

TinyGo programs can run in Fastly Compute, Fermyon Spin, wazero and many other WebAssembly runtimes.

Here is a small TinyGo program for use by a WASI host application:

package main

//go:wasmexport add
func add(x, y uint32) uint32 {
	return x + y
}

This compiles the above TinyGo program for use on any WASI Preview 1 runtime:

tinygo build -buildmode=c-shared -o add.wasm -target=wasip1 add.go

You can also use the same syntax as Go 1.24+:

GOOS=wasip1 GOARCH=wasm tinygo build -buildmode=c-shared -o add.wasm add.go

Installation

See the getting started instructions for information on how to install TinyGo, as well as how to run the TinyGo compiler using our Docker container.

Supported targets

Embedded

You can compile TinyGo programs for over 150 different microcontroller boards.

For more information, please see https://tinygo.org/docs/reference/microcontrollers/

WebAssembly

TinyGo programs can be compiled for both WASM and WASI targets.

For more information, see https://tinygo.org/docs/guides/webassembly/

Operating Systems

You can also compile programs for Linux, macOS, and Windows targets.

For more information:

Currently supported features:

For a description of currently supported Go language features, please see https://tinygo.org/lang-support/.

Documentation

Documentation is located on our web site at https://tinygo.org/.

You can find the web site code at https://github.com/tinygo-org/tinygo-site.

Getting help

If you're looking for a more interactive way to discuss TinyGo usage or development, we have a #TinyGo channel on the Gophers Slack.

If you need an invitation for the Gophers Slack, you can generate one here which should arrive fairly quickly (under 1 min): https://invite.slack.golangbridge.org

Contributing

Your contributions are welcome!

Please take a look at our Contributing page on our web site for details.

Project Scope

Goals:

Non-goals:

Why this project exists

We never expected Go to be an embedded language, and so it’s got serious problems...

-- Rob Pike, GopherCon 2014 Opening Keynote

TinyGo is a project to bring Go to microcontrollers and small systems with a single processor core. It is similar to emgo but a major difference is that we want to keep the Go memory model (which implies garbage collection of some sort). Another difference is that TinyGo uses LLVM internally instead of emitting C, which hopefully leads to smaller and more efficient code and certainly leads to more flexibility.

The original reasoning was: if Python can run on microcontrollers, then certainly Go should be able to run on even lower level micros.

License

This project is licensed under the BSD 3-clause license, just like the Go project itself.

Some code has been copied from the LLVM project and is therefore licensed under a variant of the Apache 2.0 license. This has been clearly indicated in the header of these files.

Some code has been copied and/or ported from Paul Stoffregen's Teensy libraries and is therefore licensed under PJRC's license. This has been clearly indicated in the header of these files.

tinygo (tinygo-org/tinygo)

i2c
Searching Database…

17.8K ·GitHub
What is this?TinyGo is an alternative Go compiler for small places: microcontrollers, WebAssembly (wasm/wasi), and command-line tools. It compiles Go code by combining the standard Go tool libraries with LLVM.
Is this a new language, or can I write regular Go?You write regular Go: TinyGo reuses the libraries of the standard Go tools and swaps the backend for LLVM. It supports most standard library packages and compiles most Go code without modification.
How do I install it and flash my first program to a board?Follow the getting started instructions on the TinyGo website, or run the compiler from the official Docker container. For embedded targets you compile and flash straight to the board by setting the compiler target.
Can it compile any Go program I throw at it?No. Compiling every Go program is an explicit non-goal, and TinyGo does not aim to match the gc compiler's speed or handle zillions of goroutines efficiently, though LLVM may speed up number crunching.
What can it compile for - just microcontrollers?Over 150 microcontroller boards, including the Arduino Uno, Adafruit Circuit Playground Express and Seeed Studio XIAO-ESP32S3. It also targets browser WASM, server-side WASI, plus Linux, macOS and Windows.
Will the same program run on different boards without changes?Usually yes. The README's built-in LED blink example compiles and runs without modification on the Arduino Uno, Adafruit Circuit Playground Express and Seeed Studio XIAO-ESP32S3 - you only change the compiler target.
Why did the author build TinyGo in the first place?Rob Pike said Go was never expected to be an embedded language. The reasoning: if Python can run on microcontrollers, Go should run on even lower-level micros. Unlike emgo, TinyGo keeps the Go memory model (garbage collection included) and uses LLVM internally instead of emitting C.
Where can TinyGo-built WebAssembly actually run?In many runtimes: the README names Fastly Compute, Fermyon Spin and wazero for servers and edge devices, plus browsers via plain WASM. It compiles for WASI Preview 1 and also supports the newer export syntax from Go 1.24+.
Is CGo supported?Yes - good CGo support is an explicit project goal, with no more overhead than a regular function call.
Creator
tinygo-org
Size
14.1 MB
Stars
17.8K
Age
8y
Commits · 90 Days