Developer

Your code.
On the card.

A native C++ SDK gives you direct control of recording, triggers, storage, and on-device processing — across the QL and Bar Series.

Native C++

Write firmware-level logic in the language you already know. No proprietary scripting layer, no lock-in.

Event-driven

Attach callbacks to triggers, the side switch, schedules, and storage events. The card reacts the moment things happen.

Flash over USB-C

Compile, connect over USB Type-C, and flash. Charging and programming share the one reversible port.

Quick start

From zero to recording in three steps.

Install the SDK

Pull the OX toolchain and headers, then add them to your build.

Write your logic

Describe how the card should record — modes, triggers, and storage — in C++.

Flash over USB-C

Connect the card and push your build. It runs the moment it boots.

main.cpp
// OX Recorder — stream the mic to an SD file
#include <Arduino.h>
#include "OXAudioManager.h"
#include "OXFileManager.h"
#include "OXLog.h"

using namespace OXRecorder;

OXAudioManager audio;
OXFileManager fm;
OXFileStream recFile;

// Called by poll() with each chunk of captured PCM.
void onAudio(const int16_t *pcm, size_t n, void *ctx) {
  if (recFile.isOpen())
    recFile.write(reinterpret_cast<const uint8_t *>(pcm), n * sizeof(int16_t));
}

void setup() {
  OXLog::begin(115200);
  fm.beginExternal();                 // mount SD card
  fm.mkdir(Storage::External, "/rec");
  recFile = fm.openWrite(Storage::External, "/rec/take01.pcm");

  audio.onAudio(onAudio);
  if (!audio.begin())                   // default pins/format
    OXLog::error("mic start failed");
}

void loop() {
  audio.poll();                         // pump capture -> onAudio()
}

Illustrative API. Full headers ship with the SDK.

API reference

The OXRecorder class library.

Nine focused C++ managers in the OXRecorder namespace cover the whole device — audio capture, storage, security, status, input, config, wireless transport, and the networking API. Each has a full reference and a “how it works” deep-dive.

OXAudioManager

INMP441 microphone capture — start, stop, and pause recording, and receive continuous 16-bit PCM via callback or read().

OXFileManager

Unified read/write access to internal flash (LittleFS, quota-bounded) and the external SD card (SdFat/exFAT), with streaming writes.

OXSecurity

Instance-based AES-256-CBC encrypt/decrypt for strings and binary data, with a per-instance key and IV for local vs. server use.

OXLEDManager

WS2812 status LED — a distinct color and animation per application state (pairing, Wi-Fi, recording, faults).

OXSwitchManager

GPIO switch monitoring — debounced on/off state and configurable long-press detection with per-pin callbacks.

OXConfigManager

Central config store plus the hardware reset feature — a long press on GPIO10 triggers a reset callback.

OXWirelessManager

The transport layer — the Wi-Fi and Bluetooth (NimBLE) chips, their connection state, raw data exchange, and per-radio byte statistics, behind injectable transports.

OXAPIManager

The protocol layer on top of OXWirelessManager — inbound REST routing and Bluetooth command dispatch, plus an outbound REST client with chunked streaming uploads.

OXLog

Centralized, level-based logging — wraps the serial transport so all firmware output flows through one extensible API.

Hardware

One board, four peripherals.

An ESP32-C3 drives an INMP441 mic (I2S), a microSD card (SPI), a WS2812 status LED, and a reset button — powered by a 3.7 V LiPo through a TP4056. Each peripheral maps to the manager that owns it.

Peripheral Interface · ESP32-C3 pins Managed by
INMP441 mic I2S · GPIO1 / GPIO2 / GPIO21 OXAudioManager
microSD card SPI · GPIO0 / GPIO4 / GPIO5 / GPIO6 OXFileManager
WS2812 LED GPIO8 (via 330 Ω) OXLEDManager
Reset button GPIO10GND (hold 5 s) OXConfigManager

Signal pins are firmware defaults and can be overridden in each manager's begin(). Power: Battery → TP4056 (5 V) → ESP32-C3; microSD and WS2812 on 5 V, the INMP441 on the ESP32's 3V3 output.

One SDK. Both series.

The same C++ codebase runs on the thin OX QL card and the elongated OX Bar. Build once, deploy to whichever form factor fits your install.

Get SDK access.

Request the toolchain, headers, and developer documentation for your team.