<?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.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>
