You saved the export at 2:14.
At 2:15 you know what is wrong with it.

In plain English

What it does
Watches the folder where your spreadsheets and exports already get saved. Every time a file changes it checks it and tells you what looks broken — a column that is the same value all the way down, a field that is empty on every row, a report that stopped changing weeks ago.
Why it helps
Every tool like this waits for you to bring it a file, which means you have to already suspect something is wrong. The people who most need the check are the ones who never think to run it. This one runs itself.
What you need
A folder where files land, and someone technical for about ten minutes to install it. It only reads — it changes nothing, and sends nothing anywhere.
How long
Minutes to set up, then never again. It runs on a schedule or watches continuously.

Nobody checks the export before it goes out, because checking it is a chore and it has been fine for a year. The one time it is not fine, it looks exactly the same.

2:14pm
Your system writes invoices-august.csv to the usual folder.
2:15pm
canary has already read it: the status column is “OPEN” on all 412 rows, and paid_date is empty on every one.
2:16pm
You discover the billing sync stopped writing three weeks ago — instead of discovering it when a client asks why they were never invoiced.

What the report looks like

What is in your files right now · 3 files checked · 1 with findings · 1 could not be checked
invoices-august.csvFINDINGS status: CONSTANT — identical value ‘OPEN’ on all 412 rows
paid_date: empty on every row
payroll-q3.csvCOULD NOT CHECK file locked by another process — this is not a pass
crew-hours.csvCLEAN nothing to report

An illustration of the real output format. The middle row is the entire point of the tool: a file it could not read is reported as a failure to read it, never quietly counted as fine.

Three decisions that decide whether you keep reading it

content, not timestampsFiles are compared by hash. A file re-saved with identical bytes has not changed in any way you care about, and re-reporting it every night is how a tool teaches you to ignore it.
news, not inventoryIt raises the alarm for findings in files it actually re-checked. Everything known stays in the report, but a known-bad file sitting untouched is not an alarm — a guard that shouts nightly gets muted.
never a false all-clearA check that could not run is reported as a failure to check. The report says so in plain words, because a tool that says “no findings” when it never looked is the exact failure this exists to catch.

The setting you will want on day two

Some columns are constant on purpose — a version number, a region code, a format tag. Nothing in your data can tell canary which ones those are, so on a real folder they can account for most of every night’s findings. List them once in a plain text file called canary-ignore.txt, one name per line, and they move out of your way. They are still counted and named in the report rather than deleted from it — a checker that quietly stops mentioning things is the exact failure this tool is pointed at.

How canary and flatline work, end to end →
The full pipeline: what flatline checks, how canary reaches it, the ignore file, and every exit code.

Get it

Free, MIT licensed, runs on your machine. canary calls flatline for the analysis rather than reimplementing it, so you install both — two files, no account, no service.

If you just want to use it — Windows, one file, nothing to install:

Double-click it, pick your folder, and the report opens in your browser. Everything happens on your machine.

Windows will warn you the first time. This download is not code-signed — a certificate costs a few hundred dollars a year and we have not bought one — so SmartScreen shows “Windows protected your PC”. That warning means unrecognized, not unsafe. Click More info → Run anyway, or skip the app entirely and install from source below — it is the same code you can read on GitHub.

If you are technical, or not on Windows:

pip install awllc_flatline-0.2.1-py3-none-any.whl
pip install awllc_canary-0.1.0-py3-none-any.whl

canary ~/Downloads --report canary.html
Install from these files, not by name. The names canary and flatline on PyPI belong to unrelated projects, so pip install canary would fetch someone else’s tool. Ours publish as awllc-canary and awllc-flatline. canary checks for this too — if the wrong package is installed it says so, rather than blaming your data for a packaging mistake.

Source, tests and documentation on GitHub →

Running it on a schedule

Give it --fail-on-findings so it has something to say, and let your scheduler read the exit code. Watching the report file instead would prove nothing: it carries a timestamp, so it changes every run whether or not anything happened.

0every re-examined file came back clean
1a file could not be checked — worse than a finding, because it hides an unknown number of them
2new findings

What it does not see

Only files that change on disk. It knows nothing about whether a scheduled job ran at all, or whether an output went stale between runs — different questions, different tools. Saying so is the point: a tool that implies it covers more than it does is how coverage comes to be assumed instead of checked.

The other half: flatline

Software fails loudly. Data fails quietly. flatline is the judgment — it decides whether a signal still carries information. canary is the trigger. Neither tool will ever call a file clean that it failed to read: a check that could not run is reported as a failure to check, never as a pass — in code, and with a test, in both.

See flatline   Or have us watch your stack →