PRESERVATION OF RTTY HISTORY
TELETYPE ART & CULTURE
EST. 1998
RTTY.COM The Radio Teletype Reference & Archive
THE INTERNET'S OLDEST
RTTY RESOURCE
BAUDOT • TELETYPE • WIRE
RTTYAPP — TRANSMIT QUEUE & SCHEDULING • FOR CHANNEL OPERATORS

Transmit Queue & Scheduling

How RTTYApp decides what to transmit, in what order, and when. This covers the queue, the two schedule files, $reload, and what the date/time stamps actually mean. Written for channel operators who want to go beyond the basics — if you’re setting RTTYApp up for the first time, start with the Getting Started guide.

New to RTTYApp? Start with the Getting Started guide first — this page assumes you already have it installed and running.

1. The One Big Idea: the Queue Is the On-Screen List

The actual transmit queue is the list in the main window. Nothing transmits except what is in that list. The schedule files on disk are just a way to load lines into it.

Once per second, RTTYApp looks at the top line of the list and decides whether to transmit it now, wait, or (if it’s a command) act on it. When a line is sent, it is deleted from the top; the next line becomes the new top. That’s the whole engine.

2. The Two Schedule Files

Both live in the data directory and are plain text, one entry per line.

FileHoldsPurpose
schedule_temp.lstfile names (optionally date-stamped)the working queue — the actual things to send, in order
schedule.lstcommands (one of which is usually $reload)the “deck” re-read when the queue needs refilling

On startup and on every reload, schedule_temp.lst is read first, then schedule.lst. So the list ends up as:

[ everything from schedule_temp.lst ] [ everything from schedule.lst ] <-- $reload usually sits here, at the bottom

How an incoming SMTP article enters the queue (on mail-fed channels that aren’t in AutoStart mode): the arriving article is inserted at the top of the queue, so it transmits next. Its file name is also appended to the bottom of schedule_temp.lst, so the article rejoins the persistent rotation the next time the schedule reloads. Net effect: a fresh bulletin jumps the queue immediately, then recurs in arrival order.

In AutoStart mode the behaviour differs — the arriving file is appended to the bottom of the queue and is not written to schedule_temp.lst.

3. Anatomy of a Queue Line — and Where the Timestamp Comes From

Every line in the queue has the form:

MM/DD/YYYY HH:MM:SS <name>

where <name> is either a file name (bulletin.txt) or a command ($reload). The timestamp is always present in the queue, but it gets there two different ways depending on what was written in the schedule file:

A. A bare name (no date) — e.g. bulletin.txt or $reload.

RTTYApp computes a timestamp for it. It starts a running clock at “now + 10s” and, for each successive entry, advances it by the estimated time to transmit that file (file size × seconds-per-character at the current baud). So bare files get staggered timestamps that approximate “when each one will actually go out.” A bare $reload is treated the same way — it’s a single token, so it too gets a computed timestamp and becomes a normal timestamped line in the queue. (This is the part that’s easy to forget: the reload command is just another timed entry.)

B. An explicit date — e.g. 1/18/2025 10:00:00 bulletin.txt.

The timestamp you wrote is used as-is — but the line is only added to the queue if that time is still in the future. If the time has already passed, the entry is skipped and logged as an “Expired time tag.” This is the mechanism behind everything in §5.

4. The Once-Per-Second Send Loop

Each tick, RTTYApp reads the top queue line and:

No-Timer mode (the default): set the wait to 0 → send the top line immediately. Timestamps are ignored; the queue just pours out top-to-bottom as fast as it can.
Timer mode: compute wait = entry_timestamp − now. If wait <= 0 (the entry’s time has arrived or passed) → send it and delete it from the top. If wait > 0 (still in the future) → do not send; write wait (seconds) to the Count Down box and try again next tick.

When a line is selected to send:

If <name> starts with $, it is a command, not a file — it is acted on and the tick ends. ($reload is handled here.)
Otherwise open data/<name> and transmit it: key up, optional header.txt, the file, optional footer.txt, then drop back to receive.
If the queue is empty, it logs “Queue Empty: Nothing to Send.”

5. What the Timestamps Mean

Because of the “add only if still in the future” rule at load (§3B) combined with the send loop (§4), a date/time stamp is an “effective-until” (expiry), not an “effective-from”:

