About CivicWatch
CivicWatch keeps a copy of what local government publishes in Shelby, Moultrie and Effingham counties, Illinois, and records when it did so. If a document is later changed or removed, the copy and its timestamp remain.
Why it exists
Small-town government publishes a great deal and archives very little. Agendas are replaced by the next agenda. Council packets — which carry the itemised claims lists showing exactly who a city pays — are commonly posted for a fortnight and then deleted. Resolutions often are not published at all. None of that is sinister; it is what happens when a clerk with six other jobs maintains a website. But it means the record a resident needs is frequently gone by the time they think to look for it.
This project does one narrow thing about that: it takes a copy while the document is up, and it can prove afterwards that the copy is genuine.
How we crawl
A crawler called CivicWatchBot visits the public websites of the bodies listed on the bodies page. It reads only what is already public — it does not log in, submit forms, or follow links behind an authentication prompt.
- robots.txt is obeyed. A disallowed path is not fetched. If robots.txt cannot be read at all, that is treated as a refusal rather than as permission.
- One request at a time, paced, off-hours where practical.
- Unchanged files are not re-fetched. Content is stored by fingerprint.
- The crawler identifies itself and publishes a page explaining how to make it stop.
What our silence means
Two things look identical in a database and only one of them is news, so they are kept separate everywhere in this system:
“We did not see it” is not “they did not publish it.” If a source is unreachable, its robots.txt refuses us, or a page fails to parse, that is recorded as a gap in our coverage. It never becomes a finding about the body.
What a timestamp proves
Every file we capture is fingerprinted with SHA-256. Each day’s fingerprints are combined into a Merkle tree, and the root of that tree is published into the Bitcoin blockchain using OpenTimestamps. Once a block confirms, the root cannot be altered without altering Bitcoin itself.
What that proves: these exact bytes existed no later than the moment that block was mined. Not approximately — exactly, and verifiably by anyone, without trusting us. The verification page will check a file for you, and the check runs in your browser: the file never leaves your machine, only its fingerprint does.
What it does not prove:
- Not that the document is true. A timestamp says a file existed. It says nothing about whether its contents are accurate.
- Not when it was published. It proves when we saw it. A document may have been up for weeks before we captured it. Our observation time is never presented as the body’s posting time — reading it that way would be an accusation we invented.
- Not that a file we lack is fake. If we do not hold a document, the likeliest explanations are that it was published somewhere we do not look, or that our copy differs by a character. We do not call it forged.
- Not anything, before confirmation. A capture that has been fingerprinted but not yet anchored rests on our word alone, and the site says so rather than invoking the blockchain.
What stays free
The archive, the timestamp proofs, the verification tool and every compliance finding are free to read, permanently, without an account. This is enforced by a test that fails the build if a public page ever starts requiring one — a transparency tool that puts evidence of government conduct behind a paywall has stopped being one.
Corrections
If something here is wrong — a document attributed to the wrong body, a meeting misdated, a compliance finding that misreads a notice — please tell us. We would rather be corrected than be confidently wrong in public, and errors are fixed openly rather than quietly.