Examples

Omi-derived 3D Print Edition

Works with Nexting · DIY case

Nexting Devices SDK · Case

Omi-derived 3D Print Edition

Build Nexting's 3D-printed adaptation of the Omi open-hardware lineage, flash its firmware, and connect it to the official Nexting App.

Case study: build the Omi-derived 3D Print Edition

This is Nexting's 3D-printed adaptation of the Omi open-hardware lineage. Nexting redesigned the enclosure geometry, button feel, and clip structure, and wrote firmware for this device. It is not official Omi hardware and does not use Omi firmware.

What makes up this Omi adaptation

PartDescription
Omi open-source projectProvides the enclosure structure and hardware design reference.
Nexting 3D Print EditionNexting's modified enclosure, wiring, XIAO firmware, and assembly files.
Nexting Devices SDKThe encrypted BLE/GATT Profiles used between a device and Host.

Download the files

These links are the files needed to build this Omi adaptation. Download the file you need from the public repository.

You needPublic pathUseOpen
3D-printed enclosureThe current default three-part enclosure set.Open enclosure folder
Prebuilt firmwarefirmware/pinclaw_zephyr/pinclaw_v2.2.4.uf2Only for the matching Seeed XIAO nRF52840 Sense path.Download UF2
Wiring and schematicdocs/SCH_pinclaw_v1.0_diy.pdfCheck soldering, power, and pins; do not wire from photos alone.Open schematic
Complete instructionshardware-opensource/README.mdBOM, assembly order, firmware, and license entry point.Open GitHub guide

Connect to the Nexting App

“Download the files” is the material entry point; this section explains how the finished device enters the Nexting App. The device does not connect directly to Claude Code, Codex, Grok, Cursor, or a cloud Agent. The Nexting App is the trusted Host that manages BLE, device identity, and Agent sessions.

These two images are rendered directly from the current shipping files: the first is the base.stl enclosure, and the second combines cover.stl and button.stl. Each image maps to the public download path above.

Rendered current shipping 3D-printed enclosure from base.stl
Enclosure: current-version/base.stl
Rendered current shipping cover.stl and button.stl combination
Panel and button: current-version/cover.stl + button.stl
  1. Finish the hardware and firmware

    Assemble the Omi adaptation from the public files above and flash pinclaw_v2.2.4.uf2. Test the button, recording, and playback on the bare board first.
  2. Sign in and scan in the App

    Open the Nexting App, allow Bluetooth access, and scan for nearby devices. Select the Omi adaptation that matches the advertised name.
  3. Review and authorize

    The App reads the model, firmware, and capabilities. Confirm the board is a Seeed XIAO nRF52840 Sense, then complete pairing.
  4. Enter the Agent from the App

    After pairing, PTT audio enters the App over BLE and the App forwards it to the cloud Agent. Recording, playback, and the session stay managed in the App.
This product path uses the existing BLE audio protocol. BLE alone does not mean that voice/1, status/1, or another public SDK Profile is already supported. For SDK adaptation, continue to “Connect to the Nexting SDK”.

Assembly and first boot

Assemble in this order: bare board → audio → enclosure → App. Complete each step before moving to the next one.

  1. Connect only the MCU and USB

    Power the XIAO nRF52840 Sense and confirm that it enters a UF2 volume, enumerates over serial, and shows a board LED response. Do not attach the speaker or battery yet.
  2. Add PTT and the amplifier

    Wire D4, A1/A2/A3 I2S, D6 amplifier enable, 3V3, and GND from the schematic. Power the MAX98357A from 3V3; do not infer the 5V pad from a product photo.
  3. Test recording and playback bare

    Verify hold-to-record, release-to-stop, tap-to-play, and LED startup, connection, and recording states before installing the enclosure.
  4. Install the case and button

    Dry-fit the printed parts, then secure the board, speaker, and battery. The button must fully release; case pressure must not hold D4 low.
  5. Finish with App pairing

    Confirm that the product firmware advertises and establishes audio, then pair through the Nexting App.
Disconnect the battery or USB before service. Do not repeatedly plug a LiPo, power rail, or amplifier while energized. Stop immediately for a smell, unusual heat, or a swollen battery.

Firmware structure

The firmware uses Zephyr. This source map explains each module so you can modify and build it.

