twinny / blog

← all posts

Free is a property of the file: what MIT buys you that a free tier does not

An opinion about the difference between a product that costs nothing and software that is yours, using the parts of twinny you can change, the one part that is paid, and the licence check that runs in public code.

“Free” is doing two jobs in this industry. A free tier is a price: zero, for now, for the features on the left of the pricing table, on terms that live on a web page you did not write. Free software is a property of the files on your disk: you may read them, change them, build them and keep running them after the vendor loses interest. The first kind of free is something you are given. The second is something you have.

twinny is the second kind, and this post is an opinion about why that distinction matters more for a coding assistant than for most tools, with the specifics of where the line sits, including the part of twinny that costs money.

What you can change

A coding assistant is a pile of prompts wrapped around someone else’s model. The prompts decide what the model is told about your code, what it is asked to do with it and how the answer is cut. In most products those prompts are the product, and they are hidden.

In twinny they are files. The prompts for chat, review, commit messages and custom-template completion are Handlebars templates in ~/.twinny/templates/: system.hbs for chat, review.hbs and review-summary.hbs for code review, commit-message.hbs, fim.hbs for completion when the FIM template is set to custom-template, and the rest. The folder is written when twinny starts, with the wx flag so an edited file is never overwritten. The loader in src/extension/templates/provider.ts reads your copy, and falls back to the built-in one when the file is missing, empty or will not render, with the reason in the Twinny output channel. Want reviews that flag departures from your conventions, or commit messages in Conventional Commits form? Edit the file. The docs have both as examples.

The second thing you can change is the server. There are presets for Ollama, LM Studio, llama.cpp and a generic OpenAI-compatible server on port 8080, and a Custom Provider form for anything that speaks one of the known protocols at an address you type. Completion, chat and embeddings each have their own provider, so a small local model can do completion while a hosted one does chat, and nothing in the extension cares which vendor is on the other end.

The third is the editor. twinny runs on VS Code 1.93 or newer, is on Open VSX for VSCodium, and every feature is a plain command with an id like twinny.review that you can rebind or wire into tasks.json. The FAQ is careful here: other forks generally work, but are not tested.

None of these are features in the marketing sense. They are consequences of the code being on your machine in a form you can read. A free tier offers none of them, and cannot: a hosted product’s prompts, routing and editor integration are its moat, and the moat is the thing you are not allowed to see.

What costs money, and where the check runs

The honest version of a free-software story includes the invoice. The extension is MIT and nothing in it is paid. The gateway, twinny-server, is built from the same tree and is free for five developers, permanently. The docs say the free plan is not a trial, and it is not: five seats, the admin page, usage per developer, key management, invite links, GPU pooling, the secret shield, the audit log and Prometheus metrics, with no licence installed. Beyond five, a Team licence is $6 per extra seat per month billed yearly, and switches on team policy, recording and plugins. Enterprise is $10 a seat from 50 seats, one token for every gateway in the organisation. A 30-day trial token with 25 seats arrives by email, with no card.

That is the money. What makes it consistent with the rest of the argument is where the paywall lives. A licence is a token, twl1. followed by base64url claims and a signature. The gateway verifies it in src/licensing/format.ts with node:crypto’s verify against the Ed25519 public keys listed in src/licensing/trusted-keys.ts, a file whose own header says there is nothing secret in it. There is no activation server, no account and no call home; the gateway behaves identically on a network with no internet. The constants are in the open too: FREE_SEATS = 5, GRACE_DAYS = 14, RENEWAL_NOTICE_DAYS = 30. Once the grace runs out, the five oldest keys keep their seats, and because the admin key made on day one is the oldest, an operator is never locked out of their own gateway.

So the paid features ship in an MIT repository, gated by a signature check you can read. The only private part is the key that signs tokens. Someone could fork the tree and delete the check; the licence permits it. That the project is funded anyway is a bet that a team of eight would rather pay for three seats than maintain a fork. It is the kind of bet that can only be made in the open.

Why this matters more for a coding assistant

Prompts rot. A prompt tuned for one model family cuts off or rambles on the next. With hidden prompts you wait for the vendor to notice. With a file, you look at the Debug log, which has the full prompt up to 8,000 characters, and fix the template that afternoon. The completion post on this blog about choosing a FIM model is, in the end, about a template and a stop list.

Vendors leave, mostly through acquisition, pivot or pricing. A free tier can be withdrawn; a model can be retired under a request you did not change. An MIT extension that talks to a server at an address you chose keeps working as long as both halves run, and the server can be llama.cpp on a laptop. The failure modes are yours, which is a feature.

Trust has to be checked, not read. A privacy claim you can grep made this case for the data path. The same applies to the commercial path: you do not have to believe that the gateway never phones home about seats; you can read the verifier and watch the socket. A pricing page is a promise. A public verifier is a mechanism.

The counterweight

Free software is not free of cost. You run the server, choose the model, and own the latency. A hosted model has a higher ceiling than a 7B model in 8 GB of VRAM, and the docs say so in the same table that says where your code goes. For some teams that ceiling is worth the terms, and local completion with hosted chat is a reasonable place to stand.

What MIT buys is not a better model. It is that the parts between you and the model are yours: the prompts, the routes, the keybindings and, for teams, the verifier that decides what the gateway will do. You can change them, and you can keep them. Whether that is worth the setup is a trade, but it is a trade you can inspect before you make it.

The free plan, the seat prices and the lapse rules are at Licensing and seats, and the repository is at github.com/twinnydotdev/twinny.

#opinion#licensing#teams