<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>twinny blog</title><description>Notes from building twinny, the self-hosted AI coding assistant for VS Code: how completion, the team gateway and the licence check actually work.</description><link>https://blog.twinny.dev/</link><language>en</language><item><title>Before the search: what Index workspace reads, skips, hashes and keeps when you cancel</title><link>https://blog.twinny.dev/posts/what-index-workspace-reads/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/what-index-workspace-reads/</guid><description>The search side of the workspace index has a post of its own. This one is the other half, from src/extension/embeddings/indexer.ts and embedder.ts. Which files are read, the two ways a file counts as unchanged, how many texts go to the server at once, what a cancelled run keeps, and why saving a file stops updating the index after you switch embedding models.</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><category>workspace-index</category><category>internals</category><category>guide</category></item><item><title>4.3.6 and 4.3.7: grey text in the composer, five sign-ins each, one token for many repositories</title><link>https://blog.twinny.dev/posts/grey-text-in-the-composer/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/grey-text-in-the-composer/</guid><description>Two small releases. The chat composer now suggests the rest of what you are typing, half from a word list that never leaves the webview and half from the chat model; the gateway counts sign-in requests per developer behind a reverse proxy instead of per proxy; and the pull request plugins keep one copy of an access token, so an expired one is replaced once.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><category>release</category><category>chat</category><category>gateway</category><category>plugins</category></item><item><title>A commit message from the diff: which diff, where it is cut, and what is scrubbed from the reply</title><link>https://blog.twinny.dev/posts/a-commit-message-from-the-diff/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-commit-message-from-the-diff/</guid><description>The sparkle in the Source Control title bar runs one git command, maybe two, cuts the result at a hunk boundary, sends it as a single user message, and then undoes the model&apos;s habit of wrapping the answer in fences. The constants and the fallbacks in src/extension/review/commit-message.ts.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>commit-messages</category><category>git</category><category>internals</category></item><item><title>Seven ports and a name: what the first run looks for, and what Test provider sends</title><link>https://blog.twinny.dev/posts/seven-ports-and-a-name/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/seven-ports-and-a-name/</guid><description>twinny used to write three Ollama providers on start whether or not Ollama existed. Now it asks seven local addresses for a model list at once, picks a model for each job from the name alone, and leaves a job unset rather than guess wrong. What the probe sends for chat, autocomplete and embeddings, why it stops after one chunk, and how a thrown error becomes a sentence you can act on. From src/extension/providers and src/common/provider-discovery.ts.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><category>providers</category><category>internals</category><category>guide</category></item><item><title>What a recording keeps: the request as it arrived, the reply as it left, and one row per conversation</title><link>https://blog.twinny.dev/posts/what-a-recording-keeps/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/what-a-recording-keeps/</guid><description>By default twinny-server keeps metadata and never content. Switch Recording on and it keeps the conversation and the reply, the code around the cursor and the completion, the embedding inputs and never the vectors. Where the capture happens relative to the secret shield, why a stopped autocomplete is a success, how twelve hex characters turn a dozen agent steps into one row, and what the training export throws away. From src/gateway/recording.</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><category>gateway</category><category>recording</category><category>internals</category></item><item><title>Free is a property of the file: what MIT buys you that a free tier does not</title><link>https://blog.twinny.dev/posts/free-is-a-property-of-the-file/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/free-is-a-property-of-the-file/</guid><description>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.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><category>opinion</category><category>licensing</category><category>teams</category></item><item><title>One contract, three adapters: where a provider name turns into a request</title><link>https://blog.twinny.dev/posts/one-contract-three-adapters/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/one-contract-three-adapters/</guid><description>Completion, chat, inline edit, review and the workspace index all end up calling the same three methods. Underneath, one adapter speaks every local server&apos;s dialect, one drives the hosted SDKs, one carries the gateway protocol. What each one adds, removes or remembers before a request goes out. From src/extension/inference.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><category>providers</category><category>internals</category></item><item><title>An agent in eight thousand tokens: how the tool loop fits a small model&apos;s context</title><link>https://blog.twinny.dev/posts/an-agent-in-eight-thousand-tokens/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/an-agent-in-eight-thousand-tokens/</guid><description>Every step of an agent reply resends the whole conversation, tool results included, so a few file reads fill a local model&apos;s context. How twinny asks the server how big that context is, shares it out, trims the oldest results first, reads a call the model wrote as text, and what it says on the last request. From src/extension/tools.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>agent-mode</category><category>chat</category><category>internals</category></item><item><title>A review in parts: what the review tab sends, skips and cuts</title><link>https://blog.twinny.dev/posts/a-review-in-parts/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-review-in-parts/</guid><description>The extension&apos;s review tab never pastes a diff into the chat. It parses the unified diff per file, drops lockfiles and build output, trims any one file to half a part, packs the rest into at most eight requests of 16,000 characters, and writes a verdict across them. The rules, the numbers and the one setting, from src/extension/review.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><category>code-review</category><category>internals</category><category>guide</category></item><item><title>What @terminal actually sends: five runs, the tail, and a hunt for file:line</title><link>https://blog.twinny.dev/posts/what-terminal-actually-sends/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/what-terminal-actually-sends/</guid><description>twinny does not read your scrollback. It listens to VS Code&apos;s shell integration, keeps the last five commands per terminal, sends the model the end of the output, and, when a failure names a file in the workspace, can turn it into an inline edit at that line. The constants, the regexes and the decisions in src/extension/terminal.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><category>terminal</category><category>internals</category></item><item><title>The diff lives in the file: how an inline edit is shown, streamed and settled</title><link>https://blog.twinny.dev/posts/the-diff-lives-in-the-file/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/the-diff-lives-in-the-file/</guid><description>Ctrl+I does not open a preview. The old lines and the new lines are both written into your document, tinted, and one of the two sets is deleted when you decide. What that costs, what it buys, and the diff and bookkeeping that make it hold still while the model is still typing.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>inline-edit</category><category>internals</category></item><item><title>twinny 4.3: agent mode, one key away, and a chat that behaves like a terminal</title><link>https://blog.twinny.dev/posts/agent-mode-one-key-away/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/agent-mode-one-key-away/</guid><description>Six releases in two days. The chat model can now read, search and edit files and run commands in your workspace, behind a switch rather than a setting; commands run in the background with their output in the reply; messages typed mid-reply queue instead of vanishing; and the gateway&apos;s Recordings fold an agent conversation into one row.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><category>release</category><category>chat</category><category>agent-mode</category><category>gateway</category></item><item><title>twinny 4.2.8 to 4.2.10: a key nobody sees, a version that lied, and WSL</title><link>https://blog.twinny.dev/posts/a-key-nobody-sees/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-key-nobody-sees/</guid><description>Three releases in three days. Developers get the gateway&apos;s pull-request plugins, opened from VS Code with a one-time code instead of a pasted key; twinny-server learns its own version number; and the extension starts under WSL again.</description><pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate><category>release</category><category>gateway</category><category>plugins</category><category>security</category></item><item><title>Where the milliseconds go: tuning completion latency</title><link>https://blog.twinny.dev/posts/where-the-milliseconds-go/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/where-the-milliseconds-go/</guid><description>A practical guide to making twinny&apos;s suggestions arrive sooner, in the order that pays off, starting with reading the log rather than changing settings.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>completion</category><category>performance</category><category>guide</category></item><item><title>A gateway for five people: one GPU box, in the order you will actually do it</title><link>https://blog.twinny.dev/posts/a-gateway-for-five-people/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-gateway-for-five-people/</guid><description>A practical guide to running twinny-server for a small team, from quickstart on loopback to invite links, the queue that replaces errors on a shared GPU, and the day someone leaves.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>gateway</category><category>teams</category><category>guide</category></item><item><title>A privacy claim you can grep</title><link>https://blog.twinny.dev/posts/a-privacy-claim-you-can-grep/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-privacy-claim-you-can-grep/</guid><description>Why &quot;we do not look at your code&quot; and &quot;there is nowhere for your code to go&quot; are different kinds of promise, where twinny&apos;s outbound requests are in the source, and the cases where local inference does not save you.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>privacy</category><category>opinion</category><category>internals</category></item><item><title>Choosing a completion model: the name on the tag decides the prompt</title><link>https://blog.twinny.dev/posts/choosing-a-fim-model/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/choosing-a-fim-model/</guid><description>A practical guide to picking a fill-in-the-middle model for twinny, what the Automatic template does with the model&apos;s name, and what to check when suggestions come back wrong.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>completion</category><category>models</category><category>guide</category></item><item><title>What @workspace actually does: two searches, a vote, and a cross-encoder</title><link>https://blog.twinny.dev/posts/what-workspace-actually-does/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/what-workspace-actually-does/</guid><description>Reading through twinny&apos;s workspace search stage by stage, from the question to the labelled blocks in the prompt, and why a 0.08 threshold means the same thing on every question.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>chat</category><category>workspace-index</category><category>internals</category></item><item><title>The completion you did not ask for: typing through a suggestion, the cache, and when the stream stops</title><link>https://blog.twinny.dev/posts/typing-through-a-suggestion/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/typing-through-a-suggestion/</guid><description>What twinny does on every keystroke between the ghost text appearing and the next request, why most keystrokes never reach the model, and the twelve reasons a streamed completion ends.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>completion</category><category>internals</category></item><item><title>twinny 4.2.7: the model never sees your keys, and the first completion no longer waits</title><link>https://blog.twinny.dev/posts/secrets-never-leave-the-machine/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/secrets-never-leave-the-machine/</guid><description>A secret shield swaps credentials for placeholders before a prompt leaves the machine and puts them back in the reply, in the extension and now on the gateway. And the completion model is loaded before you type.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>release</category><category>security</category><category>completion</category><category>gateway</category></item><item><title>A licence check with no licence server</title><link>https://blog.twinny.dev/posts/a-licence-check-with-no-server/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/a-licence-check-with-no-server/</guid><description>Why the team licence is a signed token verified offline, what it carries, what happens when it lapses, and what the gateway never sends.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>licensing</category><category>security</category><category>gateway</category></item><item><title>A blog for a coding assistant that never phones home</title><link>https://blog.twinny.dev/posts/hello/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/hello/</guid><description>What twinny is, what this blog is for, and the rule every post here follows.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>twinny</category><category>meta</category></item><item><title>How a completion is made: what a 7B model sees when you pause</title><link>https://blog.twinny.dev/posts/how-a-completion-is-made/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/how-a-completion-is-made/</guid><description>The six steps between a pause in typing and ghost text at the cursor, and why the prompt matters more than the model size.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>completion</category><category>models</category><category>internals</category></item><item><title>Pooling a teammate&apos;s GPU: one gateway, no open ports</title><link>https://blog.twinny.dev/posts/pooling-a-teammates-gpu/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/pooling-a-teammates-gpu/</guid><description>How twinny-server lets a developer share their own computer&apos;s models with the team, what the sharer consents to, and why a busy GPU queues instead of failing.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>teams</category><category>gateway</category><category>internals</category></item><item><title>Devices: the desktop&apos;s GPU from the laptop, with no relay</title><link>https://blog.twinny.dev/posts/the-desktop-gpu-from-the-laptop/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/the-desktop-gpu-from-the-laptop/</guid><description>How twinny pairs two of your own computers over an encrypted peer-to-peer link so a laptop can use a desktop&apos;s models, and what happens when hole-punching fails.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>devices</category><category>p2p</category><category>ollama</category></item><item><title>twinny 4.2: pull-request reviews on the GPU you already own</title><link>https://blog.twinny.dev/posts/pull-request-reviews-on-your-own-gpu/</link><guid isPermaLink="true">https://blog.twinny.dev/posts/pull-request-reviews-on-your-own-gpu/</guid><description>The 4.2 gateway reviews and triages pull requests from GitHub, GitLab, Gitea and Bitbucket with your own models, only when nobody is typing, and keeps the review on your server.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>release</category><category>code-review</category><category>gateway</category><category>plugins</category></item></channel></rss>