Margyn
Colour theme
Get Watch

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.