An application for Flipper Zero to identify, manage, and clean up duplicate *.sub files from Sub-GHz storage.
| Main Menu | Groups View | File Management |
|---|---|---|
![]() |
![]() |
![]() |
- Choose the folder: from the main menu, select "Folder: " to open a folder browser
starting at the currently chosen folder. Select a subfolder to move into it, ".." to go up
(not above the SD card root), or "[Use this folder]" to pick the folder shown in the header
and return to the main menu without scanning. The choice is saved to the SD card and
remembered on the next launch; it falls back to
/ext/subghzif nothing was saved yet, or the saved folder is missing or invalid. - Find Duplicates scans only the chosen folder, one level deep (subfolders are not
scanned), and only considers
*.subfiles (case-insensitive). - Up to 128
.subfiles are kept; reaching that limit stops the scan and the result says "Stopped at 128". A file that can't be read, or whose name doesn't fit, is skipped rather than guessed at and doesn't count towards that limit; the skipped counts are shown after the scan. - Delete removes the selected file from the SD card. If the delete fails, the file stays in the list and a "Delete failed" message is shown instead.
This project uses a standard Makefile for local development on your host machine (Linux/macOS).
gcc,make,clang-format,cppcheck.
make test: Run unit tests for the core logic on your computer.make format: Automatically format code usingclang-format.make linter: Run static analysis withcppcheck.make prepare: Links your local project directory into the Flipper Zero firmwareapplications_userfolder.make fap: Builds the.fapbinary usingfbt(requires firmware repo).make clean: Cleans local build artifacts.
This project builds with ufbt, the same
tool CI uses to build the .fap on every pull request and push to main:
- Install
ufbt(pip install ufbt). - Run
ufbtfrom this project's directory to build the.fap.
make fap remains available as an alternative if you already have a full firmware checkout;
set FLIPPER_FIRMWARE_PATH in the Makefile to point to it.
| File | Responsibility |
|---|---|
logic.h / logic.c |
Pure domain logic: CRC32, duplicate detection, record removal, scan decisions. No Flipper SDK dependency, testable with plain gcc. |
app_state.h |
App state struct, view enums, shared constants (DEFAULT_SCAN_DIR). |
storage_helper.h / .c |
File I/O: directory scanning, folder listing, file hashing, file deletion. |
settings.h / .c |
Loads and saves the chosen scan folder (/ext/apps_data/sub_dup_finder/folder.txt). |
ui.h / ui.c |
UI callbacks, rendering, view setup. |
main.c |
App lifecycle orchestration: alloc, setup, run, free. |
version.h |
App version, auto-updated by release-please. |
This project includes GitHub Actions workflows:
-
CI (
ci.yml): Runs on every pull request and on pushes tomain.- Linter (static analysis with
cppcheck). - Format check (style enforcement with
clang-format). - Unit tests (logic validation).
- Build FAP (compiles with
ufbt).
- Linter (static analysis with
-
Release (
release.yml): Runs on push tomain.- Runs CI checks.
- release-please creates a release PR with auto-generated changelog.
- On release, builds the
.fapbinary withufbtand uploads it as a GitHub Release asset.
Author: Endika GitHub: github.com/endika/flipper-sub-dup


