Build From Source

May 5, 2026 · View on GitHub

Requirements

  • 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)

One-time setup

# Install ufbt
pip install --user ufbt

# Bootstrap Flipper SDK (downloads ~150 MB the first time)
ufbt update --channel=dev

The --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 + version

Build commands

ufbt              # 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 rules

Project layout

pingequa_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

Editing for a different firmware target

# 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.zip

The build is firmware-agnostic — same source, different target SDKs.

Static checks

# 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"; fi

Debugging

View live logs over USB

ufbt cli
> log debug

This subscribes the CLI to the Flipper firmware log. App logs are tagged with Pq* prefixes (e.g. PqApp, PqScannerScene).

Memory profiling

Flipper firmware exposes free heap via CLI:

> free

Run with the app open vs closed to see allocation. Our app uses ~50 KB peak.

Releasing

For maintainers:

  1. Bump version in application.fam (fap_version="0.3.0")
  2. Update CHANGELOG.md — move [Unreleased] items to a new [0.3.0] section
  3. Tag and push: git tag v0.3.0 && git push --tags
  4. 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.