Source locationResponsibilityVerification after a change
src/button.c / button.hD4 press, release, debounce, and tap/hold classificationRecord, playback, repeated input, and bounce tests
src/transport.c / transport.hBLE audio, commands, and heartbeat transportService UUIDs, notify order, sequence numbers, reconnect
src/codec.c, mic.c, speaker.cPDM capture, Opus encoding, and I2S playbackRecording duration, START/DATA/END packets, audible playback
src/device_id.c / storage.cPersistent device ID and NVS storageStable BLE name and ID after reboot
overlay/*.overlayBoard, amplifier, and I2S pin descriptionWiring and audio output on the actual board
prj.conf / CMakeLists.txtZephyr feature flags and build entry pointClean build without stale build-directory state
Build the known XIAO product path from sourcebash
# Run from the repository root
export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
export GNUARMEMB_TOOLCHAIN_PATH="$HOME/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/9-2019q4"
export ZEPHYR_BASE="$HOME/ncs/zephyr"

cd hardware-opensource/firmware/pinclaw_zephyr
west build -b xiao_ble/nrf52840/sense . \
  -DDTC_OVERLAY_FILE="$PWD/overlay/xiao_ble_sense_devkitv2-adafruit.overlay" \
  --pristine

# Artifact: build/zephyr/zephyr.uf2

Use the prebuilt UF2 for a quick reproduction and a source build for development. Build with a board and overlay that match XIAO nRF52840 Sense.

Connect to the Nexting SDK

To connect this hardware to the Nexting SDK, add a message adapter and tests. Keep the voice feature, then expose PTT and one status light through the public Profiles.

Adapter taskDevice workHost workAcceptance evidence
Device identityDeclare model, hardware, firmware, capabilities, and a stable IDReject missing fields, incompatible versions, or identity changesDevice Info snapshot before and after reboot
PTT intentTranslate press/release into bounded voice/1 eventsValidate session, freshness, and duplicates before invoking the AgentHold, release, replay, and disconnect vectors
Status lightRender only bounded Host state; do not infer Agent stateSend full-replacement status/1 and clear it on disconnectConnected, recording, complete, error, and clear vectors
BatteryReport the agreed battery service or Device Info valueTreat it as a hint, never as authorizationCharging, discharging, low, and absent-battery tests
Update and rollbackKeep a recoverable boot path and version markerDeliver firmware only to matching hardwareA wrong-target drill that preserves recovery
The device reports physical intent. Agent mapping, policy, credentials, and sessions stay in the trusted Host; device firmware does not store Agent credentials.

Troubleshooting

SymptomCheckFix
No UF2 volume appearsUse a data cable, double-tap Reset, and confirm XIAO SenseReplace the cable or re-enter the bootloader
UF2 appears but the board will not bootCheck the board, bootloader, and overlay matchRebuild or download the matching UF2
LED works but there is no soundCheck 3V3/GND, A1/A2/A3, D6, amplifier SD, and speaker polarityRecheck the wiring against the schematic
Recording works but App playback failsCheck START/DATA/END order, sequence numbers, and BLE connectionFix the audio path before the App path
Product pairs but has no SDK controlsCheck Profile declarations and Host enrollmentComplete the Profile adapter and Device Info
Input is duplicatedCheck debounce, event IDs, Host deduplication, and disconnect clearingImplement idempotent handling

When reporting a problem, include the MCU marking, firmware filename, overlay, operating system, USB enumeration result, LED behavior, and reproduction steps.

Two ways to use it

The voice product uses a BLE audio path; an SDK device uses public Profiles. Firmware or a Host adapter translates button, LED, and battery state into public messages, then the trusted Host connects the device to an Agent.

Flash the firmware

  1. Confirm the MCU first

    This UF2 is for the Seeed XIAO nRF52840 Sense. Confirm the board marking and model first.
  2. Keep a recoverable baseline

    Confirm that the device boots, records, and plays back, and keep the current firmware file. MultiPad STM32 firmware and other UF2 files do not apply to this XIAO.
  3. Double-tap Reset for the UF2 volume

    After a double-tap on the XIAO Reset button, the computer should show a removable disk. Continue only when the volume appears for the expected board.
  4. Drop in pinclaw_v2.2.4.uf2

    Download the matching file from firmware/pinclaw_zephyr and drag it onto the UF2 volume. If it does not appear, troubleshoot USB and Reset first.
  5. Verify the product path

    Reconnect power and USB, confirm button, audio, LED, and the Nexting App pairing flow, then start SDK Profile work.
This section targets the Seeed XIAO nRF52840 Sense. Other MCUs require their matching firmware and flashing method.

Map hardware to the SDK

Hardware capabilityShipping product pathSDK targetStatus
Hold PTTStart/stop voice capturevoice/1 hold-to-talk intentNeeds Profile adapter and vectors
LEDLocal recording/connection feedbackMinimal status/1 stateDeclare the light semantics
BatteryProduct App battery displayDevice Info / battery serviceVerify against real advertisement
No screenNo text outputDo not declare text/1; use Host or LED stateA useful design constraint
BLEProduct audio pathEncrypted GATT Profile pathVerify the protocol layer by layer

Start with one PTT event and one status light. Cover hold, release, disconnect, reconnect, and expiry before adding audio, configuration, usage, or custom light effects.

Completion checklist

StageVerificationPass condition
1. FilesFetch the enclosure, schematic, and v2.2.4 UF2 from the public repoThe linked files are available
2. ProductComplete recording, playback, LED, and pairing on the original pathIt works without the SDK adapter
3. LinkInspect BLE services and confirm identity, direction, and disconnect behaviorAudio characteristics are not mislabeled as SDK Profiles
4. ProfileVerify one PTT → voice/1 and one state → status/1Messages, replay, expiry, and clearing have vectors
5. DocsRecord the model, firmware, pins, rollback, and limitsAnother developer can reproduce the build

Other examples

CaseWhy it mattersFirst deliverableStatus
XIAO reference controllerFastest SDK proof without enclosure or complex audioapproval/1 + status/1Ready as the next sample
BLE RingSmall bandwidth and rotation/click map naturally to physical intentrotary/1 + keys/1Needs real hardware specs
MultiPadKeys, rotary controls, and displays suit extensible mappingkeys/1 + rotary/1 + status/1Bridge connection planned