gg
Home › Fixes

What we've fixed

Every tool here is free and runs on your own device, which means when one of them is wrong, nobody at a company finds out — you do. So this page exists: what broke, what a reader would have seen, and what now has to fail before it can happen again.

Why this page is written like this

Most changelogs say "improved date handling." That tells you nothing and asks you to trust the people who wrote it. This one says the birthday calculator was over a month behind and gave someone the wrong age, because that is what actually happened, and because you can go and check whether it is fixed.

Each entry names the check that now guards it. That matters more than the fix — a fix protects you from the bug once, a test protects you from it every time the site is rebuilt. If an entry can't name one, it shouldn't be on this page.

Known and not yet fixed

Publishing fixes is easy after the fact. This is the part that costs something — the things that are wrong right now, written down before we've dealt with them:

If this list is ever empty, assume it's out of date rather than that a catalogue of 250-plus tools has nothing wrong with it.

Shipped

2026-09-02

23 money tools — very large amounts printed "$inf"

Found by an automated sweep

What was wrong: Type an enormous amount into any tool that shows a dollar figure and the answer came back as $inf. Not a big number — the literal word, which is how a computer spells "this overflowed". It affected 23 tools including Unit Price, Mortgage PITI, Net Worth, ROI, Loan Amortization and Present Value. The formatter already had a guard against this, added after an earlier sweep, and the guard was checking the wrong thing: it tested the number handed to it, then multiplied that number by 100 to round it to the nearest cent, and that multiplication is what overflowed. A perfectly valid figure went in and infinity came out one line later.

What it does now: The check now runs after the rounding as well as before it, so a figure too large to express in cents is reported as — rather than as a word dressed up like currency. Nothing about ordinary amounts changed: the new check cannot trigger below roughly 1.8 × 10306 dollars, so every real figure formats exactly as it did before.

What stops it coming back: The catalogue sweep now runs every tool at a huge-but-finite value and fails the build if any answer contains "inf" or "NaN", and the formatter has its own test pinning both halves — the argument check and the rounding check — so removing either one breaks the build immediately.

Speed / Distance / Time

Found by an automated sweep

What was wrong: A very large distance produced 9223372036854775807h 56m. That number is not a duration, it is the largest whole number the machine can hold, and the tidy "56m" stuck on the end made it read like a real result rather than a failure. This tool had already been fixed once for the same class of problem — a speed of zero used to do it — but that fix stopped the division producing infinity, and this route never produced an infinity at all. The hours stayed a perfectly ordinary number right up until the moment they were converted to a whole number, which is where they overflowed.

What it does now: A journey too long to express in whole hours is refused with — and the plain sentence "that distance and speed are too far apart to time", which is what the tool already said for the infinite case. Everyday journeys are untouched: 150 miles at 60 mph is still 2h 30m.

What stops it coming back: The sweep now includes a value that is enormous but still finite, which is the exact gap the previous edge cases jumped over — one of them overflowed on entry and was caught by the input check, the next was a billion, far too small to break anything. Any answer containing a saturated whole number now fails the build.

2026-08-28

CliffEdge — Benefit Cliff Finder

Found in review

What was wrong: It only ever looked upward. Enter an income going down — cutting your hours, losing a job, retiring — and it reported "no eligibility lines sit between these two incomes" even when there plainly were. A household dropping from $40,000 to $28,000 was told nothing had changed, when in fact it had just become eligible for SNAP and Medicaid again. That is the wrong answer for exactly the people most likely to need it.

What it does now: Crossings are read in both directions. Losing eligibility is flagged with ⚠ as before; regaining it now says ✓ BECOMES ELIGIBLE and tells you which line you dropped back under, so you know there is something to go and apply for.

What stops it coming back: A test runs the same pair of incomes up and down and fails unless both directions count the same number of crossings. Any one-way blindness breaks the build.

Every database tool (79 of them)

Found in review

What was wrong: Seventeen tools' instructions told you to "filter by" a column — and there was no filter control anywhere on the page. The engine underneath had supported it since the day it was written; nothing on screen ever set it. So the advice was real, the capability was real, and the button did not exist.

What it does now: A column picker and a text box sit next to the search field on every database tool. The text box stays greyed out until you choose a column, so the filter can never be in a state where it silently does nothing.

What stops it coming back: A browser test loads a real database page and fails unless both controls are present and the value box unlocks when a column is chosen.

50/30/20 Budget Calculator

Found in review

What was wrong: On some incomes the three categories added up to a penny more than the income you entered. Rounding each share separately, then showing them together as though they were a division of your actual pay.

What it does now: The split is worked out in whole cents, and the savings share takes whatever is left over rather than being rounded on its own. The three numbers now add to exactly what you typed, every time.

