Changelog
Dates come from the commits, not from memory. Version numbers start at 0.1.0, which is the first release on npm. Everything before that is dated instead of versioned, because pretending there were tags would be inventing history.
2026-08-06
later
Two more ways to buy, one of which is a person rather than a binary
Team, 29 USD a month, is Watch for every repository an organisation owns, with issues triaged first and invoices instead of a card on request. It expands into the same capability Watch grants, because a customer on the larger plan finding the paid check locked would be the worst bug to ship in a billing path. That expansion now lives in one module both hosts import, with a test naming each rule, rather than as a copy in each of them.
Fix flow, 79 USD a month, is up to three findings a month fixed for you, each returned as a patch carrying a test that fails before it and passes after. It works from the finding rather than from your repository, so it needs no token, no clone and no repository access, which keeps the promise on the security page intact. Three is the ceiling because three is what one person can do properly in a month, so that is the number on the page instead of the word unlimited.
The pricing page carries all three, checkout is wired per product rather than to one hard coded id, then the terms say exactly what the service delivers plus what happens when it is late.
0.1.2
2026-08-06
Seven false positives found on a real repository, then fixed
The scan was run over five public repositories to replace a precision claim nobody could
reproduce. It reported 17 findings on fastify at 39e87e8. Seven of them
were wrong: the tests in test/trust-proxy.test.js declare
t.plan(11) then assert through a helper that takes the test context. A planned
count fails the test when it comes up short, so a body carrying one cannot be hollow.
no-assertion now counts a declared assertion count as an assertion, plus any
helper handed the test context. Both directions are tested. fastify reports 10 rather than
17. The six tests that remain each name a file and a line you can open.
The finding itself was overclaiming too. It said a test with no assertion "cannot fail", which is wrong for a test whose failure mode is an exception. It now says nothing but a thrown error can fail it, which is what is actually true.
The whole run, with every commit, is on the proof page. It replaces the older 132 to 0 precision table, which was true but named none of its repositories, so nobody could repeat it.
0.1.1
2026-08-06
First published release, plus a site instead of a page
On npm as margyn-scan, so npx margyn-scan /path/to/repo resolves
for anyone. npm refuses the name margyn as too close to an existing package
called morgan, so the package carries a suffix while the command it installs stays
margyn. 0.1.0 went out first then was replaced within the hour, because its
README still printed the name we turned out not to be allowed. The tarball carries
src, the README and the licence, nothing else.
The CLI grew --help, --version and --max. The last
one is what makes "raise the cap" a sentence you can act on rather than an option only
reachable by importing the checker.
Two pages scrolled sideways on a phone. Measured in a headless browser at 360 and 390 pixels: the docs grid took its width from the 680 pixel prose measure, then the pricing card took its width from the nowrap install command. Both are fixed, both were re-measured, so all eight pages now fit a 360 pixel screen.
The pricing page now says which Tiun environment its buttons are wired to. While the live account finishes onboarding, checkout runs in the sandbox, so the page says that where someone is about to press a buy button rather than leaving them to find out.
The site went from one page to eight, all built through one shell: docs, pricing,
changelog, security, terms, privacy and a real 404. Paths are served without the
.html. Both sitemap.xml and robots.txt are generated
from the same page list, so a new page cannot be shipped and left out of the sitemap.
Corrected our own self audit. The home page had named bin/bundle-static.mjs as
a surviving mutant, from a run against an older tree. That file no longer carries a line
this checker knows how to invert, because the line it inverted went away when the bundler
was rewritten. At the default cap of four, four of four now survive. The suite is 41 tests,
not the 26 the older copy claimed.
2026-08-05
Live on margyn.xyz, with the scanner deliberately left out
The hosted half runs on Cloudflare Workers: the page, sign in, checkout and the licence
endpoint. There is no /api/scan in production. On a public host that route
would take a filesystem path from a stranger and run git against it.
The mutation proof became a paid check behind an Ed25519 licence that the CLI verifies
offline. A refusal prints the reason then runs the free scan in full, so billing can never
fail a build. The Worker signs with WebCrypto, the local server signs with
node:crypto. A test asserts the two produce identical bytes rather than
merely both being valid.
The product was renamed from Placebo to Margyn. The palette became a gate: every text pair is measured against WCAG in both colour schemes and the build fails on a miss.
2026-08-01
Five checks, written from a pull request that went red
Eight vendored modules sat under a path containing dist/, which the root
ignore file excludes at any depth, so git dropped all eight while they sat on disk. The
first two checks came straight out of that failure. Then three more, from the same
question: what else in this repository reads as verification and performs none?
Then the precision pass, because a scanner that cries wolf is hollow itself. The first run produced 132 findings on one repository and nearly all were wrong. Four fixes later the same five repositories gave 0, 2, 2, 2 and 0 findings. The eight that remain are true.
What is not built
Named here so the roadmap is checkable rather than implied.
- An assertion that cannot fail for a subtler reason than having none, for example a fixture hash written by hand instead of generated. We hit exactly that case on 2026-08-01 and it is still a human's job.
- Local against CI environment divergence.
- Generating the fix rather than naming the defect.
A hosted scan is not on this list. That one is a decision rather than a gap, and the reasoning is on the security page.