Contributions more than welcome!
Basically… pixlet in Python.
This is an example for generating images for the Tidbyt device, a nice LED display. The company that made the Tidbyt got acquihired and won't be developing the software much in the future.
Pixlet was very convenient, but is an oddball for a tech stack: implemented in Go for people to consume in Starlark. Starlark is a niche language. It'd be nice to support a mainstream language.
This is a WIP implementation of the same concepts as pixlet in Python.
First, install indiepixel with uv.
I use mise to manage my versions, so I'd start out with
mise install python uvBut that's optional if you have global installations of Python and uv that you like. Also: this process works without uv, with pip etc: if you're a Python expert, you can probably piece that together.
Initialize your project:
uv initThen install indiepixel
uv add indiepixel
Create a basic example: for example, copy clock.py to the current directory.
Then run:
uv run indiepixel clock.py
Then, bam! You've got that clock rendering. If you want to get fancier,
you can create a directory of widgets and move clock.py into it, point
indiepixel at that, and it'll show all of them rendered in its web interface.
I like to deploy this with Render but it's totally up to you. Again, Python experts probably can just figure this out, but with Render:
Set up Render to deploy from a repo containing your pyproject.toml and clock.py (or
whatever widgets you've written)
Render doesn't support uv and it's rough to install. So dump those dependencies into requirements.txt so the old-fashioned package managers can understand them:
uv pip freeze > requirements.txt
Your render start command will look like:
indiepixel src/clock.py
And add an environment variable like:
PYTHON_VERSION=3.13.2
To your environment so that it uses a modern version of Python.
First make sure you have uv installed.
Install dependencies with:
uv sync
Install pre-commit hooks:
uv run pre-commit install
To run examples/kitchen_sink.py:
uv run indiepixel examples/cli/gradient.py
uv run pytest
uv run pre-commit run --all-files
Or run ruff directly
uv run ruff check
uv run ruff format --check
This needs you to build before publishing:
- Bump version in pyproject.toml
uv builduv publish
* = currently not tidbyt-compatible
- WebP generation
- Rendering the tb-8 pixel font without anti-aliasing
- Fonts
- Components
- Text
- Box*
- Rect*
- Column*
- Row
- Stack
- Circle
- PieChart
- Image
- Animation
- WrappedText
- Resizing
- Animation
- Plot
- 'expand' option