Technology blog

Field notes from the bench

Deep dives on the engineering behind HTCommander — real-world findings, protocol reverse-engineering and DSP experiments. The honest ledger of what works, what doesn't, and what we still don't know.

DART Modem

Building and tuning DART (Data Adaptive Rate Transport), an adaptive OFDM modem for sending data over ordinary VHF/UHF FM voice radios (2 m / 70 cm) across a Bluetooth (SBC) audio link. Best read in order — each post builds on the last, walking from the first over-the-air observation down to the root-cause diagnosis and fix.

Part 1

Pushing Data Through FM Voice Radios: Real-World Findings

The first over-the-air test on two UV-Pro radios. Which modes work, which fail, and the first evidence that the quality ceiling lives in the audio path — not the RF, band, or transmit level.

Read more →
Part 2

Does SBC Bitpool Matter?

The Bluetooth SBC codec adds a small noise floor under the signal. We measure how much, and show that raising the bitpool saturates quickly and never moves the ceiling.

Read more →
Part 3

Inside SBC: Loudness vs. SNR Bit Allocation

How SBC spends its bits across subbands, and why its default loudness allocation is the wrong choice for data — a free quality gain from switching data frames to SNR allocation.

Read more →
Part 4

Chasing a Ghost: Proving (and Fixing) the Real Limiter

Building a phase-noise channel model and a phase-drift meter to turn "it's probably phase noise" into a measurement — then fixing it with pilot-aided phase tracking, recovering a rung of throughput, and showing the remaining ceiling is raw SNR (a link-budget problem), not DSP.

Read more →
Part 5

The Bits You Already Know: Code Shortening for Short Frames

A lopsided constellation reveals that short frames are mostly known zero-padding. Telling the decoder those bits are known (code shortening) buys 5+ dB of margin on short frames — for free, and scaling exactly with how short the frame is.

Read more →
Part 6

Is 125 Microseconds Enough? A Look at Inter-Symbol Interference

Building a multipath echo channel to test whether DART's deliberately-short cyclic prefix is big enough. It finds the classic ISI knee at the CP boundary, confirms the SBC/audio path adds no dispersion the CP misses, and shows the short-CP bet was safe.

Read more →
Part 7

Whitening the Signal: Why a Modem Scrambles Its Own Data

Why repetitive data (a frame full of zeros) wrecks spectrum, PAPR, and phase tracking — and why the fix is to make the data look like noise first. Compares the self-synchronizing G3RUH scrambler against an additive frame-synchronous one, and lays out the LDPC-friendly PN15 whitener DART will adopt.

Read more →

Firmware Updates

FIguring out the radio's firmware-update path — from the cloud check that finds an update to the two-phase Bluetooth flash that writes it into the radio.

Radio Protocol

The low-level language HTCommander and the radio speak to each other.

Sharing & Interop

Making HTCommander features portable between operators and radios.

Messaging & Security

Trusting what comes off the air — proving who sent a message, without breaking the no-encryption rules.

Home Automation & Integrations

Connecting HTCommander to the wider ecosystem of tools operators already run.

Troubleshooting & Support

Getting good diagnostics out of the app when something goes wrong.

Internet Linking

Bringing internet-linked voice into the same app that drives the radio.

Internet

Radio Over the Internet: Adding EchoLink to HTCommander

A full walk through the EchoLink stack in pure Dart — the GSM voice codec, the UDP audio/control ports and TCP directory, the RTCP SDES/BYE handshake that opens a QSO, how voice and chat are wrapped, what callsign suffixes and node numbers mean, a NAT pinhole that quietly eats receive audio, and how to get an account and make your first connection.

Read more →
Internet

Radio and Internet, Two Ways: Planning APRS-IS for HTCommander

A design note written before the first line of code — what APRS-IS is, the single-line passcode login, the TNC2 ⟷ AX.25 codec that lets internet packets reuse the existing APRS pipeline, the full-IGate rules for gating between RF and the internet (q-constructs, NOGATE, the "recently heard" list), and the receive-only-first test plan.

Read more →
Internet

Dialing In: Adding AllStarLink Support to HTCommander

How we speak Asterisk's native IAX2 protocol from pure Dart to connect to an AllStarLink node — the single-UDP-port design, full vs. mini frames, the NEW/AUTHREQ/AUTHREP/ACCEPT/ANSWER call handshake, MD5 challenge-response auth, GSM and μ-law voice, UDP reliability with sequence numbers and the 0x8000 timestamp-resync trick, why we connect client-to-node (DVSwitch/iaxRPT style), and how to configure a node and make your first call.

Read more →
Internet

Becoming the Node: Hosting an AllStarLink Node in HTCommander

The other direction — turning HTCommander into a node others dial into. Running the inbound IAX2 server (the handshake in reverse), sharing one socket between calls and registration by call-number range, IAX2 registration so the network can find you, and the radio relay: bridging 8 kHz call audio to a handheld's PTT with half-duplex carrier arbitration so local RF always wins. Plus accepting Web Transceiver clients safely by validating their portal token the way a real app_rpt node does.

Read more →

Voice & CW

Sending and shaping audio through the radio — from the microphone to Morse.

Satellites

Working amateur radio satellites with a handheld — tracking, passes, and Doppler.

Emergency Beacons

Pulling life-saving signals out of the air — receive-only, on protected bands.

Data & Storage

How HTCommander packs large datasets into small, fast, self-contained files.

App Architecture

How HTCommander is built under the hood — the threading, plumbing, and design decisions that keep the radio responsive.

Building & Contributing

Getting a full HTCommander development environment running on your own machine.