fpp-performance-capture - FPP 10 readiness
Plugin name: Animatronic Performance Capture
Repo: https://github.com/pgianotto/animatronic-motion-system
Maintainer: @pgianotto
📢 FPP's plugin guidelines and submission process have been updated - see the Plugin Guidelines for what's expected of a listed plugin. Adding another plugin? Start at Submit a plugin.
🔄 As part of this new process, in the lead up to each new version release we will create a GitHub issue like this one and ask that you review compatibility of your plugin with the new version and outline any new best practices for plugins. Please review this information and update your plugin accordingly.
🧪 Get your plugin ready for FPP 10
FPP 10.0 beta3 has been released - FPP 10 full release is due shortly. Please test and update your plugin against beta3, available at https://github.com/FalconChristmas/fpp/releases/tag/10.0-beta3.
✅ Compatibility
A versions[] entry already declares FPP 10 support.
Areas of concern / optimisation
- 🛑 Blocker - remote-exec
- pipes a remote script into a shell (fpp-plugins/fpp-performance-capture/fpp_install.sh:19:
curl -LsSf https://astral.sh/uv/install.sh | sh) - install the dependency through a package manager FPP already has instead: apt-get install for system packages, npm install for Node packages, or pip install --break-system-packages for Python packages.
- Only if there's genuinely no package for it, download the installer to a file, verify its checksum, then run it, e.g.
curl -fsSLo installer.sh https://example.com/install.sh && echo "<sha256> installer.sh" | sha256sum -c && bash installer.sh
- 🛑 Blocker - fppd-port
- calls fppd's internal port :32322 directly (fpp-plugins/fpp-performance-capture/daemon.py:239:
conn = http.client.HTTPConnection('127.0.0.1', 32322, timeout=0.1)).
- Replace
http://localhost:32322/... with the proxied, documented equivalent at http://localhost/api/... instead
- 🛑 Blocker - pip-install
- installs Python packages with pip but no --break-system-packages (fpp-plugins/fpp-performance-capture/fpp_install.sh:48:
uv pip install --python "$PLUGIN_DIR/venv/bin/python" \) - this fails outright on any current PEP 668-managed image ('externally managed environment').
- Add
--break-system-packages: it's safe here because pip targets /usr/local/lib/python3.x/dist-packages, which isn't tracked by dpkg, so it can't conflict with anything apt manages
- 🛑 Blocker - core-config
- reads/writes FPP core config directly (fpp-plugins/fpp-performance-capture/daemon.py:38:
CO_OTHER_PATH = Path('/home/fpp/media/config/co-other.json')).
- Read it through the
/api/settings/<name> endpoint (e.g. requests.get("http://localhost/api/settings/settingName")) - there's no Python helper, just the HTTP API instead of parsing the settings file yourself; the file's format is not a stable contract across FPP releases
- 🛑 Blocker - server-bind-all-interfaces
- daemon binds 0.0.0.0 despite an Apache ProxyPass for the same service (fpp-plugins/fpp-performance-capture/daemon.py:1182:
app.run(host='0.0.0.0', port=PORT, threaded=True)) - the ProxyPass means this was designed to be reached through Apache only.
- Bind to
127.0.0.1 instead so the routes aren't directly reachable on the LAN, bypassing whatever auth Apache would add
- 🛑 Blocker - exec-bit - scripts/preStart.sh is not executable - commit it +x (git update-index --chmod=+x)
- 🛑 Blocker - install-in-hook
- runs the plugin's own install/upgrade script from a lifecycle hook (fpp-plugins/fpp-performance-capture/scripts/preStart.sh:8:
bash "$PLUGIN_DIR/fpp_install.sh") - this re-executes the entire install (package installs, service/proxy setup, network downloads) synchronously every time the hook's guard condition trips, blocking fppd startup for however long that takes.
- Run any genuine self-heal step detached from the hook (e.g.
systemd-run or nohup ... &) instead of inline, or use FPP's actual post-os-upgrade mechanism rather than reinventing one in preStart/postStart
- 🛑 Blocker - git-network-call-in-hook
- unbounded git network call in a lifecycle hook (fpp-plugins/fpp-performance-capture/scripts/preStart.sh:7:
sudo -u fpp git -C "$PLUGIN_DIR" pull --quiet 2>/dev/null || true) - git has no built-in timeout, so a stalled connection here blocks fppd startup/shutdown indefinitely.
- Wrap it with
timeout <seconds> git ... or move it out of the hook entirely
- ⚠️ Best practice - extra-pkg-manager
- installs a second package/version manager on top of what FPP's image already provides (fpp-plugins/fpp-performance-capture/fpp_install.sh:19:
curl -LsSf https://astral.sh/uv/install.sh | sh) - apt/pip/npm already cover system and language packages; a bolted-on manager (uv, pipx, nvm ...) is undesirable.
- If there's a genuine need it can't cover (e.g. a Python/Node version the OS image doesn't ship), say so explicitly via
/submit instead of adding a manager silently
- ⚠️ Best practice - sudo
- uses sudo in a script (fpp_install.sh:9:
sudo git config --system --add safe.directory "$SCRIPT_DIR" 2>/dev/null || true) - install/hooks already run as root.
- Remove the sudo call and run the command directly, e.g.
git config --system --add safe.directory "$SCRIPT_DIR" 2>/dev/null || true
- ⚠️ Best practice - log-naming
- installs an always-on service but has no FPP-conformant log anywhere (no LOGDIR/logDirectory/plugin-fpp-performance-capture.log reference).
- Log to
$settings['logDirectory']."/plugin-fpp-performance-capture.log" (PHP) or the equivalent in your language, so the service's output surfaces in FPP's log viewer and Support Zip instead of only wherever stdout happens to go
- ⚠️ Best practice - no-timeout
- outbound HTTP call has no timeout set (fpp-plugins/fpp-performance-capture/fpp_install.sh:19:
curl -LsSf https://astral.sh/uv/install.sh | sh) - a hung remote server stalls this indefinitely, blocking whatever hook/show command triggered it.
- Set
CURLOPT_TIMEOUT/CURLOPT_CONNECTTIMEOUT (PHP curl), the 'timeout' key (PHP stream contexts), or timeout= (Python requests)
- ⚠️ Best practice - reponame-mismatch
- pluginInfo.json's repoName (
fpp-performance-capture) doesn't match the actual GitHub repo name (animatronic-motion-system, parsed from srcURL) - PLUGININFO_FORMAT.md requires them to match.
- Rename the GitHub repo to
fpp-performance-capture (Settings > repository name) or change repoName to animatronic-motion-system, whichever is the real name here - just make sure pluginList.json's listing name is updated to match too.
- ⚠️ Best practice - no-icon
- no icon.png in the repo root and no iconURL in pluginInfo.json - the Plugin Manager will show your initials instead of an icon.
- A local icon.png (128x128 or 256x256, repo root) is preferred since it renders offline once installed; iconURL is the fallback and the only option shown before install
- 💡 Optional - no-license - no LICENSE file - add one for redistribution clarity
- 💡 Optional - no-resource-hints
- looks potentially compute/memory heavy (native build / video-capture-shaped code) but declares no minMemoryMB/minCpuCores in pluginInfo.json.
- If this plugin genuinely needs more than a Pi Zero's resources to run acceptably, declare it as a top-level field in pluginInfo.json (see PLUGININFO_FORMAT.md's Resource hints section) so FPP can warn/hide it on underpowered devices instead of the user finding out the hard way
We know our automated checks don't always get it 100% right. Please fix whatever above does apply first - then, for anything left that doesn't apply or you think deserves an exception, comment /submit with an explanation and a maintainer will take a look.
Once you have updated your plugin, please comment /recheck on this issue and we will automatically scan your plugin and comment the new results here.
Want to sunset this plugin? Request Plugin Removal
fpp-performance-capture - FPP 10 readiness
Plugin name: Animatronic Performance Capture
Repo: https://github.com/pgianotto/animatronic-motion-system
Maintainer: @pgianotto
🧪 Get your plugin ready for FPP 10
FPP 10.0 beta3 has been released - FPP 10 full release is due shortly. Please test and update your plugin against beta3, available at https://github.com/FalconChristmas/fpp/releases/tag/10.0-beta3.
✅ Compatibility
A
versions[]entry already declares FPP 10 support.Areas of concern / optimisation
curl -LsSf https://astral.sh/uv/install.sh | sh) - install the dependency through a package manager FPP already has instead:apt-get installfor system packages,npm installfor Node packages, orpip install --break-system-packagesfor Python packages.curl -fsSLo installer.sh https://example.com/install.sh && echo "<sha256> installer.sh" | sha256sum -c && bash installer.shconn = http.client.HTTPConnection('127.0.0.1', 32322, timeout=0.1)).http://localhost:32322/...with the proxied, documented equivalent athttp://localhost/api/...insteaduv pip install --python "$PLUGIN_DIR/venv/bin/python" \) - this fails outright on any current PEP 668-managed image ('externally managed environment').--break-system-packages: it's safe here because pip targets/usr/local/lib/python3.x/dist-packages, which isn't tracked by dpkg, so it can't conflict with anything apt managesCO_OTHER_PATH = Path('/home/fpp/media/config/co-other.json'))./api/settings/<name>endpoint (e.g.requests.get("http://localhost/api/settings/settingName")) - there's no Python helper, just the HTTP API instead of parsing the settings file yourself; the file's format is not a stable contract across FPP releasesapp.run(host='0.0.0.0', port=PORT, threaded=True)) - the ProxyPass means this was designed to be reached through Apache only.127.0.0.1instead so the routes aren't directly reachable on the LAN, bypassing whatever auth Apache would addbash "$PLUGIN_DIR/fpp_install.sh") - this re-executes the entire install (package installs, service/proxy setup, network downloads) synchronously every time the hook's guard condition trips, blocking fppd startup for however long that takes.systemd-runornohup ... &) instead of inline, or use FPP's actual post-os-upgrade mechanism rather than reinventing one in preStart/postStartsudo -u fpp git -C "$PLUGIN_DIR" pull --quiet 2>/dev/null || true) - git has no built-in timeout, so a stalled connection here blocks fppd startup/shutdown indefinitely.timeout <seconds> git ...or move it out of the hook entirelycurl -LsSf https://astral.sh/uv/install.sh | sh) - apt/pip/npm already cover system and language packages; a bolted-on manager (uv, pipx, nvm ...) is undesirable./submitinstead of adding a manager silentlysudo git config --system --add safe.directory "$SCRIPT_DIR" 2>/dev/null || true) - install/hooks already run as root.git config --system --add safe.directory "$SCRIPT_DIR" 2>/dev/null || true$settings['logDirectory']."/plugin-fpp-performance-capture.log"(PHP) or the equivalent in your language, so the service's output surfaces in FPP's log viewer and Support Zip instead of only wherever stdout happens to gocurl -LsSf https://astral.sh/uv/install.sh | sh) - a hung remote server stalls this indefinitely, blocking whatever hook/show command triggered it.CURLOPT_TIMEOUT/CURLOPT_CONNECTTIMEOUT(PHP curl), the'timeout'key (PHP stream contexts), ortimeout=(Pythonrequests)fpp-performance-capture) doesn't match the actual GitHub repo name (animatronic-motion-system, parsed from srcURL) - PLUGININFO_FORMAT.md requires them to match.fpp-performance-capture(Settings > repository name) or change repoName toanimatronic-motion-system, whichever is the real name here - just make sure pluginList.json's listing name is updated to match too.We know our automated checks don't always get it 100% right. Please fix whatever above does apply first - then, for anything left that doesn't apply or you think deserves an exception, comment
/submitwith an explanation and a maintainer will take a look.Once you have updated your plugin, please comment
/recheckon this issue and we will automatically scan your plugin and comment the new results here.Want to sunset this plugin? Request Plugin Removal