The DiscoX runs an open-source C++ firmware built on the SAP6 platform. Keep an eye on this page for bug fixes, calibration improvements and new features.
Showing the new device — the one with the large orange trigger button.
Showing the original device — four identical blue buttons, no orange trigger.
Firmware Update Mode (also called UF2 bootloader mode) is what makes the DiscoX appear on your computer as a USB drive named DISCOX. To activate this mode enter the device menu, select "Update Firmware" and confirm yes. You'll then be able to plug your device into a PC and it'll pop up as a USB drive.
● Bootloader
The device looks like a USB drive
When the DiscoX is in Firmware Update Mode, the screen shows a steady bootloader prompt and your computer mounts a removable drive called DISCOX.
· DiscoXUSB · Boot
Entered Bootloader
Plug device into PC and
flash new firmware (.uf2)
Load new firmware or hold
power button to exit._
Method A — From the menu (recommended)
If your DiscoX is already running working firmware, this is the easiest path. No buttons gymnastics required.
Power the device on and wait for the home screen.
Press Button 3 to open the menu.
Scroll to Update / Settings and select with Button 3.
Select Update Firmware.
The device reboots and the screen shows the bootloader prompt.
Plug in USB-C — a drive named DISCOX will appear on your computer.
Method B — Double-press reset (recovery)
Use this if the firmware is unresponsive, the menu won't open, or a previous flash was interrupted. The device's reset is reachable through the USB-C port without opening the case.
Connect the DiscoX to your computer with a USB-C data cable.
Quickly double-press the reset button on the mainboard (or, on assembled units, double-tap Button 4 within 0.5s while plugged in).
The status LED settles to a steady amber/red glow — that's the bootloader signal.
The screen shows DISCOX BOOTLOADER and the DISCOX drive mounts.
Tip · Use a data cable
A surprising number of USB-C cables are charge-only. If the device powers on but no drive appears, swap the cable before assuming anything is wrong.
How to tell you're in update mode
The screen shows DISCOX BOOTLOADER with a version line.
The status LED holds a steady colour (no breathing or pulsing).
A removable drive called DISCOX has mounted on your computer.
The laser is off and buttons no longer take readings.
03 · Drag & drop
Flashing the .uf2
With the device in Firmware Update Mode and the DISCOX drive mounted, you're ready to flash.
DiscoX2-v2.0.9.uf2
discox-v0.1.0.uf2
drop
D
DISCOX
USB · 1.0 MB
Download the latest .uf2 file from the link above.
Open the DISCOX drive in Finder, Explorer, or your file manager.
Drag the .uf2 onto the drive (or copy & paste — either works).
The drive will dismount on its own as flashing starts. Don't unplug.
After 5–15 seconds the device reboots into normal firmware and the home screen returns.
Open Menu → About to confirm the version number matches what you flashed.
Don't interrupt the flash
Once the drive disappears, the chip is rewriting its own firmware. Pulling the cable mid-flash can leave the device in a half-written state — recoverable via Method B above, but easier just to wait the few seconds it takes.
04 · If something's off
Troubleshooting
No drive
The DISCOX drive doesn't appear
Try a different USB-C cable — many are charge-only. If you're sure the cable is fine, use Method B (double-press reset) to force the bootloader.
Stuck
Device won't boot after flashing
Hold the power button for 10 seconds to fully power down, then plug back in and re-enter update mode via Method B. Re-flash the latest known-good .uf2.
Wrong file
Drive ejects with a FAIL.TXT
The bootloader rejected the file. Make sure you downloaded the .uf2 for DiscoX (not a generic SAP6 build) and that the file isn't corrupted — re-download and try again.
Settings
My config.json was wiped
Major firmware updates can reset the settings file to defaults. Your calibration is preserved separately. Re-edit config.json via Menu → Update / Settings → Edit Settings File.
05 · What's new
Changelog
v2.0.9 — 2026-10-10
Readings on dark rock work far more often. The laser was refusing many shots on dark or wet surfaces that it could have measured. It now accepts a weaker return signal, but takes three shots for every reading and only keeps the result if all three agree to within 25 mm. A shot that can't be trusted is still refused rather than recorded.
Each reading takes a little longer, because the laser now takes three shots instead of one.
This release keeps the spinning disco ball start-up animation.
No re-calibration is needed. Your settings and calibration are kept when you update.
v2.0.8 — 2026-10-04
Waking the device from standby now goes straight back to live compass and inclination readings. Before, if your last action was a shot, it woke showing that old reading frozen on screen until you pressed FIRE.
The standby screen now tells you when the device will switch itself off, for example "Powers down after 10 minutes", using your standby_timeout setting. It stays up for a moment longer so there's time to read it.
The start-up animation is no longer a setting. Each firmware update now chooses it, so updating may bring a new one. If you changed splash_style in CONFIG.JSON on v2.0.7, that setting is removed when you update. This release keeps the spinning disco ball.
No re-calibration is needed. Your settings and calibration are kept when you update.
v2.0.7 — 2026-10-04
New standby mode, so the device is ready again instantly between stations. A short press of the power button shows "Standby mode" for a second, then switches off the screen and laser. Press any button and you're straight back on the reading screen, with no start-up wait. After 10 minutes in standby it switches itself off fully. Your phone stays connected while it's in standby; any readings not yet sent go across as soon as you wake it.
To switch off fully, hold the power button until the bar fills. To switch on from fully off, hold the power button until the bar fills; a quick tap shows "Hold the power button to turn on" and the device stays off, so it won't turn itself on in a bag.
The standby time can be changed with the new standby_timeout setting in CONFIG.JSON on the USB drive (Menu → Settings → USB Drive Mode). It's in seconds: 600 is 10 minutes, and 0 turns standby off, so a short press does nothing and holding switches off.
New start-up animation: a spinning disco ball. Six others are available, including a laser engraving the name, a compass that settles on north and a flight down a cave passage. Choose one with the splash_style setting in CONFIG.JSON; the README.TXT on the USB drive lists them.
Start-up is quicker: after the animation the device goes straight to the reading screen and finishes starting up behind it, so readings appear a moment later rather than the animation freezing.
Fixed a flash of static on the screen when switching on from fully off.
No re-calibration is needed. Your settings and calibration are kept when you update.
v2.0.6 — 2026-09-29
Far fewer laser shots are refused on dark or dull rock. The device was throwing away readings when the returned laser signal was only moderately faint, and showing WEAK even for walls under a metre away. Those readings were checked against a tape measure and were accurate to about 2 cm, so they are now accepted. Very faint returns are still refused: on those the laser can report a wrong distance (sometimes half the true one), which would put a bad leg in your survey.
WEAK is now LOW SIGNAL, with the advice "Use reflective target". It still means the same thing: the laser got a reading but the signal was too faint to trust. Aim at a paler patch of rock, hit the surface more squarely, or hold up a target card. RANGE is different: it means the laser got nothing back at all.
No re-calibration is needed. Your settings and calibration are kept when you update.
v2.0.4 — 2026-09-26
Fixed compass readings on tilted and rolled shots. The fix in v2.0.2 corrected readings taken with the device level and screen-up, but on inclined legs, or with the device rolled onto its side, the azimuth could still be out by several degrees, sometimes much more. Inclination and distance were never affected. Everyone on v2.0.2 or v2.0.3 should update.
If you calibrated your device on v2.0.2 or v2.0.3, please re-run the full calibration after updating. The device shows RECAL NEEDED at start-up until you do. Calibrations made on earlier firmware are converted automatically and don't need redoing.
Taking a shot is quicker. The device now needs about a third of a second of steady aim rather than a longer, stricter hold, and it records the average over that moment instead of a single instant, so ordinary hand shake no longer holds a shot up or nudges the reading.
The compass and inclination on screen are steadier while you aim.
Calibration now spots points thrown off by nearby metal and leaves them out of the result. It also warns you if the second part was done somewhere magnetically different from the first (half a metre from a radiator is enough), and says so in plain words instead of showing a good-looking accuracy figure.
The calibration results screens show a new Dip spread figure. In a clear spot expect about 1° after part 1 and 0.1–0.2° after part 2; a much larger number means something magnetic was nearby.
A calibration point that never settles is no longer recorded anyway. The device beeps three times and you take that point again.
The CAL? warning at start-up appears far less often. It could be set off by a single noisy reading or by moving the device as you switched it on.
config.json on the USB drive now lists only the settings you might want to change, and your existing values are kept when you update. The steadiness setting is now called steady_tolerance (default 1.5°).
v2.0.3 — 2026-09-25
Fixed the device freezing on the start-up screen if its internal storage gets damaged — for example by power being cut while it was saving a calibration. Before, the only clue was a device that never finished booting, and re-flashing the firmware didn't help. Now it restarts into a STORAGE DAMAGED screen: hold FIRE for 3 seconds to repair it and the device boots normally again. Everyone on v2.0.2 should update.
Your settings and calibration are now backed up automatically. If the storage ever has to be reset — through the repair screen, Menu → Settings → Reformat Storage, or holding DOWN + MENU at power-on — they are put back on the next start-up, so you don't have to calibrate again. Unsent readings can't be recovered, so let the device send its readings to your phone before you reset it.
After updating, turn the device on once so it can make its first backup. There is nothing else to do and you don't need to calibrate again.
v2.0.2 — 2026-09-19
Fixed the compass reading backwards. Turning east from north showed 270° instead of 90°, and the error grew worse on steeply inclined legs. Inclination and distance were never affected. Everyone on v2.0.1 should update.
If you calibrated your device on v2.0.1, please re-run the calibration after updating — the old one was recorded against the mirrored compass. The new firmware will not let a stale calibration undo the fix.
v2.0.1 — 2026-09-15
First public release for the new device, built on the single-processor board.
Survey legs are held on the device until your phone confirms it has them — pull the device out of range mid-trip and nothing is lost.
The firmware version is now shown on the boot splash, so you can check what a device is running without opening it up.
Laser shots that can't be trusted are rejected rather than recorded, and error messages say what actually went wrong.
The laser now switches off with DOWN while idling, saving battery between legs.
Calibration: undo a recorded point with DOWN, save with UP+DOWN, and a dry-run test before committing.
Settings, calibration and unsent readings are editable over USB as a plain drive (Menu → Settings → USB Drive Mode).
Disco mode, with the Mario theme hidden in it.
Numerous storage-reliability fixes around calibration saves and reflashing.
v0.1.0 — 2026-06-19
Initial public release of the DiscoX firmware.
Main board and BLE board UF2 builds published via automated GitHub releases.