What actually got built
A build log,
not a
launch list.
Nothing on this page is a feature announcement, because there is nobody to announce it to. Nothing here can be bought, and most of what follows is a defect that no human being ever hit — there are no customers to have hit one.
It is published anyway, because a company at this stage has nothing else to show you. No logos, no case studies, no reviews. What is left is the work, and whether it is done carefully enough to be worth waiting for. Every entry below names the commit that did it.
Last entry 3 September 2026 14 entries out of 342 commits · most commits do not belong on a page anyone reads · anything built behind a gate that is still shut says so, in the entry
Read it as
What this page is,
and what it is not.
A changelog on a product with no customers is doing the job that testimonials usually do. That makes being straight about it the whole point.
- 01Every entry names a commit. If a line here cannot be pointed at a change in the repository, it is cut rather than softened. The hashes beside each entry are real and they are the receipt.
- 02Nothing is announced that you cannot reach. Several things below landed behind a gate that is still closed — there is no payment account, so nothing is purchasable, so no account can be on a paid plan. Those entries carry a not reachable yet mark and say what is shut. A changelog that reads as a launch list for features nobody can use is the worst possible version of this page.
- 03No schedule is promised. A publishing cadence is a claim like any other, and a missed one would prove the opposite of what this page is for. Instead the build has a check that fails when the newest entry here goes stale, so the page cannot quietly rot while the site keeps pointing at it.
- 04No prices, and no method. Prices live on the pricing page and nowhere else. And this is a log of what changed in the product — not an explanation of how the measurement works. Those are different documents and only one of them is this one.
The log
What changed.
Newest first. Ordered inside a day by what a person deciding whether to use this would care about — not by how much work it was.
-
shipped
A competitor list stopped reporting your own name back to you as a rival
Competitors are read out of the domains an answer actually cited. Nothing filtered a domain that merely resembled the brand name, and the first real scan of answermend.com returned 25 “competitors” — answermen, answermeter, answermgmt, answermedtelecom, and the brand’s own site on another domain ending. A business called Northwind would have been told northwindtraders was beating it. That is a wrong finding wearing the clothes of a measurement, on the screen this product sells hardest, and it is worse than a missing finding because someone might act on it.
Two structural tests over the registrable name now run before a domain is called a rival. Nothing is deleted: a set-aside domain is kept and grouped under near-misses of your own name, not rivals — because “nothing was found” and “four things were found and they were your own name misspelled” are different statements.
The limits ship with it, because they are real. Below eight characters the filter does not run at all: nike and bike are one edit apart and are different companies, and there is no safe threshold down there. Two of the six known collisions are deliberately not caught, because every rule that reached them also reached a legitimate rival — and dropping a real competitor is a silent error the reader never learns about.
Commits 09df13d1d7ee8812e57af
-
shipped
A typo in the domain field ended the account, in thirty seconds
Type exmaple.com, press Add. That was the account’s only brand, permanently. Every plan allows one, and there was no delete, no rename and no archive anywhere in the product. Submitting the correct domain then returned a refusal offering a plan that is not on sale. The test suite asserted those handlers did not exist — so it was deliberate rather than forgotten, which is what made it load-bearing.
Three verbs now, each a different promise. Rename changes the display name only and touches no history. Archive stops tracking, keeps the history readable, and frees the slot. Delete destroys the brand and its scans.
The domain itself is still not editable, and the refusal says so out loud rather than hiding the field. It is the key everything is measured against — scans, the trend line and the re-scan register are all keyed on it — so editing it would silently re-label one site’s measurements as another’s while every chart carried on drawing. Delete is gated by history rather than by ceremony: with no scans it simply goes, because making someone type a domain back to undo a thirty-second-old typo is theatre. With scans, it names the exact count and the most recent date, offers archive instead, and asks for the domain typed back.
Not verified: the database change this needs has not run against the live database. Until it does, the archive-and-re-add path is proven against test drivers only.Commits e21020d
-
shipped
The free scan says which assistant read your site, and counts it separately
Both assistants answer on the free scan; only Gemini is asked to go and fetch a page. That makes named you and linked to you two measurements over two different totals, so they are no longer allowed to look like one number. The line on screen names which total it is counting out of. A ChatGPT cell carries not measured with the reason, never a zero — and the store refuses to write a zero there at all.
Proving that split found four defects the simpler design had been hiding, and one of them mattered more than the feature itself: domains an engine merely remembered were being counted as citations. Competitors are harvested from the links an answer quotes, and an engine that was not asked to search writes down domains it recalls. Every free competitor list would have been half measurement and half recollection, under a heading saying it was cited.
Commits cff5d98d770fba
-
shipped
A signed-in account can read the scan it just spent our engine calls to run
Every account resolves to free, because nothing is purchasable. Every screen that would show a finished scan was gated above free. So the sequence was: create a brand, spend real metered engine calls, watch the scan finish, and be refused by every screen that could show it — with a Try again button that could never succeed.
Free now reads its own most recent scan. Saved history and scan-to-scan comparison stay on the paid tier, which nobody can be on yet.
Rendering a free scan on screens that had only ever shown paid ones exposed four live counting defects, none of them in the brief: a cited count paired with the wrong total, a sentence printed off a citation count that was never measured, a chart axis labelled with the wider set’s word over the narrower set’s bar, and a history caption claiming one total for three columns.
Commits fe42aa82586347
-
shipped
Somebody who leaves an account kept permanent read access to everything in it
Nobody could be removed from an organisation, and nobody could see who was in one. An employee leaves and keeps standing read access to every scan, the brand, its competitors and where it is losing. Two screens told people that an owner is promoted from inside the account, and no code anywhere promoted anyone.
Removal now takes effect immediately, with no waiting: nothing about an organisation is carried in the sign-in token, so membership is re-read on every request — proved with the removed person’s still-valid token rather than reasoned about. The guard that stops the last owner leaving lives in the database under a per-organisation lock, not in the route, because two owners each pressing leave in the same second would both read there are two owners and produce exactly the unrecoverable account the work existed to prevent.
Changing the address on the account got the same treatment. On a product with no passwords the address is the credential, so one dead inbox was an unrecoverable account. It now takes two different codes: one to the new address proving it is reachable, and one to the old address that cancels the change and works with no session at all — because the person that second code protects may be locked out of the session being used against them. If the message to the old address cannot be sent, the change never starts.
And it uncovered something that would have broken sign-in. The mail helper read two settings the transactional configuration never returned, so every transactional send aborted instantly and then called out to nothing. Not a misconfiguration with an obvious missing value to point at — an unconditional failure. It stayed hidden because the other configuration builder in the same file does return both, and that is the one the scheduled report uses.
Not verified: this database change has not executed either, so the lock has not been proved to serialise two simultaneous departures.Commits 3a8d4b1
-
shipped
A report link stopped being written into a log nobody here can reach
A report page has no sign-in. Holding the link is the authorisation — which means the link is the credential, and it was sitting in the address path. A path is written into every access log the request passes through. On our own server that log could be redacted, and was. The report page is not on that server: it is on shared hosting behind two layers with no configuration access, no shell and no log format to edit, so the credential was landing in access logs on hosts this account cannot configure.
The token moved into the part of the address after the #, which browsers never transmit — not to the origin, not to the network in front of it. No server log anywhere can contain it. The page now refuses a token in the path or the query rather than accepting one, because a fallback would work perfectly for the reader, which is exactly what would make it dangerous.
Commits b9c5f6347e8951
-
shipped
A finished scan could be read on its id alone, by another account or by nobody
The export route serves a finished scan straight off the running job when that job has no owner — correct for the anonymous public checker, which genuinely has none. Nothing ever set the owner field, so an owned scan looked ownerless too and took the same branch. For the job’s whole thirty-minute life, a scan started from inside an account could be exported by a different account, or by a caller with no session at all, by anyone holding the id. The id is handed to the browser in the response that starts the scan; it was never meant to be a credential.
A comment directly above that branch had predicted this exact failure, for the day the owner field was set. That day had arrived and nothing noticed. The fix is one line; the missing thing was the instrument, and it now exists — 119 checks across four route modules, over a real connection with a real session, because this question is about application code running above the database’s own guarantees.
Separately, the same day: keeping one account’s data invisible to another stopped being a hypothesis at the database layer — two organisations, two real sessions, ten tables, no cross-reads and no writes of any kind. The honest limit: that is the database. The same question asked through the API is still not fully proven, because the payment gate answers before ownership is ever reached, and nobody can pay yet.
Commits 51b27cec3c1b31
-
not reachable yet
An alert would have said citation fell 100%, about a fall that never happened
Reported by the owner and reproduced exactly. The code that compares two scans read a not measured citation as the number zero, and pooled those runs into the citation total. Because ChatGPT is not asked to fetch on the free scan, that turned an honest 8 of 14 checks into 8 of 29 — the blended rate this project’s own rules name as the single most likely thing to ship wrong, precisely because both halves of it are individually true.
The consequence was worse than the number, and it was demonstrated rather than assumed. With the old line, a change of plan on its own produced an alertable comparison and four events reading cited moved −100% on ChatGPT. The switch hits every ChatGPT cell at once, so every threshold meant to suppress noise was cleared many times over. That is an email about a collapse that did not occur.
The same defect runs the other way, and that half is easier to miss: turning fetching off reclassifies every previously-cited run as merely mentioned, so mentioned rises with nothing having happened to the brand. Comparisons of that metric across a change in what was fetched are now refused, with the reason given. The fix was mutated in both directions — restoring the old line turns sixteen assertions red, and making a genuine measured zero unmeasured turns a different set red, because a fix that swallows real zeros is the same defect facing the other way.
Not reachable yet: the alert email this prevents goes to schedule subscribers, and there are none — subscriptions require a paid plan and nothing is purchasable.Commits 8d8f136
-
not reachable yet
Nothing ever told anyone whether a fix worked — built, and not reachable yet
After a fix ships, the questions that fix was aimed at get asked again and the two scans are put side by side. The linkage was the missing piece — the arithmetic and the list of targeted questions both already existed, and the list was being thrown away.
What it refuses to say is the point. A change observed after a fix is not proof the fix caused it, and this product has measured its own noise: 15.9% per-question disagreement across repeated runs, over 231 calls. So the output states what two scans measured, over the runs they measured it on, and says the cause is not established — in every branch, including the refusals. A fix with no recorded target list refuses to be verified rather than being scored against an invented one. Four states, and three of them never merge; not measured in one or both prints as no comparison exists — not a zero and not a drop.
A checker walks every sentence in the result as it is built and aborts the call if any of thirteen forbidden shapes appears. Making the code emit “your fix worked” does not produce a bad sentence; it produces a crash.
Not reachable yet: this runs on a paid tier, and no account can be on one — there is no payment account, so nothing is purchasable. The database change it needs has not been applied either. It is built and parked, not available.Commits 6c80537
-
shipped
Every account got its own engine-call budget, so one account cannot spend the day
A signed-in account had no usage limit of its own. The only backstops were a per-address hourly limit — the wrong axis, since one office address throttles two accounts and one phone bypasses it — and a single business-wide daily ceiling. One busy account could therefore exhaust the day, and a second would be refused for it.
The unit counted is engine calls, not scans, because a scan is a different number of calls on each plan, and a scan counter would quietly hand the larger plan several times the resource per unit. The ledger only ever appends, enforced in the database: a counter cannot be audited or corrected, and a correction belongs beside what it corrects, signed and with a reason.
Not verified, and deliberately unpublished: the database change for this has never run live. The allowance numbers are absent from every published surface on purpose, because a published allowance is binding — and a test asserts that absence so it cannot leak out by accident.Commits 4f55e81
-
not reachable yet
Scheduled re-scans and the report they send — built, and nothing subscribes to them
Two independent reasons a scheduled run did nothing, either sufficient on its own: no path in the product ever created the link between a subscriber and a brand, so the due list was empty forever; and the part that works out which plan a schedule belongs to could not read an entitlement at all, because two tables were keyed on different things with nothing between them. Both closed.
Two defects came out of it that would have cost real money quietly. A cancelled subscription stayed active forever, burning a slot every period to record a refusal. And an upgrade broke the schedule silently — one table saying the old plan, another saying the new one, so somebody who paid more and never pressed re-scan would have received nothing, weekly, with no error anywhere.
The report those runs send exists too. Two of its sentences are quoted verbatim from the code that computes them rather than re-written, because a second phrasing of one fact is how two surfaces drift into disagreeing about it.
Not reachable yet: recurring scans belong to paid plans, and nothing is purchasable, so there is no subscription for the scheduler to serve and no address for the report to reach.Commits 06acdb0b8ae77b994a3b5
-
shipped
The dashboard stopped being a drawing of a product
Every screen in the signed-in app rendered invented data and made no network call at all — the example data banner on them was telling the truth. They now read the live product. The honesty helpers live in exactly one place so that five screens cannot each get them wrong: a failure renders as we could not check, never as you have none, and a value that was not measured has one vocabulary, a dash and a reason, never a zero.
Then it stopped reading like a document. The first screen a new account was served ran to 1,338 words before the form it existed for; it is 295 now, and the form is the first thing on it. Nothing true was deleted — each explanation moved to the place it is actually used. A check came with it that fails the build if any screen in the app ships a figure with nothing behind it.
Commits 8715fce8e4f4b023a06b94c7e2c6
-
shipped
Six of the site’s own surfaces were saying things that were not true
The homepage said 7 free tools in the hero and fifteen in its own description, about the same set, while sixteen tool pages were serving. The tools page did not list the flagship tool at all, and five finished tools were reachable from nothing. Twenty-two pages carried an older footer that reached eight of the live tools, which leaves each of the others with no way in.
Worse, and funnier: the one file whose entire purpose is being read by AI assistants was describing the visibility scan in the future tense, months after it started answering questions — the AI visibility company, telling AI assistants to look forward to something it had already built. Half the tools had no entry in that file either, and four whole sections of the site were absent from it. (The sentence itself is not reproduced here. It is machine-readable copy asserting that this product does not run, and putting it on a page a crawler reads would recreate the defect on a second address.)
The comparison pages were publishing four figures about other companies that this project’s own research had already withdrawn — including one where we were wrong about a competitor’s website in public. Every figure now traces to a dated line in the research, and where the research does not settle a number the page says so rather than supplying one. The error about someone else’s pricing was corrected in the “where we are behind” list on the page rather than quietly deleted, which is the only version of that correction consistent with a page whose argument is that we checked.
Three of these are now enforced by a script rather than by remembering: a tool count in prose that disagrees with the directory fails the build, a footer link that resolves to nothing fails, and a page claiming a feature is live while that feature’s own switch is off fails.
One part not live yet: the llms.txt fix is in the repository, but that file is served by a separate snippet and does not change until it is published.Commits 29401128ff5f839027fcfc400cf87c24aa1acc26fa
-
shipped
Free API credits were turned down rather than let a model train on scan data
A vendor offered this account a large daily token grant in exchange for permission to train on its traffic. That traffic is scan data — the questions derived from somebody’s own page, and what each engine said about their brand. It was declined. The reason it is on this page is that the value of declining is that nothing changes: the privacy policy already promised no training in four places, and accepting would have falsified twelve published statements in one stroke, one of them machine-readable. The answer is now written into this project’s own standing rules, so a future session reads it before it reads the next offer.
The same week, the site stopped selling an engine it does not query. Paid plans add Perplexity was not a stray line — it was a product promise repeated in the homepage questions, the how-it-works strip, our own row in the comparison, two capability tables, the free tool’s own page, and the machine-readable description on ten pages. No plan has ever queried Perplexity. The pages now name it as not measured rather than dropping it, because silence reads worse than the admission.
Commits bc9ce9e60027ee
The honest part
What is still
shut, plainly.
Three of the entries above describe work you cannot reach at all, and three more describe work that has never met a real database. Here is the whole of why, in one place, rather than scattered through a list of good news.
There is no payment account.
Nothing on this site can be bought. Everything written against a paid plan — the schedule, the emailed report, the before-and-after check on a fix — is built, tested, and reachable by nobody, because no account can be on a paid plan.
Some of it has never met a real database.
Three entries say not verified, and they mean it literally: the database change is written and tested against stand-ins, and has not run against the live one. Until it does, the guarantee is a test result, not a fact.
Still no customers, and nothing to show you.
No logos, no case studies, no reviews, and no line claiming that anyone relies on us — because there is nothing true to put in one. This page exists because that is the situation, not in spite of it.
You cannot buy this yet.
You can use it.
The free tools need no account and no email. The result is on screen.