- Python 3.8 or newer
ufbt≥ 0.2.6 (Flipper's Micro-FBT)- macOS, Linux, or Windows (WSL)
- USB cable for the Flipper (only required for
ufbt launch)
# Install ufbt
pip install --user ufbt
# Bootstrap Flipper SDK (downloads ~150 MB the first time)
ufbt update --channel=devThe --channel=dev flag pulls the latest mntm-dev SDK, which is what we develop against. For stable releases use --channel=release.
Verify the install:
ufbt --version
ufbt status # shows current SDK channel + versionufbt # build only — produces dist/pingequa_rf_toolkit.fap
ufbt launch # build + sideload to connected Flipper + auto-launch
ufbt cli # interactive Flipper CLI session
ufbt vscode_dist # generate compile_commands.json for VSCode IntelliSense
ufbt format # format C files using project clang-format rulespingequa_rf_toolkit/
├── application.fam FAP manifest
├── pingequa_app.{c,h} Entry point
├── core/ Hardware abstraction layer
├── scenes/ Scene handlers
├── views/ Custom Views
├── icon.png App icon
└── dist/ Build output
# Stable Momentum
ufbt update --channel=release
# Specific commit
ufbt update --hw-target=7 --branch=mntm-012-3.4.5
# Custom SDK ZIP
ufbt update --local=path/to/sdk.zipThe build is firmware-agnostic — same source, different target SDKs.
# Build clean
ufbt
# FAP size budget
SIZE=$(wc -c < dist/pingequa_rf_toolkit.fap)
if [ "$SIZE" -gt 30720 ]; then echo "FAP too big: $SIZE bytes"; fiufbt cli
> log debugThis subscribes the CLI to the Flipper firmware log. App logs are tagged with Pq* prefixes (e.g. PqApp, PqScannerScene).
Flipper firmware exposes free heap via CLI:
> freeRun with the app open vs closed to see allocation. Our app uses ~50 KB peak.
For maintainers:
- Bump version in
application.fam(fap_version="0.3.0") - Update
CHANGELOG.md— move[Unreleased]items to a new[0.3.0]section - Tag and push:
git tag v0.3.0 && git push --tags - Create a GitHub Release pointing to that tag — CI will attach the FAP automatically (see .github/workflows/build.yml)
🛒 Get the PINGEQUA 2-in-1 RF Devboard — the hardware this app is built for.