<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>twinny releases</title>
    <link>https://twinny.dev/changelog</link>
    <atom:link href="https://twinny.dev/changelog.xml" rel="self" type="application/rss+xml" />
    <description>Every release of the twinny VS Code extension and the twinny-server team gateway.</description>
    <language>en</language>
    <item>
      <title>twinny 4.3.6</title>
      <link>https://twinny.dev/changelog/4.3.6</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.6</guid>
      <pubDate>Tue, 06 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: the chat composer suggests how to finish what you are typing. twinny-server release: sign-in&#39;s per-address limit works behind a reverse proxy.</description>
      <content:encoded><![CDATA[<p>Extension release: the chat composer suggests how to finish what you are typing. <code>twinny-server</code> release: sign-in&#39;s per-address limit works behind a reverse proxy.</p>
<ul>
<li><strong>Grey suggestions in the chat composer.</strong> As in the editor, a suggestion shows in grey after the cursor: <strong>Tab</strong> accepts it, <strong>Ctrl+→</strong> accepts one word of it, and <strong>Esc</strong> puts it away. From the first key it finishes the word you are typing, or guesses the next one after a space, from your own earlier prompts, as a phone keyboard does. Once the conversation has a reply, a short pause after a word asks the chat model for the rest of the message given the last three exchanges, so the suggestion follows the conversation. Nothing is asked of the model while a reply is coming. <code>twinny.chatSuggestions</code> turns it off.</li>
<li><strong>Gateway: sign-in requests are counted per developer behind a proxy.</strong> <code>POST /twinny/v1/signin</code> allows five waiting requests per client address, and took the address from the connection. Behind nginx or Caddy on the same machine, as <code>docs/gateway.md</code> describes, every developer arrives from the proxy&#39;s loopback address, so the whole team shared five, and one client could hold sign-in shut for everyone for ten minutes. It now takes the forwarded address, by the rule the audit log already follows: <code>X-Forwarded-For</code> is believed only from a loopback peer.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.5</title>
      <link>https://twinny.dev/changelog/4.3.5</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.5</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: settings, labels and a command that did not do what they said. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: settings, labels and a command that did not do what they said. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>Edit twinny templates runs.</strong> The command was in the command palette but was never registered, so choosing it failed with &quot;command &#39;twinny.templates&#39; not found&quot;. It now opens <code>~/.twinny/templates</code> in a new window, as <strong>Open template editor</strong> under <strong>Manage twinny templates</strong> does.</li>
<li><strong>Chilean Spanish is used when chosen.</strong> The sidebar registered the <code>es-CL</code> translations under the key <code>esCL</code>, so <code>twinny.locale</code> set to <code>es-CL</code> fell back to the general Spanish ones. The two differ in one string today. The setting&#39;s description also called it Spanish (Colombia); it is Spanish (Chile).</li>
<li><strong><code>twinny.numPredictChat</code> is gone.</strong> Nothing has read it since 3.21: chat requests set no length limit of their own, so the provider&#39;s default applies. Removing it changes no reply.</li>
<li><strong><code>twinny.temperature</code> says what it covers.</strong> It applies to code completions only; chat, inline edit and code review in the extension send no temperature, so the server&#39;s default applies. The description implied all of them.</li>
<li><strong>The Stop button over an inline edit names the right key on macOS.</strong> It showed <code>⌘⇧/</code>; the binding is <code>Ctrl+Shift+/</code> on every platform (<code>⌘⇧/</code> is macOS&#39;s Help search), so it now shows <code>⌃⇧/</code>.</li>
<li><strong>The gateway preset names <code>twinny-server</code>.</strong> Its description in the Providers tab said the gateway is run with <code>twinny-node serve</code>.</li>
<li><code>docs/gateway.md</code> documents <code>policy.secretShield</code>, the READMEs list agent mode, and <code>docs/providers.md</code> points to the provider pages on docs.twinny.dev instead of setup from 3.x that no longer matched the presets.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.4</title>
      <link>https://twinny.dev/changelog/4.3.4</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.4</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: the chat&#39;s provider and model dropdowns open again. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: the chat&#39;s provider and model dropdowns open again. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>The provider and model dropdowns open again.</strong> In 4.3.2 the chat footer&#39;s dropdowns were made to fit a narrow panel, and that change hid their lists, so clicking one did nothing. The lists open again, and long names are still cut short in a narrow panel.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.3</title>
      <link>https://twinny.dev/changelog/4.3.3</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.3</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <description>twinny-server release: Recordings folds an agent conversation&#39;s steps into one row, and the tests no longer touch the real data directory. The extension carries the version number only.</description>
      <content:encoded><![CDATA[<p><code>twinny-server</code> release: Recordings folds an agent conversation&#39;s steps into one row, and the tests no longer touch the real data directory. The extension carries the version number only.</p>
<ul>
<li><strong>Recordings: one row per conversation.</strong> Agent mode sends the conversation again for every tool step, and every step was its own row in <strong>Recordings</strong>, so one reply could fill the list with a dozen near-identical entries. Now the steps and later turns of a chat fold into one row with a step count, wherever they fall among other requests. Opening it shows the whole conversation, and the caret lists each step. ↑ ↓ move between rows as shown. Storage is unchanged: each step is still its own record, and the training export still has one example per step. Records kept before this are grouped the first time the gateway opens them.</li>
<li><strong>Recordings: the preview is the question.</strong> A follow-up&#39;s preview showed the tool notes the extension sends ahead of it, as JSON. It now shows the question the developer asked.</li>
<li><strong>Tests no longer touch the real data directory.</strong> The gateway tests&#39; CLI processes run with a scratch home, so a full test run no longer removes <code>~/.twinny/server/recordings</code>.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.2</title>
      <link>https://twinny.dev/changelog/4.3.2</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.2</guid>
      <pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: agent mode&#39;s steps show inside the reply, commands run in the background with their output in the chat, and commands can be approved from the keyboard. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: agent mode&#39;s steps show inside the reply, commands run in the background with their output in the chat, and commands can be approved from the keyboard. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>Steps show where they happened in the reply.</strong> Before, every tool step sat in one block above the reply, so a command waiting for Run was above the text you were reading. Now the reply reads in order: what the model said, the tool it used, what it said next. A command waiting for you is at the bottom, where you are already looking. Conversations saved earlier show their steps at the top, as before.</li>
<li><strong>Commands run in the background, with their output in the chat.</strong> A command the model runs no longer opens the <strong>twinny tools</strong> terminal. It runs through <code>bash</code> from the workspace root, and its output appears in its step as it prints. Nothing can answer a prompt, and a command is stopped after two minutes, so interactive commands, servers and watch modes belong in a terminal. Set <code>twinny.chatToolsCommandsRunIn</code> to <code>terminal</code> to run them in the terminal as before.</li>
<li><strong>An auto-run switch.</strong> With agent mode on, an <strong>auto-run</strong> switch next to the agent switch lets every command run without asking. Until you first flip it, <code>twinny.chatToolsCommands</code> decides, so commands still ask by default.</li>
<li><strong>Always run, one command at a time.</strong> A waiting command now has <strong>Always run</strong> between Run and Skip. It runs the command and remembers that exact command, so the model can run it again without asking; any other command still asks. <strong>Twinny - Forget commands set to always run</strong> clears the list.</li>
<li><strong>Approve from the keyboard.</strong> When a command or change is waiting and the composer is empty, <code>Enter</code> runs or applies it, <code>Shift+Enter</code> always runs it, and <code>Esc</code> skips it. A second <code>Esc</code> still stops the reply.</li>
<li><strong>Stop one command, not the whole reply.</strong> A running command has a stop button on its line. It ends that command and anything it started; the model gets the output so far, is told you stopped it, and carries on.</li>
<li><strong>Model names fit in the composer footer, and nothing overlaps in a narrow panel.</strong> The provider dropdown takes only the room it needs, and the model&#39;s name gets the rest. As the panel narrows, &quot;? for shortcuts&quot; shrinks to &quot;?&quot;, the agent switch drops its key hint, auto-run keeps only its icon, and the placeholder is cut short on one line. The switches no longer run under the camera and send buttons, and the dropdown arrows no longer cover the names.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.1</title>
      <link>https://twinny.dev/changelog/4.3.1</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.1</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: code in agent mode&#39;s steps wraps properly. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: code in agent mode&#39;s steps wraps properly. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>Code in tool steps reads as code again.</strong> A file the agent read, shown with line numbers in a narrow chat, broke every word into its own wrapped column. Long lines now wrap as text, under the code and clear of the line numbers.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.3.0</title>
      <link>https://twinny.dev/changelog/4.3.0</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.3.0</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate>
      <description>Extension release: agent mode switched from the chat, messages queued while a reply runs, terminal-style chat keys, and a fix for Anthropic tool calls. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: agent mode switched from the chat, messages queued while a reply runs, terminal-style chat keys, and a fix for Anthropic tool calls. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>Messages sent while a reply runs are queued, not lost.</strong> Pressing Enter while the model is answering, or working through tools in agent mode, used to clear what you typed without sending it. It now waits under the transcript, marked <em>queued</em>, and goes out when the reply ends, one message per reply. Hover a queued message to drop it. Stopping the reply (<code>Esc</code>, <code>Ctrl+C</code> or the stop button) puts queued messages back in the composer instead of sending them.</li>
<li><strong>Agent mode with Anthropic no longer fails after a tool with no arguments.</strong> When Claude called a tool that takes nothing, such as looking at the editor, the next step failed with &quot;Unexpected end of JSON input&quot; before it was sent. Calls with no arguments now go back as <code>{}</code>; Bedrock, Gemini and Cohere had the same failure.</li>
<li><strong>Agent mode, one key away.</strong> A switch at the bottom left of the chat&#39;s composer, or <code>Shift+Tab</code>, turns agent mode on and off: the model may then read, search and edit files and run commands in the workspace. The choice is kept for every window; until you first switch it, the <code>twinny.chatTools</code> setting decides. While it is on, the prompt turns to a bright <code>❯❯</code>, and it pulses while the model works.</li>
<li><strong>Chat keys, as in a terminal.</strong> <code>Ctrl+C</code> stops a reply, or clears the draft when nothing is streaming; with text selected it still copies. <code>Esc</code> twice clears the draft, and <code>↑</code> brings a cleared draft back. <code>Ctrl+L</code> starts a new conversation, <code>PgUp</code> and <code>PgDn</code> scroll the transcript from the composer, and typing with the focus on the transcript goes to the composer. <code>Esc</code> and <code>Ctrl+C</code> stop a reply from anywhere in the chat, not only the composer. Press <code>?</code> on an empty composer for the list, or run <strong>Twinny - Chat keyboard shortcuts</strong> from the view&#39;s <code>…</code> menu.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.10</title>
      <link>https://twinny.dev/changelog/4.2.10</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.10</guid>
      <pubDate>Wed, 30 Sep 2026 12:00:00 GMT</pubDate>
      <description>Extension release: twinny starts in WSL again, and the Embeddings tab holds still while indexing.</description>
      <content:encoded><![CDATA[<p>Extension release: twinny starts in WSL again, and the Embeddings tab holds still while indexing.</p>
<ul>
<li><strong>Works in WSL remotes.</strong> Opening a folder through WSL failed activation with <code>Cannot read properties of undefined (reading &#39;header&#39;)</code>, so chat never loaded and completions did nothing. LanceDB&#39;s native loader read the Node process report to tell glibc from musl, and the VS Code server under WSL returns none. The check now falls back to glibc, and LanceDB loads when the index is first opened rather than at startup, so a native module that fails to load turns embeddings off instead of stopping the extension.</li>
<li><strong>No flicker while indexing.</strong> The line naming the files being embedded came and went between files, making the page below it jump many times a second. It now keeps its place for the whole run.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.9</title>
      <link>https://twinny.dev/changelog/4.2.9</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.9</guid>
      <pubDate>Tue, 29 Sep 2026 12:00:00 GMT</pubDate>
      <description>twinny-server release: twinny-server --version and the gateway&#39;s /twinny/v1 responses report the right version. The 4.2.8 package was published with a bundle built before the version bump, so it called itself 4.2.7. Publishing now refuses a cli.js that was not built for the package&#39;s version.</description>
      <content:encoded><![CDATA[<p><code>twinny-server</code> release: <code>twinny-server --version</code> and the gateway&#39;s <code>/twinny/v1</code> responses report the right version. The 4.2.8 package was published with a bundle built before the version bump, so it called itself 4.2.7. Publishing now refuses a <code>cli.js</code> that was not built for the package&#39;s version.</p>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.8</title>
      <link>https://twinny.dev/changelog/4.2.8</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.8</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <description>Extension and twinny-server release: plugins shared with developers, opened from VS Code already signed in, an approve button on the pull page, and Qwen3-Coder completions through a gateway.</description>
      <content:encoded><![CDATA[<p>Extension and <code>twinny-server</code> release: plugins shared with developers, opened from VS Code already signed in, an approve button on the pull page, and Qwen3-Coder completions through a gateway.</p>
<ul>
<li><strong>Share plugins with developers.</strong> An admin can share a plugin with every developer or with the people they tick, from the plugin&#39;s card under <strong>Plugins → Store</strong> or <code>PUT /twinny/v1/admin/plugins/&lt;id&gt;/access</code>. A developer then signs in to the gateway&#39;s page with their own key and sees only the plugins shared with them, without their settings. On GitHub, GitLab, Gitea and Bitbucket they read pulls and issues, review, ask about a review, post it as a comment, triage and apply the suggested labels, and set their own username on the host; approving or requesting changes through the token stays with admins, as do repositories, tokens, the GitHub App and the review model. The notifiers, SSO sign-in, shared context and backups are for admins only. Grants are kept by key name in <code>plugins.json</code>, every change is audited (<code>plugin.access-changed</code>), and a developer&#39;s writes are audited under their name, marked <code>member</code>. The shared token and a demo&#39;s guests never open a plugin.</li>
<li><strong>Your team&#39;s plugins, one click from VS Code, signed in.</strong> When an admin shares a plugin with you, VS Code says so once with an <strong>Open</strong> button, and the Providers tab lists it under <strong>Your team&#39;s plugins</strong>; admins get <strong>Your gateway&#39;s page</strong>. Opening asks the gateway for a one-time code with your key (<code>POST /twinny/v1/page-link</code>) and opens the page with the code in the URL fragment; the page trades it for the key once, within a minute (<code>POST /twinny/v1/page-link/open</code>), and wipes it from the address bar. Nobody sees, copies or pastes a key, and a developer who joined by invite needs nothing from the admin. <strong>Twinny - Open your team&#39;s plugins</strong> in the command palette does the same; against an older gateway it falls back to putting the key on the clipboard.</li>
<li><strong>The page knows who you are on GitHub.</strong> Opened from VS Code, the page fills in your GitHub username from the account VS Code is signed in with, once, so pull requests waiting for your approval appear under <strong>waiting for me</strong>; it never replaces a name you set and is skipped on GitHub Enterprise. Without one, the plugin&#39;s page asks <strong>Who are you on GitHub?</strong> at the top until you answer.</li>
<li><strong>Approve from the pull page.</strong> An admin approves a pull request with one button next to its checks, as the repository&#39;s token, with no review text posted. GitHub, Gitea and GitLab pin the approval to the commit the page showed. Developers a plugin is shared with do not get the button.</li>
<li><strong>Qwen3-Coder completions through a gateway.</strong> A chat-only FIM model&#39;s prompt now reaches <code>twinny-server</code> as the chat it was rendered from, instead of being refused, so the backend no longer templates it twice.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.7</title>
      <link>https://twinny.dev/changelog/4.2.7</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.7</guid>
      <pubDate>Thu, 24 Sep 2026 12:00:00 GMT</pubDate>
      <description>Extension and twinny-server release: the completion model is loaded before you type, and the gateway shields secrets for every client.</description>
      <content:encoded><![CDATA[<p>Extension and <code>twinny-server</code> release: the completion model is loaded before you type, and the gateway shields secrets for every client.</p>
<ul>
<li><strong>The completion model is loaded before you type.</strong> When VS Code starts or regains focus, twinny asks a local model server (Ollama, LM Studio, llama.cpp, or an OpenAI-compatible server on this machine) to load the autocomplete model, so the first completion no longer waits for it. With CodeLlama 7B on Ollama, the first completion went from 11 to 17 seconds to 0.06. Nothing is sent when the model has been used in the last four minutes, and hosted APIs are never called. Turn it off with <code>twinny.warmUpModel</code>.</li>
<li><strong>The gateway shields secrets too.</strong> <code>twinny-server</code> now swaps credentials in prompts for placeholders before a request reaches a backend, and puts them back in the reply, for every client (the extension, the TUI, Neovim). Set it with <code>policy.secretShield</code> or on the admin page&#39;s <strong>Policy</strong> tab: <code>offMachine</code> (the default) covers hosted APIs, backends on other hosts and the team pool; <code>always</code> adds backends on the gateway&#39;s own host; <code>off</code> forwards prompts as they arrive.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.6</title>
      <link>https://twinny.dev/changelog/4.2.6</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.6</guid>
      <pubDate>Thu, 24 Sep 2026 12:00:00 GMT</pubDate>
      <description>Extension release: a secret shield keeps credentials out of prompts that leave the machine. twinny-server carries the version number only.</description>
      <content:encoded><![CDATA[<p>Extension release: a secret shield keeps credentials out of prompts that leave the machine. <code>twinny-server</code> carries the version number only.</p>
<ul>
<li><strong>Secret shield.</strong> API keys, tokens, private keys and passwords in a prompt are replaced with placeholders such as <code>REDACTED_GITHUB_TOKEN_1</code> before the request leaves your machine, and put back wherever the reply uses them, so the model never sees the value and the code it writes still works. This covers chat, completions, inline edit and embeddings. It knows the GitHub, GitLab, AWS, Stripe, Slack, OpenAI, Anthropic, Google, Hugging Face and npm token formats, as well as PEM private keys, JWTs, passwords in URLs, and secret-named values in code and <code>.env</code> files. Values like <code>process.env.X</code> or <code>&lt;your-key&gt;</code> are left alone. A chat reply shows <strong>N secrets withheld</strong> and which kinds; completions log it to the Twinny output channel. The <code>twinny.secretShield</code> setting controls when it runs: <code>offMachine</code> (the default) covers hosted APIs, gateways, paired devices and servers elsewhere on the network, <code>always</code> adds local servers, and <code>off</code> turns it off.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.5</title>
      <link>https://twinny.dev/changelog/4.2.5</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.5</guid>
      <pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate>
      <description>Gateway release: pull-request reviews stop ending mid-sentence, say when they were cut, and can be asked about. The extension carries the version number only.</description>
      <content:encoded><![CDATA[<p>Gateway release: pull-request reviews stop ending mid-sentence, say when they were cut, and can be asked about. The extension carries the version number only.</p>
<ul>
<li><strong>Reviews no longer end mid-sentence.</strong> Ollama&#39;s OpenAI-compatible route ignores <code>think: false</code> (checked against 0.33), so a reasoning model such as Qwen 3 thought its way through most of the 4,000-token budget and the review that followed was cut off. The request now says it the standard OpenAI way, <code>reasoning_effort: &quot;none&quot;</code>, which that route does honour; the extension&#39;s chat and developers&#39; requests through the gateway are unchanged.</li>
<li><strong>A cut-off answer says so.</strong> Backends now report why generation stopped, and a review or answer the output cap cut is kept but tagged <strong>cut short</strong>, with the reason (and how much went on thinking) above it.</li>
<li><strong>Ask about a review.</strong> Under a finished review is a box for questions. Each goes to the review model with the pull, the review and the earlier questions, and the exchange is kept on the review as a thread until the pull is reviewed again. Nothing in it is posted to the host. Route: <code>POST …/pulls/&lt;n&gt;/review/ask { question }</code>.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.4</title>
      <link>https://twinny.dev/changelog/4.2.4</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.4</guid>
      <pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate>
      <description>Chat release: replies carry their details, and the chat gains the controls it was missing. twinny-server carries the version number only; the gateway is unchanged.</description>
      <content:encoded><![CDATA[<p>Chat release: replies carry their details, and the chat gains the controls it was missing. <code>twinny-server</code> carries the version number only; the gateway is unchanged.</p>
<ul>
<li><strong>Replies say who wrote them.</strong> Under each reply: the model, how long it took and, when the backend reports token counts, tokens per second. A reply you stopped says so. The details are saved with the conversation and never sent to the model; older conversations show nothing.</li>
<li><strong>Continue a stopped reply.</strong> The last reply, if you stopped it, has a <em>Continue</em> button that asks the model to carry on without starting over.</li>
<li><strong>Earlier prompts with ↑ and ↓.</strong> From an empty composer, the arrow keys step through what you have sent, across conversations, as in a shell. Typing into a recalled prompt makes it your draft.</li>
<li><strong>Esc stops a reply</strong> while the composer has focus.</li>
<li><strong>Insert at cursor.</strong> Code blocks in replies have <em>insert</em> next to <em>apply</em>: the code goes straight into the editor at the cursor, replacing any selection. <em>Apply</em> still proposes a diff to review.</li>
<li><strong>Open conversation as Markdown</strong>, from the sidebar&#39;s <code>…</code> menu or the panel&#39;s toolbar: the whole conversation in a new editor, without thinking or composer markup.</li>
<li><strong>Long questions fold.</strong> A message of yours taller than about a dozen lines (an <em>Explain</em> over a big selection, pasted code) shows its first lines and <em>Show more</em>.</li>
<li><strong>Empty code blocks are not shown.</strong> A fence with only whitespace in it no longer renders as an empty box with buttons.</li>
<li><strong>The sidebar keeps its state when hidden.</strong> Switching to another view and back no longer reloads the chat, so a half-written prompt, a reply still streaming and the scroll position survive.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.3</title>
      <link>https://twinny.dev/changelog/4.2.3</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.3</guid>
      <pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate>
      <description>Small release: code completion works with Qwen3-Coder. twinny-server carries the version number only; the gateway is unchanged.</description>
      <content:encoded><![CDATA[<p>Small release: code completion works with Qwen3-Coder. <code>twinny-server</code> carries the version number only; the gateway is unchanged.</p>
<ul>
<li><strong>Qwen3-Coder completes code.</strong> Qwen3-Coder is released only as an instruct model, and it fills the hole when the FIM prompt arrives as the user turn of a chat (&quot;You are a code completion assistant.&quot;). Twinny sent it the bare Qwen2.5-Coder markers, and plain text at the end of a file, so completions came back as garbage. Models whose name contains <code>qwen3-coder</code> now get a new <code>qwen3-coder</code> FIM template, which is also in the template list. Completion endpoints still get a completion request: the chat is written out as ChatML in the prompt, and Ollama is sent <code>raw: true</code> so it does not apply the model&#39;s template a second time. LiteLLM gets the chat as messages. Custom and repository-level templates are wrapped the same way. The model answers inside a markdown code block whatever the system prompt says, so for this template the opening fence is dropped and the closing one ends the completion. Given a half-typed word the model either repeats it (<code>c</code> completed with <code>const mul</code>, shown as <code>cconst</code>) or starts a fresh line after it, so for this template the prompt now ends before the unfinished word, the chat names what the completion must begin with, and an answer that ignores it is discarded. A short echoed word start is stripped for every model.</li>
<li><strong>A suggestion made in an empty file no longer follows what you type.</strong> The last suggestion shown is kept so that typing its first characters serves the rest without a new request. At the start of a file it had nothing to anchor to and was re-served after any text at all, whether or not the completion cache was on.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.2</title>
      <link>https://twinny.dev/changelog/4.2.2</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.2</guid>
      <pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate>
      <description>Small release: prompt templates (~/.twinny/templates) are sturdier. twinny-server carries the version number only; the gateway is unchanged.</description>
      <content:encoded><![CDATA[<p>Small release: prompt templates (<code>~/.twinny/templates</code>) are sturdier. <code>twinny-server</code> carries the version number only; the gateway is unchanged.</p>
<ul>
<li><strong>A missing or broken template no longer breaks the feature.</strong> Deleting <code>system.hbs</code> used to make every template render empty, so Explain, Review and the commit message all failed. A template that is missing, blank or will not parse now falls back to the built-in copy, and the reason goes to the Twinny output channel. Asking for a template that does not exist returns nothing instead of throwing in the background.</li>
<li><strong>Prompts are no longer HTML-escaped.</strong> A review of &quot;Fix <code>&lt;T&gt;</code> &amp; co&quot; reached the model as <code>Fix &amp;lt;T&amp;gt; &amp;amp; co</code>; values now go in as written.</li>
<li><strong>The template buttons in chat</strong> no longer offer <em>review-summary</em>, which needs a review to summarise, and a template of your own whose name merely starts with &quot;system&quot; is listed again.</li>
<li>Template names that are not plain file names are refused, and the <code>eq</code> helper is available to every template however the extension started.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.1</title>
      <link>https://twinny.dev/changelog/4.2.1</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.1</guid>
      <pubDate>Tue, 22 Sep 2026 12:00:00 GMT</pubDate>
      <description>Small release: the extension tells the person who could run a gateway that one exists, and the listings say what the product costs.</description>
      <content:encoded><![CDATA[<p>Small release: the extension tells the person who could run a gateway that one exists, and the listings say what the product costs.</p>
<ul>
<li><strong>Set up for your team.</strong> The Providers tab has a second team card for whoever has the models: the quick-start command and a link to the gateway page on twinny.dev. The same link is the command <em>Twinny - Set up for your team</em>.</li>
<li><strong>One notice, once.</strong> Two weeks after first use on a machine that is not connected to a team, one information message says the gateway exists, with <em>See how</em> and <em>No thanks</em>. It is recorded as shown before it appears, so dismissing it is also the end of it. A machine connected to a team never sees it.</li>
<li>The Marketplace description and both READMEs name the team gateway, the price, and the free 30-day trial at twinny.dev. <code>twinny-server</code> is republished for its README only; the gateway itself is unchanged.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.2.0</title>
      <link>https://twinny.dev/changelog/4.2.0</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.2.0</guid>
      <pubDate>Mon, 21 Sep 2026 12:00:00 GMT</pubDate>
      <description>Everything in it is on the gateway side; the extension only learns to send the open workspace&#39;s name (for routing rules) and to search the shared context index.</description>
      <content:encoded><![CDATA[<p>Everything in it is on the gateway side; the extension only learns to send the open workspace&#39;s name (for routing rules) and to search the shared context index.</p>
<h3>Plugins</h3>
<p>Plugins are features the gateway ships with but that stay off until an admin switches them on from <strong>Plugins → Store</strong> on the admin page. Each has its own routes, files and page. They are a licence feature: without one the store lists them but none can be switched on, and plugins that were on stop when a licence lapses and start again when one is installed.</p>
<ul>
<li><strong>GitHub and GitLab pull requests.</strong> Watch repositories with a token or a GitHub App and the admin page lists every open pull request across them: checks, merge state, review state, drafts. Open one to read the description and highlighted diffs. <strong>Review now</strong> sends it to one of the gateway&#39;s own chat aliases and keeps the review on the server; <strong>auto-review</strong> does it in the background for new and updated pulls while no developer request is running.</li>
<li><strong>Gitea, Forgejo, Codeberg and Bitbucket Cloud</strong> on the same pull-request core.</li>
<li><strong>Reviews posted back to the host</strong> as a comment, a change request or an approval, with a footer naming the model; <strong>auto-post</strong> per repository. A review in progress shows as a status row.</li>
<li><strong>Issue triage.</strong> Open issues are listed beside pulls; a model suggests labels, a duplicate, a priority and a first reply, kept on the server until someone posts the reply or applies the labels. Auto-triage suggests while the models are idle.</li>
<li><strong>Pull-request pages</strong> have one listing toolbar on every forge: one-click views with live counts, selects for repository, author, label, target branch and activity, a search, order by, sortable headers, all remembered per host. Each pull carries its approvals as the host reports them, and the page tags each pull with the operator&#39;s part in it (&quot;waiting for me&quot;). Drafts stay out of the list until a toggle brings them in.</li>
<li><strong>Reasoning models</strong> are asked not to think when reviewing (<code>think: false</code> on Ollama); reasoning deltas and inline <code>&lt;think&gt;</code> blocks are recognised, and a thinking-only answer fails with the reason.</li>
<li><strong>Slack, Discord and Microsoft Teams</strong> post chosen events to webhooks (Mattermost and Rocket.Chat take the Slack shape): a review finished or asked for changes, a pull opened, checks failed, a backup made or failed, a backend down or back. A test button and a delivery log per webhook; URLs are kept secret. Plugins share one event bus.</li>
<li><strong>SSO sign-in (OIDC).</strong> Developers sign in with Okta, Entra ID, Google Workspace, Keycloak or any OpenID Connect provider: PKCE, nonce, RS256 id_token verified against the provider&#39;s keys, a domain allow-list, admin emails, and a key minted through a replacing invite that opens VS Code. Signing in again replaces the key, so it doubles as lost-key recovery.</li>
<li><strong>Shared context.</strong> Repositories are cloned shallow onto the gateway, chunked, embedded with an embeddings alias it serves, and re-indexed on a schedule while the models are idle, embedding only what changed. Connected extensions search it with their key and merge the hits into the relevant code their chat already gathers.</li>
<li><strong>Backups.</strong> A nightly copy of configuration, keys, licence, invites, plugins and usage (recordings on request) to a directory or an S3-compatible bucket, optionally encrypted, with retention and a CLI restore (<code>twinny-server backup restore</code>).</li>
<li>Plugin logos on the store, navigation and pages; skeleton loaders while a page loads; themed scrollbars on panels and code blocks.</li>
</ul>
<h3>Gateway operations</h3>
<ul>
<li><strong>Audit log.</strong> Every admin change (keys, invites, sign-ins, configuration, licence, plugins on or off, plugin writes) goes to <code>audit/YYYY-MM.jsonl</code>, each line carrying the hash of the line before it. <strong>Team → Audit log</strong> shows whether the chain is intact, filters by period, actor and kind, and exports.</li>
<li><strong>Read-only admins.</strong> <code>keys create &lt;name&gt; --admin --read-only</code> (or the box on People) opens the admin page and every <code>GET</code> admin route and refuses anything that changes state.</li>
<li><strong>Prometheus metrics</strong> at <code>GET /metrics</code> for admin keys: requests by route, alias and outcome, a latency histogram, tokens, in-flight and queued requests, backend health, refused authentications, seats, plugin events.</li>
<li><strong>Costs.</strong> Give an alias a price per million input and output tokens and a currency, and Usage and Overview show what each developer, model and period cost.</li>
<li><strong>Bounded request queue.</strong> A chat or autocomplete request that finds every slot taken waits, oldest first, for up to <code>limits.queue.fimWaitMs</code> or <code>chatWaitMs</code> before it is refused; at most <code>limits.queue.maxWaiting</code> may wait. A client that goes away while waiting is dropped as <code>request.abandoned</code>. Refusal logs say whether the gateway, the queue or the key&#39;s own limit refused; <code>twinny_queued_requests</code> is exported.</li>
<li><strong>Data-directory format marker.</strong> <code>format.json</code> names the layout; migrations run in order at start, a newer format than the build knows exits with code 6, and a directory with files but no marker is taken as format 1. Backups carry the marker along.</li>
<li><strong>Routing rules</strong> in team policy keep a workspace on local backends or on named aliases, matched on the workspace name the extension now sends. <strong>Team system prompt</strong> in policy is put before every chat&#39;s system prompt on connected extensions and shown on the consent card.</li>
<li><strong>Helm chart</strong> under <code>deploy/helm/twinny-server</code>: one pod, one volume, an optional Ingress with TLS, a ServiceMonitor for <code>/metrics</code>.</li>
<li>The admin shell widens to 1480px and folds the sidebar into tabs below 960px.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.1.3</title>
      <link>https://twinny.dev/changelog/4.1.3</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.1.3</guid>
      <pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Gateway discovery now names the backend model behind each alias, and the extension picks the fill-in-the-middle prompt format from it instead of from the alias name. An alias called coder in front of Codestral gets the Codestral format.</description>
      <content:encoded><![CDATA[<ul>
<li>Gateway discovery now names the backend model behind each alias, and the extension picks the fill-in-the-middle prompt format from it instead of from the alias name. An alias called <code>coder</code> in front of Codestral gets the Codestral format.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.1.2</title>
      <link>https://twinny.dev/changelog/4.1.2</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.1.2</guid>
      <pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Mistral: the completion endpoint gets the model in the request body, and text-only chat messages go as a plain string rather than a parts list, which Mistral refused. Images keep their parts.</description>
      <content:encoded><![CDATA[<ul>
<li>Mistral: the completion endpoint gets the model in the request body, and text-only chat messages go as a plain string rather than a parts list, which Mistral refused. Images keep their parts.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.1.1</title>
      <link>https://twinny.dev/changelog/4.1.1</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.1.1</guid>
      <pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate>
      <description>Teams. One gateway on your own hardware serves twinny to the whole team.</description>
      <content:encoded><![CDATA[<p>Teams. One gateway on your own hardware serves twinny to the whole team.</p>
<ul>
<li><strong><code>twinny-server</code></strong>, a dependency-free Node package built from <code>src/gateway</code>: <code>quickstart</code> finds a local model server, writes a configuration, makes an admin key and serves; <code>init</code>, <code>serve</code>, <code>keys</code>, <code>invites</code>, <code>usage</code>, <code>license</code>, <code>recordings</code>, <code>reset</code>. Any OpenAI-compatible backend, Ollama, LM Studio, llama.cpp, QVAC or a hosted API behind named aliases.</li>
<li><strong>Protocol v1</strong> at <code>/twinny/v1</code>: models, chat, fim and embeddings streamed as NDJSON, with typed error kinds; the extension&#39;s <strong>Twinny gateway</strong> provider speaks it with a token kept in VS Code secret storage.</li>
<li><strong>A key per developer</strong>, stored as a hash, created and revoked live on the admin page or the CLI; per-key limits; a shared token that can be retired.</li>
<li><strong>Invite links</strong> (<code>vscode://</code> URI handler) that open VS Code and connect with nothing to paste; one use, seven days, no seat until opened. Sign-in with a short code as the alternative.</li>
<li><strong>Usage per person and per model</strong>: requests, failures, token counts, indexing runs; retention you choose; never the content.</li>
<li><strong>Admin page</strong> at <code>/admin</code>: overview, usage charts, people, policy, providers and models (edited live), plan and licence, recordings.</li>
<li><strong>Team GPU pooling.</strong> A developer flips <em>Share this computer</em> and their local server serves the team through a WebSocket to the gateway: no port to open, consent shown, least-loaded first, failover when a sharer goes offline.</li>
<li><strong>Seat licensing.</strong> Five seats free for good; a signed <code>twl1.</code> token bought by card raises the count and switches on policy and recording. Checked locally, no call home, 30-day notice and 14-day grace.</li>
<li><strong>Team policy</strong> (licence): team-gateway-only providers and locked defaults, shown for consent before connecting and enforced by the extension while connected. <strong>Leave team</strong> is one click.</li>
<li><strong>Recording</strong> (licence): keep chat, autocomplete and embedding content on the gateway, disclosed to every developer, reviewed and exported as training data from the admin page.</li>
<li><strong>Docker</strong> image <code>ghcr.io/twinnydotdev/twinny-server</code> with a compose file; <strong>demo mode</strong> (<code>serve --demo</code>) for a read-only public admin page with one-hour guest keys.</li>
<li>Autocomplete fix: a client that hung up after the first chunk no longer logs the request as cancelled.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.20</title>
      <link>https://twinny.dev/changelog/4.0.20</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.20</guid>
      <pubDate>Thu, 17 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Chat: Add file to context did nothing (#503).</description>
      <content:encoded><![CDATA[<ul>
<li>Chat: <em>Add file to context</em> did nothing (#503).</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.19</title>
      <link>https://twinny.dev/changelog/4.0.19</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.19</guid>
      <pubDate>Mon, 14 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Chat: code blocks render and copy better.</description>
      <content:encoded><![CDATA[<ul>
<li>Chat: code blocks render and copy better.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.18</title>
      <link>https://twinny.dev/changelog/4.0.18</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.18</guid>
      <pubDate>Sun, 13 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Workspace index: models that truncate at 256 tokens are given embedding windows instead of whole chunks; identifiers are split for the keyword column; follow-up questions search with their question; open files are favoured; hits are widened to neighbours. Workspace search sources show under chat replies.
- Autocomplete gets the definitions and signatures of what is being typed from the language server.
- Providers: validation, a Test provider probe on every card, presets, import and export; the provider layer is laid out by feature.
- Logging through a VS Code LogOutputChannel.</description>
      <content:encoded><![CDATA[<ul>
<li><strong>Workspace index</strong>: models that truncate at 256 tokens are given embedding windows instead of whole chunks; identifiers are split for the keyword column; follow-up questions search with their question; open files are favoured; hits are widened to neighbours. Workspace search sources show under chat replies.</li>
<li><strong>Autocomplete</strong> gets the definitions and signatures of what is being typed from the language server.</li>
<li><strong>Providers</strong>: validation, a <em>Test provider</em> probe on every card, presets, import and export; the provider layer is laid out by feature.</li>
<li>Logging through a VS Code <code>LogOutputChannel</code>.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.13</title>
      <link>https://twinny.dev/changelog/4.0.13</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.13</guid>
      <pubDate>Thu, 10 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Mentions: @git, @terminal and @symbol join @files, @problems and @workspace.
- Terminal: fix the last error with the output attached, and write a command from a description, shown before it runs. Needs VS Code 1.93 shell integration.
- Workspace index rewritten: an incremental index with a manifest, hybrid BM25 and vector search, a reranker in worker threads, @workspace or automatic mode.
- Dependencies updated.</description>
      <content:encoded><![CDATA[<ul>
<li><strong>Mentions</strong>: <code>@git</code>, <code>@terminal</code> and <code>@symbol</code> join <code>@files</code>, <code>@problems</code> and <code>@workspace</code>.</li>
<li><strong>Terminal</strong>: <em>fix the last error</em> with the output attached, and write a command from a description, shown before it runs. Needs VS Code 1.93 shell integration.</li>
<li><strong>Workspace index</strong> rewritten: an incremental index with a manifest, hybrid BM25 and vector search, a reranker in worker threads, <code>@workspace</code> or automatic mode.</li>
<li>Dependencies updated.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.9</title>
      <link>https://twinny.dev/changelog/4.0.9</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.9</guid>
      <pubDate>Mon, 07 Sep 2026 12:00:00 GMT</pubDate>
      <description>- Inline edit: Ctrl+I streams a merged diff into the editor with Accept and Reject per hunk (CodeLens and keys); Fix with Twinny quick fix.
- Autocomplete takes context from the language server and from recent edits (diff hunks against a baseline per document).
- Tests written next to the code they cover.</description>
      <content:encoded><![CDATA[<ul>
<li><strong>Inline edit</strong>: Ctrl+I streams a merged diff into the editor with Accept and Reject per hunk (CodeLens and keys); <em>Fix with Twinny</em> quick fix.</li>
<li><strong>Autocomplete</strong> takes context from the language server and from recent edits (diff hunks against a baseline per document).</li>
<li>Tests written next to the code they cover.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>twinny 4.0.6</title>
      <link>https://twinny.dev/changelog/4.0.6</link>
      <guid isPermaLink="true">https://twinny.dev/changelog/4.0.6</guid>
      <pubDate>Mon, 07 Sep 2026 12:00:00 GMT</pubDate>
      <description>The 4.x rewrite.</description>
      <content:encoded><![CDATA[<p>The 4.x rewrite.</p>
<ul>
<li><strong>Autocomplete</strong> rebuilt: a per-request completion stream with a termination policy (stop words, blank line, dedent, bracket depth, suffix duplicate, max lines), type-through continuation, stop sequences sent server-side, plain continuation at end of file, imports first in the context budget. Template bugs for qwen2.5-coder, CodeGemma and DeepSeek fixed.</li>
<li><strong>Devices</strong>: use the GPU in another of your computers over an encrypted peer-to-peer link with a pairing code; no account, no relay. Symmetry is removed.</li>
<li><strong>First run</strong> discovers a local model server instead of assuming Ollama; a welcome view and a reset command.</li>
<li><strong>Next edit</strong> as its own provider type for the Sweep next-edit model.</li>
<li><strong>QVAC</strong> located at runtime with an in-tab install guide.</li>
<li>Status bar rewritten; the commit-message command restored; chat lifecycle and error fixes; macOS 15 Intel build.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
