What gets checked
This page is the checks that actually run before a report is shown, texted, or reused. If a check is not listed here, it does not happen.
Where a report comes from
There are three sources.
- Phone lines. The server calls the airport's published weather phone through Twilio, records the broadcast, and hangs up. That recording is what gets transcribed.
- Community receivers. A computer at the field records the radio and uploads an mp3 to S3 under
raw_atc_stream/<ICAO>/. A new file smaller than 10,000 bytes is skipped and not transcribed. The newest large enough file is the one that gets processed. - FAA digital ATIS. For airports on the FAA SWIM feed, the text is the FAA's text. It is not a transcription and there is no audio file. The airport page says SWIM data is labeled not for operational use. That feed is cached for 60 seconds, and local log files older than 10 minutes are deleted.
Speech to text, then a correction pass
A voice recording is sent to whisper-1. That text is then sent to gpt-6.1-sol. The instruction to the second model is to fix words a non-pilot would mishear, not to add words, and not to change wind, visibility, ceiling, temperature, dew point, altimeter, times, runway numbers, or the information letter.
The correction is kept only if it passes a gate, and only when we know which airport the recording is from. Phone calls and Pi uploads both pass the airport.
- An empty reply, a refusal, or an error keeps the whisper text.
- If the correction changes the set of numbers, changes the information letter, or makes the shape of the report worse, it is thrown out.
- A number that was not in the whisper text is thrown out.
- If only the airport name was fixed and the rest still passes, the whisper text is kept with that name spliced in.
A misheard digit in the first pass can stick, because a correction that changes a number is discarded. Example: if whisper hears altimeter 29.82 and the broadcast said 29.92, the correction pass is not allowed to "fix" 2982 to 2992. The 29.82 can remain.
One loop
ATIS is a loop. A formatter tries to keep a single copy, in this order: airport name, information letter, time, wind, visibility, sky, temperature, dew point, altimeter, approach or runway, remarks, and the closing "advise you have information." It runs before the correction pass and again after it.
If it is not confident it found one broadcast, it leaves the text unrotated. A second copy can still be in the transcript. The cut can also drop the tail. Phrases such as "thanks for watching" are removed when they match a known junk pattern. If you need a remark at the end, listen to the audio. The text can be a sentence short.
When the cut is confident, the player prefers a single-pass audio file. Otherwise it plays the original recording.
Information letter
A voice ATIS report is reused for a later caller only when the stored letter is a single letter A through Z, and the letter spoken in the transcript is that same letter. AWOS and ASOS do not need a letter. If the letters do not match, that copy is not reused. The next phone request places a new call.
The airport page can still show a report that failed this check. Reuse is stricter than display.
When a saved report is sent again
A new phone request looks back 90 minutes for the same information letter, or the same Zulu time if one side has no letter. That saved report is sent again only when all of these are true:
- It is not a tower-closed recording.
- It has not been marked ineligible by the homepage quality read.
- It has a transcript and a readable valid time.
- The transcript is not blank, shorter than 12 characters, or an error string.
- It is not carrying an altimeter warning. See below.
- For ATIS, the letter check above passes.
- The audio file is attached.
- It has not been flagged as dangerous.
If any of those fail, the next caller does not get that copy. The server calls the airport again.
The homepage stack is a separate read. It uses gpt-4o-mini unless another model is configured, and it only decides which reports rotate on the home page. If that call fails, the report is left unchecked. An unchecked report can still be reused. A report explicitly marked ineligible cannot.
Altimeter
When a phone transcript is saved, and when a Pi upload is saved, the altimeter in the transcript is compared with the current METAR from aviationweather.gov. The check uses the first group shaped like A plus four digits. A2992 becomes 2992.
In the transcript, spoken numbers are turned into digits first. "altimeter two niner niner two" and "altimeter 29.92" both become 2992. The same four digits repeated still count as one value. Two different four-digit values, or none, count as no transcript setting.
There is no tolerance. 2992 matches only 2992. It does not match 2993.
- Exact match: the stored text keeps the normal
AI TRANSCRIBED(!):prefix. - No METAR, an error body, no
A####group, or the METAR request throws: the report is stored with an internal marker that says the altimeter is unverified and METAR is unavailable. A phone save and a Pi upload both keep the report. The Pi upload is not dropped. - The METAR has a setting, and the transcript has no single altimeter, or a different one: the report is stored with an internal marker that says the altimeter is unverified. The marker keeps the METAR digits, and the transcript digits when there is one. Transcript 29.92 against METAR
A3001is a mismatch. The spoken 29.92 is not rewritten to 30.01.
A report with that marker is not a normal report. The homepage stack skips it. The next phone request does not reuse it, and the server calls the airport again. The airport page, the report page, the map popup, and a text-for-ATIS card still show the transcript, and only with a warning in front of it. A mismatch warning is Altimeter unverified. Transcript A2992, METAR A3001. When the transcript has no single altimeter, the warning names the METAR value. When the METAR could not be read, the warning says METAR unavailable. The internal marker is not in the paragraph.
An SMS of that report, and the airport API transcript, do not include the internal marker. They start with Altimeter unverified. METAR A2992. when the METAR digits are known, or Altimeter unverified. METAR unavailable. when they are not.
Five minutes after an unverified save, a background job reads the METAR again. If the spoken altimeter matches, the marker is removed and the report can be reused. If it still does not match, or the METAR is still unavailable, the marker stays. The job runs once.
Wind, visibility, ceiling, and the observation time are not compared with the METAR. Those checks are not implemented.
The transcribed marker
After cleanup, a voice transcript that passes the altimeter check is stored with the prefix AI TRANSCRIBED(!):. The altimeter check rewrites that prefix when it cannot verify the setting. Airport pages and report cards strip the prefix out of the paragraph you read. An SMS or API copy of an unverified report uses the short METAR note above, not the stored prefix.
Audio
The phone recording and the Pi mp3 are saved on the report. If a play button is on the report, play it before you use the text.
The airport page hides the player while that community station is marked offline, even if the file is still attached. Other report cards show the player whenever the file is attached. Digital ATIS has no recording.
A report can be shown on an airport page without audio. Reuse for a later phone call requires the audio file.
If a report is wrong
Every transcribed report on an airport page has an accurate / inaccurate vote, POST /api/transcripts/:id/feedback. Inaccurate can include an optional suggested transcript and a note. The suggested transcript is off unless you check Include a suggested transcript. One vote per browser, per report, per hour. The vote does not change the stored transcript and it does not take the report down.
A signed-in account can check This is dangerous and should be removed on that same form and submit. That is the flag. One flag per account per report. A second flag from the same account is rejected and logged. The report is hidden as soon as the flag is saved: airport pages, texts, the API, and reuse skip it. If another saved report is still usable, that one is what you get. If the hidden report was the one a phone call would have reused, the server calls again. If there is no other stored report to text, the reply is KXXX: no report available.
The What's wrong? note is also the flag reason. The admin phone, the same number the station monitor texts, gets KXXX report 123 flagged. The admin review page records who flagged it, when, the reason, whether that text went out, and who restored the report or confirmed the takedown.
When a community station goes quiet
A community station is marked offline when either of these is true:
- A real upload has been seen, and the last one is older than
PI_AUDIO_STALE_MINminutes. That defaults to 45. A real upload is a file larger than 1,024 bytes. That is a different cutoff from the 10,000-byte transcription minimum. Uploads with no real audio also count as offline. - A heartbeat has been seen, and the last one is 15 minutes old or older.
A station that has never uploaded and never sent a heartbeat is not marked offline. The airport page then says station offline. The first time it goes offline, and when it comes back, a text goes to the admin phone. A run of empty uploads is included in that text. Empty uploads do not, by themselves, mark the station offline once a recent real file is still inside the 45-minute window.
What you should do with this
Read the text as a head start. Listen to the audio when the play button is there. Check the information letter, the altimeter, and the runway on the frequency before you use them.
What can go wrong: a digit can be misheard and then locked in, because the correction pass is thrown out when it changes a number. A loop can be cut short or left doubled when the formatter is not confident. The altimeter check is one METAR group compared as four exact digits, not a second listening, and it does not check wind or ceiling. A mismatch stays on the airport page with both values, and it is not sent as a normal text. Digital ATIS is FAA text with no audio to compare.
This is not a certified briefing.