This repository targets the ICBbuy SuperMini nRF52840 Pro Micro-form-factor board sold with the black PCB / ENIG finish sometimes called “Black Gold.” It does not target a genuine nice!nano.
| Identity layer | Required value |
|---|---|
| Physical PCB | ICBbuy SuperMini nRF52840 |
| CircuitPython board ID / control image | supermini_nrf52840 |
| OpenSK/Wasefire runner | board-supermini-direct |
| Factory bootloader volume | NICENANO |
| Factory bootloader Board-ID | nRF52840-nicenano |
The last two values are compatibility identities advertised by the Adafruit bootloader shipped on the clone. They do not mean the physical board is a nice!nano, and they must never be used to select board-specific test firmware.
Verified hardware: two matching SuperMinis completed WebAuthn registration, PIN setup, user presence, and authentication in Chrome. One unit then upgraded from Standard to APPROTECT and authenticated the credential created before the upgrade. The stock Adafruit bootloader still accepts unsigned firmware and exposes application readback, so APPROTECT is defense in depth rather than a physical-security boundary. This is research firmware, not a FIDO-certified product; do not use it as the only authentication method for an account.
- CTAP2/FIDO2 and CTAP1/U2F
- Client PIN and user verification
- Persistent credential storage in internal flash
- Physical user-presence input on P0.22
- Adafruit UF2 drag-and-drop updates
- Standard and opt-in APPROTECT firmware profiles
You need:
- the ICBbuy SuperMini nRF52840 described in the identity table above;
- a USB-C data cable;
- a normally open momentary switch between P0.22 and GND.
Board-specific pin facts:
- P0.13 is
VCC_OFF; this port drives it high to keep the external 3.3 V rail enabled. - P0.24 is connected to battery-divider circuitry on the physical PCB. Enabling hardware edge counting on it hard-faulted a tested board, so it is not the user-presence input.
- CircuitPython names P0.15 as
LED, but the visible blue indicator on the tested unit behaved independently of firmware. It is not a diagnostic channel.
Run the guided installer:
python3 scripts/install.pyIt identifies the bootloader, checks the S140 SoftDevice byte-for-byte, repairs factory corruption when found, and offers two profiles:
- Standard — the complete FIDO2 key without SWD lockout.
- Hardened — verifies Standard first, then installs the separate APPROTECT image after explaining that the change is permanent without SWD hardware.
For manual installation, double-tap reset (or bridge RST to GND twice within
approximately half a second). The NICENANO volume should appear. Its tested
bootloader report is:
UF2 Bootloader 0.11.0
Board-ID: nRF52840-nicenano
SoftDevice: S140 6.1.1
That is the bootloader identity, not the board model. If the bootloader is
older, copy firmware/update-nice_nano_bootloader-0.11.0_nosd.uf2 to
NICENANO. This is Adafruit's unmodified updater for that bootloader Board-ID.
INFO_UF2.TXT proves only that the SoftDevice info page is intact. Check the
actual region before flashing OpenSK:
python3 scripts/check_softdevice.pyThen copy the selected image:
firmware/opensk-supermini-nrf52840.uf2
firmware/opensk-supermini-nrf52840-approtect.uf2
The first is Standard. The second enables permanent APPROTECT hardening on its
first boot. After either manual flash, unplug USB, wait two seconds, and
reconnect normally; the SuperMini requires this cold boot after leaving the
UF2 bootloader. Use the guided installer unless you already understand the
recovery implications in SECURITY.md.
Open webauthn.io in Chrome or another WebAuthn browser.
- Register a credential.
- When the browser requests user presence, press the P0.22-to-GND button.
- Set the authenticator PIN when prompted.
- Authenticate with the saved credential.
Both UF2 profiles write only the application region. Credential storage remains at 0xda000..0xe0000.
To upgrade without losing credentials:
- Double-tap reset.
- Copy the selected UF2 to
NICENANO. - Unplug USB, wait two seconds, and reconnect normally.
- Authenticate with an existing credential.
Do not use CTRL-AP ERASEALL unless you intend to erase every credential and
the UICR configuration.
Prerequisites:
- Git
- Rustup
- Python 3
rsync- Linux packages required by
libusbwhen building on Linux
Build:
./setup.sh
./scripts/build_firmware.shOutput:
dist/opensk-supermini-nrf52840.uf2
dist/opensk-supermini-nrf52840-approtect.uf2
dist/SHA256SUMS
The setup script pins:
- OpenSK:
b3b16fb3af12bd8249b9e2a6b4b5869d9036ccda - Wasefire:
6d8f4fc9714004af9d86b4218da0ce6d52db84f4 - Rust:
nightly-2026-06-03through OpenSK's toolchain file
| Path | Purpose |
|---|---|
firmware/ |
Prebuilt UF2 images, checksums, and build manifest |
overlay/ |
Source files applied over pinned OpenSK and Wasefire revisions |
scripts/build_firmware.sh |
Builds Standard and APPROTECT UF2 images |
scripts/install.py |
Guided Standard/Hardened installer with SoftDevice check |
scripts/flash_on_mount.py |
Waits for NICENANO and flashes one UF2 |
scripts/flash_sequence.py |
Updates the tested bootloader, then flashes production firmware |
scripts/check_softdevice.py |
Detects a corrupt SoftDevice region through the bootloader |
scripts/make_sd_repair.py |
Builds a UF2 that restores genuine S140 6.1.1 |
scripts/verify_uf2.py |
Checks UF2 family, address bounds, and store separation |
TROUBLESHOOTING.md |
Observed symptoms and diagnostic procedure |
SECURITY.md |
Security properties and recovery behavior |
RELEASES.md |
Release provenance, reproducibility status, and upgrade gates |
THIRD_PARTY_NOTICES.md |
Upstream revisions and license notices |
The Standard image leaves SWD access unchanged. The separate APPROTECT image
programs UICR.APPROTECT; on newer silicon covered by Nordic erratum 249 it
also locks the software branch for the current boot. APPROTECT blocks debugger
access but does not encrypt flash or add side-channel resistance.
Once APPROTECT is latched, CPU ERASEUICR is blocked. Removing it requires
CTRL-AP ERASEALL over SWD hardware, which erases application flash,
credentials, PIN state, and UICR. UF2 application upgrades remain available,
but they cannot undo APPROTECT.
The stock bootloader permits physical firmware replacement. See SECURITY.md before enrolling any sensitive account.
Repository-original files are MIT licensed. Modified OpenSK and Wasefire files remain Apache-2.0. The vendored nrf-usbd source remains MIT OR Apache-2.0. Full license texts and notices are in LICENSES/ and THIRD_PARTY_NOTICES.md.