๐ค Contributing to PyDevices
August 14, 2026 ยท View on GitHub
Thanks for your interest in contributing! PyDevices spans several repos โ
this doc covers what's shared across all of them. Each repo's own README.md
(and AGENTS.md, where present) has project-specific setup, test, and lint
instructions โ read that first.
Where things live
Repo directory and root-file layout (src/, lib/, tests/,
requirements-dev.txt, โฆ): see docs/repo-layout.md.
- pydevices โ core display, touch, and hardware abstraction layer (HAL) library.
- pydevices-examples โ showcase apps, PyScript runner, and reference gallery.
- palettes / pdwidgets โ color engine and lightweight UI widgets.
- mpftp โ VS Code / Cursor board tools (REPL, file transfer, firmware).
- lvgl-bindings โ the LVGL binding generator; source of truth for the native LVGL cmods.
- Native modules โ displayif, pygraphics (also pure-Python
pygraphics), lvgl-micropython, lvgl-circuitpython, lvgl-python. - cmods โ workspace wrapper that builds/smoke-tests the native cmods together.
- pydevices-android-template โ Android packaging (python-for-android/buildozer).
- pydevices-pyscript-template โ installable PyScript/PWA application starter.
If you're not sure which repo an issue or PR belongs to, open it on pydevices-examples โ we'll help route it.
๐ Reporting bugs / requesting features
Use the issue templates on the relevant repo. Include the runtime (MicroPython/CircuitPython/CPython), version, and platform/board where applicable โ most bugs here are runtime- or hardware-specific.
For open-ended questions, ideas, or show-and-tell, use pydevices-examples Discussions instead of opening an issue.
Pull requests
- Fork the repo and branch from
main. - Follow that repo's existing code style and test conventions (see its
README.md/AGENTS.md). - Keep PRs focused โ one change per PR is easier to review and revert.
- Describe why the change is needed, not just what changed.
Regenerating LVGL bindings
If your change touches lvgl-bindings/binding/, lv_conf.h, or the lvgl
submodule, regenerate and commit the affected generated/*.c files โ see
lvgl-bindings' README
for the exact commands. Don't hand-edit generated files.
Doc style: emoji
Docs across PyDevices use a small, fixed set of emoji as landmarks on section headings โ not decoration. Each emoji has exactly one meaning and is only used on a heading that's actually about that thing:
| Emoji | Meaning | Use on headings like |
|---|---|---|
| ๐ | Getting started / install / build | "Quick start", "Installation", "Build", "Setup" |
| ๐จ | Examples / demos | "Examples", "App starter", a demo's own title |
| ๐ฌ | Getting help / support | "Get help", "Getting help", "Still stuck?" |
| ๐ | Reporting bugs / issues | "Reporting bugs", "Reporting bugs / requesting features" |
| ๐ค | Contributing | "Contributing" (as a heading or doc title) |
| ๐ | Documentation / reference links | "Documentation map", "Quick links" |
| โ ๏ธ | Troubleshooting / things that can go wrong | "Troubleshooting" (doc title), a warning callout |
Rules of thumb:
- Only use these seven โ don't add a new one-off emoji to "break up the monotony." If a heading doesn't match one of these meanings, leave it plain.
- One emoji per heading, and only on headings, not scattered through body
text (an inline
โ ๏ธ **Note:**callout is the one exception). - Skip a doc/repo entirely if it doesn't have a heading that genuinely matches โ don't invent a "Getting started" section just to have somewhere to put ๐.
- If several headings in the same doc are parallel alternatives for the same category (e.g. "Build (Make ports)" and "Build (CMake ports)"), tag none of them rather than picking one arbitrarily โ repeating the same emoji on adjacent headings reads as noise, not a landmark.