Blog
Write-ups on the things that go wrong with timestamps, encodings, hashes and CSV — mostly problems found while building the tools that handle them.
- 2 min read
Your checksum does not match. Here are the four reasons.
A digest that disagrees between two systems is almost never a broken implementation. It is one of four things, and they are quick to check.
Hash GeneratorWord Counter - 2 min read
Why your contrast checker disagrees with the accessibility audit
WCAG contrast is a ratio of relative luminances, not a difference in brightness. The two agree for greys and diverge badly for saturated colours.
Color Converter - 3 min read
What is actually in a TLS certificate
The common name has not matched hostnames since 2017, fingerprints are over the DER, and a certificate is public — the private key next to it is not.
Certificate DecoderASN.1 / DER Inspector - 2 min read
Your CSP is probably not doing what you think
A policy with unsafe-inline blocks almost nothing, and three important directives do not fall back to default-src. Both look fine in a header dump.
CSP AnalyzerCertificate Decoder - 3 min read
no-cache does not mean no cache
The directive that prevents storage is no-store. no-cache permits it and requires revalidation, which is why responses you tried to protect are still on disk.
Cache-Control AnalyzerURL Parser - 2 min read
The cron expression that runs on the wrong days
0 0 * * 1-5 is Monday to Friday in Unix cron and Sunday to Thursday in Quartz and AWS. Nothing errors, and the expression passes review.
Cron Dialect ConverterCron Expression Parser - 3 min read
Why 1.2.4-beta does not satisfy ^1.2.3
Prereleases are opt-in in npm ranges. A version with a tag is only matched when a comparator names the same three numbers and is itself a prerelease.
Semver Range CheckerJSON Diff
Looking for something longer?
6 guides are organised into learning paths, working through one topic from the start rather than covering a single problem.
Browse the guides