1Install & first launch
Grab JTTYAF from the GitHub releases page as a free APK; the Google Play build is in review. Full install instructions live on the Download page.
The first time you open JTTYAF, Android will ask for permissions:
- Microphone — the decoder reads audio through the microphone permission whether it comes from USB audio or the phone's mic. Required.
- USB device access — needed for CAT control and rig audio. Choose Always so the app auto-reconnects when you replug the cable.
- Notifications — lets the background-receive service show its persistent notification while the screen is off.
- Location (optional) — only if you want the grid square filled from GPS.
2Set your callsign & grid
Open the Settings tab and fill in the operator card at the top. Your callsign is what %M expands to in every macro, so JTTYAF won't transmit until it's set.
- Callsign
- Your licensed callsign. JTTY's callsign atoms only fit standard calls (prefix, digit, up to three letters, no
/); a portable suffix still goes out, but as free text. - Grid square
- 4- or 6-character Maidenhead locator. Used for distances and the
FN42grid atom. - Contest profile
- General, RTTY Roundup or Field Day. Decides how exchange text is packed: Roundup sends
599 001in one frame; Field Day packs class and section. See the mode page. - Echo my transmissions
- Show what you send in the receive window, like a teleprinter. Leave it on — it's how you see the QSO as one conversation.
- Decode the whole passband
- Print every JTTY station between 300 and 2700 Hz. Turn it off to decode only around your RX offset and save battery.
3Connect your radio
JTTYAF talks to your rig over a single USB-C connection — both CAT (frequency, PTT) and audio ride on the same cable. Modern phones connect directly with USB-C; older devices need a USB-OTG adapter. Bluetooth CAT interfaces and network rigs are supported too.
- Plug in. Connect your phone to the rig's USB port. Android will prompt for permission to talk to the device — accept it, and tick Always.
- Pick your rig. In Settings → Radio, open the Rig model picker and choose your transceiver.
- Set control mode to CAT. VOX, RTS and DTR are there if your setup needs them, but CAT is what you want with a modern HF rig over USB.
- Confirm CI-V / baud rate. The defaults usually match. If CAT won't connect, this is the first place to check.
- Put the rig in a data mode (DATA-USB / USB-D) with a wide filter. JTTY signals are only 127 Hz wide, but you want to see the whole segment.
- Pick a band. Tap the frequency pill at the top of the JTTY tab. The picker lists the preliminary JTTY dials — 14.090 is where everyone is.
No rig? You can still explore.
JTTYAF will decode from the phone's microphone — hold it up to a speaker on a JTTY-active radio, or play WSJT-X's sample recording at it, and the same print appears. Useful for learning the layout before you wire up CAT.
4Read the live print
The JTTY tab is where you'll spend your operating time. The receiver walks the whole passband and every decoded message prints as a line, newest at the bottom:
- Frequency
- The audio offset of the signal's lowest tone. Tap the line and the RX/TX offset jumps to it, so your reply lands on top of the station you're answering.
- Multi-frame messages
- Frames chain into one line as they arrive. A missed frame shows as
...; a message that stops without its end-of-message bit prints as(incomplete)after three frame periods. - DX call
- Tapping a line also drops that station's callsign into the DX call field, which is what
%Hexpands to. You can type it instead. - Clear
- Wipes the print. Everything stays in
jtty_all.txt.
5The waterfall
The Waterfall tab shows the passband over time. JTTY signals are narrow four-lane ribbons about 127 Hz wide; the bright marker is your RX/TX offset, which sits on the lowest tone of your own signal.
Tap-to-tune. Tap any ribbon to set the RX/TX offset to that signal. The offset marker is also where your transmission will go, so pick a clear spot before you call CQ.
6Send a message
Type into the box at the bottom of the JTTY tab — up to 80 characters — and watch the hint: 2 frame(s) · 3.8 s tells you how many 1.888-second frames the text packs into and how long the transmission will take. Then tap Send.
- JTTYAF keys PTT (CAT, RTS or DTR, whichever you set), waits the TX delay, and plays the whole GFSK buffer with the lowest tone on your offset.
- The print echoes your text in the TX colour as it goes out.
- PTT drops automatically when the buffer ends. Stop aborts early and drops the carrier cleanly.
There is no slot to wait for. If the other station is still sending, wait for their ribbon to end on the waterfall, then go. Text is upper-cased; characters outside the JTTY alphabet become #; anything over 80 characters is refused rather than cut short, so you always know what went out.
7Macros & the serial
The F1–F8 row above the text box loads a macro into the box and sends it. %M is your call, %H the DX call, %E is 599 plus the running serial. The defaults are the one-frame JTTY atoms, so a whole exchange is one tap per over:
| Key | Default | Use |
|---|---|---|
| F1 | CQ %M CQ | call CQ |
| F2 | %H %E | send the exchange |
| F3 | TU %M CQ | thank them and call the next |
| F4 | %M | answer a CQ with your call |
| F5 | %H TU | confirm |
| F6 | %H AGN? | ask for a repeat |
| F7 | NR? | ask for the number |
| F8 | TU NOW %M | moving on |
Long-press an F-key to edit it; Reset to default brings the original back. Keys that use %H won't fire until a DX call is set. The Serial field shows the number %E will send next; it increments every time you log a QSO, and you can edit it by hand.
8Work a station
Running (you call CQ):
- Tap F1 —
CQ K1AF CQgoes out in one frame. - A station answers with their call. Tap their line: it becomes the DX call and your offset snaps to them.
- Tap F2 —
K1ABC 599 017. Under the RTTY Roundup profile that's two frames. - They send
K1AF 599 001. Tap Log QSO, then F3 —TU K1AF CQ— and you're back to step 2 with the serial already bumped.
Search and pounce (you answer a CQ):
- Tap the CQ line in the print. DX call and offset are set.
- Tap F4 — just your call, one frame.
- They send the exchange. Tap F2 to send yours.
- They confirm with
K1AF TUorTU NOW K1AF. Tap Log QSO. Done.
Didn't copy? F6 asks for a repeat of everything, F7 for just the number. Free text works anywhere — type TNX NEW ONE 73 and Send — it just takes more frames.
9Logging & uploads
Log QSO writes the contact to the on-device Log tab with MODE=JTTY, the serial you sent and the exchange you copied, and bumps the serial. If you've configured upload services, it also flies up to them the moment it's logged.
599 / 599
599 / 599
Cloudlog / Wavelog
Open Settings → Cloudlog, paste your server URL, API key and station ID, tap Test, and toggle sync on. New QSOs upload automatically.
QRZ Logbook and World Radio League
Same idea: paste the API key from your account, toggle on. You can run several at once. Export ADIF in the Log tab writes a standard file for everything else.
10Background receive & history
JTTYAF keeps decoding with the screen off: a foreground service with a persistent notification holds the audio path open, so when you come back the print has everything that happened while you were away. Stop receiving to end it.
Everything received and sent is appended to jtty_all.txt in the app's files directory (Android/data/radio.ks3ckc.jttyaf/files/), in the style of WSJT-X's ALL.TXT. Clearing the print doesn't touch it.
11Field tips
- Pick a clear offset before you call CQ. Your signal is only 127 Hz wide, but so is everyone else's — look at the waterfall and park where nobody is.
- Use the RTTY Roundup profile whenever the exchange is 599 + serial. It halves the frames for F2.
- Let the other station finish. There's no slot, so courtesy is the protocol: wait for their ribbon to end.
- Turn off the wide search when portable. Decoding only around your offset is noticeably easier on the battery.
- Set TX level with ALC auto-volume in Settings → Radio, then leave it. GFSK is constant-envelope, but an overdriven rig still splatters.
- Star the GitHub repo if you want a nudge when a new release lands. Or grab the Play Store build and updates happen by themselves.
Something not behaving?
Read the next page: it walks you through the in-app bug reporter and the debug log so we can actually fix what you ran into. Reporting a bug →