On a file

the file stays in rotation until its timestamp passes; after that, each reload drops it. One-shot / expiring content.

schedule.lst: $reload schedule_temp.lst: 1/18/2025 10:00:00 bulletin.txt standing.txt

bulletin.txt and standing.txt both transmit and loop — until 10:00 on Jan 18. After that, reloads skip bulletin.txt; only standing.txt continues.

On $reload

the loop keeps refiring until the stamp passes; after that the reload no longer fires, the queue drains, and the system stops.

schedule.lst: 1/15/2025 19:30:15 $reload schedule_temp.lst: fileA.txt fileB.txt

A and B send and resend until 19:30:15 on Jan 15, then stop.

In Timer mode, a future stamp also means “don’t send until then.” That’s the scheduling lever: a line with a future timestamp waits (showing the countdown) and fires when its time arrives.

There is no “effective-from” date and no delay-between-transmissions command. Scheduling is done entirely with expiry stamps plus the timer, and the clock trick in §7.

6. $reload and How the Loop Works

$reload is a command entry. When the send loop reaches it, RTTYApp re-reads schedule_temp.lst and then schedule.lstre-appending their current contents to the queue. That refill is what makes the queue loop forever. Remove the $reload and the queue plays once and stops.

ITTY’s production schedule.lst files carry three $reload lines as a belt-and-suspenders guard: if schedule_temp.lst is momentarily empty or being re-written by an incoming SMTP article at the instant of a reload, the extra reloads keep the queue from stalling.

7. Timer Mode, the Count Down Box, and “Feed by Historical Date”

No-Timer mode (Control menu → No Timer, checked by default; ini ITTYNoTimer = 1): continuous transmission, timestamps ignored. This is what most always-on streams use.
Timer mode (ITTYNoTimer = 0): timestamps gate transmission. The Count Down box shows the seconds remaining until the next timed line goes out.

Feed-by-historical-date technique (worked out with Daniel Jones, K6YIC, for his WW2 Nimitz Gray Book stream): put each message in schedule_temp.lst with the timestamp of its original historical send time, run in Timer mode, and set the transmitting PC’s clock to the target date. Each message then waits in the queue until “its” time and rolls off at the original hour — replaying a day’s traffic in real time. Because the machine’s clock is deliberately wrong, this wants a dedicated computer (Daniel used a cheap mini-PC per feed). The Count Down box is how you see “N seconds to the next transmission.”

8. The $ Command Reference

Any queue entry (or incoming directive) beginning with $ is a command. Matched case-insensitively on the first few letters:

CommandAction
$ASCII $ITA2 $TELEX $MILITARY $CW $PSK31set encoding mode
$PSK=nnnn $FSK=nnnn $F1500$F2100set PSK/FSK center frequency
$B45 $B50 $B56 $B74 $B100$B56000set baud rate
$TX $RX $DISABLEtransmit / receive / disable
$RTS $DTRselect RS-232 PTT line
$CWID $CWTimer $CWStopsend CW ID / start / stop hourly CW-ID timer
$HEADER $NOHEADERenable / disable header+footer per file
$DITTLE $NODITTLEenable / disable diddle (idle)
$COM1$COM8switch COM port
$reloadreload the schedule files into the queue (the loop)

(All of these are also listed as ITTYBadWord entries in the ini so they can’t be injected into the transmit stream by an incoming SMTP message.)

9. Practical Gotchas (From Real Deployments)

Preparing content from PDFs: text pasted from a PDF often looks wrapped but has no real line breaks — it will run on when transmitted. Make sure every line ends in a genuine carriage return.
Streaming silence is a client issue, not an Icecast one: Icecast (and DarkIce → Icecast) handle long silent gaps fine — the AUTOSTART channel is idle for long stretches with no dropouts. Some Windows streaming clients, notably BUTT, instead stop the connection when they detect silence; if you hit that, adjust the client’s silence/signal settings or feed it a faint continuous background tone. Do not use RTTY diddle (continuous LTRS) for this — it disturbs receiving teletypes and punches blank paper tape.
Timestamps are estimates for bare files: the computed stamp for an un-dated file is based on file size × baud, so it approximates real transmit time; it is not exact.