Every part of the operating loop — copy, tune, send, log — in a fast Jetpack Compose UI on FT8AF's hardened radio stack, with a codec written for this app from the JTTY design notes. Here's what's inside.
The receiver walks the entire 300–2700 Hz passband, not just your RX frequency, so every JTTY station on the band scrolls up as it decodes — time, audio frequency, S/N, text. Accepted frames are re-encoded and subtracted from the audio so weaker stations underneath print too. Multi-frame messages chain into one line; a dropped frame shows as ....
JTTY is asynchronous — there is no UTC slot to wait for. Type up to 80 characters; the hint under the box shows how many 1.888 s frames it packs into and how long it will take. Press Send and JTTYAF keys PTT, settles, plays the whole continuous-phase GFSK buffer with the 13-symbol sync at the head of every frame, and drops PTT. Stop aborts cleanly.
Eight one-tap keys drive the whole exchange. %M expands to your call, %H to the DX call you tapped in the print, %E to 599 plus the running serial. The defaults are the one-frame JTTY atoms, so a run QSO is three frames each way. Long-press any key to edit it.
JTTY signals are narrow four-lane ribbons, about 127 Hz wide, and the waterfall is scaled to show a crowded band of them. The marker is your RX/TX offset — the lowest of the four tones. Tap any ribbon and JTTYAF retunes the offset to it, so answering a CQ is one tap on the waterfall and one on an F-key.
Plug your rig straight into your phone with a single USB-C cable. JTTYAF inherits FT8AF's cable stack: CAT frequency and PTT control, USB audio, Bluetooth and network rigs, and a long list of radios — Icom, Yaesu, Kenwood, Elecraft, Xiegu, FlexRadio, Guohe, truSDX and anything Hamlib drives.
Tap any received line to make that station the DX call. When the exchange is done, tap Log QSO: the contact is written with MODE=JTTY, the serial bumps, and the record flies up to whichever services you've configured — Cloudlog, Wavelog, QRZ Logbook, World Radio League.
The JTTY encoder and streaming receiver were written for JTTYAF in plain C from the published WSJT-X design documents — no GPL source consulted — and every bit-level convention was settled empirically against the official sample recording. Host tests cover the source-coding golden vectors, channel-coding round trips and modem sensitivity, and run in CI on every pull request.
JTTYAF inherits FT8AF's hardened USB CAT and audio stack, its Compose UI, and years of crash, leak and lifecycle fixes — so the plumbing is solid before you key up.
A foreground service keeps JTTYAF listening and printing with the screen off.
Everything received and sent is appended to a WSJT-X ALL.TXT-style history file.
The whole TX buffer plays, head first. The 13-symbol sync a receiver needs is always on the air.
Isochronous packets are sized from the sample rate, not the endpoint max, so every tone lands where it should.
Runs from API 23 up and targets the current platform, with a dark and a light theme.
Turn off the wide search to decode only around your RX offset when you're portable.