For version 1.2
Greyline FT8 turns an iPhone or iPad into a complete FT8 and FT4 station. Connect the device to your transceiver with a USB audio interface and the app decodes the band in real time, shows it on a waterfall, works stations for you if you want it to, logs the contacts, and uploads them to your logbook. There is no computer in the chain and nothing to configure on a desktop. Everything happens on the device: decoding, transmitting, logging, POTA spotting, mapping.
Any interface that presents itself to iOS as a USB audio device will work: a Digirig, a SignaLink, a radio with a built-in USB CODEC, or a simple isolated audio cable pair. The app detects the interface automatically when you plug it in and switches to it, and switches back if you unplug it.
Looking for information on supported radios and how to configure them? See Connecting to Radios.
Bluetooth audio is experimental. A Bluetooth interface that offers a microphone (the "hands-free" profile, as a headset does) can be used, but only when no USB or wired interface is connected — those always win. Every time the app switches to a Bluetooth device, it pauses all audio and shows a warning with two choices, like the disconnection alert:
Either way, a CQ or automatic mode that was running stays stopped, as after any audio-device change.
Never use earphones or earbuds with Greyline. Transmit audio is loud, and in your ears it can damage your hearing quickly. That is why audio pauses until you have seen the warning.
Expect some drawbacks:
If your interface also has a USB connection, use that.
The app has no CAT control and does not key your radio over a serial line. It transmits audio, and your radio needs to key from that audio, using VOX or the "data VOX" setting most modern radios have on their USB audio input. Every transmission begins with a tenth of a second of silence to give the radio time to key up before the signal starts.
FT8 and FT4 divide time into fixed slots aligned to UTC. If your device clock is off by more than about a fifth of a second, other stations will struggle to decode you and every station you hear will show a suspicious DT value. Leave iOS set to "Set Automatically" under Settings › General › Date & Time. You can check your clock inside the app; see Diagnostics.
iOS treats your radio's audio input as a microphone. Without that permission the app cannot decode anything.
Keep the app in front. iOS suspends audio processing for apps that go to the background, so Greyline stops decoding and transmitting when you switch to another app or lock the screen. It restarts automatically when you come back. If you are running a long session, turn on Keep Screen On in Settings so the device does not sleep.
The first launch walks you through eight short pages. You can skip the optional ones and come back later; everything is also in Settings. There is also an "I'll set up myself" button on the welcome page if you would rather do it all by hand.
| Step | What it asks for | Required? |
|---|---|---|
| Welcome | Nothing | No |
| Callsign | Your callsign (A–Z, 0–9 and /) | Yes, you cannot transmit without one |
| Location | Location permission, or a manually typed grid square | Yes, a grid is required to transmit |
| Audio access | Microphone permission | Yes, nothing decodes without it |
| Lookups & logging | QRZ / HamQTH / Cloudlog / World Radio League credentials | Optional, skippable |
| Share your spots | PSKReporter and POTA spotting toggles | Optional, skippable |
| Help & resources | Links to cabling guides and support | No |
| Finish | Warns you if the mic or grid is still missing | No |
You can re-run the whole flow at any time from Settings › About › Re-run first-time Setup.
Both are mandatory before the app will transmit. The grid rides inside your CQ, and the distance and bearing columns depend on it.
If you enable Use device GPS, the app derives your grid from your position and keeps it current as you move, which is useful when you are operating portable. Turn GPS off and you can type a grid by hand (4 or 6 characters, e.g. DM04 or DM04vk). Typing a grid manually while GPS is on automatically switches GPS off, so a later position fix cannot overwrite what you typed.
The layout adapts to the device.
On iPhone, five tabs across the bottom:
The strip at the bottom of the Operate tab is always visible. It shows the slot phase, the countdown, your transmit frequency with an icon for its mode (see Choosing your transmit frequency), the message queued to go out next, and a single action button. Tap the strip to open the full control panel as a sheet; drag it down to dismiss.
On iPad, a sidebar holds the whole control panel plus navigation, and the right-hand pane holds the waterfall and band activity. The button at the top-left of the sidebar collapses it, which is useful in the field: the band activity then fills the screen and grows its own compact timing strip along the top and a control bar along the bottom.
FT8 works in 15-second slots (FT4 in 7.5-second slots) locked to UTC. The progress bar and its label tell you where you are inside the current slot:
| Label | Colour | Meaning |
|---|---|---|
| RX | Green | Receiving. Signals are arriving. |
| DECODE | Blue | Enough of the slot has arrived to decode it. Results appear a second or two later, before the slot ends. |
| TX | Red | You are transmitting. |
Decoding starts before the slot boundary on purpose. That head start is what lets the app answer a station on the very next slot rather than waiting a full cycle.
Time flows downward, frequency runs left to right across the FT8 passband (200–3000 Hz). Louder signals move up the colour scale: black, blue, cyan, yellow, red.
Tap or drag horizontally anywhere on the waterfall to move your transmit frequency there. Drag vertically to adjust the display sensitivity: down makes the display more sensitive (weaker signals show), up makes it less. A read-out appears while you drag and the value is remembered.
Adjusting sensitivity by dragging turns off Auto-calibrate Waterfall; setting a frequency by tapping switches the TX frequency mode to Hold. Both are deliberate, because a manual choice should not be overwritten a second later. See Choosing your transmit frequency.
Every packet for the session, oldest at the top, newest at the bottom. The list follows new decodes as they arrive while you are at the bottom. Scroll up to look at something and it stays where you put it; scroll back down and it follows again. A tap made in the instant new decodes arrive and the list moves is ignored, so it can never land on a row that slid under your finger — just tap again.
| Column | Meaning |
|---|---|
| UTC | The slot the message was decoded in, as HHMMSS. For your own transmissions it's the slot start, except when you tapped to transmit mid-slot, which shows the moment it actually went out. |
| dB | Signal-to-noise ratio, in the same terms WSJT-X uses, so the numbers are comparable. Your own transmissions show TX. |
| DT | How far off the slot boundary the other station's transmission arrived, in seconds. The app subtracts its own audio latency, so what you see is the other station's timing error, not yours. Values within a few tenths are normal. |
| Freq / Hz | Audio frequency inside the passband. |
| Message | The decoded text. Long compound callsigns scroll gently side to side rather than being cut off. |
| Grid | The remote station's grid, remembered from any earlier message in the session, so it stays filled in during an exchange even when the current message does not carry one. |
| Dist / Brg | Great-circle distance and bearing from your grid. iPad only, when the pane is wide enough. |
| Country / Entity | DXCC entity, state or province, and continent, resolved offline. |
Tap a column heading to sort by it: UTC, dB, Freq (Hz on iPhone), or on iPad Dist. Tap the same heading again to reverse the order. The chevron beside the heading points down for the usual order and up when reversed.
| Heading | First tap | Tap again |
|---|---|---|
| UTC | Oldest first, newest at the bottom | Newest first, at the top |
| dB | Strongest first | Weakest first |
| Freq / Hz | Lowest first | Highest first |
| Dist | Furthest first | Nearest first |
| Colour | Meaning |
|---|---|
| Yellow | Something you transmitted. |
| Red | A message addressed to you. |
| Cyan | A CQ from a station you have not worked on this band and mode. |
| Green | A CQ from a station you have already worked on this band and mode. The automatic modes will pass on it. |
Green is scoped to the current band and mode, not your whole log: a station worked on 20 m is a genuinely new contact on 40 m, and the colour tells you what Hunter and Gatherer will actually do.
A short vertical bar down the left of a row means that station transmits while you are listening — you can work it. The speaker symbol at the top of that narrow column labels it. Rows without the bar are transmitting at the same time you do, so you are largely deaf to them and could not answer them without moving to the other slot.
Under time sort, in either direction, a heavier line also separates one slot from the next, so the list reads as alternating blocks. That grouping disappears if you sort by signal, frequency or distance, because slots no longer run in order — the bar itself stays under every sort.
The bar follows where you are actually transmitting, not simply your Call CQ on setting. Those are usually the same, but while you are answering someone else the protocol puts you on the opposite slot to theirs, so the marking flips for the duration of that exchange and flips back when it ends. That is not a glitch: it always shows the slot you are free to listen in right now.
When Hunter or Gatherer is running, it will sometimes leave a station alone. Left unexplained that looks like the app has stopped working, particularly when you are operating unattended and come back to find calls that went unanswered.
A small badge after the message says why. It sits to the right of the message text rather than before it, so the messages stay aligned in a column you can read straight down:
| Badge | What it means |
|---|---|
| WAIT 3m | You tried to work this station and got nowhere, so it is set aside for a few minutes before it is tried again. The number counts down. |
| SKIPPED | Hunter gave up on this station after calling without a reply. It stays set aside until you re-arm Hunter or cancel the exchange. |
| FILTERED | Your CQ filter excludes this station's kind of call. See CQ filtering. |
| WORKED | You have already worked this station on this band and mode. |
You will see them on different rows depending on the mode, which follows from what each mode does. Hunter answers other stations' CQs, so its badges are on CQ rows. Gatherer calls CQ and works whoever replies, so its badges are on the replies addressed to you.
WORKED appears in Gatherer only. In Hunter the row is already green, which says the same thing.
In Standard you keep the WAIT and SKIPPED badges. Dropping out of an automatic mode — by tapping a station, or by switching mode — used to blank every badge, so you lost your picture of who had been set aside just as you went to do something about it. Those two are memories that outlive the mode change, so they stay. WORKED and FILTERED do not: the green row already says worked, and the CQ filter only acts on the automatic modes, so in Standard it is not excluding anything and a badge claiming otherwise would be wrong. If you have never armed an automatic mode, Standard shows no badges at all, exactly as before.
A badge is not a fault. It is the app telling you it made a decision on purpose. If you want a station worked anyway, the relevant setting is in Settings › Operations: turn on Allow duplicates in auto modes for WORKED, or change the CQ filter for FILTERED. WAIT expires on its own, SKIPPED clears when you re-arm Hunter, and you can always tap the row to work that station by hand.
A station you tap in Gatherer loses its badge, because it is no longer being passed over — see Tapping a row.
RR73 or 73) also keeps the run going. If you owe them a closing message, it goes to the top of the queue and is re-sent next, without logging the contact a second time. If their roger is for a contact that never made it into your log, they are queued as a caller instead, and logged when the exchange completes. If nothing is left to send them, a status line says so and nothing else changes.Tapping any other row does nothing, so a stray tap on a moving list never starts a transmission. To call a station from one of those rows, long-press it instead.
Many stations, POTA activators especially, work one contact after another without calling CQ in between. There is no CQ of theirs to tap, but their exchanges with other stations are in the list. Long-press any row to call one of the stations on it.
The menu lists the station that is running first: the one working contacts back to back, which is usually who you want. The app works out which station that is from the message:
| Row | Example | Listed first |
|---|---|---|
A report or RR73 | JA1XYZ JQ3JUK RR73 | the sender, JQ3JUK |
A grid, a roger or 73 | JQ3JUK JA1XYZ 73 | the station it was sent to, JQ3JUK |
The other station on the row is listed second, so if the app picks the wrong one, the right one is still a tap away. A long-press on a CQ offers that station alone, and does the same as tapping it.
What Call does depends on the mode:
Your own transmissions and rows addressed to you have no menu: tap a row addressed to you to pick that exchange back up. Free text and unreadable callsigns have no menu either.
The funnel button in the navigation bar opens Only show CQ and my exchanges. With it on, the list shows CQ calls, anything addressed to you, and your own transmissions, and hides everything else. This is a display filter only: decoding, logging and the automatic modes carry on exactly as before. A banner along the bottom reminds you it is active; tap it to clear.
The filter also hides other stations' exchanges, which is where a station running contacts back to back shows up, so turn it off to long-press one of those rows.
With the filter on, every row in the list can be tapped, so the rows get taller: each one is a comfortable target on its own rather than a line of text between two others. The text stays the same size. For larger text as well, turn on Settings › Display › High Visibility.
You can choose whether this starts on, off, or as you left it under Settings › Display › Only show CQs.
Your callsign and grid on the left; a status pill on the right reading TX (red), RX (green), or Stopped. If it says Stopped, tap it to start the receiver. If microphone access was denied it says so, and tapping takes you to iOS Settings.
An orange Timing slow warning appears to the left of the pill when recent transmissions have been leaving late — see Timing Health under Diagnostics for what to do about it. It is not a radio fault: it means the app itself is struggling to keep up.
Band picker, transmit frequency read-out with its Auto / Hold / Partner menu, the suggested clear frequency (tap it to adopt it; in Hold it becomes a Resume Auto button), a frequency slider covering 200–2900 Hz, and the FT8/FT4 selector. These lock during your transmit slot and unlock again on each receive cycle. The frequency mode menu locks whenever you are transmitting, in any mode, since a change can't affect what is already on the air.
See POTA activations.
Standard / Hunter / Gatherer, grouped under "Manual" and "Automatic" brackets. Hunter and Gatherer are greyed out until a callsign and grid are set.
A dropdown reading Even slots or Odd slots. It decides which half of the cycle your CQ goes out on:
| Selection | FT8 | FT4 |
|---|---|---|
| Even slots | :00 and :30 | :00, :15, :30, :45 |
| Odd slots | :15 and :45 | :07.5, :22.5, :37.5, :52.5 |
Even slots is the default, and is what earlier versions always did.
It only applies when you start the contact. When you answer somebody, you transmit on the opposite half of the cycle to them. That is how FT8 works, and it is their choice rather than yours. So if you have chosen Odd slots and then reply to a station calling CQ on odd, you will correctly answer on even. The setting is about your CQ, which is why it is labelled that way.
The dropdown greys out whenever you are armed to transmit, meaning while you are calling CQ, mid-exchange, in Hunter or Gatherer, or sending any message. Stop what you are doing to change it, and the new choice takes effect from your next CQ. This is deliberate: changing halfway through a contact would move your transmissions onto the slot your partner is using, and neither of you would hear the other again.
Your choice is remembered between launches.
Most operators never need to touch this. Reach for it when the half you are on is crowded, or when you have agreed a slot with someone you are trying to work.
What it does depends on where you are:
| It says | Tapping it |
|---|---|
| Call CQ | Starts calling CQ (Standard mode). |
| Halt Transmit | Stops calling CQ. |
| Abort — working W6ABC | Abandons the exchange in progress. |
| Enable Transmit / Auto TX Enabled | Arms Hunter, or disarms it back to Standard. |
| Abort — hunting W6ABC | Drops the station Hunter is chasing and goes back to scanning. |
| Stop Gatherer plus Queue (n) | In Gatherer the button splits: stop, or inspect the pile of waiting callers. |
The exact message that will go out, in the same form the other station will see it. Two details worth knowing:
W6ABC KB0RB -12 (7), that message is being sent now and will be repeated up to seven more times if the other station does not respond. It counts down with each repeat and disappears when the budget is spent. See Retransmissions.The small TX / RX pill in the corner of that panel tells you whether the coming slot is yours to transmit on. While Hunter is scanning it stays on RX, because Hunter sends nothing until it finds a target.
If nothing is queued, the panel shows your CQ message greyed out, a preview of what would go out if you tapped Call CQ.
Expand it and pick what the box is for: Call or Message.
Call (the default) takes a callsign and starts a QSO with that station — for chasing a station that is working a pileup and never calls CQ, so there is no CQ of theirs to tap. Type W6ABC, and the hint under the field previews exactly what will go out (Will send: W6ABC YOURCALL FN42). Press Call and the app calls them, repeating until they come back or your retransmission limit runs out, then sequences the rest of the QSO for you like any other exchange. To stop, use the main button, which reads Abort — working W6ABC.
Timing is picked for you: the app transmits opposite to the slot it last heard that station in, so your call lands while they are listening. If you have never decoded them, it falls back to your Call CQ on slot setting, which is a coin flip until you hear them once.
If the station is in the band activity list, long-pressing its row does the same without typing, and the row settles the timing even if you have never decoded them transmitting.
Calling from Hunter keeps you in Hunter — it runs the exchange and returns to scanning afterwards — as long as you have decoded that station transmitting. If you never have, Hunter has nothing to run the exchange from, so the app switches to Standard and calls them from there. Calling from Gatherer ends the run, because you are answering someone else instead of the callers answering you.
Message is the original behaviour: one message of your own on the next slot boundary, whichever slot that is. It accepts either free text (up to 13 characters) or a standard message such as W6ABC KD9XYZ -09; the field validates by trying to actually encode what you typed, so a legitimate standard message is never rejected for looking too long. Once queued, the button becomes a red X to cancel. A custom message does not appear in the Next TX panel.
Your audio input level, labelled QUIET, OK or HOT. Aim for the green band. If it reads HOT, turn the audio down at the radio or interface, because an overdriven input decodes badly. The meter is suppressed during your own transmit slot.
A standard FT8 contact is four transmissions, alternating slots. Answering a CQ, you send:
W6ABC KB0RB DM04 your grid
W6ABC KB0RB R-12 roger, and your report of their signal
W6ABC KB0RB 73 done
Calling CQ, you send:
CQ KB0RB DM04
W6ABC KB0RB -09 your report of their signal
W6ABC KB0RB RR73 confirmed and finished
Greyline follows this strictly, and like WSJT-X it will not treat a repeated bare signal report as confirmation that the other station heard your roger. Jumping ahead there is how contacts get logged that never actually completed.
The Sent report in your log is the SNR the app measured for their signal. The Rcvd report is the number they sent you, read from their message. Reports are generated automatically; you never type one.
RR73 arrives, the point at which they have confirmed the contact.RR73 goes out for the first time. By then you hold their report and their roger, so the contact is complete from your side, and their 73 simply closes it out. This matters, because an RR73 they never hear would otherwise lose a contact that had in fact been made.Each contact is logged once, no matter how many times a message is repeated.
The mode chip sits directly above the transmit button, because it changes what that button does. Modes always reset to Standard when the app launches.
You decide everything. Tap a CQ to answer it, or tap Call CQ to call. Once an exchange starts, the app sequences it for you and sends the right message at the right moment; you are choosing who to work, not typing messages.
Calling CQ in Standard mode gives up after your configured retransmission limit of unanswered CQs and stops. Anything you tap resets that count.
Hunter watches for CQ calls and answers them one at a time, on its own.
73 goes out, then returns to scanning.Each of those skips shows as a badge on the station's row, so you can see why a call went unanswered. See Why a station was passed over.
While Hunter is scanning, Next TX reads Pending Target and the pill stays on RX, because Hunter transmits nothing until it has someone to call.
A setting with two options:
Distance uses grids decoded off the air, never an online lookup, so it works with no network.
Hunter has no First to reply option, unlike Gatherer. Gatherer keeps a standing queue of callers waiting their turn, so the order they arrived in is meaningful; Hunter chooses among the CQs of a single cycle, where nobody is waiting.
Gatherer calls CQ continuously and works everyone who answers, in order, without stopping. This is the mode for running a pile-up during an activation or a contest.
RR73, log, next caller. When the queue empties it goes back to calling CQ.Tap Queue (n) to open it. The station being worked sits at the top marked ACTIVE and stays there for the whole exchange; everyone else follows in the order they will be worked. Each row shows the callsign, the operator's name if a lookup service is configured, how long ago you last heard them, the report you will give them, and, on a second line, grid, country and state, distance and bearing, to help you prioritise.
The count on the button is the number of rows in the card — the station being worked plus everyone waiting.
A setting with three options: First to reply (first in, first out), Strongest signal, or Furthest distance (callers whose grid you do not know go to the back). Re-hearing a caller already in the queue refreshes their report and timestamp but never re-sorts them.
Some software repeats a bare signal report forever instead of sending a roger. Rather than burn the whole retransmission budget, Gatherer bails after three of these and moves to the next caller. A station it has bailed on is left alone for five minutes so its next transmission cannot immediately re-engage you.
While that station is set aside, its messages carry a WAIT badge counting down the remaining time, so a caller being passed over is never a mystery. See Why a station was passed over.
Changing mode, band, or FT8/FT4 tears down whatever was in progress cleanly, and stops a CQ you were calling.
An automatic mode is disarmed rather than carried across: changing band or FT8/FT4 drops Hunter or Gatherer back to Standard and clears the call queue, so you re-arm deliberately where you now are instead of finding out afterwards what an armed mode did in a place you had not looked at yet.
Changing band or mode also clears the activity list, so what you see always belongs to where you are now.
During a POTA activation nothing is spotted at the moment you change band or mode. The QSY spot goes out when you next call CQ — which, in Gatherer, means when you re-arm it.
Max retransmissions (Settings › Operations, default 10) is how many times the app will repeat the same message before giving up and returning to idle. It applies to every exchange message in every mode, and to CQ calls in Standard mode.
At ten repeats on FT8 that is up to five minutes of trying: generous for a weak station, and bounded so a dead exchange does not hold the frequency indefinitely.
The number in parentheses beside Next TX is how many copies remain after the one currently going out.
The contacts most worth saving are the ones that fail on the last step. You send RR73, they never hear it, and your budget runs out. A minute later their R-12 arrives, plainly saying "I never got your RR73."
Greyline keeps those exchanges alive:
RR73, or repeating their RR73 when you owe them a 73, the app will send the closing message again, once per request. If that one is missed too, they'll ask again and get another. If they go quiet, the app doesn't keep transmitting at them: silence means your message landed, or that you can no longer hear them.Changing band or mode, or restarting the app, clears all of these, since a close-out fired on the wrong band would be wrong.
You can always do this by hand too: tap the late message in the band activity list and the app picks the exchange up where it left off.
The TX frequency mode decides how your transmit frequency is managed:
| Mode | Icon | Behaviour |
|---|---|---|
| Auto (default) | wand | The suggested clear frequency from each receive cycle is applied automatically. You spread out into quiet spectrum without thinking about it. |
| Hold | lock | Never moves on its own. The suggestion is still drawn on the waterfall, but only a tap applies it. |
| Partner | two people | Picks a clear frequency when you start a CQ, but moves to match a station you engage. |
Change it from the menu beside TX Frequency in the control panel, or in Settings › Operations › TX Frequency; both are the same setting. The icon beside the frequency on the Operate strip always shows the current mode. The menu is locked while you are transmitting.
Choosing a frequency yourself always wins. Tapping the waterfall, moving the slider, or Tune to on a station's details sets the frequency and switches to Hold from either Auto or Partner, so your choice isn't overwritten on the next cycle or the next QSO. The status line says so when it happens. To go back, tap the green Resume Auto button in the control panel, which appears in place of the suggested frequency while you're in Hold. It applies the current suggestion and switches to Auto in one step.
The app starts in Auto at every launch, since last session's clear frequency is stale.
The band picker sets the audio passband the app expects and the dial frequency it records in your log. You still have to tune your radio to the dial frequency yourself, and the bar above the waterfall shows it, e.g. 20m FT8 · 14.0740 MHz USB. All bands are upper sideband.
The frequencies below are the conventional ones the app uses by default. If you work somewhere else on a band, see Working off the usual frequency further down.
| Band | FT8 | FT4 |
|---|---|---|
| 160 m | 1.840 | None |
| 80 m | 3.573 | 3.575 |
| 60 m | 5.3573 | None |
| 40 m | 7.074 | 7.0475 |
| 30 m | 10.136 | 10.140 |
| 20 m | 14.074 | 14.080 |
| 17 m | 18.100 | 18.104 |
| 15 m | 21.074 | 21.140 |
| 12 m | 24.915 | 24.919 |
| 10 m | 28.074 | 28.180 |
| 6 m | 50.313 | 50.318 |
| 2 m | 144.174 | 144.170 |
All frequencies in MHz.
FT4 uses 7.5-second slots and its own dial frequencies. 160 m and 60 m have no FT4 allocation, so those bands disappear from the picker in FT4, and switching to FT4 while on one of them moves you to 20 m.
You can have the app open on a specific band and mode every time, or return to where you left off, using Default Band and Default Mode in Settings.
Sometimes the conventional dial frequency is not where the activity is. A region has settled on something else, a contest specifies a frequency, or a group has agreed one for the evening.
Tap the band bar above the waterfall to set your own dial frequency for the band you are on.
Type it in either MHz or kHz. 7.071 and 7071 both mean the same thing, so you can enter whichever form your radio displays without converting. When you type kHz the sheet confirms what it will use, e.g. "Will use 7.0710 MHz", so there is no guesswork.
Once set, the band bar turns orange and gains a CUSTOM chip, so you can see at a glance that you are not on the usual frequency. The same chip appears next to the band picker in the control panel, and bands with a custom frequency are marked in the band menu itself, so you can tell before you switch to one.
This matters because that frequency is what the app reports everywhere: the FREQ field of every contact you log, the frequency in your POTA self-spot, and your PSKReporter reception reports. It is also what the live spots map filters on. Setting it correctly is the difference between hunters finding you and hunters looking in the wrong place.
A few details:
7.71 for 7.071. The check applies the same either way you type it, so 7710 is refused just as 7.71 is. It is not checking your licence privileges, and it will not stop you using a frequency that is valid in your country but not in others.By default, custom frequencies are cleared each time the app starts. This is deliberate: a frequency set for one contest should not quietly follow you into next week's operating and mis-report every contact. If you would rather keep them between sessions, turn off Reset custom frequencies on launch in Settings, and get into the habit of checking the band bar before you transmit.
The Tune screen transmits a steady carrier so you can adjust your antenna, tuner, VOX or Drive settings. It runs at exactly the level your FT8 and FT4 transmissions use, so anything you set against it holds when you go back on the air.
Set a duration (5 seconds to 2 minutes, or Infinite), then Start Tuning. The screen goes black with a countdown large enough to read from across a field, plus Cancel and Extend buttons. The screen is kept awake while tuning, since you are probably not holding the device.
Drive controls how hard the app feeds your radio. It is on the Tune screen — before and during tuning — and beside the waterfall on the Operate screen. Both show the same value. The waterfall one can be turned off with Settings › Display › Show drive slider, which gives that width back to the waterfall; the Tune screen always has it.
It is separate from the phone's volume buttons, which still apply on top. That is the point: the volume buttons are coarse, shared with everything else on the phone, and easily knocked; Drive is fine (1 dB steps), remembered between sessions, and only affects transmission.
Drive only reduces. 0 dB is full output. Going higher isn't possible, because the audio is already at maximum before it leaves the app, and anything more would distort. If 0 dB is too quiet for your radio, turn the phone's volume up, or raise the input gain on the radio or interface. WSJT-X calls this same control "Pwr".
To set it:
Changes take effect immediately, even in the middle of a transmission, so you can adjust while calling CQ and watch the meter respond.
Overdriving is the most common cause of a wide, distorted signal — other stations see it as splatter, and it wins you nothing. If your ALC pegs at any usable Drive setting, the drive into your radio is too high somewhere else in the chain: try the radio's data or ACC input gain setting.
Be considerate: find a clear frequency before you key up. A tuning carrier on top of someone's QSO is unmistakable.
Turn on POTA Activation in the control panel and the app switches your CQ to CQ POTA, scopes your log to the activation, and optionally spots you to the POTA cluster.
Type the reference (US-1234) and the app checks it against pota.app as you type:
| Indicator | Meaning |
|---|---|
| Spinner | Checking. |
| Green tick plus park name | Confirmed. |
| Red cross | No park with that reference. |
| Grey Wi-Fi-slash | Could not reach POTA. The reference is accepted anyway and spotting still works. |
Tap the location-magnifier button to list parks in your grid square, nearest first. Pick one and the reference fills in for you.
With Self-spot to POTA enabled (Settings › Spotting, on by default), the app posts to the cluster automatically:
A status line under the park field names the last spot that went out and how long ago:
| Line | What went out |
|---|---|
| Activation starting | The first spot of this activation. |
| Autospotted | The ten-minute refresh, posted on its own. |
| QSY sent | A new band, mode or frequency was announced. |
| QRT sent | The closing spot as the activation ended. |
The age counts up as you sit there — Autospotted · 4 min ago — so a glance tells you whether the cluster still has you. A spot that fails says so in orange instead. When you switch POTA off, the panel stays up for a few seconds so you can watch the closing spot land.
Turn the setting off to activate without spotting at all; everything else about the activation still works.
While an activation is running, the log's summary bar grows a This park counter: red below five contacts, yellow from five, green at ten, which is the POTA minimum for a valid activation.
It counts credited contacts, which is not the same as rows in the log. POTA gives one credit per callsign per band per mode per UTC day, so:
The automatic modes use the same rule: during an activation they will re-work a station from yesterday, because that is a new credit.
Confirm a different reference while an activation is running and the app treats it as two separate activations. The old one gets a closing spot, a "POTA Ended" divider in the log, and its own export entry; the new one starts fresh. Fixing a typo before you have spotted or logged anything just corrects the reference in place.
iOS cannot tell a deliberate quit from a background kill, so if you relaunch within an hour of an activation that was never closed out, the app asks: "Are you still at US-1234?"
Activations left open by older sessions are closed out automatically at launch, stamped with their last contact rather than the current time.
The log's export menu lists each activation separately, so you can send POTA exactly the contacts for that park and nothing else. Exporting the activation that is still running asks whether this ends it: Export & End Activation closes it out and sends the closing spot, while Export & Keep Activating is just a snapshot.
Total, Today, DXCC (unique entities worked), and This park during an activation. New QSO opens a manual entry form.
If you have configured any logbook services, a small legend shows a coloured dot per service, QRZ teal, Cloudlog blue and World Radio League purple, matching the dots in the Upload column. A contact that a service rejected shows an X in that service's colour instead of an empty dot.
| Column | Notes |
|---|---|
| Date / UTC | Always UTC. The date carries the year (08-Sep-26), since a log spanning years — or holding imported contacts of any age — makes a bare day and month ambiguous. |
| Call | Carries a DUP badge when the contact shares POTA credit with another contact in the same activation. Both rows of a pair are flagged. A DUP is still a real contact and is exported normally. An EXT badge means the row sits between two contacts of a POTA activation without belonging to it — external to that run. See Sorting. |
| Band / Mode | |
| Sent / Rcvd | Signal reports. |
| Grid | Their grid. |
| Country / Name | Resolved from the callsign offline, and enriched from a lookup service if one is configured. |
| Upload | One dot per configured logbook: filled when that contact has been uploaded there, hollow when it has not. An imported contact shows a download arrow instead, since imports are never uploaded anywhere. |
Search filters by callsign, band, country or name.
The sort button (⇅) in the toolbar offers:
Log order was the only behaviour before, and it is why an imported contact could seem to vanish: import a LoTW report of contacts from last week into a log with thousands of entries and they land at the very bottom, findable by search but nowhere near the date you expect. Sorting is display only — it never rearranges the stored log, so exports, POTA activation grouping and the dividers below are unaffected by it.
A wrinkle in older logs. An import is placed newest-first, matching the contacts you make, so log order runs newest-to-oldest throughout. Batches imported by an earlier version of the app kept whatever order the file itself used, and most logging programs export oldest-first — so in a log holding one of those, log order reads oldest-first from the point that import begins. Nothing is wrong with those contacts and re-importing will not rearrange them (they would all be skipped as duplicates); sort by date, which ignores how they arrived.
One consequence of date order is worth knowing. A contact that is not part of an activation can now fall between two contacts that are — an imported contact dated during a past activation, most often. It carries a red EXT badge to say so: it sits inside that run but is external to it and will not appear in its export. Contacts from activations made before the app tracked activation identity are never badged, as there is nothing to compare them against.
The log grows horizontal dividers to mark events, so you can see at a glance what belongs to what:
Dividers are hidden while searching.
The export menu offers:
Files are standard ADIF (.adi) and go through the normal iOS share sheet: AirDrop, Mail, Files, whatever you use. The "Exported" divider is only recorded if the share actually completes, so backing out of the share sheet does not leave a phantom mark.
Import ADIF reads an .adi or .adif file. The result tells you how many contacts were imported and how many were skipped as duplicates, as non-FT8/FT4 modes, or as malformed records. Imported contacts count toward your duplicate checking, since they are your own history of who you have worked, but they are never uploaded to a logbook.
Configure QRZ, Cloudlog and/or World Radio League in Settings and turn on their auto-log toggles, and each contact uploads in the background as it is logged. Nothing about that ever blocks operating; a failed upload just leaves the contact pending.
The cloud button in the toolbar shows how many contacts are still pending. Tap it for a menu that uploads them on demand, to one service or, with more than one configured, to all.
If you've already sent your contacts another way, for example by exporting an ADIF file and importing it on the service's website, the pending count no longer means anything. Uploading them again doesn't help: World Radio League stores a second copy of each contact, and QRZ refuses them and reports a failure.
Two items at the bottom of the cloud button's menu deal with this.
Recheck Uploads asks each service whether it already has each pending contact, and marks the ones it has as uploaded. It never uploads anything. A contact counts as already there only if the service has the same callsign, band and mode within two minutes of the same time, so a contact it doesn't have stays pending. When it finishes, it tells you how many contacts were found on each service and how many are still pending.
Clear Pending Count is for contacts that recheck can't confirm, and for services it can't ask. It sets the count to zero for every configured service. It asks for confirmation first and shows how many contacts it will clear for each service.
A warning appears above the search field only when something has actually gone wrong, so it costs you no space the rest of the time. It names the service and the reason, and counts the contacts affected. It clears itself once those contacts upload, once you replace the key, or once the service verifies successfully.
View opens a list of everything that failed, grouped by reason, showing the callsign, band, mode and park for each contact. Retry All attempts them again.
Common reasons:
| What you see | What to do |
|---|---|
| No internet connection | Nothing. Contacts stay pending and upload when you have signal again. |
| Authentication failed | Check the API key in Settings and verify it. |
| Needs to know which logbook to use | Choose a default logbook in Settings, under World Radio League. |
| Rate limit reached | Nothing. Large uploads pause and continue on their own. |
If a large upload stops early it tells you how many contacts are left. Upload from the cloud button again to carry on from where it stopped.
Select enters selection mode, where you can upload, export or delete a group of contacts. Services the selection is already fully uploaded to are omitted from the upload menu. Deletion asks for confirmation and cannot be undone.
New QSO opens a form for contacts made outside the app, pre-filled from your most recent exchange where possible. Callsign and both reports are required; date and time are UTC. The saved contact is enriched with country and lookup data and uploaded to your logbooks just like an automatic one.
One map, three things it can show. Pick with the first dropdown at the top left; the second picks how far back to look: 5, 15, 30 or 60 minutes, or longer. Each view remembers its own choice.
For Live Spots and Stations Heard, the longest choice is This band/mode: everything since you last changed band or mode, or since the app started. The line under the dropdowns says when that was, for example 20m FT8 since 14:05 (UTC). Changing band or mode starts both views again from empty, and the timed windows never reach back past that point either.
Stations that have reported hearing you on pskreporter.info, for the current band and mode. Refreshed every five minutes automatically; the refresh button forces it. Dots are coloured by the latest report each station gave you: blue weak, green good, orange strong. Opens on This band/mode by default.
Reports reach pskreporter.info in batches, so the 5-minute window can look empty just before the next refresh.
Stations you decoded, coloured the same way. Opens on the last 15 minutes by default. Only stations whose grid the app has seen can be plotted.
Every grid in your log, across all bands, coloured by band. A grid worked on several bands fans out into a small cluster as you zoom in. The window here runs over your whole logbook, not just this session.
The map centres on your grid when it opens. Which mode it opens in is a setting: Settings › Display › Default Map View.
IOTA, POTA, SOTA, DX, QRP, or custom text. Your CQ becomes e.g. CQ POTA KB0RB DM04.Controls which CQ calls the automatic modes will engage with, based on the word in the CQ. Manual operating is never filtered.
Tick the words to match from the standard list, and add your own (up to 4 characters) for contests the app does not know about. Custom entries appear in blue and can be edited or swiped away.
Shows the current input and output devices and warns while a device change is settling. Plug your interface in and the app finds it; there is nothing to select.
Three services, three different jobs. All credentials are stored in the device keychain and never leave it except to the service they belong to.
| Service | Used for | Needs |
|---|---|---|
| QRZ Logbook API key | Uploading your contacts to your QRZ logbook | The API key from your QRZ logbook settings |
| QRZ username + password | Looking up names, QTH and grids | A QRZ XML subscription |
| HamQTH username + password | Looking up names, QTH and grids, worldwide | A free HamQTH account |
| Callook.info | US callsign lookups | No credentials, used automatically |
| Cloudlog URL + API key | Uploading contacts to Cloudlog or a compatible logbook | Server URL, API key, and station profile ID |
| World Radio League API key | Uploading contacts to your WRL logbooks | The API key from your WRL account, which needs a paid membership |
Lookups are tried in order: QRZ, then HamQTH, then Callook. Each service has a Verify or Test Login button so you can confirm the credentials before you rely on them, and each logbook has its own Auto-Log toggle, which stays disabled until the credentials are filled in.
A note on Cloudlog and POTA: Cloudlog applies the park reference from the station profile you point at, overriding the one in the uploaded contact. If you activate several parks, make sure the station profile matches, or export ADIF for POTA instead.
Pick a Default Logbook and your contacts go there. The list loads from your account, so verify your key first.
A logbook for each POTA activation is on by default. With it on, every activation gets its own logbook, named for your callsign, the park and the date, for example KB0RB @ US-4578 08-22-2026. The logbook is created when the first contact of the activation uploads, so an activation you never work anyone at leaves nothing behind. Turn it off and everything goes to your default logbook instead.
Each POTA contact also carries its park on the contact itself, so World Radio League knows where you operated from whichever way the switch is set. With the switch on, the park appears twice — in the logbook's name and on every contact in it. With it off, the contacts still carry their park, even though they share your default logbook. Export ADIF for your POTA submission as usual.
If World Radio League does not recognise the park, it would normally refuse the whole contact. Rather than leave that contact stuck unuploaded — Greyline has no way for you to correct a park reference once a contact is logged — it sends the contact again without the park. You will see a notice at the top of the log saying so, and the contact keeps a purple NO PARK badge afterwards, so you can find it later. The contact is complete apart from the park, and your own log and ADIF export still have the park you entered. With per-activation logbooks on, the contact still lands in that activation's logbook, whose name carries the reference you typed — so a mistyped park stays visible there too, and the whole run stays together.
Contacts from activations you ran before this feature existed still go to a park logbook. Greyline works out which activation they belong to the same way the POTA export menu does, by grouping a run of contacts at one park. That works for the great majority of older activations, but it can get it wrong in a few cases: a non-park contact logged in the middle of an activation splits it in two, and two visits to the same park on the same day are treated as one.
If contacts land somewhere you did not intend, you can move them between logbooks on the World Radio League site. Greyline cannot move them for you, because their API does not yet offer it.
It is worth setting the default logbook and the per-activation switch the way you want them before you start, since Greyline cannot move a contact once it has been uploaded.
Author and version, plus:
Read-only. Nothing here changes how the app behaves; it exists so a problem can be identified from a screenshot.
The offset between your device clock and network time. Anything beyond ±0.2 s is worth fixing in iOS Settings › General › Date & Time. A fast clock shifts your slot alignment and inflates the DT of every station you hear, which looks identical to an audio problem but is not.
External USB interfaces have their own crystal, so their sample rate is never exactly what they claim. A steady positive deviation means the capture clock runs fast. "Projected drift" is how far your slot alignment would move in an hour. Small values are normal and compensated for.
Raw DT is what the decoder sees; compensated DT is what the band activity list shows after subtracting the app's own audio latency. Drift is how much the raw figure has moved since early in the session.
Which devices are actually being used for input and output.
Counters for transmissions started and completed, plus TX drive, the level set by the Drive slider. "Never completed" is the number to watch: it counts transmissions whose audio was handed to the system but never reported finishing, which is the signature of a radio's USB CODEC stalling.
Everything else in Diagnostics describes the radio and the audio path. This section watches the app itself, and it is the first place to look if other stations stop answering you without any obvious cause.
FT8 and FT4 transmissions must start on the slot boundary. The app decides what to send at that instant, so if it is busy with something else, the transmission starts late. Its end still lands on the boundary — the opening is cut off instead — so a small delay costs you nothing and a large one means nobody decodes you.
| Row | What it means |
|---|---|
| Boundary transmissions | How many transmissions this session started on a slot boundary. Tapping to transmit mid-slot is not counted. |
| Started late | How many of those reached the radio more than 250 ms after the boundary. |
| Worst delay | The largest delay seen this session. |
| Decodes too late to use | How many times a slot's decodes arrived after the next transmit decision, so the app answered using the previous cycle. This is what makes the app repeat a message instead of replying to what it just heard. |
| Stale decodes dropped | How many times a slot's decodes were discarded because you changed band or mode while they were being decoded. They would otherwise appear in the new band's list and be reported to PSKReporter on the wrong frequency. Up to one per change is normal and not a problem. |
Started late should stay at 0, Decodes too late to use at or near 0, and Worst delay in the tens of milliseconds. For reference, eight hours of automatic operation on a real station measured a worst delay of 81 ms, no late transmissions, and 2 late decodes out of roughly 1,900 — an occasional late decode on a crowded band is normal.
Numbers that climb as a session goes on are the signature worth reporting: the app is gradually slowing down rather than failing outright. Reset timing stats clears the counters, which is useful for testing one thing at a time — reset, run for ten minutes with the Band Activity list filtered down or a screen closed, and see whether the count moves.
If it happens to you, the useful bug report is these four numbers plus how long the app had been running, your device, and whether an external display was attached. That is enough to reproduce it; a description of the symptom alone usually is not.
Interruption and recovery counters, for diagnosing what happened after a phone call or a Siri activation.
Check the status pill reads RX, not Stopped. Check the RX Level meter is moving. If it reads QUIET, the audio is not reaching the app: check the cable, the interface, and that iOS granted microphone access. Check you are on the right dial frequency for the band and mode shown above the waterfall, and that your radio is in USB.
Your radio is probably not keying. Greyline transmits audio only, so VOX or data-VOX must be enabled on the radio. Confirm the yellow rows appear in the band activity list when you transmit, which means the app sent audio, and watch for RF output on the radio.
Check Diagnostics › Timing Health. If Started late is climbing or Worst delay has grown into the hundreds of milliseconds, your transmissions are leaving after the slot boundary with their openings cut off, and the far end can no longer decode them. The orange Timing slow warning on the Operate screen means the same thing.
This is the app falling behind, not the radio. Backing out of a busy screen, clearing a very long band activity list, or restarting the app all buy it back. Please report it with the four Timing Health numbers, since it is a bug rather than something you should have to work around.
In some markets, notably Japan and Korea, the law requires the camera shutter and screenshot sounds to play at all times and they cannot be silenced, muted, or turned down. On those devices the sound is mixed into the audio your phone is sending to the radio, so taking a screenshot during a transmit slot will put that shutter tone on the air.
There is nothing Greyline can do about this, since the sound is generated below the app and is deliberately outside any app's control. Take screenshots during a receive cycle instead: watch the slot timer and capture while it reads RX or DECODE, never TX.
That is usually your clock, not theirs. Open Diagnostics and check the clock offset.
Either the level is far too high, in which case everything reads red and you should turn the audio down at the radio, or the floor is set wrong. Turn Auto-calibrate Waterfall back on, or drag vertically on the waterfall to adjust.
iOS fell back to the built-in microphone and speaker, usually because the interface was unplugged or lost power. Reconnect it, or choose Use Internal Audio to carry on with the device's own audio.
The app switched to a Bluetooth microphone and speaker because no USB or wired interface was connected, and paused audio until you choose. Use Bluetooth Audio resumes on that device; Close leaves audio stopped. It works, with the caveats under A transceiver with a sound-card interface. The warning appears every time a Bluetooth device is connected.
Greyline only runs while it is on screen. Come back to it and it restarts. Turn on Keep Screen On so the device does not sleep mid-session.
It is either already in your log for this band and mode (the CQ row will be green), excluded by the CQ filter, or it timed out on Hunter earlier in this session. Tap the row to work it manually: a tap ignores every filter, and it does not turn Hunter off — Hunter works the station you picked and then goes back to scanning.
If Hunter keeps choosing stations you would rather it did not, Hunter Call Order in Settings › Operations decides which of the CQs in each cycle it answers. See Call order.
Check the queue card. Callers already worked on this band and mode, callers excluded by the CQ filter, and callers Gatherer recently bailed on are not queued — nor is a station you dropped from the card, for five minutes. A WAIT badge on their messages counts that down.
To work one of them anyway, tap their row in the band activity list: that forces them to the top of the queue regardless of why they were passed over.
Contacts are logged when the exchange completes from your side. If it stopped earlier than that, use New QSO in the log; the form pre-fills from the most recent exchange.
Addendum: the optional word after CQ (CQ POTA W6ABC) declaring what you are doing.
Close-out: resending a final RR73 or 73 to a station whose exchange did not confirm, after they ask again.
DT: the difference between when a station's transmission arrived and when the slot started. A measure of their timing accuracy.
Dupe / DUP: a contact that does not earn fresh POTA credit because you already worked that station on the same band, mode and UTC day.
Grid square (Maidenhead locator): a short code for your location, e.g. DM04.
Passband: the 200–3000 Hz range of audio the app listens to and transmits in. Your station's frequency inside it is separate from your dial frequency.
Roger (R-12): a signal report with an acknowledgement attached, meaning "I got your report, and here is mine."
RR73: "received, roger, and 73." The CQ-ing station's confirmation that the contact is complete.
Slot: the fixed 15-second (FT8) or 7.5-second (FT4) transmit window, aligned to UTC. Stations alternate slots; one transmits while the other listens.
SNR: signal-to-noise ratio in dB, reported the way WSJT-X reports it, so the figures are directly comparable with other stations'.
Greyline FT8 is built by Jon Schulman, KB0RB.
Decoding and encoding use ft8_lib by Peter Backlund (kgoba), MIT licensed. Maps are rendered by MapLibre Native with tiles from OpenFreeMap and data from OpenStreetMap contributors. DXCC country data is cty.csv by Jim Reisert AD1C, with data from Club Log. The FT8 protocol itself is the work of Joe Taylor K1JT and the WSJT-X team.
Questions, bug reports and photos from the field are always welcome at support@greylineft8.com.
73 de KB0RB