engineering
I fact-checked my own marketing. It did not go well.
Seven false claims about my own product, all written by me, none of them lies. What I found, and the check that had been quietly passing for four months without working.
The pinned post on my product’s X account was advertising a free tier that no longer exists.
Not a typo. Not a rounding error. The single most-viewed thing on that account — the first thing any human being sees when they click the profile — was cheerfully offering a monthly allowance the product had retired three days earlier. It is a 14-day trial now, and it was a trial by the time anybody read that post.
I found it while doing something else entirely. I was trying to fix the account’s reach, which is a polite way of saying I was trying to fix the fact that nobody looks at it. And somewhere between “why does this reply have one view” and “let me open my own profile like a normal person would,” there it was. My own storefront, confidently selling something I had personally retired.
So I went looking for its friends. It had six.
The receipts
A pricing card, served live from my own domain, quoting last quarter’s prices. $15 a month and $144 a year. The real numbers had been $19 and $179 since May. The card was a PNG — the worst possible place for a wrong number to live, because every fact-checking script I own reads text. You cannot grep an image. It sat there for four months returning a cheerful HTTP 200 to anyone who asked.
A capability my software does not have. Four launch documents — a Hacker News post, a Reddit post, a directory submission, and the fact sheet all of them copy from — claimed there was “no per-recording time cap.” There is a ten-minute cap. It is in the source code. It is also, and this is the part where I put my head in my hands, stated correctly on my own pricing page. My marketing was contradicting my marketing, and the wrong one was the copy about to be emailed to journalists.
A dead link, verified twice. My site’s structured data pointed at an X profile that does not
exist, and had for four months. Two separate sessions had checked it and written down that it was
fine, because the check was curl — and X returns the same response for a live handle and a dead
one. The note in my own repository reads: “returned 403 to curl, but page exists.” That sentence
contains a verification and an assumption wearing the same coat.
A number that moved. A draft email to three journalists said the app idles at 84.3 megabytes — measured, not estimated, and I was rather pleased with the precision. I measured again: 145.8 megabytes. Both are honest numbers. The first was a fresh launch; the second was a process that had been running for two and a half days. Precise figures invite verification, which is exactly what makes a precise figure that drifts worse than no figure at all.
A default that wasn’t. Copy in several places said the app feeds your dictionary, your selected text and your cursor context to the transcription engine. Two of those three are off unless you turn them on — deliberately, because your clipboard might hold a password you just copied. The true version is a better story than the false one, which is usually the case and never stops being annoying.
And an absolute. “Types into any app on your Mac.” It cannot type into a field with macOS Secure Input active. Neither can anything else — the OS blocks synthetic keystrokes there for every application on the platform. Saying so costs one clause and buys more credibility than the absolute ever did.
The part that actually bothers me
Every single one of those was true when I wrote it.
I did not exaggerate. I did not round in my own favour. I wrote down what was true on a Tuesday, and then reality moved, and nobody told the copy. The old allowance was retired in favour of a trial and the pinned post was not on the retirement checklist. Prices went up and the image did not. The cap was added and four documents kept describing the version of the product that predated it.
Marketing copy does not rot because you lied. It rots because facts have expiry dates and almost nothing revalidates them. Every claim you publish is a small unmaintained service running in production with no monitoring, and the failure mode is silent, and the alerting system is a stranger noticing before you do.
The dead link is the one that keeps me up. It was not unchecked. It was checked twice and passed twice, by a test that could not physically fail. That is worse than never looking, because now there is a green light and a written record telling every future version of you not to bother.
What I do now, which is embarrassingly simple
Check it the way a stranger would, not the way that is convenient. If someone can run the
command, run the command. If it is an image, open the image. curl returning 200 is not the same as
a human seeing the page, and I have four months of evidence.
When the product changes, audit every surface — not just the repository. A pinned social post is a landing page nobody thinks to search. So is a PNG. So is an email draft from August. The repository is the surface you will remember; it is rarely the one a customer meets.
And if a check cannot fail, it is not a check. Before trusting one, break the thing on purpose and watch it go red. If you cannot make it fail, you have built a machine for generating false confidence, which is strictly worse than no machine.
The good news, such as it is
All seven are fixed. It took a day — less than it took to write them.
And the useful discovery is that this was findable at all. I only found the first one because I clicked my own profile the way a customer would, which I had not done in weeks, because I build the thing and therefore never arrive at it the way anyone else does.
That is the whole trick, I think. Go be a stranger to your own product for an hour.
Bring a notepad. You will need it.
This is also why Halopen’s homepage now hands you a shell command instead of a testimonial. If a claim can be checked, it should be — I would rather be verified than believed, having recently established that believing me was not a great strategy.
Try Halopen
Hold the function key. Speak.
Halopen is free for 14 days, no credit card. Pro is $19/mo or $179/yr — unlimited.
Read next
More from Halopen Learn
-
privacy
What on-device dictation means in Halopen
Understand local speech recognition on Apple Silicon, model setup, local history and the network activity that remains separate.
-
writers
Mac dictation that handles multilingual code-switching
Evaluate multilingual dictation on Mac with your language pair, names and numbers. Review mixed-language output and understand processing limits.
-
developers
Mac dictation for AI coding: choosing an input workflow
Evaluate a Mac dictation workflow for coding: choose the input, review the transcript, inspect the diff and check the result before accepting a change.