What stops it coming back: A test sweeps a wide range of incomes and fails if needs + wants + savings ever differs from the income by a single cent.

JSON Formatter

Found in review

What was wrong: Emoji and other characters outside the basic range came out as replacement squares. JSON writes them as a pair of escapes; the formatter read each half on its own, found two invalid characters and threw both away. Paste in JSON containing 🎂 and you got damage back.

What it does now: The two halves are recombined into the character they describe. Emoji, and every other character above the basic range, survive the round trip intact.

What stops it coming back: A round-trip test formats JSON containing characters from outside the basic range and fails unless the output still contains them.

Text Diff

Found in review

What was wrong: It compared line 1 with line 1, line 2 with line 2, and so on. Insert a single line at the top of a document and it reported every line after it as changed — which is the one thing a diff exists to avoid. It was a line-by-line comparison wearing a diff's name.

What it does now: A real longest-common-subsequence diff. Inserting a line marks one line added and leaves the rest alone. It also reports how many lines were added, removed and unchanged.

What stops it coming back: A test takes the diff output and rebuilds both original documents from it. If the diff isn't a faithful description of the change, the reconstruction won't match and the build fails.

2026-08-27

Age Calculator, Countdown and Add/Subtract Days

Reported by a reader

What was wrong: The "as of today" date was baked in when the site was last rebuilt, and then sat there getting older. By the time a reader hit the birthday calculator it was more than a month behind — so it gave the wrong age. A tool whose entire job is knowing what day it is did not know what day it was.

What it does now: Any field that means "today" is filled from your own device's clock when the page loads. It cannot drift, because nothing about it depends on when the site was built.

What stops it coming back: A test scans the whole catalogue and fails if any tool ships a date field with a hard-coded default instead of the today flag. Reintroducing the old pattern anywhere breaks the build.

$inf where a dollar amount belonged — 30 tools

Found by an automated sweep

What was wrong: Type a number too big for the arithmetic into a money field — an extra row of zeros, a pasted figure, a stuck key — and thirty tools printed $inf or $NaN back at you as though that were a price. Re-running the sweep with the fix removed puts the count at 147 separate figures across the catalogue. None of them looked wrong enough to notice while skimming a page of results.

What it does now: All 147 print — instead. A dash reads as "there is no answer here," which is the truth; $NaN reads like a number and isn't one.

What stops it coming back: A sweep runs every tool in the catalogue against deliberately absurd inputs and fails the build if any output contains an impossible value. It is how this was found as 147 at once instead of one complaint at a time.

19-digit numbers presented as measurements

Found by an automated sweep

What was wrong: When a number too large to fit is converted for display, the language this site is written in does not complain — it quietly substitutes the largest number it can hold. So instead of an error you got a measurement: a duration of 9223372036854775807h 0m, a maximum heart rate of -9223372036854775808, a spacing of 9223372036854775807px. All three of those shipped.

What it does now: Every place a calculated number becomes a displayed one now states its own sensible range up front, so an impossible value is refused rather than rounded off to something that looks like data.

What stops it coming back: That family of numbers is on the sweep's list of banned outputs. Any tool that emits one fails the build, whatever produced it.

CSV export, everywhere it appears

Found in review

What was wrong: Six copies of the code that writes CSV had drifted apart over time. Two produced files that some spreadsheets read as one long line. Only one of the six protected against the trick where a cell beginning with = runs as a formula when the file is opened — so an exported file could carry a live instruction into your spreadsheet.

What it does now: One shared writer, used by all of them. It quotes correctly, it ends lines the way spreadsheets expect, and it defuses cells that would otherwise execute on open — without mangling negative numbers, which is the usual overcorrection.

What stops it coming back: The six copies are gone; there is one implementation left, and tests cover the quoting, the line endings and the formula guard. There is no longer a second copy to drift.

Accented and non-Latin text

Found in review

What was wrong: Several text tools assumed one character was one letter. Slugify turned Łódź into od. Reverse Text pulled flag emoji into their component halves. Remove Punctuation deleted marks that are part of a letter in Indic scripts, quietly changing words. Fine in English, wrong everywhere else.

What it does now: These tools work in grapheme clusters — what a reader would call a character — so accents stay attached to their letters and emoji stay whole. Accent folding maps to the nearest plain letter rather than deleting anything.

What stops it coming back: Tests cover Polish, Vietnamese, Devanagari and flag emoji specifically. Anything that treats those as loose bytes fails.

Found something?

Tell us. The age calculator above was fixed the same day a reader ran into it — that is the fastest route from broken to fixed there is, and it doesn't require you to know anything about the code. Use the suggestion box on any tool page.