Field Report // NO. 028

How I built a flight monitor that watched my actual flight

1 September 2026· 7 min read· Case № 028

A departure board tells you a flight is delayed and never tells you whether to worry. I built a self-terminating monitor that watched my flight through a storm-delayed evening at JFK, stayed silent until it mattered, delivered once at wheels-up and deleted its own cron. Here is the reproducible pattern.

Two hours before my flight home, thunderstorms closed the approach paths into New York and every departure board in the city turned into a weather report. I was due out on BA114, JFK to Heathrow, scheduled 9:40 that evening, with ground delays running toward two hours. I opened zero flight-tracking tabs that night. I armed a sentry, went to the airport, and flew home. It said one thing all night, and that one thing was the goodbye.

By the end of this piece you can build the same sentry for any flight you care about. It is an evening of work, runs on free sources, and ends itself once the flight is airborne.

The board is a crowd, not a signal

A departure board tells you a flight is still listed. It cannot tell you whether to worry. That evening New York was running a ground delay program, air traffic control pacing departures into a storm, one step short of a ground stop, where aircraft are held at the gate. Under a program like that the board refreshes all night with a worsening number, and the number is supposed to move, so none of it is news.

What cancels a flight usually sits one flight upstream: the aircraft and crew meant to operate it are stuck somewhere else. My aircraft was arriving as BA113, due at the gate more than two hours before I was due out. The tail number G-STBA, the airframe’s number plate, appears on both legs because the same plane flies in, turns around, and flies out with me on it. If the inbound makes the gate near schedule, cancellation risk is low whatever the storm banner says. So the sentry watched BA113 and left the board alone.

Every watch starts with a baseline

A watcher needs to know what normal looks like, so normal came first. agentic-worker, the hands-on profile in my fleet that does the fetching and wiring, gathered it in one pass: BA114 operating on time, Terminal 8, Gate 14, the inbound early, the delay program holding departures an hour and three quarters to two hours and climbing. Three independent sources agreed, FlightAware, Flightradar24 and the FAA’s JFK status page, and every fact came back with its source attached.

The baseline matters because of where the watcher lives. The sentry is a cron job, the server’s alarm clock, and a cron job starts each run remembering nothing: the flight, the gate, the tail, the noise floor of expected delays, all of it rides in the job’s prompt.

Arming the sentry

With normal on record, arming took one command, sent to Porter, the profile that owns my life admin and its Telegram delivery:

HERMES_HOME=/home/hermes/.hermes/profiles/personal \
HERMES_PROFILE=personal hermes cronjob create "*/15 * * * *" \
  --name ba114-jfk-monitor \
  --deliver telegram

Job 8d492f154dd8 landed in the personal profile’s cron directory, next fire 18:15 local.

The prompt the job carries is the whole contract. Each tick is a three-way decision. If nothing changed, the job replies with the bare word SILENT and Hermes swallows it. If something changed, a cancellation, a gate move, a slip beyond the noise floor, it says what changed, with the gate number attached. If the flight is airborne, it delivers one goodbye and deletes its own cron. The silence token is SILENT, not [SILENT]: models drop closing brackets under load, and a half-bracket is just a message that gets delivered. A small state file, rewritten each run, carries the last-known gate and time between ticks.

The night, on the record

The early evening was quiet by design: I packed and rode out from Long Beach while the job walked its rounds. A couple of manual checks kept me informed, one of them coming back with only part of the status picture because a tracker site refused the server that hour.

Around nine my phone buzzed: British Airways itself, pushing a delay, while FlightAware, Flightradar24 and Trip.com still showed the old time. The worker went hunting for the airline’s own status page, because the company operating the aircraft outranks every mirror of news about it. The trackers caught up about an hour later.

At 10:27 PM the tail left Gate 14, forty-seven minutes late and airborne. The next tick found the change, delivered the one message it exists for, then removed the cron job. The state file it sealed still sits on the server:

{
  "last_known_gate": "14",
  "last_known_terminal": "8",
  "status": "AIRBORNE",
  "baseline_notes": "BA114 DEPARTED 10 Aug, ATD 10:27 PM EDT from JFK T8 Gate 14 (FlightRadar24). Monitor self-terminated.",
  "updated_at": "2026-08-11T02:46:00Z"
}

What the night taught

Two of the lessons came from the setup; the third came from the night itself.

The first was placement. The flag everyone reaches for is HERMES_PROFILE, which only says which profile the job runs as; the scheduler reads HERMES_HOME to find its jobs file, so a job created without it lands in the worker’s own profile, fully alive, checking every fifteen minutes and delivering nowhere. The fix is step 2 of the recipe below.

The second was noise. The evening’s rolling delays sat near two hours, so a departure slipping toward ten o’clock was just weather. A monitor that reported every worsening minute would have been muted in the first hour. The baseline carried a noise floor, and the prompt says plainly that a pushback slip inside the band is not a change.

The third came from the race. The airline’s push arrived about an hour before its status was mirrored anywhere a server could read. A watcher built on third-party mirrors inherits their lag: you notice the airline has already moved and your monitor still says the old thing. When the news matters, ask the issuer first; treat mirrors as corroboration.

The reproducible pattern

The whole thing is six steps, and each one is load-bearing.

  1. Run a one-shot baseline probe before arming anything. Flight number, scheduled time, terminal, gate, tail number, inbound aircraft status, and the airport’s traffic-program state. FlightAware, Flightradar24, Trip.com and the FAA status page all worked from a plain server; keep a fallback for each, because any one can block you on a given night. Demand the source for every fact.
  2. Create the monitor on the profile that owns your notifications, and verify it landed. Set HERMES_HOME to that profile’s directory at creation; it is the variable the scheduler reads for its jobs file. Then list the directory to confirm the job exists.
  3. Bake the baseline and the noise floor into a self-contained prompt. The full contract is spelled out in “Arming the sentry” above.
  4. Write the three-way decision into the job, removal command included, matching the contract in “Arming the sentry”.
  5. Keep the silence token bare. SILENT, exact match; the bracket trap is covered in “Arming the sentry”.
  6. Keep a small state file as memory between runs. Gate, time, one line of notes; the sealed example above shows the shape.

Cost

The sources are public pages, the scheduler and model server were already running, and the whole watch was about seventeen short runs, one every fifteen minutes for a bit over four hours. No API keys, no flight-data subscriptions, no paid feeds. The token bill for a small model checking a page is real and small.

Honest limits

Fifteen-minute polling on tracker pages is a tolerated grey area, and the pages can change their shapes or refuse the server without notice. If every mirror blocks, the sentry goes silent, the safe failure but a silence all the same. Quarter-hour polling also misses anything faster than that. And this sentry watches one flight and ends itself; it is not a standing service. The wider travel stack, search and booking and the calendar bridge around it, is a different piece.

Takeaway

The pattern is no longer a one-off. My Sunday-evening calendar brief scans the coming week for flight events and arms a sentry on its own. The next time a storm sits over an airport I am due out of, the watch posts itself.

The agent did the watching. I did the one thing that matters: I got on the plane.

← All transmissions