# Changelog

> What shipped and when, written the way the guides are: what changed and why it was the right shape. Dated by the day the work landed, newest first.

Source: https://netweft.com/changelog
Updated: 2026-10-24

What shipped and when, newest first.

## netweft-mcp on npm, and the newest MCP revision

*2026-10-24* — Clients that only start local servers, such as Claude Desktop, now connect through netweft-mcp on npm, and the MCP server speaks the 2026-07-28 revision beside the handshake ones.

The [MCP server](/docs/mcp-server) was always a remote one: a client that
speaks HTTP pointed at `https://api.netweft.com/mcp` with an API key, and that
was the whole setup. A client that only starts local programs, Claude Desktop
among them, had no way in. It does now. `netweft-mcp` on npm is a small relay
the client starts with `npx`: it takes each message the client writes, posts
it to the server with your key, and hands the answer back. There is nothing to
install by hand, and nothing in it but the relay.

The server itself moved to the protocol's newest revision, `2026-07-28`,
which drops the opening handshake and sends the version with every request. A
client on an older revision still opens with `initialize` and is answered in
its own version, so nothing that worked before stops working. Every tool now
has a title and says it is read-only, and the server tells the agent how the
tools fit together before its first call.

Creating an API key now shows where it goes next: the endpoint, a Claude Code
command and a config for the npm relay, filled in for your workspace, beside
the key itself. The [docs page](/docs/mcp-server) has the setup for Claude
Code, Claude Desktop, Cursor, VS Code, Windsurf, Codex CLI and Gemini CLI.

## One mark, and the pages that were missing

*2026-09-11* — The netweft mark now generates every icon both deployments serve, sits on every share card, and the site gained comparisons, use cases, an API page, an MCP page, a credit calculator, a security page and this changelog.

There is now one brand master, and everything else is generated from it: the
favicons, the app icons, the maskable icon, the touch icon and the mark on
every share card, in both the marketing site and the dashboard. Nothing has to
be kept in step because there is nothing to keep in step.

The site also gained the pages it was missing. [Comparisons](/compare) against
four tools, written about the shape of each product rather than about its
price. [Use cases](/use-cases) with the month priced line by line. An
[API page](/api) with the whole error contract, an [MCP page](/mcp) listing
every tool by scope, and an [integrations page](/integrations) that says what
each connection is allowed to do. A [credits page](/credits) with a calculator
that multiplies by the live rate card. A [security page](/security) whose
second half is the list of things netweft does not have. And a
[roadmap](/roadmap) with no dates on it, because a date would be a guess.

## This site became machine-readable

*2026-09-08* — Every page is now served as plain markdown at the same path plus .md, indexed by /llms.txt, with the whole site as one document at /llms-full.txt and the assistant crawlers allowed by name.

A model reading this site should not have to parse HTML to find the numbers on
it. Every page is now served twice: once as a page, and once as the same
document in plain markdown at the same path with `.md` appended.

`/llms.txt` indexes all of them and `/llms-full.txt` is the whole site as one
document. The assistant crawlers — GPTBot, ClaudeBot, PerplexityBot and the
rest — are allowed by name in `robots.txt` rather than left to the wildcard: a
product that sells visibility in search cannot credibly block the engines that
are becoming search.

The markdown twins are generated from the same modules the pages render, never
transcribed from them, so a rate change reaches the machine-readable copy in
the same commit.

## A rank tracker's settings moved onto its own screen

*2026-09-03* — Schedule, devices and result depth are editable per tracker, and the cost of refreshing a metric is stated before the refresh spends anything.

A tracker is a standing commitment to spend credits on a schedule, so its
settings deserved a screen rather than a dialog. Schedule, devices and depth
are all editable, and each change says what it does to the cost of a check
before it is saved.

The same pass put a price on every metric refresh in the product. A button that
spends money and does not say so is the thing this product exists not to be.

## The credit wall and the rate-limit wall stopped looking alike

*2026-09-02* — A 402 and a 429 now carry the numbers that explain them, are told apart in the interface, and a credit refusal offers the top-up that would clear it.

Two very different failures used to read the same way: one means the workspace
cannot afford the call, the other means it asked too quickly. The first is
cleared by buying credits and the second by waiting, so presenting them
identically sent people to the wrong fix.

A 402 now arrives with `available` and `required`, and the interface offers the
top-up that would cover the difference. A 429 arrives with `Retry-After`, and
the interface says how long. Both are documented on the [API page](/api).

## An onboarding strategist that settles like everything else

*2026-09-01* — A short survey becomes a strategy for the project, produced by a model that can only speak from figures read back through tools — and charged as a reserved-then-settled operation like every other paid call.

The strategist reads what the workspace already knows about the project and
answers with a plan. It is restricted to figures read back through tools, so it
cannot state a number the product did not measure, and the turn reserves
credits at a ceiling before it runs and settles against what the model actually
used.

That second part matters more than it sounds. An AI feature that bills in
arrears is an AI feature whose cost is unknown until the invoice; one that
reserves a ceiling is one that can be refused before it spends.

## Page speed on audits, opt-in and priced

*2026-08-31* — A Lighthouse pass can be enabled per audit run. It costs thirty times what crawling the page costs, which is why it is a switch rather than a default.

Crawling a page costs one credit, because the crawler is ours and the cost is
compute. Measuring that page's performance costs thirty, because it is not.

On a five-hundred-page audit that ratio is the difference between a routine run
and a third of a month's allowance, so the option is presented with its price
attached before the run starts rather than switched on by default and explained
afterwards. The arithmetic is written up in
[what a 500-page crawl costs](/blog/what-a-crawl-costs).

## Every refusal got a name

*2026-08-30* — The routes that used to fail with a status and a sentence now fail with a stable code as well, so a client can branch on the reason rather than on the wording of an error message.

A failing response now carries a human sentence in `error` and a stable machine
code in `code`. The sentence is free to change; the code is a contract, and
each one has exactly one HTTP status so a name never means two different
things.

Rank tracking, projects, keywords, Google and the dashboard all got their
unnamed refusals named in the same pass. A code nobody can trigger is a promise
the API does not keep, so a new one is only added when the path that emits it
is.

The whole contract is on the [API page](/api).

## The plans appear where the wall is, not in a menu

*2026-08-29* — An unentitled workspace that tries to add a project is offered the plans in place, at the moment the limit is hit, instead of being sent to a pricing screen to work out which limit it was.

There is no free tier, so a workspace with no subscription hits a wall the
first time it tries to do anything. Sending that person to a pricing page makes
them reconstruct which limit they hit and which plan clears it. Offering the
plans at the point of refusal, with the refusal still on screen, does not.

## Projects, and a switcher that remembers where you were

*2026-08-28* — Create, rename, archive and restore a project; a switcher in the sidebar; and a workspace overview assembled from the projects rather than from a separate summary table.

A workspace holds projects, and every question netweft answers is asked against
one of them. The overview is built from the projects themselves rather than
from a summary table kept alongside them — a summary that has to be maintained
is a summary that eventually disagrees with what it summarises.

## An audit log, and an account that can close itself

*2026-08-27* — Project archiving, API key creation and revocation are recorded as audit events, and the account routes land beside them so a workspace can be read and closed by its owner.

The first thing written down was not a feature but a record of features being
used. Archiving a project, restoring one, creating an API key and revoking one
all write an audit event, so a workspace can answer the question of who did
what without anybody having to have thought to log it at the time.

Revocation leaves the key's row in place rather than deleting it. A deleted key
takes the evidence that it existed away with the access it granted, which is
exactly backwards.
