Pixlet is an app runtime and UX toolkit for highly-constrained displays. We use Pixlet to develop applets for Tidbyt, which has a 64x32 RGB LED matrix display:
Apps developed with Pixlet can be served in a browser, rendered as WebP or GIF animations, or pushed to a physical Tidbyt device.
Hey! We have a new docs site! Check it out at tidbyt.dev. We'll be updating this repo in the coming weeks.
- Getting started
- How it works
- In-depth tutorial
- Widget reference
- Animation reference
- Modules reference
- Schema reference
- Our thoughts on authoring apps
- Notes on the available fonts
Install on macOS
brew install tidbyt/tidbyt/pixlet
Install on Linux
pixlet binary from the latest release.
Alternatively you can build from source.
Pixlet applets are written in a simple, Python-like language called Starlark. Here's the venerable Hello World program:
load("render.star", "render") def main(): return render.Root( child = render.Text("Hello, World!") )
Render and serve it with:
curl https://raw.githubusercontent.com/tidbyt/pixlet/main/examples/hello_world.star | \ pixlet serve /dev/stdin
You can view the result by navigating to http://localhost:8080:
How it works
Pixlet scripts are written in a simple, Python-like language called Starlark. The scripts can retrieve data over HTTP, transform it and use a collection of Widgets to describe how the data should be presented visually.
The Pixlet CLI runs these scripts and renders the result as a WebP
or GIF animation. You can view the animation in your browser, save
it, or even push it to a Tidbyt device with
Example: A Clock App
This applet accepts a
timezone parameter and produces a two frame
animation displaying the current time with a blinking ':' separator
between the hour and minute components.
load("render.star", "render") load("time.star", "time") def main(config): timezone = config.get("timezone") or "America/New_York" now = time.now().in_location(timezone) return render.Root( delay = 500, child = render.Box( child = render.Animation( children = [ render.Text( content = now.format("3:04 PM"), font = "6x13", ), render.Text( content = now.format("3 04 PM"), font = "6x13", ), ], ), ), )
Here's the resulting image:
Example: A Bitcoin Tracker
Applets can get information from external data sources. For example, here is a Bitcoin price tracker:
Read the in-depth tutorial to learn how to make an applet like this.
Push to a Tidbyt
If you have a Tidbyt,
pixlet can push apps directly to it. For example,
to show the Bitcoin tracker on your Tidbyt:
# render the bitcoin example pixlet render examples/bitcoin.star # login to your Tidbyt account pixlet login # list available Tidbyt devices pixlet devices # push to your favorite Tidbyt pixlet push <YOUR DEVICE ID> examples/bitcoin.webp
To get the ID for a device, run
pixlet devices. Alternatively, you can
open the settings for the device in the Tidbyt app on your phone, and tap Get API key.
If all goes well, you should see the Bitcoin tracker appear on your Tidbyt:
Push as an Installation
Pushing an applet to your Tidbyt without an installation ID simply displays your applet one time. If you would like your applet to continously display as part of the rotation, add an installation ID to the push command:
pixlet render examples/bitcoin.star pixlet push --installation-id <INSTALLATION ID> <YOUR DEVICE ID> examples/bitcoin.webp
For example, if we set the
installationID to "Bitcoin", it would appear in the mobile app as follows:
pixlet render executes your Starlark code and generates a WebP image.
pixlet push deploys the generated WebP image to your device. You'll need to repeat this process if you want to keep the app updated. You can also create Community Apps that run on Tidbyt’s servers and update automatically.