Reusable checklists with nested items, templates and progress, kept in this browser, with a full store, a second tab and a document written by an older version all handled instead of losing them.
Initializing in your browser…
Tasks with priorities, due dates and tags, kept in this browser, with a full store, a second tab and a document written by an older version all handled instead of losing the list.
Check a link for typosquats, brand-in-subdomain tricks, mixed-alphabet homographs, and hidden destinations. Public Suffix List parsing, explainable per-rule scoring, and the link is never fetched.
Read the certificate chain a server sends and say whether it is complete, in order and in date, and build the OpenSSL commands that fetch it.
You run the same five-step production deploy every week and keep skipping a step from memory.
Checklist defined
Tag release · Run migrations · Deploy · Smoke test · Announce in #ops
Reusable checklist
☐ Tag release ☐ Run migrations ☐ Deploy ☐ Smoke test ☐ Announce in #ops [Reset] restores all boxes for the next run
Unlike a to-do list you burn down once, a checklist is meant to be reset and re-run for repeatable procedures, which is exactly how human-error checklists work in aviation and surgery. Resetting clears progress while keeping the steps, so the same vetted list guards every deploy.
Reusable checklists with nested items, templates and progress, kept in this browser. The saving is the part that was rebuilt: a full store, a second tab and a document written by an older version are all handled and said out loud instead of losing your lists.
The three tools on this site that keep a document in your browser (this one, the checklist creator and the Zettelkasten notes) all carried the same four faults before September 2026, and each was measured rather than reasoned about.
**A full store took the tool off the page.** `localStorage.setItem` throws `QuotaExceededError`, and an exception out of a React effect body reaches the nearest error boundary. Driven with the setter made to throw, all three tools vanished from the page and none of them said anything: the write was lost and the work on screen went with it. Now a failed write leaves the change on screen and puts the reason where the person who made it can see it, including how much room is left.
**Every page load wrote an empty document first.** The save effect ran on mount with the state still empty, before the load effect update had rendered. Measured in a production build, the writes on load were `[]` and then the real document, in that order, so there was a window on every single load in which your whole document was an empty array in storage. (In development it was worse than a window: React strict mode double-invokes effects, the empty save landed between the two runs of the load effect, and a seeded item was simply gone after one reload.) The document is now read in the state initialiser, so nothing is ever written before it has been read.
**A second tab silently destroyed the first tab work.** Each write replaces the whole document from the writing tab own state, and nothing listened for the `storage` event. Measured: tab one wrote two items, tab two, opened when there was one, wrote its own, and storage was left holding one. Now each tab is told when another one changes the document and is offered the choice, rather than one of them losing quietly.
**`JSON.parse` succeeding is not validation.** A document written by an older version parses perfectly and then throws on the first field that is read. Every record is now checked field by field: what can be repaired is repaired and the page says what it did, what cannot be read is left alone rather than overwritten, and an imported file goes through exactly the same check as the stored one.
A stored checklist whose items field is a string rather than a list loads with an empty item list and a note saying it was written by a different version and has been filled in, instead of throwing when the page tries to count its items.
Untick everything and run it again; the list is the same one each time.
Nested items keep the sub-steps under the step they belong to.
Export the Markdown and paste it wherever they read things.
In this browser, under this site, in localStorage. They are not sent anywhere, which also means they are not backed up and are not on your other devices. Export them if they matter.
The save is refused by the browser. The page tells you, keeps the change on screen, and shows how much room the checklists are using out of the roughly 5 MB a browser gives one site.
That was the old behaviour: both tabs wrote the whole document and the last one won. Now each tab is told when the other changes it and you choose which version to keep.
Export it as Markdown or JSON. There is no server here, so there is nothing to share a link to.
This runs as client-side JavaScript. Keys, tokens, payloads, and other inputs never leave your device.