Thanks for your interest in contributing! This document explains how to set up the project, the workflow for changes, and what is expected in a pull request.
- Report a bug — open a bug report.
- Suggest a feature or plugin — open a feature or plugin request issue.
- Improve documentation — typos, clarifications, and examples are welcome.
- Write code — fix a bug, improve the web app or firmware, or add a plugin.
For anything non-trivial, please open an issue first so the approach can be discussed before you invest time in an implementation.
app/ Web app (React + Vite): layout editor, flashing, provisioning
packages/plugin-sdk/ Shared TypeScript schemas (manifest + device config)
firmware/ ESP32 firmware (PlatformIO, Arduino framework)
plugins/ Plugins: one directory per plugin (manifest + firmware)
templates/plugin/ Starter template for new plugins
scripts/ Repo tooling (plugin registry generation, publishing)
docs/ Documentation- Node.js >= 25
- pnpm 11.5.2 (
corepack enablewill pick the right version) - PlatformIO CLI — only needed for firmware builds
git clone https://github.com/pyxel-dev/budpy.git
cd budpy
pnpm install
# Web app dev server
pnpm --filter @budpy/app dev
# Tests and type checking (all workspaces)
pnpm test
pnpm typecheck
# Regenerate plugin registries after touching plugins/*/manifest.json
pnpm generate:plugins
# Build the firmware (runs generate:plugins first)
pnpm firmware:buildPlugins are the most self-contained way to contribute. Follow the guide in docs/plugins.md — it covers the manifest, the firmware contract, and the testing checklist.
- Fork the repository and create a branch from
develop(e.g.feat/my-pluginorfix/clock-dst). - Make your changes. Keep PRs focused — one bug fix or feature per PR.
- Make sure the checks pass locally:
pnpm testpnpm typecheckpnpm firmware:build(if firmware or plugins changed)- Commit the regenerated files from
pnpm generate:plugins(if manifests changed)
- For firmware changes, test on a real ESP32-2432S028R (CYD) when possible and say so in the PR description.
- Open a pull request against
developand fill in the template.
The project follows Conventional Commits:
feat: add air quality plugin
fix: prevent stale weather render cache
docs: clarify plugin touch contract- TypeScript/React: match the existing code style; keep modules small and
covered by Vitest tests where logic is involved (
*.test.ts). - C++ firmware: the repo has a
.clang-format; keep functions in unnamed namespaces when they are file-local, and prefer the patterns used by existing plugins (config parsing with fallbacks, per-cell render caches). - Text rendered on the TFT display must be ASCII (0x20–0x7E); sanitise network strings.
By contributing, you agree that your contributions will be licensed under the MIT License.