2604 An experimental APRS transmitter for Flipper Zero
last edited by Richard YO3GND, 2026-04-12

An experimental APRS transmitter for Flipper Zero

This project began with a simple premise that was probably more ambitious than sensible: whether the Flipper Zero could be persuaded to transmit something close enough to APRS that a patient receiver might decode it. Not through the proper signal path, and certainly not with the dignity of purpose-built radio hardware, but through a deliberately rough use of the CC1101 async path and a fair bit of stubbornness.

The result is an experimental APRS / AX.25 transmitter for Flipper Zero. It can send direct messages, bulletins, status packets, and fixed-position packets. It keeps saved entries, a small callbook, remembered frequencies, a few RF settings, repeat transmit, and just enough UI to make it usable without pretending it is elegant. The next image is the first successful decode, still one of the more satisfying moments in the whole project, because the signal at that stage had no business being as intelligible as it was.

First successful APRS decode from the Flipper transmitter

The protocol side was never the true difficulty. Building an AX.25 frame, computing the CRC, stuffing bits, NRZI encoding the result, and shaping a known stream in software are all manageable tasks. Python experiments made that clear early. I spent a good amount of time generating packets, dumping edges, checking timing assumptions, and confirming that the pipeline made sense long before the embedded implementation settled down. Once the first decode appeared, the essential question had been settled: the full path, from packet construction to RF output to decode on the other side, was alive.

That was the point where Cișmigiu Park entered the code. It was added as a fixed test position, not because the project required sentiment, but because testing the full pipeline with known, local coordinates was more useful than living on synthetic placeholders indefinitely. Null Island is amusing once; after that, a real coordinate pair is a better instrument. Cișmigiu Park gave the position path a concrete reference, made expected decodes no end easier to recognise, and reinforced a lesson that applied throughout the project: test the full chain early, and keep testing it after every supposedly harmless change.

The real work began once packet generation had ceased to be the bottleneck. The problem was the signal itself. The Flipper is not an FM APRS transmitter, and it does not become one through optimism alone. What this project does instead is use FSK as a weak substitute for FM and rely, to an uncomfortable degree, on the tolerance of receiver discriminators, filtering, and decoder software. That compromise shaped nearly every technical decision. Timing had to be good enough, not merely consistent on paper. The 300 baud path had to be revisited more than once. Wavetable sizing became a real concern. The preamble sounded wrong by ear at several stages, and in this kind of work the ear is often a harsher diagnostic tool than any log file.

Later changes were meant to improve decode quality, and some did. Others merely moved the problem about. The phase-accumulator work, for example, was introduced to make oscillator continuity less crude across bit boundaries. That was the correct direction, but it still had to be debugged carefully because transitions are precisely where the whole scheme becomes least forgiving.

Oddly enough, the part that caused more head-scratching than the RF hack itself was the Flipper UI. The radio side was rough, but at least it was honestly rough. The UI was subtler in its hostility, which made it a particularly bloody nuisance. Menus, text input, variable item lists, previous-view callbacks, module-owned views, input handling, and firmware-version differences combined into a much more time-consuming problem than seemed reasonable. More than once, the transmitter logic felt straightforward compared to making the interface behave consistently.

Still, the project held together because the pipeline was tested outside the device first, then verified on the device relentlessly. That is why the first decode matters, why the Python work matters, and why a place like Cișmigiu Park deserves mention in the source. They mark the point at which the project ceased to be speculative and became measurable.

So this is what the repository really amounts to: not a clean radio design, but a determined one that took a few unreasonable turns along the way. It does transmit APRS. It does decode, and at times not half badly. It also carries a fairly honest record of the awkward path it took to get there.

After all the genuinely awkward work, I also allowed myself one daft flourish for entertainment: an IOCCC-flavoured obfuscation pass over a tiny check whose output can be had from any number of websites and which is, in any case, a fairly terrible passcode. That made it about the least deserving thing in the whole project to hide, which in turn made it oddly suitable. If one is going to spend an unreasonable amount of effort concealing something, it may as well be something almost useless.


One last thing the video made clear was how much work sat around the edges. Working out the old I-V-vi-IV at 122 bpm was a neat reminder of how out of practice I am, and the editing turned out to be a bloody sight more labour-intensive than expected. A five-second "this works" clip is easy; turning it into a one-minute, advert-style cut that is actually entertaining is not. It left me with a good deal more respect for the people who do that sort of work properly.