<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vatio changelog</title>
    <link>https://vatio.ai/changelog</link>
    <atom:link href="https://vatio.ai/changelog/rss.xml" rel="self" type="application/rss+xml" />
    <description>What changed in Vatio, week by week.</description>
    <language>en</language>
    <item>
      <title>Replies never invent a price</title>
      <link>https://vatio.ai/changelog/2026-10-26</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-10-26</guid>
      <pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate>
      <description>&lt;p&gt;Every agent now checks the amounts of money in its replies against what your tools and prompt said. API keys became one concept, quiet hours let you choose when the agent stays silent, and a few surfaces were removed so the CLI and the MCP are the way in.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No invented amounts: a price in a reply must come from a tool, your instructions or a quote that adds up from them, or the agent says it is not confirmed.&lt;/li&gt;&lt;li&gt;Two kinds of API keys, publishable and secret, on one page in the inbox and under vatio keys; secret keys now say live or preview.&lt;/li&gt;&lt;li&gt;Quiet hours: a weekly schedule in which the agent stays silent on every channel, set in the inbox or with vatio quiet-hours.&lt;/li&gt;&lt;li&gt;Tools can send photos on WhatsApp and take the files a visitor sent, and failed WhatsApp sends are retried a bounded number of times.&lt;/li&gt;&lt;li&gt;Export and erase a person from the CLI or the MCP, and safer sign-in: inviting people and minting server keys need two-step verification.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The way in has not changed: &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; and &lt;code&gt;/vatio-init&lt;/code&gt; in your
app’s project. What is new is a check on every reply: the
&lt;a href=&quot;/docs/safeguards&quot;&gt;Safeguards&lt;/a&gt; page lists what it catches and what the agent
says when an amount is not confirmed.&lt;/p&gt;
&lt;p&gt;Keys are now &lt;a href=&quot;/docs/cli/keys&quot;&gt;publishable or secret&lt;/a&gt;, and the CLI and the
&lt;a href=&quot;/docs/mcp&quot;&gt;MCP&lt;/a&gt; are the surfaces to work from: the HTTP developer API behind
them is no longer documented, and people’s data is exported or erased with
&lt;a href=&quot;/docs/cli/contacts&quot;&gt;&lt;code&gt;vatio contacts&lt;/code&gt;&lt;/a&gt;. To choose when the agent stays silent,
see &lt;a href=&quot;/docs/handoff#hours-when-the-agent-does-not-answer&quot;&gt;Human in the loop&lt;/a&gt;;
for photos and visitor files, &lt;a href=&quot;/docs/tools#photos&quot;&gt;Tools&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.106.0 — 2026-10-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio chat list&lt;/code&gt; no longer talks to your agent.&lt;/strong&gt; A lone word that reads like
a subcommand (&lt;code&gt;list&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;history&lt;/code&gt;…) is refused and nothing is
sent; the error points at &lt;code&gt;vatio chat show [CHAT_ID]&lt;/code&gt; and
&lt;code&gt;vatio chat export --from DATE&lt;/code&gt;. Before, it went to the agent as a message and
started a chat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secret keys name their environment.&lt;/strong&gt; A new one is &lt;code&gt;vsk_live_…&lt;/code&gt; or
&lt;code&gt;vsk_preview_…&lt;/code&gt;; keys from before are plain &lt;code&gt;vsk_…&lt;/code&gt; and keep working. The
inbox creates a secret key as a live and preview pair, for one
&lt;code&gt;VATIO_SERVER_KEY&lt;/code&gt; variable with a different value per environment.
&lt;code&gt;vatio keys create secret --env live|preview&lt;/code&gt; still makes one at a time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;vatio-add-to-app&lt;/code&gt; skill is gone&lt;/strong&gt; (&lt;code&gt;@vatio-ai/skills&lt;/code&gt; 1.27.0). To put
the agent in your app, ask your coding agent to add the
&lt;a href=&quot;/docs/channels/widget&quot;&gt;web widget&lt;/a&gt; or the iOS, Android or Flutter SDK. Running
&lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; again removes the old copy.&lt;/p&gt;&lt;h2&gt;0.105.0 — 2026-10-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Agents no longer state amounts nobody gave them.&lt;/strong&gt; A new safeguard,
&lt;code&gt;no_invented_amounts&lt;/code&gt;, runs on every reply of every agent: an amount of money
in a draft (&lt;code&gt;$25.000&lt;/code&gt;, &lt;code&gt;US$49.99&lt;/code&gt;, &lt;code&gt;25 lucas&lt;/code&gt;) must be a number a tool returned
in the conversation, an amount written in the prompt, or a quote that adds up
from those (a quantity times a unit price, plus up to two other amounts, such
as shipping). Any other amount sends the draft back to the model, as an
unauthorized link does; if the model keeps writing it, the reply says the
amount is not confirmed. A price the visitor proposed is never one, a price
the owner gives in a conversation with one of the business’s own numbers is.
&lt;code&gt;send_image&lt;/code&gt; refuses a caption with an invented price. The inbox and
&lt;code&gt;vatio chat show&lt;/code&gt; name the policy on a discarded draft. See
&lt;a href=&quot;/docs/safeguards&quot;&gt;Safeguards&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.104.0 — 2026-10-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whatsapp mine&lt;/code&gt;: your numbers from the CLI, before a number is
connected.&lt;/strong&gt; &lt;code&gt;vatio whatsapp mine NUMBER...&lt;/code&gt; sets the business’s own numbers
(the inbox’s &lt;strong&gt;Your numbers&lt;/strong&gt;), &lt;code&gt;--clear&lt;/code&gt; empties the list, and with no
arguments it prints them; plain &lt;code&gt;vatio whatsapp&lt;/code&gt; prints them too. They now
belong to the workspace rather than to the connected number, so they can be
set first and they outlive reconnecting one. On the preview number the list
decides who is the business: list your test phone to try
&lt;a href=&quot;/docs/tools#access&quot;&gt;&lt;code&gt;access: owner&lt;/code&gt;&lt;/a&gt; tools, leave it off to talk to the agent as a
customer. See &lt;a href=&quot;/docs/cli/channels#your-numbers&quot;&gt;Your numbers&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.103.0 — 2026-10-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Owner tools and photos on WhatsApp.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;access: owner&lt;/code&gt;&lt;/strong&gt; gives a tool only to the business itself: a WhatsApp
conversation with one of &lt;strong&gt;Your numbers&lt;/strong&gt; (Channels → WhatsApp). Anyone else
is never shown the tool, a call that names it anyway is refused with
&lt;code&gt;owner_only&lt;/code&gt;, and in an owner conversation the agent is told it is talking
with the business. Run the business from WhatsApp with it: update stock,
confirm a payment, add a product from a photo. In preview, while &lt;strong&gt;Your
numbers&lt;/strong&gt; is empty, every phone verified on &lt;strong&gt;Try the agent&lt;/strong&gt; counts as one.
See &lt;a href=&quot;/docs/tools#access&quot;&gt;Access&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;send_image&lt;/code&gt;&lt;/strong&gt;, a new built-in tool, sends a WhatsApp contact a photo one
of your tools returned in the conversation, with a caption, right after the
reply: a product from your catalog, say. A URL the agent wrote or a visitor
typed is refused. JPEG or PNG over &lt;code&gt;https&lt;/code&gt;, up to 5 MB and 10 a turn; the
photos show in the inbox. See &lt;a href=&quot;/docs/tools#photos&quot;&gt;Photos&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.102.0 — 2026-10-24&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Fewer surfaces: the CLI and the MCP.&lt;/strong&gt; The HTTP developer API behind them
(&lt;code&gt;/api/developer/v1&lt;/code&gt;, &lt;code&gt;vat_&lt;/code&gt; tokens) is no longer documented and is not a
supported surface: it can change without notice. What your own backend calls
stays documented and stable: &lt;a href=&quot;/docs/api/messages&quot;&gt;messages&lt;/a&gt; with a secret key,
&lt;a href=&quot;/docs/api/webhooks&quot;&gt;webhooks&lt;/a&gt; and &lt;a href=&quot;/docs/api/errors&quot;&gt;errors&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio contacts export ID&lt;/code&gt; and &lt;code&gt;vatio contacts delete ID&lt;/code&gt;&lt;/strong&gt; replace the
Contacts API for access, portability and erasure requests. &lt;code&gt;export&lt;/code&gt; prints the
JSON (or writes it with &lt;code&gt;--out FILE&lt;/code&gt;); &lt;code&gt;delete&lt;/code&gt; shows what goes and asks you to
type the id, and needs &lt;code&gt;--yes&lt;/code&gt; without a terminal. See
&lt;a href=&quot;/docs/cli/contacts&quot;&gt;Contacts&lt;/a&gt;. The &lt;a href=&quot;/docs/mcp&quot;&gt;MCP&lt;/a&gt; gets the same two as
&lt;code&gt;export_contact&lt;/code&gt; and &lt;code&gt;erase_contact&lt;/code&gt;; erasing needs &lt;code&gt;confirm_contact_id&lt;/code&gt; to
repeat the id.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routines are gone.&lt;/strong&gt; &lt;code&gt;vatio routines&lt;/code&gt; and the &lt;code&gt;routine:&lt;/code&gt; tool file no longer
exist. To hand work to Claude from WhatsApp, use an ordinary tool that calls
your own backend, which checks who is asking and fires the routine’s API
trigger. See &lt;a href=&quot;/docs/guides/give-claude-a-whatsapp&quot;&gt;Give Claude a WhatsApp number&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supabase sign-in is gone.&lt;/strong&gt; &lt;code&gt;vatio auth --supabase&lt;/code&gt; and &lt;code&gt;auth: supabase:&lt;/code&gt; in
&lt;code&gt;vatio.yml&lt;/code&gt; no longer exist, and the widget no longer reads the page’s
Supabase session. An app on Supabase signs the visitor token in an Edge
Function like any other stack; see &lt;a href=&quot;/docs/authentication/&quot;&gt;Authentication&lt;/a&gt;.
Nothing in production used it.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.101.0 — 2026-10-23&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One concept, API keys, of two kinds.&lt;/strong&gt; What was a publishable token and what
was a server key are now the &lt;strong&gt;publishable key&lt;/strong&gt; (&lt;code&gt;vatpub_…&lt;/code&gt;, for a page or an
app) and the &lt;strong&gt;secret key&lt;/strong&gt; (&lt;code&gt;vsk_…&lt;/code&gt;, for your backend). The values and
prefixes of the keys you already have do not change, and neither do the widget’s
&lt;code&gt;data-token&lt;/code&gt;, the SDKs’ &lt;code&gt;token&lt;/code&gt; or the &lt;code&gt;Authorization: Bearer&lt;/code&gt; header. In the
inbox they are one page, &lt;strong&gt;Settings → API keys&lt;/strong&gt;, with a single &lt;strong&gt;New key&lt;/strong&gt;
button at the top right that asks the kind.&lt;/p&gt;
&lt;p&gt;This breaks Vatio’s own commands and REST paths, with no aliases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio tokens&lt;/code&gt; is gone.&lt;/strong&gt; &lt;code&gt;vatio tokens create --env live --label website --origin URL&lt;/code&gt; is now &lt;code&gt;vatio keys create publishable --env live --label website --origin URL&lt;/code&gt;, and &lt;code&gt;vatio tokens origins PREFIX URL...&lt;/code&gt; is &lt;code&gt;vatio keys origins PREFIX URL...&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio keys create&lt;/code&gt; needs &lt;code&gt;publishable&lt;/code&gt; or &lt;code&gt;secret&lt;/code&gt;.&lt;/strong&gt; There is no default
kind: what used to be &lt;code&gt;vatio keys create --env live&lt;/code&gt; is
&lt;code&gt;vatio keys create secret --env live&lt;/code&gt;. &lt;code&gt;--origin&lt;/code&gt; is only for a publishable
key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio keys list&lt;/code&gt; shows both kinds&lt;/strong&gt;, with a kind column and the keys Vatio
manages marked. &lt;code&gt;--json&lt;/code&gt; prints the list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The developer API&lt;/strong&gt; replaces &lt;code&gt;publishable_tokens&lt;/code&gt; and &lt;code&gt;server_keys&lt;/code&gt; with
&lt;code&gt;api_keys&lt;/code&gt;: &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST /api_keys&lt;/code&gt; (the body names the &lt;code&gt;kind&lt;/code&gt;),
&lt;code&gt;PATCH /api_keys/:prefix&lt;/code&gt; for a publishable key’s origins and
&lt;code&gt;DELETE /api_keys/:prefix&lt;/code&gt;. The create response carries the full &lt;code&gt;key&lt;/code&gt; once
and the new &lt;code&gt;api_key&lt;/code&gt;. An unknown kind answers 422 &lt;code&gt;invalid_key_kind&lt;/code&gt;.
See &lt;a href=&quot;/docs/cli/keys&quot;&gt;API keys&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.100.3 — 2026-10-23&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Security fixes.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Signing in from the CLI.&lt;/strong&gt; The approval page no longer emails a sign-in
link. To sign in with your email there, you get the regular code by email,
type it in the same browser, and come back to approve the terminal. Google
and GitHub work as before.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inviting from the CLI.&lt;/strong&gt; &lt;code&gt;vatio team invite&lt;/code&gt; now needs two-step
verification on your account. Without it, invite from the inbox, under Team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two-step verification for the riskiest changes.&lt;/strong&gt; In the inbox, inviting
a member, minting a server key, offering the workspace to a new owner and
deleting it now need two-step verification on your account. &lt;strong&gt;Security&lt;/strong&gt;
lists who on the team doesn’t have it yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP tokens.&lt;/strong&gt; A token issued to an MCP client over OAuth now works only at
&lt;code&gt;/mcp&lt;/code&gt;, not on the rest of the developer API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credentials in the CLI.&lt;/strong&gt; The file that holds your token is created
readable only by you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opening your browser on Windows.&lt;/strong&gt; The CLI no longer opens it through
&lt;code&gt;cmd.exe&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.100.2 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Vatio no longer triages or fixes reports itself.&lt;/strong&gt; It used to read each report
as it was filed, say where the fix lived and, for the agent’s instructions or a
knowledge entry, change preview and test the change on its own. Every open
report is now your developer’s, to fix with their coding agent through
&lt;code&gt;/vatio:vatio-improve&lt;/code&gt;, and Vatio changes nothing on preview by itself.
Continuous improvement lists the reports by state, with the latest test, and
&lt;code&gt;vatio flags&lt;/code&gt; no longer has a &lt;strong&gt;What Vatio did&lt;/strong&gt; section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Connect Supabase” is gone from the inbox.&lt;/strong&gt; No workspace used it. Your
Supabase project is named in &lt;code&gt;vatio.yml&lt;/code&gt; (&lt;code&gt;auth: supabase:&lt;/code&gt;), and
&lt;code&gt;vatio auth --supabase&lt;/code&gt; reads it from the &lt;code&gt;.env&lt;/code&gt; of your project or from the URL
you pass. Nothing changes for a project that already declares it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Test page is gone: Try the agent, Tests and versions moved.&lt;/strong&gt; &lt;strong&gt;Try the
agent&lt;/strong&gt;, a button at the top of Conversations, opens the web chat, the shared
WhatsApp number and the shared Instagram account over the list. Conversations
has a &lt;strong&gt;Customers | Tests&lt;/strong&gt; switch, and Tests holds what the team said to the
agent on preview. The version cards are at the top of &lt;strong&gt;Continuous improvement&lt;/strong&gt;, read-only:
&lt;strong&gt;Publish&lt;/strong&gt;, &lt;strong&gt;Run tests&lt;/strong&gt; and the knowledge-conflict page left the inbox. You
publish with &lt;code&gt;vatio publish&lt;/code&gt;, run tests with &lt;code&gt;vatio test&lt;/code&gt; and resolve a
knowledge conflict by reading the entry from live (&lt;code&gt;vatio kb cat BASE ENTRY --env live&lt;/code&gt;) and writing your change on top (&lt;code&gt;vatio kb write&lt;/code&gt;), or by asking
your coding agent; &lt;code&gt;vatio kb publish&lt;/code&gt; publishes knowledge alone. &lt;code&gt;review_url&lt;/code&gt;
and &lt;code&gt;knowledge_url&lt;/code&gt; are now always null. Old &lt;code&gt;/&amp;#x3C;workspace&gt;/test&lt;/code&gt; links
redirect, and the link &lt;code&gt;vatio push&lt;/code&gt; prints opens Try the agent. On Channels, the packages card
became one card that points at &lt;code&gt;/vatio-add-to-app&lt;/code&gt; and the documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Contacts page and the inbox’s contact export are gone.&lt;/strong&gt; The inbox no
longer lists or searches every person, and it no longer exports one. A person is
seen and forgotten from their conversation: the contact pane beside it keeps
their name, channels, memories and other conversations, and &lt;strong&gt;Forget this
contact&lt;/strong&gt; (owner and developers). The per-person export and delete stay in the
developer API (&lt;code&gt;GET /contacts/:id/export&lt;/code&gt;, &lt;code&gt;DELETE /contacts/:id&lt;/code&gt;), with a token
and recorded in Activity. Old &lt;code&gt;/&amp;#x3C;workspace&gt;/contacts&lt;/code&gt; links land on Conversations.&lt;/p&gt;&lt;h2&gt;0.100.1 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt; no longer sends another session when it cannot find
the one it runs in.&lt;/strong&gt; Run from inside Claude Code or Codex, it takes that
session. When that session’s file was not where it looked, it used to fall
back, without a word, to the newest session for the directory: another
conversation. It now stops and says so, and &lt;code&gt;--list&lt;/code&gt; and &lt;code&gt;--id ID&lt;/code&gt; pick one.
From a terminal it still takes the newest session for the directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio test&lt;/code&gt; no longer fails a case only because a replay is not signed
in.&lt;/strong&gt; A replay never has a signed-in visitor, so an &lt;code&gt;access: private&lt;/code&gt; tool it
calls for real answers &lt;code&gt;not_authenticated&lt;/code&gt;. A case that failed because of that
is now marked &lt;strong&gt;not tested (a tool needs a signed-in visitor)&lt;/strong&gt; with the tool,
like a case that needed the test phone’s contact, instead of reading as a
regression of your agent. Calls the reported turn made still get the answer
your backend gave then.&lt;/p&gt;&lt;h2&gt;0.100.0 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio team&lt;/code&gt;: see who is in the workspace and invite someone.&lt;/strong&gt; &lt;code&gt;vatio team&lt;/code&gt;
lists the owner and everyone invited, and who has not signed in yet; &lt;code&gt;vatio team invite EMAIL --role viewer|supervisor|developer&lt;/code&gt; invites them and emails them,
the same invitation as the inbox’s Team page. It is the owner’s alone, as there,
and the role has to be named. When the owner’s account has a second factor, the
invite takes a fresh code from it (&lt;code&gt;--code&lt;/code&gt;), as the inbox asks the owner to
confirm. Removing someone and changing a role stay in the inbox. See
&lt;a href=&quot;/docs/cli/team&quot;&gt;Team&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whatsapp test-phones&lt;/code&gt; lists the phones verified on the Test page.&lt;/strong&gt; A
coding agent that needs a number to send a preview message to no longer has to
ask the developer for it. Plain &lt;code&gt;vatio whatsapp&lt;/code&gt; prints them too, whether or
not the workspace has a number of its own. Adding a phone is still only in the
inbox. See &lt;a href=&quot;/docs/cli/channels&quot;&gt;Channels&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.99.1 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt; says what to do when you run it after &lt;code&gt;!&lt;/code&gt; in Claude
Code.&lt;/strong&gt; Typed at Claude Code’s &lt;code&gt;!&lt;/code&gt; prompt, it has no terminal to ask from, so
it refused with a message addressed to a coding agent, and nothing was sent.
It now also tells the person to add &lt;code&gt;--yes&lt;/code&gt;. Nothing else changes: it still
sends only after a yes, or with &lt;code&gt;--yes&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.99.0 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A push says who can see it, not which environment it landed in.&lt;/strong&gt; Until
someone outside your team talks to your agent the workspace is a
&lt;a href=&quot;/docs/deployments#draft-and-published&quot;&gt;draft&lt;/a&gt; and live follows every push, so
&lt;code&gt;vatio push&lt;/code&gt; said &lt;code&gt;to preview&lt;/code&gt; about a version that was already answering
people. It now says what happened instead: &lt;code&gt;Your agent is answering with this now&lt;/code&gt; while the workspace is a draft, and once it is published, which
deployment visitors still get and what is left before they get this one. The
environment is named only when the push is waiting for a
&lt;a href=&quot;/docs/cli/deploy&quot;&gt;&lt;code&gt;vatio publish&lt;/code&gt;&lt;/a&gt;. The docs follow the same order: &lt;code&gt;Draft and published&lt;/code&gt; comes first, and preview appears where it starts to mean
something. &lt;code&gt;staging&lt;/code&gt; and &lt;code&gt;sandbox&lt;/code&gt; are still accepted as names for preview
and are no longer documented.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An unknown command suggests the closest one.&lt;/strong&gt; &lt;code&gt;vatio puhs&lt;/code&gt; offers &lt;code&gt;push&lt;/code&gt;,
a subcommand on its own (&lt;code&gt;vatio show&lt;/code&gt;) lists the commands it belongs to, a
sentence (&lt;code&gt;vatio &quot;do you deliver?&quot;&lt;/code&gt;) offers &lt;code&gt;vatio chat&lt;/code&gt;, and the package
name used as a command — &lt;code&gt;npx @vatio-ai/cli @vatio-ai/cli push&lt;/code&gt;, the
commonest way to get the invocation wrong — says so and prints the command to
run. It used to answer all of them with the whole help text, which is where
the reader had already failed to find what they wanted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio secrets set KEY --from-env&lt;/code&gt;&lt;/strong&gt; takes the value from your shell or the
&lt;code&gt;.env&lt;/code&gt; beside your &lt;code&gt;vatio.yml&lt;/code&gt; and sends it without printing it, so a coding
agent can set a secret it is not allowed to read instead of stopping to ask
you to run the command. Only the key you name is read. &lt;code&gt;--from-env NAME&lt;/code&gt;
reads a different local name. See &lt;a href=&quot;/docs/cli/secrets&quot;&gt;Secrets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One &lt;code&gt;http://localhost&lt;/code&gt; origin covers every port.&lt;/strong&gt; A publishable token that
lists &lt;code&gt;http://localhost:3000&lt;/code&gt; now works on &lt;code&gt;:5173&lt;/code&gt; or whatever port your dev
server picked today, the way a loopback OAuth redirect URI already did
(RFC 8252 §7.3). A changed &lt;code&gt;PORT&lt;/code&gt; was silently a blank widget. Only &lt;code&gt;http&lt;/code&gt;
loopback: &lt;code&gt;https://localhost:5000&lt;/code&gt; is still its own origin. See
&lt;a href=&quot;/docs/cli/keys&quot;&gt;Tokens&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio test&lt;/code&gt; explains how to start a suite.&lt;/strong&gt; With nothing to replay it
pointed at reporting a reply that went wrong, which is no help on a workspace
where nothing has gone wrong yet; it now shows &lt;code&gt;vatio chat --new&lt;/code&gt; plus
&lt;code&gt;vatio test add&lt;/code&gt;, which is how a reply that is already right is kept. A test
run’s report no longer fails with an uncaught timeout when it takes a while
to render: it says the run is still on Vatio’s servers and to ask again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio changelog&lt;/code&gt; says what a newer release would bring.&lt;/strong&gt; It prints which
release is current, the headline of every change between the version you have
and that one, and the npm command that installs it; &lt;code&gt;--full&lt;/code&gt; prints each entry
whole. npm still does the updating, so &lt;code&gt;vatio update&lt;/code&gt; is still not a command —
its refusal names this one now. That refusal was the only answer a coding agent
could get, because the “a new release is available” notice prints only to a
terminal and an agent has none. The automatic jump to the current release
(&lt;code&gt;426 cli_outdated&lt;/code&gt;) names the command as well.&lt;/p&gt;&lt;h2&gt;0.98.0 — 2026-10-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The plan belongs to an organization.&lt;/strong&gt; Every workspace now sits in an
organization, and the plan, the subscription and the monthly conversations
belong to it: its workspaces share one plan, and the conversations of all of
them count against it. Whoever has one workspace sees no difference. The owner
of an organization can add more workspaces to it, each one an agent for a
different workflow, with &lt;code&gt;vatio init SLUG --org ORG&lt;/code&gt; or the &lt;code&gt;create_workspace&lt;/code&gt;
tool’s &lt;code&gt;organization&lt;/code&gt; argument. A workspace transferred to someone else leaves
for an organization of its own unless it was the only one in its organization,
which then goes along with its plan. Contacts and conversations stay in the
workspace they belong to.&lt;/p&gt;&lt;h2&gt;0.97.0 — 2026-10-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Choose when the agent does not answer.&lt;/strong&gt; A weekly schedule, with any number
of ranges per day and a time zone, in which the agent stays silent on every
channel. A message that arrives inside a range is not answered afterwards: it
waits for your team in the inbox. Set it in the inbox under Channels → Quiet
hours, or with &lt;a href=&quot;/docs/cli/quiet-hours&quot;&gt;&lt;code&gt;vatio quiet-hours&lt;/code&gt;&lt;/a&gt;. Without one the agent answers around the
clock. See &lt;a href=&quot;/docs/handoff#hours-when-the-agent-does-not-answer&quot;&gt;Human in the loop&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.96.0 — 2026-10-20&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tools can send the visitor’s files.&lt;/strong&gt; A tool parameter declared with
&lt;code&gt;format: vatio-attachment&lt;/code&gt; takes a file the visitor sent in the conversation,
such as the screenshot on a support ticket. The agent picks the file by the
attachment id it now sees next to each one. Your backend gets a link that
expires after 1 hour, with the filename, type and size. Only files the
visitor sent in that conversation can be sent; any other value goes back to
the agent as &lt;code&gt;invalid_argument&lt;/code&gt;. Each file sent appears on the Activity page.
&lt;code&gt;$params.&amp;#x3C;name&gt;.&amp;#x3C;field&gt;&lt;/code&gt; reads a field of an object argument, such as
&lt;code&gt;$params.screenshot.url&lt;/code&gt;. See &lt;a href=&quot;/docs/tools#visitor-files&quot;&gt;Visitor files&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.95.0 — 2026-10-19&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One request, bounded retries.&lt;/strong&gt; Vatio retries confirmed WhatsApp send and
delivery failures for developer messages in every mode. A request keeps the
same message ID and idempotency key through four total attempts; the API and
inbox show the attempt count and next retry time. In a conversation, the
message’s receipt says which attempt got it through, and its tooltip when
each retry ran and after which error. The developer receives a
failure webhook when Vatio has no safe attempts left. Opt-outs and uncertain
send outcomes stop immediately to avoid unwanted or duplicate messages.
&lt;code&gt;vatio messages failed&lt;/code&gt; lists final failures; the separate resend command
and API are removed.&lt;/p&gt;&lt;h2&gt;0.94.0 — 2026-10-19&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Review failed WhatsApp messages.&lt;/strong&gt; The inbox groups failures by cause, the
server API and &lt;code&gt;vatio messages failed&lt;/code&gt; filter them by error and date, and a
&lt;code&gt;channel.issue&lt;/code&gt; webhook reports account-level problems. This version also
introduced separate resend attempts, which 0.95.0 replaces with retries on
the original request.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build and run your agent from a chat</title>
      <link>https://vatio.ai/changelog/2026-10-19</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-10-19</guid>
      <pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate>
      <description>&lt;p&gt;Vatio is now an MCP server: add vatio.ai/mcp to Claude or ChatGPT and work on your agent from a chat. The way in is still two lines in your app's project, and reported replies now double as a test suite you replay on every version.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Vatio in Claude and ChatGPT: add https://vatio.ai/mcp, sign in, and create, edit, test and publish your agent from a chat.&lt;/li&gt;&lt;li&gt;Reported replies become tests: vatio flags add reports a reply from the terminal, vatio test add keeps one that is already right, and vatio test replays them all on every version.&lt;/li&gt;&lt;li&gt;A Flutter SDK, and a guide to the AI agent runtime that follows one message from your customer to the reply.&lt;/li&gt;&lt;li&gt;vatio pull brings the agent Vatio runs back into your files, and vatio push no longer overwrites edits made outside them.&lt;/li&gt;&lt;li&gt;A new agent's live follows preview until someone outside your team talks to it, so there is nothing to publish at first.&lt;/li&gt;&lt;li&gt;The inbox got simpler: knowledge is read-only there, Test shows the next version only when there is one, and vatio.ai now has a Spanish landing at vatio.ai/es.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The way in has not changed: &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; and &lt;code&gt;/vatio-init&lt;/code&gt; in your
app’s project. What is new is a second place to work from. &lt;a href=&quot;/docs/mcp&quot;&gt;Vatio in Claude and
ChatGPT&lt;/a&gt; explains how to connect, and the
&lt;a href=&quot;/docs/cli/improve#tests-from-the-terminal&quot;&gt;Tests from the terminal&lt;/a&gt; section
shows how a few &lt;code&gt;vatio chat&lt;/code&gt; and &lt;code&gt;vatio flags add&lt;/code&gt; commands become a suite.&lt;/p&gt;
&lt;p&gt;A flag on a preview chat is now a note for your coding agent, not a test:
&lt;code&gt;vatio flags&lt;/code&gt; lists it and your next &lt;code&gt;vatio push&lt;/code&gt; closes it. The tests are the
reports on real conversations and the replies &lt;code&gt;vatio test add&lt;/code&gt; keeps.&lt;/p&gt;
&lt;p&gt;Earlier in the week: the &lt;a href=&quot;/docs/guides/&quot;&gt;guides by use case&lt;/a&gt; for bookings, orders,
support and onboarding, &lt;code&gt;vatio test&lt;/code&gt; running in the background on Vatio’s
servers, and &lt;code&gt;/vatio-analyze&lt;/code&gt;, which reads a stretch of redacted conversations
and writes up what people ask. For the whole picture of a turn, read
&lt;a href=&quot;/docs/guides/ai-agent-runtime&quot;&gt;the AI agent runtime&lt;/a&gt;; for Flutter,
&lt;a href=&quot;/docs/guides/ai-agent-in-your-flutter-app&quot;&gt;an AI agent in your Flutter app&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.93.0 — 2026-10-17&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A flag on preview is a note, not a test.&lt;/strong&gt; Flagging a reply in a test
conversation, or with &lt;code&gt;vatio flags add&lt;/code&gt; after a &lt;code&gt;vatio chat&lt;/code&gt; (preview by
default), now leaves a note for your coding agent: &lt;code&gt;vatio flags&lt;/code&gt; lists it and
says so, but it is no eval case, Vatio does not triage or fix it, it is not in
the daily mail or in Continuous improvement, and your next &lt;code&gt;vatio push&lt;/code&gt; closes
it. The tests are the reports on real conversations and the replies
&lt;code&gt;vatio test add&lt;/code&gt; keeps, which now also keeps a reply that is not right yet: it
fails until a version gets it right. The case of a preview flag that was
already resolved stays, as a test; an open one’s goes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The business description moved into the instructions.&lt;/strong&gt; What the business
does goes in &lt;code&gt;agent.instructions&lt;/code&gt;. &lt;code&gt;vatio business set --description&lt;/code&gt; is
refused; a workspace that still has one keeps it in the prompt, &lt;code&gt;vatio push&lt;/code&gt;
and &lt;code&gt;vatio business&lt;/code&gt; say so, and &lt;code&gt;vatio business set --clear-description&lt;/code&gt;
removes it once live runs instructions that say it. The name and brand stay
in &lt;code&gt;vatio business set&lt;/code&gt;, and in the inbox under &lt;strong&gt;Channels → Web widget&lt;/strong&gt;: the
&lt;strong&gt;Business&lt;/strong&gt; page is gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The inbox’s Test shows the next version only when there is one.&lt;/strong&gt; When live
runs what preview runs, Test shows live alone; a push newer than live shows
as a new version, with its tests and Publish. Test chats is part of Test now
and only developers see it. View manifest and Roll back left the inbox: use
&lt;code&gt;vatio pull&lt;/code&gt; and &lt;code&gt;vatio rollback&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.92.1 — 2026-10-17&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The inbox has no Tools page any more.&lt;/strong&gt; &lt;code&gt;vatio tools&lt;/code&gt; is where each tool’s
calls, error rate, timeouts and p50/p95 are read, with the calls that failed
and what your backend answered; its help no longer points at the inbox, and
&lt;code&gt;console_url&lt;/code&gt; in &lt;code&gt;vatio tools --json&lt;/code&gt; is now the docs page that explains the
numbers. The inbox also lost its environment switch: &lt;strong&gt;Conversations&lt;/strong&gt; is
real people’s, on live, and &lt;strong&gt;Test chats&lt;/strong&gt; is the team’s own, on preview. A
link with &lt;code&gt;?environment=preview&lt;/code&gt; opens in Test chats.&lt;/p&gt;&lt;h2&gt;0.92.0 — 2026-10-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A test runs the turn it is about, as it happened.&lt;/strong&gt; A report’s test used to
act the conversation out again: every visitor message sent anew, the agent’s
earlier replies written again, as your test phone, today, with writes
simulated. A reply whose cause was that world (your backend answering “this
number has no account”) failed whatever the fix. Now a test is a photo of the
turn, taken when it is made: the conversation as it happened up to the
visitor’s message, who they were, when they wrote, and what your backend
answered on that turn. &lt;code&gt;vatio test&lt;/code&gt; writes only that turn’s reply, on the
version under test. A tool call it repeats gets the answer your backend gave
then when asking again would ask about somebody else (the tool’s request names
the visitor) or would not be sent (a write with no test value); any other call
goes to your backend again, so a fix there still shows, and the report says
which answers came from the photo. See &lt;a href=&quot;/docs/improve#eval-runs&quot;&gt;Eval runs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio test add &quot;NOTE&quot;&lt;/code&gt; keeps a reply that is right.&lt;/strong&gt; It replaces
&lt;code&gt;vatio flags add --passes&lt;/code&gt;: a reply that is already right is a test, not a
report, so it has no report for Vatio to triage or fix and is not in the
inbox. &lt;code&gt;vatio test list&lt;/code&gt; lists them and &lt;code&gt;vatio test rm ID&lt;/code&gt; removes one; their
ids start with &lt;code&gt;C-&lt;/code&gt;. The ones made with &lt;code&gt;--passes&lt;/code&gt; are tests now, with their
ids. See &lt;a href=&quot;/docs/cli/improve#tests-from-the-terminal&quot;&gt;Tests from the terminal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A 4xx your backend sends on purpose is an answer, not a failure.&lt;/strong&gt; A report
whose turn got “HTTP 404, this number has no account” reads &lt;strong&gt;Your agent&lt;/strong&gt;:
“Your backend answered HTTP 404 to &lt;code&gt;get_context&lt;/code&gt;”, with the fix in what the
agent does with that answer, and Vatio can try an instructions fix for it.&lt;/p&gt;&lt;h2&gt;0.91.0 — 2026-10-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Report a reply from the terminal.&lt;/strong&gt; &lt;code&gt;vatio flags add &quot;NOTE&quot;&lt;/code&gt; does what the
inbox’s &lt;strong&gt;Report&lt;/strong&gt; does: it reports the agent’s last reply in the chat
&lt;code&gt;vatio chat&lt;/code&gt; is in, or &lt;code&gt;--chat ID&lt;/code&gt;’s, or any reply by &lt;code&gt;--message ID&lt;/code&gt;, with
what should have happened. It is a test case right away, so a few
&lt;code&gt;vatio chat --new &quot;…&quot;&lt;/code&gt; + &lt;code&gt;vatio flags add &quot;…&quot;&lt;/code&gt; are a test suite &lt;code&gt;vatio test&lt;/code&gt;
replays on every version. &lt;code&gt;--passes&lt;/code&gt; keeps a reply that is already right: the
case is filed resolved in the version that gave it, Vatio does not triage it,
and it is not pending in the inbox. See
&lt;a href=&quot;/docs/cli/improve#tests-from-the-terminal&quot;&gt;Tests from the terminal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio chat show&lt;/code&gt; prints each message’s id&lt;/strong&gt;, as &lt;code&gt;[assistant #4821]&lt;/code&gt;, the
id &lt;code&gt;vatio flags add --message&lt;/code&gt; takes.&lt;/p&gt;&lt;h2&gt;0.90.0 — 2026-10-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt; sends Codex sessions too.&lt;/strong&gt; From inside Codex it takes
the session it runs in (Codex names it in &lt;code&gt;CODEX_THREAD_ID&lt;/code&gt;), and from a
terminal the newest Claude Code or Codex session for the directory; &lt;code&gt;--list&lt;/code&gt;
shows both and says which is which. A Codex session is cleaned the same way:
Codex’s system prompt, events, token counts and encrypted reasoning stay
behind, images are dropped, and anything that looks like a secret, an email or
a phone is replaced. &lt;code&gt;--should-ask&lt;/code&gt; now answers from Codex as well, so a Codex
that reads the docs offers to send its session when it finishes. See
&lt;a href=&quot;/docs/cli/workspace#share-a-session&quot;&gt;Share a session&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex is recognized on Windows.&lt;/strong&gt; The CLI tells Vatio which coding agent ran
each command; on Windows, Codex was reported as &lt;code&gt;unknown&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.89.0 — 2026-10-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Vatio is an MCP server.&lt;/strong&gt; Add &lt;code&gt;https://vatio.ai/mcp&lt;/code&gt; to claude.ai, Claude
Code, ChatGPT or any MCP client, sign in with your Vatio account, and build and
run your agent from a chat: create a workspace, write its instructions, tools
and knowledge, talk to it, run the tests, publish, roll back, read
conversations and report replies. Signing in is OAuth on vatio.ai, with your
second step if you have one, and each connection shows up, named after the
app, under Account → Sessions in the inbox, where you can disconnect it.
Signing the CLI in again no longer closes those. See
&lt;a href=&quot;/docs/mcp&quot;&gt;Vatio in Claude and ChatGPT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The agent can change outside your files.&lt;/strong&gt; An edit from the MCP lands in
preview as a deployment of its own, built on what preview ran. &lt;code&gt;vatio push&lt;/code&gt;
no longer replaces those edits without saying so: while preview carries edits
your files have not seen, it is refused (&lt;code&gt;preview_edited_outside&lt;/code&gt;) with the
list of them, and &lt;code&gt;vatio push --force&lt;/code&gt; overwrites them on purpose.
&lt;code&gt;vatio status&lt;/code&gt; and the manifest endpoint list them too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio pull&lt;/code&gt; is back.&lt;/strong&gt; It writes the agent preview runs (or &lt;code&gt;--env live&lt;/code&gt;)
into your files: each &lt;code&gt;tools/NAME.yml&lt;/code&gt; exactly as deployed, and only the
&lt;code&gt;agent:&lt;/code&gt; block of your &lt;code&gt;vatio.yml&lt;/code&gt;, key by key, so comments, &lt;code&gt;workspace:&lt;/code&gt; and
&lt;code&gt;auth:&lt;/code&gt; stay as you wrote them. It wants a clean git tree, so git can give
back what it replaced; &lt;code&gt;--force&lt;/code&gt; writes anyway. After a pull or a push, the CLI
remembers which deployment your files match, and the next push sends it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversation exports carry message ids&lt;/strong&gt;, so a reply found in
&lt;code&gt;vatio chat export&lt;/code&gt; can be reported by id.&lt;/p&gt;&lt;h2&gt;0.88.0 — 2026-10-15&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio push&lt;/code&gt; signs you in before it creates anything, again.&lt;/strong&gt; The trial
workspaces 0.83.0 deployed from a machine with no account are gone: the first
&lt;code&gt;vatio push&lt;/code&gt; opens the browser to sign in (email, Google or GitHub), then
creates the workspace on your account, as it did before 0.83.0. Every
workspace has an owner from the moment it exists. &lt;code&gt;vatio init&lt;/code&gt; still asks for
no account, and the trial on vatio.ai’s landing stays as it is.&lt;/p&gt;
&lt;p&gt;A trial you already kept is an ordinary workspace and stays. One nobody kept
is deleted tonight with the landing’s trials; its link to keep it works until
then. &lt;code&gt;vatio-init&lt;/code&gt; (skills 1.20.0) says the first push signs the developer in.&lt;/p&gt;&lt;h2&gt;0.87.0 — 2026-10-15&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The model’s reasoning no longer reaches the visitor.&lt;/strong&gt; Now and then the model
wrote its own thinking as the text of a tool call, in English, mid-conversation
in Spanish (“wait, I should call knowledge_lookup”), and a turn that ended on
that row sent it on Instagram; the web showed it too. Vatio now clears that
text on every channel when it names one of the agent’s tools, talks about the
visitor in the third person, or is in English while the visitor writes in
another language. The tool call still runs. &lt;code&gt;vatio chat show&lt;/code&gt; marks the row
with &lt;code&gt;no_interim_reasoning&lt;/code&gt;. See &lt;a href=&quot;/docs/safeguards&quot;&gt;Safeguards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio publish&lt;/code&gt; names a tool that failed every call on preview.&lt;/strong&gt; A version
went live calling a backend route that was not deployed yet, and nothing said
so. Now, once a publish goes through, a notice names any tool whose calls on
preview since that version was pushed (up to the last 24 hours, at least 3)
all failed, with how the latest one did, and what to run next. It is a notice,
not a refusal: a released CLI already prints it. See
&lt;a href=&quot;/docs/cli/deploy#the-publish-gate&quot;&gt;The publish gate&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.86.1 — 2026-10-15&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt; hides passwords in &lt;code&gt;.properties&lt;/code&gt; files.&lt;/strong&gt; A line like
&lt;code&gt;storePassword=…&lt;/code&gt; or &lt;code&gt;android.injected.signing.store.password=…&lt;/code&gt;, as
&lt;code&gt;gradle.properties&lt;/code&gt; and an Android &lt;code&gt;key.properties&lt;/code&gt; write them, went out as it
was: only upper-case names such as &lt;code&gt;DB_PASSWORD=&lt;/code&gt; were caught. Any &lt;code&gt;key=value&lt;/code&gt;
line whose name has &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;secret&lt;/code&gt; or &lt;code&gt;token&lt;/code&gt; in it now becomes
&lt;code&gt;[REDACTED]&lt;/code&gt;, with or without a line number in front. &lt;code&gt;--save&lt;/code&gt; still shows
exactly what goes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio tokens create --json&lt;/code&gt;&lt;/strong&gt; prints the new token as JSON, and
&lt;code&gt;vatio tokens list --json&lt;/code&gt; the list. A script that hands the token to a
secrets store reads it from there instead of grepping the text, so a failed
command stops the script rather than storing an empty value.
&lt;a href=&quot;/docs/cli/keys&quot;&gt;Publishable tokens&lt;/a&gt; has an example. The skills (1.19.0) tell
your coding agent to use it, and to write &lt;code&gt;npx @vatio-ai/cli@latest&lt;/code&gt; rather
than &lt;code&gt;vatio&lt;/code&gt; in any command it hands you to run yourself: the &lt;code&gt;vatio&lt;/code&gt;
installed on your machine can be too old for Vatio to accept.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/docs/authentication/&quot;&gt;Supabase&lt;/a&gt; now says what to check before rotating to
an ES256 key (code that verifies tokens with the legacy secret, and Edge
Functions with Verify JWT on) instead of promising nothing changes, and what to
do if you are not ready to rotate: sign the visitor’s token yourself, from an
Edge Function. &lt;code&gt;vatio auth --supabase&lt;/code&gt; points there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claude Code’s auto mode refuses fewer Vatio commands.&lt;/strong&gt; The
&lt;a href=&quot;/docs/integrations/claude-code#auto-mode&quot;&gt;Claude Code&lt;/a&gt; page has two settings for
it. A rule in the project’s &lt;code&gt;.claude/settings.json&lt;/code&gt; lets Claude Code run
&lt;code&gt;vatio&lt;/code&gt; and still asks you before publishing, rolling back, secrets and server
keys. An entry in your own Claude Code settings tells auto mode that vatio.ai is
yours, so &lt;code&gt;vatio share-session&lt;/code&gt; is not taken for sending data out.
&lt;code&gt;vatio-init&lt;/code&gt; offers to add the project rule once the agent is pushed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whoami&lt;/code&gt; says which account this machine is signed in as.&lt;/strong&gt; An email, a
Google sign-in and a GitHub sign-in are separate accounts unless they share the
address, and a workspace belongs to one of them, so a &lt;code&gt;workspace_forbidden&lt;/code&gt; was
often the other account signed in, with nothing to tell which. &lt;code&gt;vatio whoami&lt;/code&gt;
prints the account’s email and the workspaces it reaches, &lt;code&gt;vatio doctor&lt;/code&gt; adds
an &lt;code&gt;Account:&lt;/code&gt; line, &lt;code&gt;vatio login&lt;/code&gt; ends with the account it signed in as, and a
&lt;code&gt;workspace_forbidden&lt;/code&gt; error names it. The hint for &lt;code&gt;workspace_not_found&lt;/code&gt; now
says &lt;code&gt;vatio push&lt;/code&gt; creates a missing workspace, and that &lt;code&gt;vatio init&lt;/code&gt; is for a
directory with no vatio.yml yet. See &lt;a href=&quot;/docs/cli/workspace&quot;&gt;Workspace and account&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.86.0 — 2026-10-15&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Export a stretch of time’s conversations, redacted.&lt;/strong&gt;
&lt;code&gt;vatio chat export --from 2026-09-01 --to 2026-09-30&lt;/code&gt; prints what people said
and what they were answered between two dates, one conversation per line as
JSON, for reading them in bulk with a coding agent. Vatio redacts it before it
leaves: names, emails, phone numbers, handles and Chilean RUTs read
&lt;code&gt;[FILTERED]&lt;/code&gt;, and a &lt;code&gt;person&lt;/code&gt; value counts people without naming them. Anyone on
the team can run it, viewers included, and every page is in &lt;strong&gt;Activity&lt;/strong&gt;. Reading
a visitor’s chat with &lt;code&gt;vatio chat show&lt;/code&gt; is now in &lt;strong&gt;Activity&lt;/strong&gt; too, as opening
it in the inbox is. See
&lt;a href=&quot;/docs/cli/chat#reading-conversations-in-bulk&quot;&gt;Reading conversations in bulk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A skill that analyzes them.&lt;/strong&gt; &lt;code&gt;/vatio-analyze&lt;/code&gt; (skills 1.18.0) exports the
dates you ask for, counts and reads every conversation, and writes a report:
the topics people bring up with their counts and their own words, what the
agent could not answer, and the content to write from it. Update the skills
with &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt;. See &lt;a href=&quot;/docs/integrations/claude-code#the-skills&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.85.0 — 2026-10-15&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A tool knows which channel it was called from.&lt;/strong&gt; &lt;code&gt;$chat.channel&lt;/code&gt; is where the
visitor is writing — &lt;code&gt;whatsapp&lt;/code&gt;, &lt;code&gt;instagram&lt;/code&gt;, &lt;code&gt;ios&lt;/code&gt;, &lt;code&gt;android&lt;/code&gt;, &lt;code&gt;widget&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;
or &lt;code&gt;cli&lt;/code&gt; — and &lt;code&gt;$chat.environment&lt;/code&gt; is &lt;code&gt;live&lt;/code&gt; or &lt;code&gt;preview&lt;/code&gt;. A backend shared by
your app and your WhatsApp number can now tell them apart from the request
alone, for example to look up only the account open in the app, without asking
Vatio for the chat. Only &lt;code&gt;whatsapp&lt;/code&gt; and &lt;code&gt;instagram&lt;/code&gt; cannot be faked; see
&lt;a href=&quot;/docs/tools&quot;&gt;Tools&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.84.1 — 2026-10-14&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A Flutter SDK.&lt;/strong&gt; &lt;code&gt;flutter pub add vatio&lt;/code&gt; puts the agent in a Flutter app on
iOS, Android and macOS. &lt;code&gt;VatioChat&lt;/code&gt; is a &lt;code&gt;ChangeNotifier&lt;/code&gt; holding the same
conversation the iOS and Android SDKs give — messages, typing, connection,
files and voice notes, the feedback moment and signed-in users — and the
widgets are yours. The app sends &lt;code&gt;ios-app://&lt;/code&gt; plus its bundle id or
&lt;code&gt;android-app://&lt;/code&gt; plus its package name, whichever platform it runs on, so its
token allows both. See the &lt;a href=&quot;/docs/sdk/flutter&quot;&gt;Flutter SDK&lt;/a&gt;, and
&lt;a href=&quot;https://vatio.ai/docs/guides/ai-agent-in-your-flutter-app&quot;&gt;an AI agent in your Flutter app&lt;/a&gt;
for a whole app.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vatio-add-to-app&lt;/code&gt; (skills 1.17.0) adds it to a Flutter app, with a chat
screen written from the SDK’s example, instead of saying there is no SDK yet.&lt;/p&gt;&lt;h2&gt;0.84.0 — 2026-10-14&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The agent asks for a person with a tool of yours.&lt;/strong&gt; The built-in handoff
marked a conversation as waiting for someone and told nobody, so it waited. It
is gone, with the business hours that decided when it muted the agent. To have
the agent ask for a person, give it an HTTP tool that calls your backend, and
alert whoever you want from there, with the two new placeholders: &lt;code&gt;$chat.url&lt;/code&gt;
opens the conversation in the inbox, and &lt;code&gt;$chat.id&lt;/code&gt; is its number. The person
who opens it and answers takes the conversation over, as before. The agent
reads its own earlier calls on every turn, so it knows it already asked; your
endpoint gets &lt;code&gt;$chat.id&lt;/code&gt; to skip a second alert. See
&lt;a href=&quot;/docs/handoff&quot;&gt;Human in the loop&lt;/a&gt;. &lt;code&gt;vatio-init&lt;/code&gt; (skills 1.16.1) writes that tool
for a new agent.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;handoff:&lt;/code&gt; in &lt;code&gt;vatio.yml&lt;/code&gt; is ignored with a warning, like &lt;code&gt;hours:&lt;/code&gt;. Its &lt;code&gt;when:&lt;/code&gt;
list belongs in the new tool’s &lt;code&gt;when_to_use&lt;/code&gt;. &lt;code&gt;vatio business hours&lt;/code&gt; is gone,
the inbox’s Business page no longer has hours, and the agent no longer gets
them in its prompt: write them in the business description if customers ask.&lt;/p&gt;&lt;h2&gt;0.83.0 — 2026-10-14&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio push&lt;/code&gt; works before you have an account.&lt;/strong&gt; On a machine with no
account, the first push deploys the agent to a
trial and prints two links: one to try it,
which anyone you share it with can chat on, and one to keep it, which makes it
yours once you sign in or create an account there. Until then you work as
usual: &lt;code&gt;vatio chat&lt;/code&gt;, &lt;code&gt;vatio diff&lt;/code&gt;, &lt;code&gt;vatio status&lt;/code&gt; and &lt;code&gt;vatio kb&lt;/code&gt; work on its
preview, and every push gives it another 7 days; one nobody keeps is deleted 7
days after its last push. Publishing, rolling back, secrets, tokens, keys,
webhooks, routines and the channels need an account, and say so with the link
to keep it.&lt;/p&gt;
&lt;p&gt;Before it is kept, a trial’s tools make &lt;code&gt;GET&lt;/code&gt; calls for real and simulate any
other method, and it has no secrets: &lt;code&gt;vatio push&lt;/code&gt; warns about a tool that reads
&lt;code&gt;$env.KEY&lt;/code&gt;. A trial takes up to 100 messages a day (the terminal and its try
link together), 50 pushes, 200 tool calls and 3 knowledge bases with 50
entries and 1 MB.&lt;/p&gt;
&lt;p&gt;Keeping it hands the terminal nothing. The next &lt;code&gt;vatio&lt;/code&gt; command in that folder
notices, signs the terminal in with the same browser code as &lt;code&gt;vatio login&lt;/code&gt; and
carries on, on your account. The workspace takes the slug your &lt;code&gt;vatio.yml&lt;/code&gt;
names when it is free; when it is not, the CLI updates &lt;code&gt;workspace:&lt;/code&gt; to the one
it got. Already signed in, with a trial left in the folder, &lt;code&gt;vatio push&lt;/code&gt; goes to
your account as before and reminds you of the link to keep the trial.
&lt;code&gt;vatio doctor&lt;/code&gt; shows the folder’s trial and when it is deleted.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vatio-init&lt;/code&gt; (skills 1.16.0) has your coding agent hand you both links.&lt;/p&gt;
&lt;p&gt;Taken out in 0.88.0: pushing needs an account again.&lt;/p&gt;&lt;h2&gt;0.82.1 — 2026-10-14&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Your coding agent now puts the agent in your app.&lt;/strong&gt; &lt;code&gt;vatio-init&lt;/code&gt; stopped at
the preview: putting the agent where your users talk to it was left to you.
A new skill, &lt;code&gt;vatio-add-to-app&lt;/code&gt; (skills 1.15.0), picks up there. In a web app it
adds the widget; in an iOS or Android app it adds the SDK and writes the chat
screen in your app’s style, from the example in each SDK’s repository. It
creates a publishable token for development builds, which talk to preview, and
one for release builds, which talk to live, each with your app’s origins, and
passes your signed-in users along, from Supabase or from your backend.
&lt;code&gt;vatio-init&lt;/code&gt; offers it once you have tried the preview, and the procedure it
follows is in the docs, under
&lt;a href=&quot;/docs/#putting-the-agent-in-the-app&quot;&gt;Putting the agent in the app&lt;/a&gt;. Update the
skills with &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt;, or the plugin with
&lt;code&gt;claude plugin update vatio@vatio&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vatio auth --supabase&lt;/code&gt; ended by linking to a docs page that does not exist; it
now links to &lt;a href=&quot;/docs/authentication/&quot;&gt;Supabase&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Which phone the replays are.&lt;/strong&gt; &lt;code&gt;vatio test&lt;/code&gt;’s report says which test phone
the replays talked as, by its last four digits: what a tool sent your backend
as &lt;code&gt;$contact.phone_number&lt;/code&gt;. &lt;code&gt;vatio flags&lt;/code&gt; says it before you start, when a tool
names the contact, or that there is no test phone and those tools cannot run in
a replay.&lt;/p&gt;&lt;h2&gt;0.82.0 — 2026-10-14&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Vatio only takes calls from the current CLI.&lt;/strong&gt; A coding agent drives the
CLI from whatever is installed, and the notice of a new release prints only in
a terminal, which an agent never has: one ran eight releases behind for days.
A call from a CLI older than the release on npm is now refused before it does
anything, with &lt;code&gt;426 cli_outdated&lt;/code&gt; and the version to run. From this release
the CLI then runs that version through &lt;code&gt;npx&lt;/code&gt;, with the same arguments and
stdin, and says so on stderr; an older CLI prints how to update. The release
before keeps working for five minutes after a new one is published, and
&lt;code&gt;vatio feedback&lt;/code&gt;, &lt;code&gt;vatio share-session&lt;/code&gt; and &lt;code&gt;vatio logout&lt;/code&gt; work from any
version. See &lt;a href=&quot;/docs/cli/#current-release-only&quot;&gt;Current release only&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio flags rm ID&lt;/code&gt; removes a report and its test case&lt;/strong&gt;, open or resolved,
as &lt;strong&gt;Remove&lt;/strong&gt; in the inbox does. It is the developer’s call: the flags digest
and the &lt;code&gt;vatio-improve&lt;/code&gt; skill (skills 1.14.0) tell a coding agent to propose
it and run it only when asked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A turn that runs out of tool calls answers.&lt;/strong&gt; Vatio allows 12 tool calls per
reply, then tells the agent to answer with what it has. A model can ask for
several tools at once, and when such a request ran past the twelfth call, its
remaining calls were refused one by one and the third refusal ended the turn
with “I couldn’t generate a response”, before the agent had read the stop:
turning seven expenses into fixed ones created four and told the person
nothing. Refusals now count the agent’s requests, not its calls, and the
request the budget ran out in does not count, so the agent answers with what
was done and what was not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vatio’s apology goes out in one message.&lt;/strong&gt; On WhatsApp and Instagram a
reply is split into short messages, and so was “I couldn’t generate a
response. Try again…”. The second half was an ordinary agent message: a
supervisor could flag it, and its diagnosis blamed whatever else the turn did
instead of saying Vatio wrote it. It is no longer split, and a flag on the
second half of an older one is diagnosed as Vatio’s apology. A flag diagnosed
as &lt;strong&gt;Your backend&lt;/strong&gt; also says when the turn ran out of tool calls.&lt;/p&gt;&lt;h2&gt;0.81.0 — 2026-10-12&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio eval&lt;/code&gt; is now &lt;code&gt;vatio test&lt;/code&gt;, and it runs in the background.&lt;/strong&gt;
&lt;code&gt;vatio test&lt;/code&gt; starts the runs on Vatio’s servers, prints each run’s id and
returns, so a coding agent no longer has to remember to background it.
&lt;code&gt;vatio test --wait&lt;/code&gt; waits for the judge, prints the report and exits &lt;code&gt;1&lt;/code&gt; when
a case fails, for CI and before &lt;code&gt;vatio publish&lt;/code&gt;; it joins a run of the same
version already going. &lt;code&gt;vatio test --show RUN_ID&lt;/code&gt; prints a run so far.
&lt;code&gt;vatio eval&lt;/code&gt; still works as before, waiting by default, with a warning that
it is deprecated: the name read as the shell’s &lt;code&gt;eval&lt;/code&gt; to coding agents’
command guards, which refused it. The publish refusals, the flags digest and
the &lt;code&gt;vatio-improve&lt;/code&gt; skill (skills 1.13.0) now say &lt;code&gt;vatio test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test runs say where to read a failing case.&lt;/strong&gt; Each run’s id is printed as
it starts, so &lt;code&gt;vatio test --show RUN_ID&lt;/code&gt; works however the command ends. The
report lists every case that did not pass with the &lt;code&gt;vatio chat show CHAT_ID&lt;/code&gt;
of its replay, earlier attempts included: what the agent said and every tool
it called, not just the judge’s sentence. The help and the docs now say that
&lt;code&gt;vatio test --env live&lt;/code&gt; resolves the open reports it passes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;--help&lt;/code&gt; after a command prints help.&lt;/strong&gt; &lt;code&gt;vatio chat --help&lt;/code&gt; sent “—help”
to the agent as a message, and other commands ignored it and ran: &lt;code&gt;--help&lt;/code&gt; on
the test command started a run. &lt;code&gt;--help&lt;/code&gt; or &lt;code&gt;-h&lt;/code&gt; anywhere after a command now
prints the help and does nothing else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replays talk as your test phone.&lt;/strong&gt; An eval replay had no contact, so a tool
that identifies people by &lt;code&gt;$contact.phone_number&lt;/code&gt; refused in every case, and a
WhatsApp agent’s flags that needed one could never pass or resolve. A replay
now talks as the phone you verified on Test → WhatsApp in the inbox (the
newest, if there are several). A case the judge fails because a tool could not
run without the contact’s phone, email or name is reported as &lt;strong&gt;not tested (no
test contact for a tool)&lt;/strong&gt;, names the tool, and is not retried. See
&lt;a href=&quot;/docs/improve#eval-runs&quot;&gt;Eval runs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A push says it is not live yet.&lt;/strong&gt; Once a workspace is published, &lt;code&gt;vatio push&lt;/code&gt;
prints a notice: which version live still runs, and that visitors get the push,
and the reports it fixes are resolved, only once it is published, with what to
run first. In the inbox, the owner and developers get a &lt;strong&gt;Publish&lt;/strong&gt; button on
&lt;strong&gt;Continuous improvement&lt;/strong&gt; next to the fixes waiting for it, even while other
reports are still open, and a banner once preview has held a version live does
not run for a day. Both go through the same checks as &lt;code&gt;vatio publish&lt;/code&gt;, and
&lt;strong&gt;Publish&lt;/strong&gt; asks first, saying how many open reports the version does not fix.
See &lt;a href=&quot;/docs/deployments#publishing&quot;&gt;Publishing&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.80.0 — 2026-10-12&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Is it your agent, your backend or Vatio?&lt;/strong&gt; Every flag in &lt;code&gt;vatio flags&lt;/code&gt; now
starts with a &lt;strong&gt;Diagnosis&lt;/strong&gt; that says whose it is to fix, read off what the
turn did: a tool call to your backend failed, everything answered and the
agent still got it wrong, or the model provider or Vatio failed. The digest
opens with how many are each, and its instructions tell your coding agent not
to change the agent for Vatio’s own. See
&lt;a href=&quot;/docs/improve#your-backend-your-agent-or-vatio&quot;&gt;Your backend, your agent or Vatio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A reply Vatio wrote says why.&lt;/strong&gt; When a turn produces no reply, Vatio still
sends the visitor an apology. That reply now records the cause: the model
provider was down, slow or refused, the model came back empty, Vatio failed,
the agent kept calling tools, or a safeguard removed all it wrote. A request
the provider rejects for what Vatio sent counts as Vatio failing, not the
provider. The inbox says so on
the reply and does not let a supervisor flag one of Vatio’s own.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio chat show&lt;/code&gt; says whose a problem is.&lt;/strong&gt; A &lt;code&gt;[your backend]&lt;/code&gt; line under
each tool call is how your backend answered it. A &lt;code&gt;[safeguard]&lt;/code&gt; line names
the check that discarded or rewrote a draft, and a &lt;code&gt;[vatio]&lt;/code&gt; line says why
Vatio wrote a reply. &lt;code&gt;vatio flags&lt;/code&gt; lists the safeguards too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eval errors name their cause.&lt;/strong&gt; A case Vatio could not replay or judge is
marked &lt;strong&gt;not tested (Vatio’s side)&lt;/strong&gt;, with the cause in words instead of a
Ruby class. When it passes on live, &lt;code&gt;vatio publish&lt;/code&gt; still waits for it, and
now says it is untested rather than broken: run &lt;code&gt;vatio eval&lt;/code&gt; again. The
inbox’s Continuous improvement page says the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio status&lt;/code&gt; lists the replies Vatio wrote.&lt;/strong&gt; A new &lt;code&gt;vatio&lt;/code&gt; key counts
the replies Vatio wrote in this workspace in the last 7 days, by cause, with
the latest 5 and the chat to open. When there are any, it also says so on
stderr. See &lt;a href=&quot;/docs/cli/deploy#status&quot;&gt;Status&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skills 1.12.0.&lt;/strong&gt; &lt;code&gt;vatio-improve&lt;/code&gt; reads each flag’s diagnosis first, leaves
Vatio’s own alone, and runs &lt;code&gt;vatio eval&lt;/code&gt; again for a case that was not tested.&lt;/p&gt;</description>
    </item>
    <item>
      <title>October 5–11, 2026: Vatio 0.62.1, 0.63.0, 0.64.0, 0.65.0, 0.66.0, 0.67.0, 0.68.0, 0.69.0, 0.70.0, 0.71.0, 0.72.0, 0.73.0, 0.75.0, 0.76.0, 0.77.0, 0.78.0 and 0.79.0</title>
      <link>https://vatio.ai/changelog/2026-10-12</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-10-12</guid>
      <pubDate>Mon, 12 Oct 2026 12:00:00 GMT</pubDate>
      <description>&lt;h2&gt;0.79.0 — 2026-10-11&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The console is part of the inbox now.&lt;/strong&gt; Its pages moved to inbox.vatio.ai,
one app with sections by role: Start, Test, Channels, Tools, Outreach, Team,
Security and Account. The links the CLI prints (&lt;code&gt;Try it:&lt;/code&gt; after &lt;code&gt;vatio push&lt;/code&gt;,
&lt;code&gt;vatio env&lt;/code&gt;, &lt;code&gt;vatio tools&lt;/code&gt;, &lt;code&gt;vatio whatsapp&lt;/code&gt;, &lt;code&gt;vatio instagram&lt;/code&gt;) open there,
and &lt;code&gt;vatio login&lt;/code&gt; lands there after you sign in at vatio.ai. Older CLIs keep
working: the platform sends the new links and old console URLs redirect. JSON
field names, &lt;code&gt;console_url&lt;/code&gt; included, did not change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The CLI names the inbox’s sections.&lt;/strong&gt; &lt;code&gt;vatio whatsapp&lt;/code&gt; and &lt;code&gt;vatio instagram&lt;/code&gt;
point to the Test page before you publish and to Channels after.
&lt;code&gt;vatio init --name&lt;/code&gt; before signing in says to set the name with
&lt;code&gt;vatio business set --name&lt;/code&gt; or on the Business page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skills 1.11.0.&lt;/strong&gt; &lt;code&gt;vatio-init&lt;/code&gt; hands over the inbox’s Test page, and a
teammate who is not in the workspace yet is invited from Team in the inbox.&lt;/p&gt;&lt;h2&gt;0.78.0 — 2026-10-11&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A routine is a tool the agent decides to use.&lt;/strong&gt; Give the agent a routine
with &lt;code&gt;tools/NAME.yml&lt;/code&gt; and &lt;code&gt;routine: NAME&lt;/code&gt;, and add it to &lt;code&gt;agent.tools&lt;/code&gt;. The
agent calls it once the request is complete, asking first when it is not, and
tells the person whether Claude has it in the same turn. A message from a
routine’s number no longer starts the routine by itself, and &lt;code&gt;--quiet&lt;/code&gt; is gone
with it. The tool exists only in WhatsApp conversations with the routine’s
numbers, so nobody else can talk the agent into it, and evals never start a
real session. &lt;code&gt;vatio routines create&lt;/code&gt; prints the tool file to add. See
&lt;a href=&quot;/docs/guides/give-claude-a-whatsapp&quot;&gt;Routine tools&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.77.0 — 2026-10-11&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The agent can answer only some numbers on your WhatsApp number.&lt;/strong&gt;
&lt;code&gt;vatio whatsapp only +56912345678&lt;/code&gt;, or &lt;strong&gt;The agent answers&lt;/strong&gt; next to the
&lt;strong&gt;Live&lt;/strong&gt; switch in the console, makes the agent answer only those numbers;
everyone else’s messages still reach the inbox, for you to answer. The numbers
of your routines always count. &lt;code&gt;vatio whatsapp everyone&lt;/code&gt; goes back to answering
everyone, the default, and &lt;code&gt;vatio whatsapp&lt;/code&gt; shows which it is. Set the list
before switching &lt;strong&gt;Live&lt;/strong&gt; on, and the agent never answers anyone else. See
Who the agent answers (removed in 0.107.0).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A routine’s token is checked when you save it.&lt;/strong&gt; Anything that is not a
&lt;code&gt;sk-ant-oat01-…&lt;/code&gt; token is refused right away, instead of failing with a 401 on
the first message. Pasting the wrong thing from the clipboard is the usual
cause.&lt;/p&gt;&lt;h2&gt;0.76.0 — 2026-10-11&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A WhatsApp message can start a Claude Code routine.&lt;/strong&gt; &lt;code&gt;vatio routines create&lt;/code&gt;
connects a routine’s API trigger to the numbers that start it: when one of them
writes to your number, Vatio waits for them to finish and starts the routine
with where the conversation is, never what it says. The agent waits while they
write and answers once, saying whether Claude has it or the routine could not
be started. &lt;code&gt;vatio routines runs&lt;/code&gt; shows each
run with the link to its Claude session. Only WhatsApp starts one, because only
there does Meta vouch for the number. See
&lt;a href=&quot;/docs/guides/give-claude-a-whatsapp&quot;&gt;Claude Code routines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A server key reads a conversation:&lt;/strong&gt; &lt;code&gt;GET /api/server/v1/:slug/chats/:id/messages&lt;/code&gt;,
newest last, with what was forwarded, voice notes as text and signed URLs for
files. It is how a routine catches up, and every read is in the workspace’s
Activity.&lt;/p&gt;&lt;h2&gt;0.75.0 — 2026-10-10&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt; leaves out the people a session is about.&lt;/strong&gt; Email
addresses and phone numbers written with a country code become &lt;code&gt;[EMAIL]&lt;/code&gt; and
&lt;code&gt;[PHONE]&lt;/code&gt;, next to the keys and tokens that were already &lt;code&gt;[REDACTED]&lt;/code&gt;, and the
summary says how many. The customers that come up in a database query are the
team’s least useful part of a session, and what made Claude Code’s auto mode
refuse to send one. Names, and numbers without a &lt;code&gt;+&lt;/code&gt;, still go: &lt;code&gt;--save&lt;/code&gt; shows
exactly what would.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A shared session is deleted 30 days after it arrives.&lt;/strong&gt; &lt;code&gt;vatio share-session&lt;/code&gt;
says so before it asks, and prints the date once it is sent; the row saying who
sent one, when, and the feedback with it stays. Only the Vatio team reads a
session, and every read is logged. The privacy policy lists it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session --list&lt;/code&gt; marks the sessions already sent&lt;/strong&gt;, with their
number and when. When a permission check stops the coding agent and you send
the session from your own terminal, the agent checks there that it went.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Outside a workspace, the error says where one is.&lt;/strong&gt; A command run one
directory above a &lt;code&gt;vatio.yml&lt;/code&gt; (&lt;code&gt;vatio chat show&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;kb&lt;/code&gt; …) now names the
nearby workspace and the &lt;code&gt;cd&lt;/code&gt; to it, instead of asking for an API url.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skills 1.9.0.&lt;/strong&gt; When a permission check refuses to send the session,
&lt;code&gt;vatio-share-session&lt;/code&gt; gives you the command to run yourself instead of retrying,
and checks with &lt;code&gt;--list&lt;/code&gt; that it arrived. Before asking, it tells you how the
session is treated: who reads it, that reads are logged, and when it is deleted.&lt;/p&gt;&lt;h2&gt;0.73.0 — 2026-10-10&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio flags&lt;/code&gt; and &lt;code&gt;vatio eval&lt;/code&gt; say when the Vatio skills are out of date.&lt;/strong&gt;
They compare the Claude Code plugin’s version, or the copy
&lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; made in the project, with the latest published skills
(asked of npm at most once a day) and say how to update:
&lt;code&gt;claude plugin update vatio@vatio&lt;/code&gt;, or running &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; again.
Claude Code does not auto-update plugins from other people’s marketplaces
unless you turn it on; see
&lt;a href=&quot;/docs/integrations/claude-code#keeping-them-up-to-date&quot;&gt;Keeping them up to date&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skills 1.7.0.&lt;/strong&gt; &lt;code&gt;vatio-share-session&lt;/code&gt; offers to send the session with
Claude Code’s own question (send it, send it with a comment, not now, don’t
ask again) instead of a message, and &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; leaves the version
it installed next to each copy.&lt;/p&gt;&lt;h2&gt;0.72.0 — 2026-10-10&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio flags&lt;/code&gt; and &lt;code&gt;vatio eval&lt;/code&gt; say when the Vatio skills are missing.&lt;/strong&gt;
Without the Claude Code plugin or the skills &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; copies
into a project, Claude Code has no &lt;code&gt;/vatio:vatio-improve&lt;/code&gt;, so both commands
end with one line on stderr saying how to install them. At most once a day per
directory, never in CI; &lt;code&gt;VATIO_NO_SKILLS_HINT=1&lt;/code&gt; turns it off. See
&lt;a href=&quot;/docs/cli/improve&quot;&gt;Improve&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The inbox’s Continuous improvement page is simpler.&lt;/strong&gt; One box says what is
next (reports open, with the command for the developer; fixes waiting to be
published; a fix that broke something; or all resolved), reports are Pending,
Resolved or All with one latest result each, and a report can be removed from
its row.&lt;/p&gt;&lt;h2&gt;0.71.0 — 2026-10-10&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One loop: your coding agent fixes, Vatio verifies.&lt;/strong&gt; A supervisor reports a
reply in the inbox and writes what it should have said. One session of your
coding agent takes every open report: &lt;code&gt;vatio flags&lt;/code&gt;, fix, &lt;code&gt;vatio push&lt;/code&gt;
(updates preview, runs no tests), &lt;code&gt;vatio eval&lt;/code&gt; (tests every report on
preview), then &lt;code&gt;vatio publish&lt;/code&gt;. In Claude Code, &lt;code&gt;/vatio:vatio-improve&lt;/code&gt; (skills
1.6.0) runs it, with &lt;code&gt;vatio eval&lt;/code&gt; in the background. See
&lt;a href=&quot;/docs/improve&quot;&gt;Improve your agent from flags&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio publish&lt;/code&gt; checks preview first.&lt;/strong&gt; Once the agent is published,
&lt;code&gt;publish&lt;/code&gt; is refused until &lt;code&gt;vatio eval&lt;/code&gt; has tested preview’s current version
(&lt;code&gt;evals_missing&lt;/code&gt;), while its tests are still running (&lt;code&gt;evals_running&lt;/code&gt;), and
when a report that passes on live fails on preview (&lt;code&gt;evals_regressed&lt;/code&gt;, listed
by id and title). Reports that still fail on both do not block, so a partial
fix can ship. When it goes through, the reports preview passed are resolved
with the version that fixed them, without testing again. &lt;code&gt;vatio publish --force&lt;/code&gt; publishes over a regression anyway, failing results included. The
console’s &lt;strong&gt;Publish&lt;/strong&gt; button goes through the same check and publishes
directly. See &lt;a href=&quot;/docs/cli/deploy#the-publish-gate&quot;&gt;The publish gate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio push&lt;/code&gt; does not overwrite an unpublished push from another branch.&lt;/strong&gt;
Once the agent is published, a push is refused when preview holds a version
that is not live, pushed from another git branch
(&lt;code&gt;preview_has_unpublished_push&lt;/code&gt;). Publish it first, or &lt;code&gt;vatio push --force&lt;/code&gt; to
replace it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Only preview and live.&lt;/strong&gt; There is no environment per git branch and there
are no named environments: &lt;code&gt;--env&lt;/code&gt; takes &lt;code&gt;preview&lt;/code&gt; or &lt;code&gt;live&lt;/code&gt; (&lt;code&gt;staging&lt;/code&gt; and
&lt;code&gt;sandbox&lt;/code&gt; still mean preview), and any other name is an error. Commands no
longer pick an environment from the git branch, and &lt;code&gt;vatio env rm&lt;/code&gt; is gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proposals are gone.&lt;/strong&gt; &lt;code&gt;vatio propose&lt;/code&gt;, the inbox’s proposals and an owner
accepting a change were removed; &lt;code&gt;vatio propose&lt;/code&gt; now says so, and the
proposals endpoints answer &lt;code&gt;410 proposals_removed&lt;/code&gt;. Test with &lt;code&gt;vatio eval&lt;/code&gt; and
publish with &lt;code&gt;vatio publish&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The GitHub App integration is gone:&lt;/strong&gt; pull request previews, publishing by
merging, comments and checks on pull requests, the &lt;code&gt;vatio-flags&lt;/code&gt; issue and
connecting a repository. Signing in with GitHub stays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Ask for an improvement” and the Learning view are gone.&lt;/strong&gt; A report’s state
now shows on the reported reply in the conversation: open, fixed in preview,
or resolved with the version that fixed it. The inbox’s &lt;strong&gt;Continuous
improvement&lt;/strong&gt; page lists every report with its latest tests and what
&lt;code&gt;vatio publish&lt;/code&gt; would say, with the prompt &lt;code&gt;/vatio:vatio-improve&lt;/code&gt;; the daily
email to the workspace’s developers links there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every report with a note is a test&lt;/strong&gt;, wherever it was made, live or preview.
A report made on preview after the first publish used to be a note with no
test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evals run five cases at a time.&lt;/strong&gt; A run of 27 cases takes 3 to 4 minutes
instead of about 15.&lt;/p&gt;&lt;h2&gt;0.70.0 — 2026-10-10&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio logout&lt;/code&gt; revokes the token.&lt;/strong&gt; It used to delete the token from this
machine and nothing else, so a copy of the config file kept working. Now the
token is revoked on Vatio first; offline, the local copy is still removed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLI tokens expire after 90 days without use.&lt;/strong&gt; Each command slides the
expiry forward, so a machine in regular use never notices. One left alone
needs &lt;code&gt;vatio login&lt;/code&gt; again. Every token alive today starts with the full 90
days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two-step verification.&lt;/strong&gt; Passkeys, an authenticator app and recovery codes,
in &lt;strong&gt;Settings → Security&lt;/strong&gt;, which also lists every console browser, inbox
device and CLI token signed in to your account and closes any of them. A
workspace marked as holding sensitive data requires it from its whole team; for
those workspaces the API answers &lt;code&gt;two_factor_required&lt;/code&gt; until the account has
it. See &lt;a href=&quot;/docs/team#two-step-verification-and-sessions&quot;&gt;Two-step verification and sessions&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.69.0 — 2026-10-09&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;base_url&lt;/code&gt; keeps its path.&lt;/strong&gt; A tool’s &lt;code&gt;path&lt;/code&gt; is appended to the base URL’s
own path: &lt;code&gt;https://&amp;#x3C;ref&gt;.supabase.co/functions/v1&lt;/code&gt; plus &lt;code&gt;/my-tools/check_stock&lt;/code&gt;
calls &lt;code&gt;.../functions/v1/my-tools/check_stock&lt;/code&gt;. Until now the base URL’s path
was dropped without a word and the call went to &lt;code&gt;/my-tools/check_stock&lt;/code&gt; on the
host. A &lt;code&gt;path&lt;/code&gt; that already repeats the base URL’s path, the way around it, is
not prefixed twice. See &lt;a href=&quot;/docs/tools#declarative-http-tools&quot;&gt;Declarative HTTP tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A reply makes at most 12 tool calls.&lt;/strong&gt; After the twelfth, or after the same
tool fails three times with the same &lt;code&gt;message&lt;/code&gt;, the agent is told to answer
with what it has and say what it could not do; a call after that is refused,
so a tool that keeps failing no longer leaves the person without an answer.
&lt;code&gt;vatio chat show&lt;/code&gt; marks it with a &lt;code&gt;[tool limit]&lt;/code&gt; line. See
&lt;a href=&quot;/docs/tools#tool-results&quot;&gt;Tool results&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A failing tool’s own words reach the agent.&lt;/strong&gt; On a non-2xx, a body with no
&lt;code&gt;message&lt;/code&gt; but a string &lt;code&gt;error&lt;/code&gt; (&lt;code&gt;{ &quot;error&quot;: &quot;...&quot;, &quot;hint&quot;: &quot;...&quot; }&lt;/code&gt;) uses it
as the message, instead of a bare “HTTP 422”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A typed phone number is not asked for.&lt;/strong&gt; Off WhatsApp, a tool that requires
&lt;code&gt;contact.phone_number&lt;/code&gt; used to tell the agent to ask for it, but a number typed
in the chat never fills &lt;code&gt;$contact.phone_number&lt;/code&gt;: only WhatsApp or the visitor’s
sign-in do. The agent is now told not to ask and to say it cannot be done from
that chat. See &lt;a href=&quot;/docs/tools#required-values&quot;&gt;Required values&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio secrets list&lt;/code&gt; shows every environment.&lt;/strong&gt; Each secret on its own line
with its scope (&lt;code&gt;every environment&lt;/code&gt;, &lt;code&gt;only preview&lt;/code&gt;, &lt;code&gt;tests&lt;/code&gt;), so a value set
from a branch or with &lt;code&gt;--env&lt;/code&gt; is never missing from the list; &lt;code&gt;--env NAME&lt;/code&gt;
still shows only what that environment reads. &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;rm&lt;/code&gt; say which scope
they touched. A key starting with &lt;code&gt;VATIO_&lt;/code&gt; is refused with a message that
says so, instead of “Translation missing”.&lt;/p&gt;&lt;h2&gt;0.68.0 — 2026-10-09&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Start by installing the skills.&lt;/strong&gt; The prompt on &lt;a href=&quot;https://vatio.ai&quot;&gt;vatio.ai&lt;/a&gt;
now has the coding agent run &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; in the project first and
follow the &lt;code&gt;vatio-init&lt;/code&gt; skill it installs, and installing them is step one of
&lt;a href=&quot;/docs/#starting-a-new-agent&quot;&gt;Starting a new agent&lt;/a&gt; and of the
&lt;a href=&quot;/docs/quickstart&quot;&gt;quickstart&lt;/a&gt;. The skills stay in the repository, so the next
session — or a different coding agent — finds how to start and improve the
agent without being told again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio-new&lt;/code&gt; is now &lt;code&gt;vatio-init&lt;/code&gt;, and it looks first.&lt;/strong&gt; Before creating
anything it searches the whole repository for a &lt;code&gt;vatio.yml&lt;/code&gt;, reads the app
(its API, how its users sign in, its docs) and says what it found and what it
recommends. With no agent it builds one, asking the owner only what the code
does not answer. With one, it follows
&lt;a href=&quot;/docs/#joining-an-existing-workspace&quot;&gt;Joining an existing workspace&lt;/a&gt;: it never runs
&lt;code&gt;vatio init&lt;/code&gt; there, compares the folder with live, explains the agent and
points at open flags and failing tools. &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; removes the old
&lt;code&gt;vatio-new&lt;/code&gt; copy when it installs &lt;code&gt;vatio-init&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio share-session&lt;/code&gt;: send the Vatio team your Claude Code session.&lt;/strong&gt; When a
sentence in &lt;code&gt;vatio feedback&lt;/code&gt; is not enough, &lt;code&gt;vatio share-session&lt;/code&gt; sends the
session the coding agent is in (or the most recent one for this directory):
what you asked, what it ran and what it was shown. Feedback in your words is
optional: &lt;code&gt;vatio share-session &quot;what got in the way&quot;&lt;/code&gt;. Images and
Claude Code’s own bookkeeping are left out, anything that looks like a key,
token, password or private key becomes &lt;code&gt;[REDACTED]&lt;/code&gt;, and it shows which session
goes and asks before sending; a coding agent sends only with &lt;code&gt;--yes&lt;/code&gt;, after
asking you. &lt;code&gt;--save FILE&lt;/code&gt; writes exactly what would be sent instead, &lt;code&gt;--list&lt;/code&gt;
and &lt;code&gt;--id&lt;/code&gt; pick another session. It needs you signed in, and only the Vatio
team reads it. See &lt;a href=&quot;/docs/cli/workspace#share-a-session&quot;&gt;Share a session&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A third skill, &lt;code&gt;vatio-share-session&lt;/code&gt;.&lt;/strong&gt; Say “send this session to Vatio” or
run &lt;code&gt;/vatio-share-session&lt;/code&gt;: Claude Code shows you what would go, asks, suggests
adding feedback in your words, and runs &lt;code&gt;vatio share-session&lt;/code&gt;. &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; (1.5.0) installs it with the
other two. When &lt;code&gt;vatio-init&lt;/code&gt; or &lt;code&gt;vatio-improve&lt;/code&gt; finish, Claude Code offers to
send the session, with three answers: send it, not now, or don’t ask again.
&lt;code&gt;vatio share-session --should-ask&lt;/code&gt; decides whether to offer — at most once a
week, never twice in a session — and &lt;code&gt;vatio share-session --never&lt;/code&gt; stops it. See &lt;a href=&quot;/docs/integrations/claude-code&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.67.0 — 2026-10-09&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Tool metrics for your coding agent.&lt;/strong&gt; &lt;code&gt;vatio tools&lt;/code&gt; prints the console’s
&lt;strong&gt;Tools&lt;/strong&gt; page as a document a coding agent works from: each tool’s calls,
error rate, timeouts and p50/p95 latency, then the calls that failed with
what your backend answered and the &lt;code&gt;vatio chat show&lt;/code&gt; that opens the
conversation. &lt;code&gt;--json&lt;/code&gt; gives the same as data. It reads the branch’s
environment on a branch and live elsewhere (&lt;code&gt;--env&lt;/code&gt;), over the last 7 days
(&lt;code&gt;--period&lt;/code&gt;). A failing tool seldom gets flagged, because the agent
apologizes and moves on: this is where your agent finds it. See
&lt;a href=&quot;/docs/cli/improve#tool-metrics&quot;&gt;Tool metrics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The last hour.&lt;/strong&gt; The Tools page and &lt;code&gt;vatio tools&lt;/code&gt; read the last hour as
well as the last day, 7 and 30 days: enough to see whether a fix you just
published stopped the errors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Each tool call in &lt;code&gt;vatio flags&lt;/code&gt; says how it went&lt;/strong&gt;: the HTTP status,
outcome and duration of the call to your backend, next to its arguments and
response. The &lt;code&gt;vatio-improve&lt;/code&gt; skill (1.4.0) and the &lt;code&gt;AGENTS.md&lt;/code&gt; section
&lt;code&gt;vatio init&lt;/code&gt; writes point at &lt;code&gt;vatio tools&lt;/code&gt; too.&lt;/p&gt;&lt;h2&gt;0.66.0 — 2026-10-09&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Publish through your tests.&lt;/strong&gt; The console’s &lt;strong&gt;Publish&lt;/strong&gt; buttons (the Test
page and Environments) no longer publish at once: they propose the environment
and take you to it in the inbox, where every eval case is replayed on it and
the owner or a developer publishes it. &lt;code&gt;preview&lt;/code&gt; can be proposed now, and
deciding never removes it. Accepting an improvement publishes the version that
was tested and takes its results live with it, instead of replaying every case
on live again. &lt;code&gt;vatio publish&lt;/code&gt; and a merge to the default branch still publish
directly. See &lt;a href=&quot;/docs/improve#eval-runs&quot;&gt;Eval runs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A failing case is retried.&lt;/strong&gt; The same case can fail once and pass the next
time on the same version, so a case the judge fails is replayed again in a
fresh chat, up to 3 attempts; only one failing all three counts as failing.
One that passed on a later attempt says how many it took, in the report
(&lt;code&gt;F-7K2QX (2 attempts)&lt;/code&gt;), on the improvement and in Learning: it is unstable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test values for secrets.&lt;/strong&gt; &lt;code&gt;vatio secrets set KEY VALUE --tests&lt;/code&gt; sets the
value every environment but live uses, and every eval replay, live’s included:
one staging URL for everything that is not a visitor on live. &lt;code&gt;list&lt;/code&gt; marks it
&lt;code&gt;(tests)&lt;/code&gt;. A replay’s tool calls carry an &lt;code&gt;X-Vatio-Test: 1&lt;/code&gt; header, and a write
(any method but GET) whose URL has no test value is not sent: the agent gets a
success, and the judge still checks the call and its arguments. See
&lt;a href=&quot;/docs/deployments#secrets&quot;&gt;Secrets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tests come from live.&lt;/strong&gt; A report made on live is a test, and so is one made
before the agent’s first publish. After that, a report from a preview or a
branch is a note for whoever fixes the agent: it is in &lt;code&gt;vatio flags&lt;/code&gt;, with
&lt;code&gt;Eval case: no&lt;/code&gt;, but nothing replays it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learning, simpler.&lt;/strong&gt; The inbox lists each report as solved or not, under one
card with what to do next. Asking for an improvement, and accepting one, happen
on live only. Nobody overrules the judge any more: a supervisor who disagrees
rewrites the note, which starts the case over.&lt;/p&gt;&lt;h2&gt;0.65.0 — 2026-10-08&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The docs live at &lt;a href=&quot;https://vatio.ai/docs/&quot;&gt;vatio.ai/docs&lt;/a&gt;.&lt;/strong&gt; Same pages, same
Markdown contract, now under the main domain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vatio.ai/docs/docs.md&quot;&gt;&lt;code&gt;/docs/docs.md&lt;/code&gt;&lt;/a&gt; is the whole contract, and
every page is also at its path plus &lt;code&gt;.md&lt;/code&gt;, indexed in
&lt;a href=&quot;https://vatio.ai/docs/llms.txt&quot;&gt;&lt;code&gt;/docs/llms.txt&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Every &lt;code&gt;docs.vatio.ai&lt;/code&gt; address answers with a 301 to the same path under
&lt;code&gt;vatio.ai/docs&lt;/code&gt;, so existing links keep working.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vatio docs&lt;/code&gt; fetches the same file as before, and any version of the CLI
follows the redirect. This release only updates the URLs the CLI prints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The widget is on npm, and open source.&lt;/strong&gt; &lt;code&gt;npm install @vatio-ai/widget&lt;/code&gt;
mounts the same widget from your app’s code with &lt;code&gt;mountVatioWidget()&lt;/code&gt;,
returning &lt;code&gt;identify&lt;/code&gt; and &lt;code&gt;unmount&lt;/code&gt; — see
&lt;a href=&quot;/docs/channels/widget#from-your-app-s-code&quot;&gt;From your app’s code&lt;/a&gt;. Its source is
public under MIT at &lt;a href=&quot;https://github.com/vatio-ai/widget&quot;&gt;github.com/vatio-ai/widget&lt;/a&gt;.
The script tag at &lt;code&gt;cdn.vatio.ai/v1/widget.js&lt;/code&gt; is unchanged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The skills are on npm.&lt;/strong&gt; &lt;code&gt;npx @vatio-ai/skills&lt;/code&gt; copies &lt;code&gt;vatio-new&lt;/code&gt; and
&lt;code&gt;vatio-improve&lt;/code&gt; into a project’s &lt;code&gt;.agents/skills/&lt;/code&gt; and &lt;code&gt;.claude/skills/&lt;/code&gt;, so
Codex, Cursor, Gemini CLI, GitHub Copilot and Claude Code pick them up without
the plugin. See &lt;a href=&quot;/docs/integrations/claude-code&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The browser SDK is back on the CDN&lt;/strong&gt; as a classic script,
&lt;code&gt;cdn.vatio.ai/v1/sdk.js&lt;/code&gt;, which leaves the SDK on &lt;code&gt;window.Vatio&lt;/code&gt; for a page
without a bundler (&lt;a href=&quot;/docs/sdk/#without-a-bundler&quot;&gt;Without a bundler&lt;/a&gt;). The old
&lt;code&gt;vatio.ai/vatio-widget.js&lt;/code&gt; and &lt;code&gt;vatio.ai/sdk/1.js&lt;/code&gt; redirect to the CDN again.&lt;/p&gt;&lt;h2&gt;0.64.0 — 2026-10-07&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio propose&lt;/code&gt;: a fix the owner accepts from the inbox, without GitHub.&lt;/strong&gt; On
a workspace with no repository connected, push the fix to the branch’s
environment and run &lt;code&gt;vatio propose --title &quot;What it fixes&quot;&lt;/code&gt; (plus &lt;code&gt;--summary&lt;/code&gt;
or &lt;code&gt;--summary-file&lt;/code&gt; for why). Vatio replays every eval case there and mails the
workspace’s owner when the replays finish. In the inbox, under &lt;strong&gt;Learning →
Improvements&lt;/strong&gt;, the owner sees why, every case on live next to this version,
what changes line by line against live, and a link to try it, then accepts
(which publishes the environment, prompt, tools and knowledge together) or
discards it. Accepting is refused while the replays run, when the environment
was pushed again after proposing, and when a case that passes on live fails
there. Either way the environment is removed and the proposal keeps its record.
Proposing the same environment again updates it and replays the evals;
&lt;code&gt;vatio propose --list&lt;/code&gt; shows where each one stands. &lt;code&gt;preview&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt; cannot
be proposed: they are shared. See
&lt;a href=&quot;/docs/improve&quot;&gt;Without GitHub: propose it to the owner&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask for an improvement, from the inbox.&lt;/strong&gt; On &lt;strong&gt;Learning&lt;/strong&gt;, the owner and
developers can have Vatio review the open flags. It reads each conversation,
what every tool answered and how the agent is set up, and sorts the flags by
cause. A fix in the agent’s instructions or knowledge it writes itself and
opens as a proposal, tests running. A missing tool or one that fails (an
error, a 500) it never works around in the prompt: Vatio has no access to your
backend’s code, so it gives you a prompt for your coding agent instead. One
review at a time, up to ten a day. See
&lt;a href=&quot;/docs/channels/inbox&quot;&gt;Ask for an improvement&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.63.0 — 2026-10-07&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Create WhatsApp templates from the CLI, and test them before you have a
number.&lt;/strong&gt; &lt;code&gt;vatio templates create&lt;/code&gt; submits a template for Meta’s review on
Vatio’s test number, so your coding agent no longer stops at the console to
write one:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; templates&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; order_shipped&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --language&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; es&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  --body&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hola {{1}}, tu pedido {{2}} va en camino.&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --example&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Ana&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --example&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;#1042&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once Meta approves it, a preview key sends it to your test phones when the
24-hour window is closed — before, a preview key could not send a template at
all. When you connect your own number, Vatio moves your templates to it under
the same names, so the &lt;code&gt;template&lt;/code&gt; your backend sends does not change when it
goes live, and removes them from its test number. From then on your backend
sends from your number with a live key: a preview key is refused with
&lt;code&gt;409 use_live_key&lt;/code&gt;, and &lt;code&gt;templates create&lt;/code&gt; submits straight to your number.&lt;/p&gt;
&lt;p&gt;The template is checked before Meta sees it — the name’s format, &lt;code&gt;{{1}}&lt;/code&gt;,
&lt;code&gt;{{2}}&lt;/code&gt;, … in order, one &lt;code&gt;--example&lt;/code&gt; per placeholder, and no placeholder at the
very start or end of the body. &lt;code&gt;utility&lt;/code&gt; is the default category; pass
&lt;code&gt;--category marketing&lt;/code&gt; for promotions. &lt;code&gt;vatio templates list --env preview&lt;/code&gt;
shows the ones on Vatio’s test number, and &lt;code&gt;vatio templates list&lt;/code&gt; tells a
workspace with no number of its own where its templates are.&lt;/p&gt;&lt;h2&gt;0.62.1 — 2026-10-05&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whatsapp&lt;/code&gt; and &lt;code&gt;vatio instagram&lt;/code&gt; link to a page you can see.&lt;/strong&gt; Before
your first publish the console shows only the &lt;strong&gt;Test&lt;/strong&gt; page, so they now print
its WhatsApp or Instagram tab, where you verify a test phone or account and
talk to your agent. After you publish they print that channel’s page under
&lt;strong&gt;Integrations&lt;/strong&gt;, where you connect your own number or account. &lt;code&gt;vatio status&lt;/code&gt;
reports &lt;code&gt;published&lt;/code&gt;, plus &lt;code&gt;whatsapp_url&lt;/code&gt; and &lt;code&gt;instagram_url&lt;/code&gt; next to
&lt;code&gt;integrations_url&lt;/code&gt;, which also points at the Test page until you publish.&lt;/p&gt;</description>
    </item>
    <item>
      <title>September 28 – October 4, 2026: Vatio 0.48.0, 0.48.1, 0.49.0, 0.50.0, 0.51.0, 0.52.0, 0.53.0, 0.54.0, 0.54.1, 0.55.0, 0.56.0, 0.57.0, 0.58.0, 0.58.1, 0.59.0, 0.60.0, 0.61.0 and 0.62.0</title>
      <link>https://vatio.ai/changelog/2026-10-05</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-10-05</guid>
      <pubDate>Mon, 05 Oct 2026 12:00:00 GMT</pubDate>
      <description>&lt;h2&gt;0.62.0 — 2026-10-04&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Sign in with Supabase, with no code.&lt;/strong&gt; If your users sign in with Supabase
Auth, &lt;code&gt;vatio auth --supabase&lt;/code&gt; names the project in &lt;code&gt;vatio.yml&lt;/code&gt;
(&lt;code&gt;auth: supabase:&lt;/code&gt;) and stores its URL and anon key as secrets. Then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web:&lt;/strong&gt; the widget reads the Supabase session already on the page and
follows sign-in, sign-out and token refreshes. Nothing to add to the page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WhatsApp and Instagram:&lt;/strong&gt; the Sign in button opens your login page, and
the widget on it hands the session to Vatio once the person is signed in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools:&lt;/strong&gt; forward &lt;code&gt;$auth.token&lt;/code&gt; to the project’s REST API and your Row Level
Security decides what the visitor sees.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or skip the command: &lt;strong&gt;Connect Supabase&lt;/strong&gt; in the console (Channels) signs
in to Supabase, picks the project, sets the secrets and shows the &lt;code&gt;auth:&lt;/code&gt; line;
&lt;code&gt;vatio auth --supabase&lt;/code&gt; then uses that project, and &lt;code&gt;vatio diff&lt;/code&gt; warns when
&lt;code&gt;vatio.yml&lt;/code&gt; names a different one.&lt;/p&gt;
&lt;p&gt;Vatio verifies against the project’s public keys, so the project has to use
JWT signing keys (ES256 or RS256); a push with a project still on the legacy
HS256 secret is refused with the fix. See &lt;a href=&quot;/docs/authentication/&quot;&gt;Supabase&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.61.0 — 2026-10-04&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Send WhatsApp messages from your backend.&lt;/strong&gt; Your backend calls
&lt;a href=&quot;/docs/api/messages&quot;&gt;&lt;code&gt;POST /api/server/v1/:slug/messages&lt;/code&gt;&lt;/a&gt; with a number and what
to tell them, and the agent keeps answering when the person replies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;text&lt;/code&gt; goes out exactly as written, when the person wrote in the last 24
hours.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brief&lt;/code&gt; has the agent write the message itself.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt; is the approved template to send when the window is closed,
which is the only thing WhatsApp delivers then.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The request answers &lt;code&gt;202&lt;/code&gt; at once and Vatio sends right after. The agent is
shown the brief when the person answers. Around it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Idempotency-Key&lt;/code&gt;&lt;/strong&gt;, so a retry never messages anyone twice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;identity&lt;/code&gt;&lt;/strong&gt;, a JWT your workspace signed, so private tools run when the
person answers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signed webhooks:&lt;/strong&gt; &lt;code&gt;message.sent&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, &lt;code&gt;delivered&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;,
&lt;code&gt;delivery_failed&lt;/code&gt; and &lt;code&gt;replied&lt;/code&gt;, with a delivery log and a &lt;code&gt;ping&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GET /messages&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;GET /templates&lt;/code&gt;&lt;/strong&gt;, with each template’s
parameter count.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Server keys.&lt;/strong&gt; The server API takes a server key (&lt;code&gt;vsk_…&lt;/code&gt;), not your CLI
token. A key belongs to the workspace and one environment, and survives
&lt;code&gt;vatio login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New commands.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vatio keys list|create|revoke&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vatio templates list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vatio webhooks list|create|test|deliveries|enable|rm&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.60.0 — 2026-10-03&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Signing in works when a coding agent runs the CLI.&lt;/strong&gt; &lt;code&gt;vatio push&lt;/code&gt; (the
first time) and &lt;code&gt;vatio login&lt;/code&gt; open the browser on Vatio’s sign-in page for
that terminal and print the terminal’s code; on a machine with no browser
they print the link, and tell a coding agent to show it to its human. There
you sign in with your email — Vatio mails a link that signs you in on any
device, creating the account if there is none — or with Google or GitHub,
check that the page shows the same code, and confirm the terminal. After
&lt;code&gt;vatio push&lt;/code&gt;, the page then waits for the push and turns into the console’s
&lt;strong&gt;Test&lt;/strong&gt; screen. If the wait is cut off, running the same command again picks
up the same sign-in page instead of starting over. The CLI no longer asks for
an email. The device authorization start endpoint takes an optional
&lt;code&gt;workspace&lt;/code&gt; slug.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The hosted pages at &lt;code&gt;vatio.ai/w/&lt;/code&gt; are gone.&lt;/strong&gt; Try an agent in the console’s
&lt;strong&gt;Test&lt;/strong&gt; screen — web chat, WhatsApp and Instagram — at the link &lt;code&gt;vatio push&lt;/code&gt;
and &lt;code&gt;vatio env&lt;/code&gt; print after &lt;code&gt;Try it:&lt;/code&gt;. To put it in front of customers, embed
the &lt;a href=&quot;/docs/channels/widget&quot;&gt;widget&lt;/a&gt; on your own site, connect WhatsApp or
Instagram, or use the &lt;a href=&quot;/docs/sdk/&quot;&gt;SDKs&lt;/a&gt;. &lt;code&gt;vatio env&lt;/code&gt; no longer prints a page link,
and &lt;code&gt;page_url&lt;/code&gt; is gone from the environment API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Test screen handles several numbers and accounts.&lt;/strong&gt; Its WhatsApp and
Instagram tabs list and verify up to five test phones and five test accounts,
instead of only the latest one.&lt;/p&gt;&lt;h2&gt;0.59.0 — 2026-10-03&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio feedback&lt;/code&gt;.&lt;/strong&gt; Tell the Vatio team what got in the way, in a sentence:
&lt;code&gt;vatio feedback &quot;push said the tool was invalid but not which field&quot;&lt;/code&gt;. Coding
agents are asked to run it when an error or the docs left them guessing; it
arrives with the commands the session ran before it. See
&lt;a href=&quot;/docs/cli/workspace#feedback&quot;&gt;Feedback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Errors say what to do next.&lt;/strong&gt; API errors now carry a &lt;code&gt;hint&lt;/code&gt; when there is a
known next step, and the CLI prints it as &lt;code&gt;Next:&lt;/code&gt; along with the error code and
&lt;code&gt;request_id&lt;/code&gt;. See &lt;a href=&quot;/docs/api/errors&quot;&gt;Errors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Telemetry.&lt;/strong&gt; The CLI now reports how each command ended — its name, exit code
and, on failure, the error it printed — with its version, the coding
agent running it and a session id. Arguments, file contents and secrets are
never sent. The first command on a machine says so once, and
&lt;code&gt;VATIO_TELEMETRY=0&lt;/code&gt; turns it off. See
&lt;a href=&quot;/docs/cli/workspace#telemetry&quot;&gt;Telemetry&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.58.1 — 2026-10-03&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A flag’s note is what should have happened.&lt;/strong&gt; Supervisors write more than
the sentence the agent should have said: an action, a tool it should have
used, a handover. The inbox now asks for &lt;strong&gt;What should have happened&lt;/strong&gt;, and
&lt;code&gt;vatio flags&lt;/code&gt;, the GitHub issue and the daily mail say the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The judge sees tool calls.&lt;/strong&gt; Eval replays now show the judge every tool the
agent called, so a note that asks for a tool passes when the agent calls it.
An answer the judge could not read is an error, no longer a fail against the
agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analytics and Learning in the inbox.&lt;/strong&gt; &lt;a href=&quot;/docs/channels/inbox#analytics&quot;&gt;Analytics&lt;/a&gt;
shows conversations per channel, handoffs, open flags and visitor ratings over
7, 30 or 90 days. &lt;a href=&quot;/docs/channels/inbox#report-a-reply&quot;&gt;Learning&lt;/a&gt; shows what became of
every flag (pending, in testing, fixed, failing again) with every replay of its
case, and lets a supervisor overrule the judge. A person’s verdict wins, and on
the newest live replay it decides whether the flag is fixed.&lt;/p&gt;&lt;h2&gt;0.58.0 — 2026-10-03&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The brand belongs to the business too.&lt;/strong&gt; The logo, the brand color and the
widget’s “about” are set on the inbox’s &lt;strong&gt;Business&lt;/strong&gt; page, next to the name and
hours, and no longer on the console’s Widget page, which keeps the rest of the
widget’s look. From a terminal:
&lt;code&gt;vatio business set --logo FILE | --remove-logo&lt;/code&gt;, &lt;code&gt;--color #RRGGBB | --color default&lt;/code&gt; and &lt;code&gt;--about TEXT&lt;/code&gt;. &lt;code&gt;PATCH /business&lt;/code&gt; takes &lt;code&gt;about&lt;/code&gt;, &lt;code&gt;accent_color&lt;/code&gt; and
&lt;code&gt;logo&lt;/code&gt; (base64). See &lt;a href=&quot;/docs/cli/business&quot;&gt;Business&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.57.0 — 2026-10-03&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The business and its hours belong to whoever runs it.&lt;/strong&gt; The business name,
description and opening hours live on the workspace and are set on the new
&lt;strong&gt;Business&lt;/strong&gt; page of the inbox — a time zone and
shifts per day, or someone always available. They apply to every environment as
soon as they are saved. The agent now also gets the weekly hours, so it can
tell a customer when you are open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;hours:&lt;/code&gt; is ignored in &lt;code&gt;vatio.yml&lt;/code&gt;.&lt;/strong&gt; A push that still has it succeeds and
prints a warning with a link to the inbox page; existing hours were carried
over to the workspace. &lt;code&gt;handoff:&lt;/code&gt; stays in &lt;code&gt;vatio.yml&lt;/code&gt;. The console’s Widget
page no longer edits the name and summary; it links to the inbox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio business&lt;/code&gt;.&lt;/strong&gt; Read and set the same business from a terminal:
&lt;code&gt;vatio business&lt;/code&gt;, &lt;code&gt;vatio business set --name … --description …&lt;/code&gt;, and
&lt;code&gt;vatio business hours --timezone … --mon 09:00-18:00 …&lt;/code&gt; or &lt;code&gt;--clear&lt;/code&gt;. See
&lt;a href=&quot;/docs/cli/business&quot;&gt;Business&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.56.0 — 2026-10-02&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One agent per workspace.&lt;/strong&gt; &lt;code&gt;agents:&lt;/code&gt; and &lt;code&gt;entry:&lt;/code&gt; are gone from &lt;code&gt;vatio.yml&lt;/code&gt;;
a workspace runs one &lt;code&gt;agent:&lt;/code&gt;, and private tools behind &lt;code&gt;auth:&lt;/code&gt; cover what a
second, signed-in agent was for. A push that still has them fails and says
what to change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio issue&lt;/code&gt; is gone; report on GitHub.&lt;/strong&gt; Bugs and feature requests now go
to the public repositories:
&lt;a href=&quot;https://github.com/vatio-ai/cli/issues&quot;&gt;cli&lt;/a&gt;,
&lt;a href=&quot;https://github.com/vatio-ai/sdk/issues&quot;&gt;sdk&lt;/a&gt;,
&lt;a href=&quot;https://github.com/vatio-ai/ios/issues&quot;&gt;ios&lt;/a&gt; and
&lt;a href=&quot;https://github.com/vatio-ai/ruby/issues&quot;&gt;ruby&lt;/a&gt;. Running &lt;code&gt;vatio issue&lt;/code&gt; says
where to go, and so does an older CLI that still has the command.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A smaller CLI.&lt;/strong&gt; It now keeps only the commands a developer runs to build
and ship an agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio chat&lt;/code&gt;&lt;/strong&gt; is two commands. &lt;code&gt;vatio chat &quot;message&quot; [--new]&lt;/code&gt; talks to the
agent, and &lt;code&gt;--new&lt;/code&gt; starts over as a visitor it never met. &lt;code&gt;vatio chat show [CHAT_ID]&lt;/code&gt; prints the chat you are in, or any chat, with every tool call.
&lt;code&gt;transcript&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt; and &lt;code&gt;destroy&lt;/code&gt; are gone, and each one tells you
what to use instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio tools check&lt;/code&gt;&lt;/strong&gt; is gone. &lt;code&gt;vatio push&lt;/code&gt; validates before it deploys,
and &lt;code&gt;vatio diff&lt;/code&gt; validates without deploying.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio widget&lt;/code&gt;&lt;/strong&gt; is gone. &lt;code&gt;vatio env&lt;/code&gt; prints the snippet and its token, and
the look is edited on the console’s Widget page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio mcp&lt;/code&gt;&lt;/strong&gt; is gone. Point your coding agent at &lt;code&gt;vatio docs --save&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WhatsApp and Instagram are set up in the console&lt;/strong&gt;, on the Channels page:
your own number or account, test phones, and test accounts.
&lt;code&gt;vatio whatsapp&lt;/code&gt; and &lt;code&gt;vatio instagram&lt;/code&gt; print that link. Older CLIs get the
same answer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Every API is named after who calls it.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The developer API&lt;/strong&gt; (what the CLI uses) lives at &lt;code&gt;/api/developer/v1&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Its routes read like the CLI: &lt;code&gt;/:slug/deploy/*&lt;/code&gt; is now &lt;code&gt;/:slug/check&lt;/code&gt;,
&lt;code&gt;/push&lt;/code&gt;, &lt;code&gt;/publish&lt;/code&gt;, &lt;code&gt;/rollback&lt;/code&gt;, &lt;code&gt;/status&lt;/code&gt;, &lt;code&gt;/manifest&lt;/code&gt;, &lt;code&gt;/env&lt;/code&gt; and
&lt;code&gt;/secrets&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Signing in and creating a workspace move from &lt;code&gt;/cli/*&lt;/code&gt; to
&lt;code&gt;/api/developer/v1/device_authorizations&lt;/code&gt; and &lt;code&gt;/api/developer/v1/workspaces&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/deploy/revisions&lt;/code&gt; is gone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The visitor API&lt;/strong&gt; (the widget and both SDKs) lives at &lt;code&gt;/api/visitor/v1&lt;/code&gt;.
The JavaScript SDK 3.3.0 and the iOS SDK 0.3.0 call it there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;/api/v1&lt;/code&gt;, &lt;code&gt;/cli/*&lt;/code&gt; and &lt;code&gt;/api/public/v1&lt;/code&gt; keep answering, for clients released
before these.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server-to-server is removed.&lt;/strong&gt; None of it was in use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The phone verification API&lt;/strong&gt;, along with &lt;code&gt;agent: false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversations over the API with no visitor&lt;/strong&gt; (the &lt;code&gt;api&lt;/code&gt; channel).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The identity mint, and &lt;code&gt;auth.mint&lt;/code&gt; in &lt;code&gt;vatio.yml&lt;/code&gt;.&lt;/strong&gt; WhatsApp and Instagram
visitors are anonymous, and only public tools run for them. Signed-in
visitors on the web work exactly as before. &lt;code&gt;vatio-identity&lt;/code&gt; 0.3.0 signs and
verifies the JWT, and no longer mounts a mint endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The widget is a bubble only.&lt;/strong&gt; &lt;code&gt;data-display=&quot;page&quot;&lt;/code&gt; and &lt;code&gt;data-mount&lt;/code&gt; are
gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent modes are removed.&lt;/strong&gt; &lt;code&gt;modes&lt;/code&gt;, &lt;code&gt;initial_mode&lt;/code&gt; and &lt;code&gt;mode_reset_after&lt;/code&gt;
in &lt;code&gt;vatio.yml&lt;/code&gt;, and the &lt;code&gt;switch_mode&lt;/code&gt; tool, no longer do anything. A push that
still has them succeeds and warns that they are ignored; each agent works from
its own &lt;code&gt;tools&lt;/code&gt; and &lt;code&gt;knowledge&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowledge is what you write.&lt;/strong&gt; &lt;code&gt;vatio kb follow&lt;/code&gt;, &lt;code&gt;unfollow&lt;/code&gt; and &lt;code&gt;refresh&lt;/code&gt;
are gone, and Vatio no longer reads or re-reads websites. Pages it had already
read stay as ordinary entries you can now edit (&lt;code&gt;vatio kb cat&lt;/code&gt; / &lt;code&gt;kb write&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Console notices show their message again.&lt;/strong&gt; Inviting, resending or removing
a team member, and registering, verifying or moving a test WhatsApp number,
showed “Translation missing” instead of the confirmation or the error. They
read correctly now.&lt;/p&gt;&lt;h2&gt;0.55.0 — 2026-10-01&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Flagged replies become work your coding agent can do.&lt;/strong&gt; &lt;code&gt;vatio flags&lt;/code&gt; prints
every reply a supervisor flagged in the inbox as one document for a coding
agent: the conversation, each tool call of that turn with what your backend
answered, and what the reply should have been. Each flag is now an eval case,
and &lt;code&gt;vatio eval&lt;/code&gt; replays every case against an environment — the branch’s by
default — with a judge comparing each reply to the supervisor’s note; it exits
1 when a case fails. Evals also run on every pull request preview, commented on
the pull request, and after every publish to live, which is what marks a flag
fixed in the inbox. The judge is a model from a different family than the
agent’s, and replay chats stay out of the inbox and out of the conversation
count. &lt;code&gt;vatio init&lt;/code&gt; now adds a short Vatio section to the workspace’s
&lt;code&gt;AGENTS.md&lt;/code&gt;, and the Claude Code plugin at
&lt;a href=&quot;https://github.com/vatio-ai/skills&quot;&gt;github.com/vatio-ai/skills&lt;/a&gt; adds two
skills: &lt;code&gt;vatio-new&lt;/code&gt; to build an agent from scratch and &lt;code&gt;vatio-improve&lt;/code&gt; to work
through flags. The docs’ &lt;strong&gt;For coding agents&lt;/strong&gt; section now spells out how to
start a new agent, so any coding agent reading &lt;code&gt;vatio docs&lt;/code&gt; follows the same
steps. Every morning, workspaces with new flags get a mail and,
with GitHub connected, one issue labelled &lt;code&gt;vatio-flags&lt;/code&gt; holding the digest,
ready for a coding agent on GitHub to pick up. See
&lt;a href=&quot;/docs/improve&quot;&gt;Improve your agent from flags&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.54.1 — 2026-10-01&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Source and issues are public.&lt;/strong&gt; The CLI, the JavaScript SDK, the iOS SDK and
the &lt;code&gt;vatio-identity&lt;/code&gt; gem each have a public repository under
&lt;a href=&quot;https://github.com/vatio-ai&quot;&gt;github.com/vatio-ai&lt;/a&gt;, where you can read the
code and open issues. Swift packages now install from
&lt;code&gt;https://github.com/vatio-ai/ios&lt;/code&gt;, and the gem installs with
&lt;code&gt;gem &quot;vatio-identity&quot;, git: &quot;https://github.com/vatio-ai/ruby&quot;&lt;/code&gt;. Nothing else
changed.&lt;/p&gt;&lt;h2&gt;0.54.0 — 2026-10-01&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Every git branch is an environment of its own.&lt;/strong&gt; On a branch other than the
default one, the CLI works in that branch’s environment without &lt;code&gt;--env&lt;/code&gt; —
&lt;code&gt;fix/pagos&lt;/code&gt; is &lt;code&gt;fix-pagos&lt;/code&gt; — and says so on stderr: &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;chat&lt;/code&gt;,
&lt;code&gt;kb write&lt;/code&gt;, &lt;code&gt;secrets set&lt;/code&gt;, &lt;code&gt;tokens&lt;/code&gt; and &lt;code&gt;publish&lt;/code&gt; all use it. The branch’s pull
request deploys to the same environment instead of a separate &lt;code&gt;pr-N&lt;/code&gt;, so what
was tried there before the pull request existed is still there. On the default
branch and outside a repository, every command keeps its old default. Several
people or coding agents can now fix several conversations at once, each in a
worktree, without their changes meeting before they merge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowledge changes belong to an environment, and go live with it.&lt;/strong&gt; The
entries are what live answers from; a supervisor’s edit in the inbox, the
console and a site re-reading a page change live directly. On a branch,
&lt;code&gt;vatio kb write&lt;/code&gt; makes a change only that branch answers from, and publishing
the branch — &lt;code&gt;vatio publish&lt;/code&gt;, or merging its pull request — takes the prompt
and the knowledge live together. When live changed an entry the branch also
changed, publishing is refused and names it; rewriting the entry on top of
live clears it. Each environment has a page in the console with the diff of
every entry it changed, where a conflict is resolved in place — keep the
branch’s version, take live’s, or combine them. Pull requests get a
&lt;code&gt;vatio/knowledge&lt;/code&gt; status that turns red before the merge and links to that
page, and a comment listing their knowledge changes. Today’s
unpublished draft became the changes of &lt;code&gt;preview&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A deployment is a snapshot of the whole agent.&lt;/strong&gt; Once live, it records the
version of every knowledge entry written by hand it answered from. Publishing,
and a supervisor’s edit in the inbox or console, leave a new snapshot; &lt;code&gt;vatio rollback&lt;/code&gt; moves live back one, prompt and knowledge together. Pages a site
reads are not part of it. Environments other than live are disposable, with
everything in them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio env&lt;/code&gt;.&lt;/strong&gt; Shows the environment you are in: its publishable token, the
widget snippet, the link to try it, its knowledge changes and any conflicts.
&lt;code&gt;vatio env list&lt;/code&gt; shows every environment and &lt;code&gt;vatio env rm NAME&lt;/code&gt; removes one.
An environment with nothing left to publish is removed after 14 days idle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A secret can have its own value in one environment.&lt;/strong&gt; On a branch, or with
&lt;code&gt;--env&lt;/code&gt;, &lt;code&gt;vatio secrets set&lt;/code&gt; sets the value only that environment uses, so a
branch’s tools can call staging while live calls production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A simpler console.&lt;/strong&gt; Its menu is now &lt;strong&gt;Environments&lt;/strong&gt;, &lt;strong&gt;Test&lt;/strong&gt; and
&lt;strong&gt;Channels&lt;/strong&gt;. Environments lists live, preview and every branch, each with its
deployment, agents, knowledge changes and conflicts, and secret names; GitHub
is connected there too. Under Channels, the &lt;strong&gt;Widget&lt;/strong&gt; page holds the install
snippet, the brand settings and the tokens with their allowed origins, which
used to be three pages. Knowledge is edited in the inbox (or the CLI); the
console keeps each environment’s knowledge review. The public page,
&lt;code&gt;/w/&amp;#x3C;slug&gt;&lt;/code&gt;, is live’s: the business with the widget’s bubble, no longer a
full-screen chat. Each other environment has the same page at
&lt;code&gt;/w/&amp;#x3C;slug&gt;/&amp;#x3C;environment&gt;&lt;/code&gt;, for the workspace’s members; &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;vatio env&lt;/code&gt;
and pull request comments link to the console’s Test screen for it, and the
&lt;code&gt;/w/&amp;#x3C;slug&gt;/p/…&lt;/code&gt; share links are gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every channel can point at a branch.&lt;/strong&gt; Each test phone on the shared
WhatsApp number and each test account on the shared Instagram one reaches the
environment it points at — &lt;code&gt;vatio whatsapp numbers point PHONE --env NAME&lt;/code&gt;,
&lt;code&gt;vatio instagram accounts point ID --env NAME&lt;/code&gt;, or a selector in the console —
instead of always &lt;code&gt;preview&lt;/code&gt;. With the CLI on the branch, the widget and SDKs on
its token, and &lt;code&gt;/w/&amp;#x3C;slug&gt;/&amp;#x3C;environment&gt;&lt;/code&gt; for the workspace’s members, a branch
is tried on every surface without touching live.&lt;/p&gt;
&lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Preview share links (&lt;code&gt;/w/&amp;#x3C;slug&gt;/p/…&lt;/code&gt;) no longer open: try an environment in
the console’s Test screen, signed in. The API’s &lt;code&gt;share_url&lt;/code&gt; now points there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vatio kb rollback&lt;/code&gt; and the knowledge publications behind it are gone.
&lt;code&gt;vatio rollback&lt;/code&gt; now takes the knowledge back with the prompt; to go back on
one entry alone instead: &lt;code&gt;vatio kb history BASE&lt;/code&gt; lists what reached live,
&lt;code&gt;vatio kb cat BASE ENTRY --version N&lt;/code&gt; prints one, and writing it again with
&lt;code&gt;--env live&lt;/code&gt; restores it. The API’s &lt;code&gt;snapshots&lt;/code&gt; paths answer 410.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vatio kb publish&lt;/code&gt; no longer takes &lt;code&gt;-m&lt;/code&gt;, and publishes the current
environment’s changes to one base.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pages a site reads go live as soon as they are read, instead of waiting for a
publish.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.53.0 — 2026-09-30&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The workspace’s brand is edited in the console, not in vatio.yml.&lt;/strong&gt; The
business name and summary, and the widget’s look (accent color, about, logo,
locale, greeting, suggestions and the rest), live on the workspace’s new
&lt;strong&gt;Brand&lt;/strong&gt; page. They are one setting for every environment and apply as soon
as you save. &lt;code&gt;business:&lt;/code&gt;, &lt;code&gt;widget:&lt;/code&gt; and root &lt;code&gt;allowed_origins:&lt;/code&gt; in an existing
&lt;code&gt;vatio.yml&lt;/code&gt; still push, but they are ignored: &lt;code&gt;vatio push&lt;/code&gt;, &lt;code&gt;vatio check&lt;/code&gt; and
the GitHub pull request comment print a warning with the console link. Remove
them when convenient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allowed origins belong to each publishable token.&lt;/strong&gt; A token works only from
the origins listed on it, plus Vatio’s own pages. Every token started with the
origins your workspace had, so nothing stops working. Edit them on the
console’s &lt;strong&gt;Tokens&lt;/strong&gt; page (the install snippet’s token is there too), or with
&lt;code&gt;vatio tokens create --origin URL&lt;/code&gt; (repeatable) and
&lt;code&gt;vatio tokens origins PREFIX URL...&lt;/code&gt;. &lt;code&gt;vatio tokens list&lt;/code&gt; shows each token’s
origins, and &lt;code&gt;vatio init&lt;/code&gt; no longer writes &lt;code&gt;business:&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.52.0 — 2026-09-30&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;With GitHub connected, live changes only by merging.&lt;/strong&gt; A workspace bound to a
repository publishes when a commit lands on its default branch, and nowhere
else: &lt;code&gt;vatio publish&lt;/code&gt; is refused with a message naming the repository and the
branch, and so are &lt;code&gt;vatio push --env main&lt;/code&gt; and &lt;code&gt;vatio push --env pr-N&lt;/code&gt;, which
belong to the integration. &lt;code&gt;vatio push&lt;/code&gt; to &lt;code&gt;preview&lt;/code&gt; or another named preview
still works, and &lt;code&gt;vatio rollback&lt;/code&gt; stays as the emergency button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every GitHub deploy shows on its commit.&lt;/strong&gt; Previews and publications post a
commit status (&lt;code&gt;vatio/preview (workspace)&lt;/code&gt;, &lt;code&gt;vatio/live (workspace)&lt;/code&gt;), green or
red, linking to the preview, live or the console. A failed publication used to
leave no trace outside a server log. Deploys to one workspace now run one at a
time, and a merge that finishes late never replaces a newer one already live.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio publish&lt;/code&gt; without GitHub prints a notice.&lt;/strong&gt; It works as before; the
notice says publishing from the CLI will soon require a connected repository.&lt;/p&gt;&lt;h2&gt;0.51.0 — 2026-09-30&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Knowledge has a draft, a live version, and history.&lt;/strong&gt; Every write to a base
— &lt;code&gt;vatio kb write&lt;/code&gt;, a site re-reading a page, an edit in the console or the
supervisor inbox — lands in the base’s draft and is kept as a numbered version
of its entry. Preview answers from the draft; live answers from what was last
published. &lt;code&gt;vatio kb status BASE&lt;/code&gt; shows what live does not have yet,
&lt;code&gt;vatio kb publish BASE -m NOTE&lt;/code&gt; takes it live, &lt;code&gt;vatio kb history BASE&lt;/code&gt; lists
every publication, and &lt;code&gt;vatio kb rollback BASE NUMBER&lt;/code&gt; points live back at one
instantly. Everything a base held before this release is already published, so
live answers exactly as it did.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supervisors can edit knowledge from the inbox.&lt;/strong&gt; Written entries can be
created, edited and deleted there, each entry shows its history with a diff
and a restore button, and “answered from” in a conversation now links to the
exact version the agent had.&lt;/p&gt;&lt;h2&gt;0.50.0 — 2026-09-29&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio secrets set KEY&lt;/code&gt; asks for the value.&lt;/strong&gt; Leave &lt;code&gt;VALUE&lt;/code&gt; out and the CLI
prompts &lt;code&gt;? Paste your secret:&lt;/code&gt; and echoes a &lt;code&gt;*&lt;/code&gt; per character, so the value
never lands in your shell history. Off a terminal it reads stdin instead:
&lt;code&gt;op read op://Vault/item/field | vatio secrets set KEY&lt;/code&gt;. &lt;code&gt;set KEY VALUE&lt;/code&gt; works
as before.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The CLI tells you when a new release is out.&lt;/strong&gt; After a command, if npm has a
newer &lt;code&gt;@vatio-ai/cli&lt;/code&gt;, you see the version and the command to upgrade. It checks
the registry at most once a day, only when stderr is a terminal, and never in
CI or under &lt;code&gt;vatio mcp&lt;/code&gt;. &lt;code&gt;VATIO_NO_UPDATE_NOTIFIER=1&lt;/code&gt; turns it off.&lt;/p&gt;&lt;h2&gt;0.49.0 — 2026-09-29&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The identity token can enrich the inbox.&lt;/strong&gt; Add a &lt;code&gt;metadata&lt;/code&gt; claim to the JWT
you already sign, and the inbox shows it in the conversation header:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;profile&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://acme.com/admin/users/42&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;  &quot;badges&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;plan&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Premium&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;tone&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;&quot;country&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;CL&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;profile&lt;/code&gt; becomes a &lt;strong&gt;Profile ↗&lt;/strong&gt; link to the person in your own admin. If it
is not an &lt;code&gt;http(s)&lt;/code&gt; URL, the header shows a quiet “Invalid profile link”
warning instead. Each entry in &lt;code&gt;badges&lt;/code&gt; is a chip, and an optional &lt;code&gt;tone&lt;/code&gt;
(&lt;code&gt;green&lt;/code&gt;, &lt;code&gt;amber&lt;/code&gt;, &lt;code&gt;red&lt;/code&gt;, &lt;code&gt;gray&lt;/code&gt;) colours it. Nothing changes for tokens
without &lt;code&gt;metadata&lt;/code&gt;. &lt;code&gt;vatio auth --new-key&lt;/code&gt; now lists the claim. See
&lt;a href=&quot;/docs/authentication/#enrich-the-inbox&quot;&gt;Enrich the inbox&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;0.48.1 — 2026-09-28&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio update&lt;/code&gt; now points to the correct npm package.&lt;/strong&gt; The command recommended
&lt;code&gt;vatio@latest&lt;/code&gt;, which returns a 404 from npm. The package is &lt;code&gt;@vatio-ai/cli&lt;/code&gt;; the
executable it installs is &lt;code&gt;vatio&lt;/code&gt;. The message now recommends
&lt;code&gt;npm install -g @vatio-ai/cli@latest&lt;/code&gt; for a global install and
&lt;code&gt;npx @vatio-ai/cli@latest&lt;/code&gt; to run the latest release directly.&lt;/p&gt;&lt;h2&gt;0.48.0 — 2026-09-28&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A bare &lt;code&gt;vatio publish&lt;/code&gt; promotes your latest push.&lt;/strong&gt; It used to promote
whatever the &lt;code&gt;preview&lt;/code&gt; alias pointed at, so &lt;code&gt;vatio push --env pr-42&lt;/code&gt; followed by
&lt;code&gt;vatio publish&lt;/code&gt; re-published the old preview and live never changed. Now it
takes the most recent deployment, whichever preview it landed on, and says
which one: &lt;code&gt;Published live deployment #80 from pr-42&lt;/code&gt;. &lt;code&gt;--env NAME&lt;/code&gt; still
promotes a specific preview.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio chat show CHAT_ID&lt;/code&gt; reads any chat in the workspace.&lt;/strong&gt; A visitor’s chat
on the web or WhatsApp, not only the one your CLI opened: the channel, the
environment and deployment that answered it, every message and every tool
call. &lt;code&gt;--json&lt;/code&gt; prints the raw payload.&lt;/p&gt;</description>
    </item>
    <item>
      <title>September 21–27, 2026: Vatio 0.33.0, 0.34.0, 0.35.0, 0.36.0, 0.37.0, 0.37.1, 0.37.2, 0.38.0, 0.39.0, 0.40.0, 0.41.0, 0.41.1, 0.42.0, 0.43.0, 0.44.0, 0.45.0, 0.46.0, 0.47.0 and 0.47.1</title>
      <link>https://vatio.ai/changelog/2026-09-28</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-09-28</guid>
      <pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate>
      <description>&lt;h2&gt;0.47.1 — 2026-09-26&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The README this package publishes was describing a runtime that no longer
exists.&lt;/strong&gt; It said &lt;code&gt;tools/&lt;/code&gt;, &lt;code&gt;lib/&lt;/code&gt; and &lt;code&gt;auth/&lt;/code&gt; next to &lt;code&gt;vatio.yml&lt;/code&gt; were “plain
JavaScript the agent runs”; tools have been one HTTP request in YAML for a while
now, and there is no JavaScript runtime. Its command list was also nine commands
short — &lt;code&gt;chat&lt;/code&gt;, &lt;code&gt;kb&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;mcp&lt;/code&gt;, &lt;code&gt;issue&lt;/code&gt;, &lt;code&gt;whatsapp&lt;/code&gt; and &lt;code&gt;instagram&lt;/code&gt; among
them.&lt;/p&gt;
&lt;p&gt;Nothing in the CLI changed. The version moves because the README ships inside
the tarball, and npmjs.com is where most people meet this package for the first
time — a wrong README there is wrong in the one place it is read most.&lt;/p&gt;&lt;h2&gt;0.47.0 — 2026-09-26&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;init&lt;/code&gt; no longer asks for an account, and &lt;code&gt;push&lt;/code&gt; asks by email.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vatio init&lt;/code&gt; used to stop and wait for a human to approve a code in a browser
before it would write a file. That put the one step only a person can do at the
very front — before your coding agent had built anything, and before you had
any reason to care.&lt;/p&gt;
&lt;p&gt;Now &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;init&lt;/code&gt; and &lt;code&gt;tools check&lt;/code&gt; never touch the network. Your agent can
write the whole workspace before an account exists. &lt;code&gt;vatio push&lt;/code&gt; is the first
command that makes something run on a server, so it is the one that asks who
you are:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  Before&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; can&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; this,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; need&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; know&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; whose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; it&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  Your&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; email&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (we &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; link&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;): you@example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  We&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; emailed&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; link.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  This&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; terminal&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; HXKT-4820&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; —&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; it&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; matches&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; before&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; approve.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One click on that link creates your account if it did not exist, authorizes the
terminal, and drops you in the console. No password, no separate sign-up, no
code to retype — the device code is still there, but you compare it instead of
typing it. It has to match what your terminal printed.&lt;/p&gt;
&lt;p&gt;Signing in to the console with an email we have never seen now creates the
account too, which is what Google and GitHub always did here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The console opens as your agent exists.&lt;/strong&gt; Before your first push it is one
screen with one command. After it, it is the screen you test on: your agent
behind three doors — web, WhatsApp, Instagram — and beside them what the
terminal cannot show you. Which tool it called with which arguments and how
long each took, which knowledge it read, whether a handoff rule fired, tokens
and latency. That panel keeps its shape whichever channel you pick, because it
is one agent with three entrances.&lt;/p&gt;
&lt;p&gt;WhatsApp and Instagram verification happens on that same screen now, as three
steps, instead of being a detour to another page.&lt;/p&gt;
&lt;p&gt;Publishing lands on one question — where will people write to it? — with what
WhatsApp and Instagram each need from Meta listed before the button rather than
halfway through their popup.&lt;/p&gt;
&lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The push response field &lt;code&gt;whatsapp_preview_hint&lt;/code&gt; is now &lt;code&gt;first_push_hint&lt;/code&gt;, and
it points at the test screen. A CLI older than this one stops printing that
one-time nudge after a first push; nothing else changes.&lt;/li&gt;
&lt;li&gt;The Widget page, the Usage page and the full-window preview visitor page are
gone. Installing the chat on your site is part of Integrations, testing is
the test screen, and usage comes back as analytics when there is something to
analyse.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;0.46.0 — 2026-09-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The docs are their own site: &lt;a href=&quot;https://docs.vatio.ai&quot;&gt;docs.vatio.ai&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They used to be one 1,700-line page built into the platform’s Docker image.
That cost two things worth losing. Fixing a typo paid for an image build and a
rollout, and every reader — person or agent — got all of it or none of it.&lt;/p&gt;
&lt;p&gt;Now there is a page per topic, with a search field, four tabs — Documentation,
CLI, SDK, API Reference — and Spanish alongside English. Everything that
pointed at &lt;code&gt;vatio.ai/docs&lt;/code&gt; still works: it redirects, including the anchors of
the old single page.&lt;/p&gt;
&lt;p&gt;For agents, the contract is still one fetch. &lt;code&gt;vatio docs&lt;/code&gt; is unchanged and
still prints the whole thing, because &lt;code&gt;vatio.ai/docs.md&lt;/code&gt; redirects to
&lt;code&gt;docs.vatio.ai/docs.md&lt;/code&gt; — no upgrade was needed for that. What is new is that
every page is also Markdown on its own path plus &lt;code&gt;.md&lt;/code&gt;, indexed at
&lt;a href=&quot;https://docs.vatio.ai/llms.txt&quot;&gt;&lt;code&gt;/llms.txt&lt;/code&gt;&lt;/a&gt;, so an agent working on one thing
can read the one page about it instead of spending a context window on the
whole contract.&lt;/p&gt;
&lt;p&gt;Where the CLI prints a docs link — &lt;code&gt;vatio --help&lt;/code&gt;, &lt;code&gt;vatio auth --new-key&lt;/code&gt;, the
message when &lt;code&gt;vatio docs&lt;/code&gt; cannot reach the host — it now names the new site.&lt;/p&gt;&lt;h2&gt;0.45.0 — 2026-09-25&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio issue&lt;/code&gt; sends the workspace, not just the sentence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run from a workspace, the command now attaches the directory — the same files
&lt;code&gt;vatio push&lt;/code&gt; sends. A report about a tool arrives with the tool, and a report
about a manifest that will not push arrives with the manifest that will not
push, which is precisely the one Vatio could not see before: what it held was
the last version that pushed &lt;em&gt;successfully&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Vatio keeps &lt;code&gt;vatio.yml&lt;/code&gt; and everything under &lt;code&gt;tools/&lt;/code&gt;, lists the rest of the
directory by name, and records what its own checks made of it at that moment.
Anything a check complained about comes along too, so the &lt;code&gt;tools/*.js&lt;/code&gt; and
&lt;code&gt;lib/*.js&lt;/code&gt; that 0.42.0 stopped accepting arrive with the report that asks how
to port them.&lt;/p&gt;
&lt;p&gt;Hidden files are never included, so &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;.git/&lt;/code&gt; stay where they are. The
command prints what it is attaching before it sends, and &lt;code&gt;--no-source&lt;/code&gt; sends
the report on its own.&lt;/p&gt;&lt;h2&gt;0.44.0 — 2026-09-24&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio issue list&lt;/code&gt; shows your issues.&lt;/strong&gt; It reported that you had sent none
while &lt;code&gt;vatio issue show &amp;#x3C;id&gt;&lt;/code&gt; returned those same issues, because the command
read the wrong key off the response and got an empty list every time. &lt;code&gt;list&lt;/code&gt; is
the only way back to a report whose number you did not keep, and an empty one
reads as “it never went through” — which is how the same problem gets filed
twice.&lt;/p&gt;
&lt;p&gt;Each row now says where the report stands — &lt;code&gt;sent&lt;/code&gt;, &lt;code&gt;in progress&lt;/code&gt;, &lt;code&gt;with us&lt;/code&gt;,
&lt;code&gt;answered&lt;/code&gt; or &lt;code&gt;closed&lt;/code&gt; — and prints the pull request when there is one, so a
coding agent can watch the fix land instead of waiting to be told.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio kb create&lt;/code&gt; takes several names.&lt;/strong&gt; A first push that declares two
knowledge bases refused twice and cost a round trip per name. It now refuses
once, for all the missing bases at once, and names the single command that
creates them:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;knowledge: no knowledge base named &quot;docs&quot; or &quot;policies&quot; on this workspace.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Create them with `vatio kb create docs policies`, then push again.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Still nothing implicit: a base exists because someone typed its name. That is
what keeps &lt;code&gt;knowledge: [defualt]&lt;/code&gt; a failed push rather than an empty base the
agent searches forever, quietly answering with nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt; the root-key table listed &lt;code&gt;identity&lt;/code&gt;, &lt;code&gt;knowledge&lt;/code&gt; and &lt;code&gt;links&lt;/code&gt;, all
three of which were removed in 0.41.0 and 0.43.0 and now fail the push. It
lists &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;agents&lt;/code&gt; and &lt;code&gt;entry&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;All three were reported through &lt;code&gt;vatio issue&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.43.0 — 2026-09-24&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A workspace can run several agents, and the manifest says which one answers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Key them under &lt;code&gt;agents:&lt;/code&gt; instead of &lt;code&gt;agent:&lt;/code&gt;, and add an &lt;code&gt;entry:&lt;/code&gt; table:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;agents&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  home&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Ana&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Answer product questions. Nobody here is signed in.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    tools&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;knowledge_lookup&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  portal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Ana&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    instructions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;You are talking to a signed-in customer.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    tools&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;my_orders&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;knowledge_lookup&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    knowledge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;portal_kb&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;authenticated&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;agent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;home&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;claims&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;staff&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }, &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;agent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;staff&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  - { &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;agent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;portal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The table is ordered and the order is the rule: the first row whose conditions
hold wins, and the last row is the fallback. Letting each agent declare its own
entry condition was the other design, and it loses on precedence — two agents
that both say “authenticated” need a specificity rule nobody wants to reason
about. Here the whole policy reads top to bottom in one place, and a reviewer
can check it without knowing how Vatio works.&lt;/p&gt;
&lt;p&gt;This is for the marketing site and the customer portal that embed the same
widget. The anonymous visitor asking about prices and the signed-in customer
asking about their own records are not the same conversation, and one set of
instructions serving both serves neither. Until now that meant two workspaces:
two manifests, two knowledge bases and two tokens to keep in step.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent:&lt;/code&gt; still means exactly what it did — one agent, keyed &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;knowledge:&lt;/code&gt; and &lt;code&gt;links:&lt;/code&gt; move onto the agent.&lt;/strong&gt; They used to sit at the root
and apply to the workspace; now each agent states its own, and there is no
inherited default. A manifest that still declares either at the root fails the
push and says where to put it — one edit, and &lt;code&gt;vatio diff&lt;/code&gt; shows nothing else
changed.&lt;/p&gt;
&lt;p&gt;The repetition is the point. What an agent knows and which urls it may hand out
are the two things you check when it answers wrongly, and an inherited value
means looking somewhere else and then working out whether this agent overrode
it. It also matters in the prompt: every declared url is listed there, so a
portal agent would otherwise carry a marketing agent’s whole link list around
without ever handing one out. Duplication you can see beats inheritance you have
to reconstruct.&lt;/p&gt;
&lt;p&gt;Which agent you get is settled before the first reply, on every channel: Vatio
verifies the token as the conversation opens, so the choice happens before the
first message is answered rather than after. Sign in mid-conversation and
&lt;code&gt;identify()&lt;/code&gt; runs the table again — same thread, same history, and from the next
message on, the agent for who you now are.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;entry:&lt;/code&gt; is not a security control and is not built as one. A visitor with no
valid token has no verified identity, so no &lt;code&gt;access: private&lt;/code&gt; tool runs for them
whatever agent they land on: a wrong row shows the wrong prompt, never someone
else’s data. Protect data with &lt;code&gt;access: private&lt;/code&gt; on the tool, as before.&lt;/p&gt;
&lt;p&gt;No migrations. A workspace with one agent needs one edit: move &lt;code&gt;knowledge:&lt;/code&gt; and
&lt;code&gt;links:&lt;/code&gt; inside the &lt;code&gt;agent:&lt;/code&gt; block.&lt;/p&gt;&lt;h2&gt;0.42.0 — 2026-09-24&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A tool is one HTTP call to your backend. JavaScript tools are gone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tools/*.js&lt;/code&gt; ran in a sandbox Vatio operated, and &lt;code&gt;lib/*.js&lt;/code&gt; were the helpers
bundled with them. Both are removed, along with the runtime behind them.&lt;/p&gt;
&lt;p&gt;The reason is the same one that removed &lt;code&gt;auth/*.js&lt;/code&gt; in 0.41.0: the file you
wrote was never really the point. Every JavaScript tool deployed on Vatio was
either a call to a backend the workspace already ran, or the scaffold nobody
edited. Meanwhile the platform was carrying a bundler, a sandbox, a deploy step
and a second execution model so that code with somewhere better to live could
live here instead.&lt;/p&gt;
&lt;p&gt;So it lives there. Describe the call in &lt;code&gt;tools/&amp;#x3C;key&gt;.yml&lt;/code&gt; with &lt;code&gt;request:&lt;/code&gt; and
&lt;code&gt;respond:&lt;/code&gt;, and put whatever the call needs to do — branching, a second
request, composing a response — in the endpoint it hits. That endpoint is
yours: it can already read your database, and it does not have to be redeployed
through us to change.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vatio push&lt;/code&gt; and &lt;code&gt;vatio tools check&lt;/code&gt; refuse a &lt;code&gt;tools/*.js&lt;/code&gt; or &lt;code&gt;lib/*.js&lt;/code&gt; and
name the file. Nothing else in a manifest changes, and &lt;code&gt;access: private&lt;/code&gt;,
&lt;code&gt;$auth&lt;/code&gt;, &lt;code&gt;$env&lt;/code&gt; and the result contract all work exactly as they did.&lt;/p&gt;
&lt;p&gt;Also gone: the 301 from &lt;code&gt;/vatio-widget.js&lt;/code&gt; to the CDN, which no page still
used, and a &lt;code&gt;route:&lt;/code&gt; field documented on tool results that was never
implemented.&lt;/p&gt;&lt;h2&gt;0.41.1 — 2026-09-23&lt;/h2&gt;&lt;p&gt;&lt;code&gt;vatio auth --new-key&lt;/code&gt; told you to keep &lt;code&gt;identity.pem&lt;/code&gt; secret and stopped
there, which left the one question a developer actually has unanswered: secret
&lt;em&gt;where&lt;/em&gt;. It says it now, and so do the docs — the private half goes into your
own backend, because your backend is what signs, and then out of the workspace
directory.&lt;/p&gt;
&lt;p&gt;Explicitly not into &lt;code&gt;vatio secrets&lt;/code&gt;. That store is read by Vatio, and a private
key in it would let Vatio mint tokens for your users rather than only check
them, which is the property the whole design is built around.&lt;/p&gt;&lt;h2&gt;0.41.0 — 2026-09-23&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Authentication is one JWT you sign, on every channel.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There used to be two ways to tell Vatio who a visitor is: an &lt;code&gt;identity:&lt;/code&gt; block
that verified a token your page signed, and &lt;code&gt;auth/*.js&lt;/code&gt; — a JavaScript file you
wrote, deployed and maintained, whose whole job turned out to be one HTTP call.
The second existed because WhatsApp carries a phone number and nothing else, so
someone has to ask your backend whose it is. Asking is fine. What was wrong is
what came back: a plain answer Vatio then asserted to your own API. The platform
ended up being something you had to trust about identity.&lt;/p&gt;
&lt;p&gt;Now it carries proof instead. You sign a JWT, Vatio verifies it with your public
key, and your tools get it as &lt;code&gt;$auth.token&lt;/code&gt;. On the web your page puts it on the
widget. On WhatsApp Vatio posts the phone number to your &lt;code&gt;mint:&lt;/code&gt; endpoint and you
sign one back — the same token, verified the same way. Vatio holds only a public
key, so it can check a token and never mint one, and that is now true on every
channel rather than only on the web.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;auth&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  public_key&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;identity.pub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  mint&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:                                  &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;# only for channels with no session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;$env.API_URL/api/vatio/identity&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;vatio auth --new-key&lt;/code&gt; generates the pair, gitignores the private half, and
prints the exact claims to sign.&lt;/p&gt;
&lt;p&gt;Also: the token’s expiry means something now. The old design resolved a visitor
once and cached the answer for the life of the conversation, so a twelve-hour
token stopped being checked after the first minute of a chat that ran longer.
Verifying a signature costs microseconds, so it happens on every tool call. On
WhatsApp an expired token re-mints itself and the conversation carries on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signing in no longer costs you the conversation.&lt;/strong&gt; Someone asks a question,
the agent tells them to sign in, they do, and they come back: the chat they
already had is still there, now with a name on it. Whether they signed in
through &lt;code&gt;identify()&lt;/code&gt; or by navigating away and reloading the page with a token
makes no difference.&lt;/p&gt;
&lt;p&gt;It used to start over — and a visitor who was &lt;em&gt;already&lt;/em&gt; signed in lost their
conversation on &lt;strong&gt;every page reload&lt;/strong&gt;, because the SDK’s session key was
computed over the whole token and a backend signs a fresh one on each render.
The key is the subject now.&lt;/p&gt;
&lt;p&gt;What is never carried over is somebody else’s conversation: a chat that
belonged to &lt;code&gt;sub&lt;/code&gt; A never passes to &lt;code&gt;sub&lt;/code&gt; B, so signing in as a different
person looks exactly like arriving for the first time. The server decides that,
not the page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breaking.&lt;/strong&gt; &lt;code&gt;identity:&lt;/code&gt; is &lt;code&gt;auth:&lt;/code&gt;. &lt;code&gt;authentication.schemes&lt;/code&gt; and &lt;code&gt;auth/*.js&lt;/code&gt;
are gone, and so are scheme names: a tool is &lt;code&gt;access: private&lt;/code&gt; or public.
&lt;code&gt;audience&lt;/code&gt; is no longer declared — it is your workspace slug, and it is now
required in the token, so a JWT you signed for something else cannot be replayed
as an identity. A private tool that declares &lt;code&gt;user_id&lt;/code&gt; (or &lt;code&gt;customer_id&lt;/code&gt;,
&lt;code&gt;account_id&lt;/code&gt;, &lt;code&gt;member_id&lt;/code&gt;, &lt;code&gt;patient_id&lt;/code&gt;, &lt;code&gt;subject&lt;/code&gt;) as a parameter now fails the
deploy instead of warning: the model fills parameters, so that one was always a
way to ask for someone else’s data. Every error names what to do instead.&lt;/p&gt;&lt;h2&gt;0.40.0 — 2026-09-23&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A knowledge base holds entries, and an entry is Markdown.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It used to hold “sources”, and a source was either a crawl — which produced
documents you could not open, let alone fix a typo in — or an upload, which
kept only the chunks it was cut into. Three words for two things, and you had
to know which was which to read the screen. Now there is one kind of content:
an entry, written by you or written by a &lt;strong&gt;site&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A site is one URL.&lt;/strong&gt; No include or exclude lists: the URL says it, and a URL
is that URL while a pattern is every page that matches it.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What you write&lt;/th&gt;&lt;th&gt;What it reads&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;acme.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;the home page, and only it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;acme.com/help&lt;/code&gt;&lt;/td&gt;&lt;td&gt;that one page&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;acme.com/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;every page of the site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;acme.com/help/**&lt;/code&gt;&lt;/td&gt;&lt;td&gt;that section, however deep&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Vatio reads each site again every night and rewrites the entries it owns, so a
base keeps up with the pages it mirrors without anyone pressing a button. A
page whose Markdown has not changed costs one request and nothing else — it is
not re-indexed and not re-embedded. An entry a site wrote is not editable:
the next read would overwrite it without a word, so you change the site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Same actions everywhere.&lt;/strong&gt; &lt;code&gt;vatio kb write BASE ENTRY [FILE]&lt;/code&gt; puts Markdown
under a name — creating it or replacing it, reading stdin when no file is
given — &lt;code&gt;vatio kb cat&lt;/code&gt; prints exactly what Vatio holds, and &lt;code&gt;vatio kb follow&lt;/code&gt;,
&lt;code&gt;unfollow&lt;/code&gt; and &lt;code&gt;refresh&lt;/code&gt; manage sites. &lt;code&gt;add-source&lt;/code&gt;, &lt;code&gt;upload&lt;/code&gt;, &lt;code&gt;rm-source&lt;/code&gt; and
&lt;code&gt;reindex&lt;/code&gt; are gone, along with the two kinds of source they addressed. In the
API, entries live at &lt;code&gt;/knowledge_bases/:name/entries/:entry&lt;/code&gt; (&lt;code&gt;PATCH&lt;/code&gt; to write,
&lt;code&gt;GET&lt;/code&gt; for the Markdown) and sites at &lt;code&gt;/knowledge_bases/:name/sites&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Redirects are followed.&lt;/strong&gt; A site that answers &lt;code&gt;301&lt;/code&gt; or &lt;code&gt;302&lt;/code&gt; — an apex
sending you to &lt;code&gt;www&lt;/code&gt;, a &lt;code&gt;/&lt;/code&gt; sending you to &lt;code&gt;/home&lt;/code&gt; — used to index nothing at
all and report that it had completed. So did a sitemap behind a redirect. And
a page that produces no text now says why, instead of disappearing from a run
that claims success.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accents survive.&lt;/strong&gt; A page whose charset lives only in its HTTP header was
parsed as Latin-1, so “Narváez” was indexed as “NarvÃ¡ez” and nobody searching
for the name would find it.&lt;/p&gt;&lt;h2&gt;0.39.0 — 2026-09-23&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One API, one view, and &lt;code&gt;environment&lt;/code&gt; said out loud.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The docs used to describe two chat APIs under one heading, as though you got to
pick. You never did: one is you holding a &lt;code&gt;vat_&lt;/code&gt; token, the other is a
stranger’s browser. The browser one is now documented as what it is — methods
of the &lt;a href=&quot;/docs/sdk/&quot;&gt;SDK&lt;/a&gt;, its only client — and the &lt;a href=&quot;/docs/api/&quot;&gt;API
section&lt;/a&gt; is what your developer token opens, each group naming the
&lt;code&gt;vatio&lt;/code&gt; command that does the same thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;view&lt;/code&gt; is gone from the chat endpoints.&lt;/strong&gt; It took &lt;code&gt;visitor&lt;/code&gt; or &lt;code&gt;developer&lt;/code&gt;
and quietly turned anything else into &lt;code&gt;visitor&lt;/code&gt;, so &lt;code&gt;view=debug&lt;/code&gt; — the guess
almost everyone made — returned a smaller payload with no error and looked
complete. Holding the developer token &lt;em&gt;is&lt;/em&gt; the developer view, so both reads
now answer in full: deleted messages, tool calls with their results,
attachments, delivery receipts, and the identity block. Print what you need.
&lt;code&gt;vatio chat transcript&lt;/code&gt; is unchanged for you; it filters the visitor’s half of
the thread itself now instead of asking the server for less.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;environment&lt;/code&gt; is required on &lt;code&gt;POST /chats&lt;/code&gt; and &lt;code&gt;POST /chats/:id/reset&lt;/code&gt;.&lt;/strong&gt; It
was the one field in the API that defaulted to &lt;code&gt;live&lt;/code&gt; — leave it out of a
hand-written request and you were holding a real conversation with your
published agent: billed, in your inbox, tools running against live secrets. A
missing or unparseable environment is now 422 and creates nothing. The CLI
always sent &lt;code&gt;preview&lt;/code&gt;, so nothing changes if you talk to Vatio through it.&lt;/p&gt;&lt;h2&gt;0.38.0 — 2026-09-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The SDK is on npm, and the widget is the only thing you paste into a page.&lt;/strong&gt;
Two changes with one shape: everything Vatio ships is now either a package you
install or a page you visit, and the list of scripts that go into somebody
else’s HTML is one item long.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @vatio-ai/sdk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { Vatio } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;@vatio-ai/sdk&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cdn.vatio.ai/v1/sdk.js&lt;/code&gt; is gone, and so is the &lt;code&gt;/sdk/1.js&lt;/code&gt; redirect to it.
Nothing fetches the SDK at runtime any more: &lt;code&gt;widget.js&lt;/code&gt; bundles it, which is
a little larger and one whole failure mode smaller. That mode was worth
losing — a dynamic &lt;code&gt;import()&lt;/code&gt; is a &lt;em&gt;module&lt;/em&gt; fetch, so it was a CORS request
from every page that wasn’t vatio.ai, and when it failed all the browser said
was “Failed to fetch dynamically imported module”, which reads like a 404 and
never was one. It cost a production afternoon once.&lt;/p&gt;
&lt;p&gt;No bundler is still fine — &lt;code&gt;https://cdn.jsdelivr.net/npm/@vatio-ai/sdk/+esm&lt;/code&gt;
serves the same module. Pin the major the ordinary way, &lt;code&gt;&quot;^2.0.0&quot;&lt;/code&gt;: a semver
range in your &lt;code&gt;package.json&lt;/code&gt; is what the &lt;code&gt;/v1/&lt;/code&gt; in the old URL was reaching
for, and says it better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The inbox is a page in Vatio, and there is no credential anywhere near it.&lt;/strong&gt;
It used to be a second embeddable script (&lt;code&gt;inbox.js&lt;/code&gt;) you mounted in your own
product and authenticated by signing a JWT against an &lt;code&gt;inbox:&lt;/code&gt; block in
&lt;code&gt;vatio.yml&lt;/code&gt;. All of it is gone: the script, the block, and the API behind them.
&lt;code&gt;vatio push&lt;/code&gt; refuses &lt;code&gt;inbox:&lt;/code&gt; now, so delete it and the key file it names.&lt;/p&gt;
&lt;p&gt;Invite supervisors from &lt;strong&gt;Team&lt;/strong&gt; in the console. They sign in with a code to
their email and land on &lt;code&gt;/workspaces/&amp;#x3C;id&gt;/inbox&lt;/code&gt; — every conversation, replies,
human takeover, ratings, the runtime trace. Remove them from the same page and
the next request they make is refused, including a socket they already had
open.&lt;/p&gt;
&lt;p&gt;That is the whole access model, and it is deliberately the smallest one
available: being signed in to Vatio, as someone this workspace invited. No
token to mint, nothing to sign, nothing that expires on its own schedule, and
no second place that can grant access to a conversation.&lt;/p&gt;
&lt;p&gt;The old design asked every developer to build and run a small authentication
system — generate a keypair, guard the private half, pick an algorithm, pick an
expiry, remember to rotate — to answer a question Vatio can already answer, and
the answer granted read-and-reply on every conversation in the workspace. The
version that replaced it had Vatio issue the credential instead, which was
better, and it was still a credential, an exchange endpoint, a token table and
a CLI command in service of a supervisor UI nobody outside Vatio had built.
Withdrawing the option is what actually removed the cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building a supervisor UI inside your own product is not supported for now.&lt;/strong&gt;
If that is something you want, say so — reopening it means adding a credential
back to a client that already works, not rebuilding the feature.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://vatio.ai/vatio-inbox.js&lt;/code&gt; no longer redirects anywhere, because there
is no longer anything to redirect to. &lt;code&gt;vatio-widget.js&lt;/code&gt; still does, and will.&lt;/p&gt;&lt;h2&gt;0.37.2 — 2026-09-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The package is &lt;code&gt;@vatio-ai/cli&lt;/code&gt;.&lt;/strong&gt; The command is still &lt;code&gt;vatio&lt;/code&gt; — a package’s name
and the binary it installs are separate things:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @vatio-ai/cli&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-agent&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;           # nothing installed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @vatio-ai/cli&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x26;&amp;#x26; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two reasons for the scope. The first is forced: npm will not publish a package
called &lt;code&gt;vatio&lt;/code&gt;, because it reads as a typo of
&lt;a href=&quot;https://www.npmjs.com/package/valtio&quot;&gt;valtio&lt;/a&gt;, an unrelated state library, and
the registry refuses names close enough to an existing one to be mistaken for
it. That rule is worth respecting rather than routing around.&lt;/p&gt;
&lt;p&gt;The second is the one that decided it. The CLI will not be the only thing Vatio
publishes — a frontend built on the SDK wants &lt;code&gt;npm i @vatio-ai/sdk&lt;/code&gt;, not a script
tag — and a scope claimed now is one name that stays coherent instead of two
that have to be reconciled later.&lt;/p&gt;
&lt;p&gt;Nothing else changed: same commands, same flags, same &lt;code&gt;~/.vatio/config.json&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.37.1 — 2026-09-22&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whatsapp connect&lt;/code&gt; opens the browser too.&lt;/strong&gt; It printed the link and
stopped, while &lt;code&gt;vatio instagram connect&lt;/code&gt; printed it &lt;em&gt;and&lt;/em&gt; opened it — two
sibling commands behaving differently for no reason a developer could see.&lt;/p&gt;
&lt;p&gt;The link is still printed first and still printed in full, so nothing is lost
where there is no browser to open: over SSH, in a container, on a headless
machine, the call quietly does nothing and the URL is there to paste.&lt;/p&gt;&lt;h2&gt;0.37.0 — 2026-09-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio whatsapp connect&lt;/code&gt; prints a link, and pasted credentials are gone.&lt;/strong&gt;
The command took &lt;code&gt;--phone-number-id&lt;/code&gt;, &lt;code&gt;--waba-id&lt;/code&gt; and &lt;code&gt;--token&lt;/code&gt;. It takes no
flags now: it prints a URL and stops, the same shape as &lt;code&gt;vatio instagram connect&lt;/code&gt; and &lt;code&gt;vatio login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is not a CLI preference, it is what connecting a number actually is. Meta’s
Embedded Signup is a consent screen a person has to read, and the three ids the
flags wanted only exist &lt;em&gt;after&lt;/em&gt; it has run — so for the case that matters most,
a number sitting in the WhatsApp Business app on someone’s phone, the flags
could never have worked at all. That number can now be connected and &lt;strong&gt;stay in
the phone app&lt;/strong&gt;, which only this flow can do.&lt;/p&gt;
&lt;p&gt;The form in the app is gone with it, along with “Enter details manually
instead”. An expired access token is renewed by running the same connect flow
again: Meta hands back a fresh token for the same number and it replaces the old
one in place. Connecting a &lt;em&gt;different&lt;/em&gt; number still has to be a disconnect
first.&lt;/p&gt;
&lt;p&gt;If you were scripting &lt;code&gt;vatio whatsapp connect&lt;/code&gt; with flags, it now exits telling
you the option is unknown. Everything else about the command group — &lt;code&gt;status&lt;/code&gt;,
&lt;code&gt;check&lt;/code&gt;, &lt;code&gt;activate&lt;/code&gt;, &lt;code&gt;deactivate&lt;/code&gt;, &lt;code&gt;disconnect&lt;/code&gt;, and all of &lt;code&gt;numbers&lt;/code&gt; — is
unchanged.&lt;/p&gt;&lt;h2&gt;0.36.0 — 2026-09-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The CLI is an npm package now.&lt;/strong&gt; There is nothing to install:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @vatio-ai/cli&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; my-agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; @vatio-ai/cli&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have Node 20 or newer you have the CLI. The Ruby one that
&lt;code&gt;curl … /install.sh | bash&lt;/code&gt; put in &lt;code&gt;~/.vatio-cli/&lt;/code&gt; is gone, and so is
&lt;code&gt;/install.sh&lt;/code&gt; itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Node is the runtime this audience already has, and Ruby is the one some
of them do not. A CLI that asks you to find a runtime before it can help you is
a CLI that loses the people it was written for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What carries over:&lt;/strong&gt; your login. It is the same &lt;code&gt;~/.vatio/config.json&lt;/code&gt;, with
the same keys — run &lt;code&gt;npx @vatio-ai/cli push&lt;/code&gt; and you are already authenticated. Every
command keeps its name, its flags and its output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To migrate:&lt;/strong&gt; delete &lt;code&gt;~/.vatio-cli/&lt;/code&gt; and the &lt;code&gt;vatio&lt;/code&gt; symlink in
&lt;code&gt;~/.local/bin/&lt;/code&gt;, then use &lt;code&gt;npx @vatio-ai/cli&lt;/code&gt; (or &lt;code&gt;npm install -g @vatio-ai/cli&lt;/code&gt;).
Nothing else to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio update&lt;/code&gt; is gone&lt;/strong&gt; with it: &lt;code&gt;npx @vatio-ai/cli&lt;/code&gt; runs the current release
every time, so there is no version of the CLI that can fall behind the
platform. A global install updates with &lt;code&gt;npm install -g @vatio-ai/cli@latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio pull&lt;/code&gt; is removed.&lt;/strong&gt; It overwrote your local files from a deployed
manifest, and the reason to stop is that it could never tell you anything your
repository did not already contain.&lt;/p&gt;
&lt;p&gt;A deployed manifest is only ever produced by a push. Nothing else writes one —
no screen in the Vatio app edits your agent, your tools or your widget, because
&lt;code&gt;vatio.yml&lt;/code&gt; owns all of it. So what pull handed back was your own repository,
one round trip later, and less: the logo it admitted it could not restore,
because a revision keeps that file’s name and digest and never its bytes.&lt;/p&gt;
&lt;p&gt;If you want to see what is actually deployed:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; live&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    # what your directory would change there&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --full&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;        # both manifests in full&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the manifest itself is one request: &lt;code&gt;GET /api/v1/:slug/deploy/manifest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The CLI test suite is removed too&lt;/strong&gt;, along with the Ruby 2.6 CI job that ran
it. It tested a CLI that is being replaced, and the drift guard it carried — the
one that reconciled the command dispatch against &lt;code&gt;vatio help&lt;/code&gt; and against these
docs — is gone with it. Adding or renaming a command now needs those three read
against each other by hand.&lt;/p&gt;&lt;h2&gt;0.35.0 — 2026-09-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A chat is you, and &lt;code&gt;vatio chat&lt;/code&gt; can talk to live.&lt;/strong&gt; &lt;code&gt;vatio chat --channel whatsapp --from +56912345678&lt;/code&gt; let you arrive at your own agent as a simulated
WhatsApp visitor. It is gone, on both sides — the CLI no longer sends it and
the platform no longer accepts it.&lt;/p&gt;
&lt;p&gt;It was a fake version of something that exists for real. The
&lt;a href=&quot;https://vatio.ai/docs/channels/whatsapp&quot;&gt;shared WhatsApp preview number&lt;/a&gt; and Instagram
test accounts put a genuine message through a genuine channel, with the real
verified phone number attached; the simulation only ever produced something
channel-shaped, and it had to be kept in step with the real path forever. It
drifted instead: the same module decided which contact a chat attached to, in
two places at once.&lt;/p&gt;
&lt;p&gt;What replaces it: nothing, for identity. A chat belongs to the token you are
holding, on the &lt;code&gt;cli&lt;/code&gt; channel. What you gain instead is the deployment:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hi&quot;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;              # preview, as before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Hi&quot;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; live&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   # the published agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; chat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; reset&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;             # a visitor this workspace has never met&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;A chat against live is a real conversation.&lt;/strong&gt; It lands in your inbox next to
the ones visitors started, and nothing downstream knows it came from a
terminal. The CLI says so when it opens one; it does not ask twice.&lt;/p&gt;
&lt;h3 id=&quot;breaking&quot;&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vatio chat --channel&lt;/code&gt; and &lt;code&gt;--from&lt;/code&gt; are removed, and so are &lt;code&gt;vatio config set channel&lt;/code&gt; / &lt;code&gt;from&lt;/code&gt;. A config file carrying them is cleaned up on next use.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--sandbox-url&lt;/code&gt; is now &lt;code&gt;--api-url&lt;/code&gt;, and &lt;code&gt;VATIO_SANDBOX_URL&lt;/code&gt; is gone. Nothing
else is called sandbox any more: the word was already &lt;code&gt;preview&lt;/code&gt; everywhere
else.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.vatio-sandbox.json&lt;/code&gt; is now &lt;code&gt;.vatio-chat.json&lt;/code&gt;, and holds one open chat per
deployment instead of one overall — switching to &lt;code&gt;--env live&lt;/code&gt; and back no
longer loses your place. The old file is deleted, not migrated: half of what
it stored was the simulated identity.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /api/v1/:slug/chats&lt;/code&gt; and &lt;code&gt;/reset&lt;/code&gt; take &lt;code&gt;environment&lt;/code&gt; and nothing else.
&lt;code&gt;channel&lt;/code&gt;, &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;session_id&lt;/code&gt;, &lt;code&gt;reply_style&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone_number&lt;/code&gt; and
&lt;code&gt;as&lt;/code&gt; are all refused with &lt;code&gt;removed_field&lt;/code&gt; and a message saying to run
&lt;code&gt;vatio update&lt;/code&gt;. A CLI older than this one sends &lt;code&gt;channel&lt;/code&gt; and &lt;code&gt;session_id&lt;/code&gt; on
every chat, so &lt;strong&gt;&lt;code&gt;vatio chat&lt;/code&gt; stops working until you update&lt;/strong&gt; — deliberately,
rather than accepting fields it would ignore and letting the next request, the
one that actually meant something, be the one that breaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing is called sandbox any more.&lt;/strong&gt; Instagram’s shared test surface now
reads the way WhatsApp’s always did: the &lt;em&gt;shared Instagram preview&lt;/em&gt;, not “the
sandbox”. Same change in the CLI help, the docs, the console labels and the
API error messages. The JS sandbox that tools run in keeps its name, because
that is what it is.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;also-fixed&quot;&gt;Also fixed&lt;/h3&gt;
&lt;p&gt;The one-time nudge after a workspace’s first push — the one pointing at the
free WhatsApp preview number — never printed. The server renamed the field to
&lt;code&gt;whatsapp_preview_hint&lt;/code&gt; when sandbox became preview and the CLI kept reading
&lt;code&gt;whatsapp_sandbox_hint&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;0.34.0 — 2026-09-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;One flag picks the deployment: &lt;code&gt;--env&lt;/code&gt;.&lt;/strong&gt; Saying which deployment a command
was about used to depend on the command. &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;publish&lt;/code&gt; took &lt;code&gt;--as NAME&lt;/code&gt;,
&lt;code&gt;pull&lt;/code&gt; took &lt;code&gt;--preview&lt;/code&gt;, &lt;code&gt;tokens&lt;/code&gt; and &lt;code&gt;widget&lt;/code&gt; took &lt;code&gt;--environment&lt;/code&gt; or &lt;code&gt;-e&lt;/code&gt;, and
&lt;code&gt;diff&lt;/code&gt; took nothing at all — it compared against &lt;code&gt;preview&lt;/code&gt; and there was no way
to ask it anything else.&lt;/p&gt;
&lt;p&gt;Now every command that touches a deployment takes &lt;code&gt;--env NAME&lt;/code&gt;, where NAME is
&lt;code&gt;live&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt;, or a named preview like &lt;code&gt;pr-42&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; diff&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; live&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;           # what would publishing change?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pr-42&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;          # bring that preview's manifest down&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vatio&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tokens&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pr-42&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; # a publishable token for it&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two things this unlocks that were not possible before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio diff --env live&lt;/code&gt;.&lt;/strong&gt; The question “what does publishing actually
change” had no CLI answer; you had to push, then read the console.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named previews outside push.&lt;/strong&gt; &lt;code&gt;tokens&lt;/code&gt; and &lt;code&gt;widget&lt;/code&gt; rejected anything but
&lt;code&gt;live&lt;/code&gt; or &lt;code&gt;preview&lt;/code&gt;, so a workspace could deploy to &lt;code&gt;pr-42&lt;/code&gt; and then have no
way to mint the publishable token that makes it embeddable. The CLI refused
a name the platform had just accepted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing is removed. &lt;code&gt;--as&lt;/code&gt;, &lt;code&gt;--preview&lt;/code&gt;, &lt;code&gt;--environment&lt;/code&gt; and &lt;code&gt;-e&lt;/code&gt; all still
work, and every default is the one it was: &lt;code&gt;push&lt;/code&gt; writes a preview, &lt;code&gt;pull&lt;/code&gt;
brings down live.&lt;/p&gt;&lt;h2&gt;0.33.0 — 2026-09-21&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The CLI stopped parsing your workspace; Vatio does it.&lt;/strong&gt; &lt;code&gt;vatio tools check&lt;/code&gt;,
&lt;code&gt;vatio diff&lt;/code&gt; and &lt;code&gt;vatio push&lt;/code&gt; used to read &lt;code&gt;vatio.yml&lt;/code&gt;, your &lt;code&gt;tools/&lt;/code&gt;, &lt;code&gt;auth/&lt;/code&gt;
and &lt;code&gt;lib/&lt;/code&gt; files and build the manifest on your machine, against rules compiled
into whichever CLI version you happened to have installed. They now send the
directory to the platform, which builds the manifest, validates it and answers
with the errors, the warnings and the diff.&lt;/p&gt;
&lt;p&gt;What this fixes: the rules are the platform’s, so a workspace that checks clean
is a workspace that deploys, and a contract change reaches you without an
upgrade. &lt;code&gt;vatio diff&lt;/code&gt; and the console no longer disagree about &lt;code&gt;links:&lt;/code&gt; — they
were two implementations of the same comparison, and one of them had drifted.&lt;/p&gt;
&lt;p&gt;What it costs, and you should know before upgrading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vatio tools check&lt;/code&gt; and &lt;code&gt;vatio diff&lt;/code&gt; need the network and a login.&lt;/strong&gt; They
were local commands; they are not any more. Run &lt;code&gt;vatio login&lt;/code&gt; first, and
expect a round trip where there used to be none.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They also need the workspace to exist on Vatio.&lt;/strong&gt; &lt;code&gt;vatio push&lt;/code&gt; still creates
it for you; a check before your first push will say the remote is missing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing about &lt;code&gt;vatio.yml&lt;/code&gt;, &lt;code&gt;tools/&lt;/code&gt;, &lt;code&gt;auth/&lt;/code&gt; or &lt;code&gt;lib/&lt;/code&gt; changed. The same
directory that deployed on 0.32.0 deploys on 0.33.0.&lt;/p&gt;
&lt;p&gt;Your workspace is sent as files, so the usual exclusions apply: anything
hidden (&lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.git/&lt;/code&gt;) and &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;tmp/&lt;/code&gt; and &lt;code&gt;log/&lt;/code&gt; are never
uploaded. A workspace is capped at 500 files, 2 MB per file and 8 MB in total.&lt;/p&gt;</description>
    </item>
    <item>
      <title>September 14–20, 2026: Vatio 0.27.0, 0.28.0, 0.29.0, 0.30.0, 0.31.0 and 0.32.0</title>
      <link>https://vatio.ai/changelog/2026-09-21</link>
      <guid isPermaLink="true">https://vatio.ai/changelog/2026-09-21</guid>
      <pubDate>Mon, 21 Sep 2026 12:00:00 GMT</pubDate>
      <description>&lt;h2&gt;0.32.0 — 2026-09-20&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio.yml&lt;/code&gt; owns the whole widget, and the snippet drops to two attributes.&lt;/strong&gt;
The &lt;code&gt;widget:&lt;/code&gt; block set the accent, the logo, the locale and the about text;
everything else about how the widget looked — its corner, its colour scheme,
its radius, its font, its greeting, the suggestions on the empty state — could
only be said as a &lt;code&gt;data-*&lt;/code&gt; attribute on every page that embedded it. A
workspace with the same widget on five pages repeated the same ten attributes
five times, and changing one meant a website deploy.&lt;/p&gt;
&lt;p&gt;All of it is &lt;code&gt;widget:&lt;/code&gt; now:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;widget&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  accent_color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;#2563eb&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  position&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  scheme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;light&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  font&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;inherit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  radius&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;20px&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  greeting&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;What can I help you with?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  suggestions&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Where is my order?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;How do returns work?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The precedence is the host page’s &lt;code&gt;data-*&lt;/code&gt;, then &lt;code&gt;vatio.yml&lt;/code&gt;, then the platform
default — field by field, so a page that has to differ still can, and the
snippet only carries what is specific to it:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://cdn.vatio.ai/v1/widget.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        data-workspace&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;acme&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; data-token&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;vatpub_...&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;data-display&lt;/code&gt; and &lt;code&gt;data-mount&lt;/code&gt; have no &lt;code&gt;widget:&lt;/code&gt; key on purpose: they say
where the widget goes in one page’s DOM, which is the part a page really does
own.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A key &lt;code&gt;widget:&lt;/code&gt; does not recognise fails the push.&lt;/strong&gt; &lt;code&gt;possition: right&lt;/code&gt;
validated, pushed, exited &lt;code&gt;0&lt;/code&gt; and did nothing — the only signal was a bubble
that had not moved. It is an error now, and the message names what the block
accepts.&lt;/p&gt;&lt;h2&gt;0.31.0 — 2026-09-20&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;A source name belongs to one kind of source, permanently.&lt;/strong&gt; An upload whose
filename matched an existing crawl used to win, without saying so: the crawl’s
&lt;code&gt;site_url&lt;/code&gt; and globs were overwritten, the pages it had already indexed stayed
underneath answering lookups for a source that no longer said where they came
from, and the command exited 0. Declaring a crawl over an existing upload did
the same in reverse, which is worse — a crawl can be rebuilt from the site, an
upload is the only copy of what it holds.&lt;/p&gt;
&lt;p&gt;Both directions are refused now, and the error names what is already there:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$ vatio kb upload default kb/ayuda.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Error: default already has a source named &quot;ayuda&quot;, and it is a crawl of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://home.saludtech.cl include=/ayuda/pacientes/**. An upload cannot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;take over a crawl -- rename the file, or drop the crawl first with&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;`vatio kb rm-source default ayuda`.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refusing beats merging or renaming for you: &lt;code&gt;upload ayuda.md&lt;/code&gt; onto a crawl
named &lt;code&gt;ayuda&lt;/code&gt; reads as both “replace my crawl” and “I did not realise the names
collide”, and only you know which one you meant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A batch upload is all-or-nothing.&lt;/strong&gt; &lt;code&gt;vatio kb upload BASE kb/*.md&lt;/code&gt; now checks
every file against the base before it sends the first one, so a collision on
file twenty no longer leaves nineteen uploaded and the rest refused.&lt;/p&gt;&lt;h2&gt;0.30.0 — 2026-09-17&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio issue --template&lt;/code&gt; is prompts now, not a form.&lt;/strong&gt; A written-up issue used
to have to carry four headings — Motivation, Proposal, Open questions, Prior art
— and a document that skipped one came back rejected. That asked for an RFC. It
mostly produced either an RFC-shaped wrapper around one real sentence, or
nothing at all, because the person with something to tell us did not feel like
filing a proposal.&lt;/p&gt;
&lt;p&gt;There are no required sections any more. &lt;code&gt;--template&lt;/code&gt; prints prompts you are
free to keep, delete or answer out of order, and the platform asks only for a
one-line title of your own and a body that says something — so a document that
came back untouched is still refused, and a rough one is not:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue --template &gt; issue.md   # prompts, not a form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue --file issue.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;“I don’t know what the right fix is” is a fine thing to send.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The mail around an issue says less, and the thread says it instead.&lt;/strong&gt; The
acknowledgement used to promise that a person reads every one and invite a
reply — which made the inbox look like the channel when it is not. It is now a
short confirmation that the issue was submitted, plus where to read it. Two
mails go out per issue, submitted and answered; the notes while it is worked
on and the pull request are posted to the thread and never mailed, and a reply
to either mail does not reach the thread. &lt;code&gt;vatio issue show&lt;/code&gt; prints the whole
of it.&lt;/p&gt;&lt;h2&gt;0.29.0 — 2026-09-17&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;An issue is now a conversation, and it lives in the CLI.&lt;/strong&gt; &lt;code&gt;vatio issue&lt;/code&gt; was
one-way: you sent something, we replied by email, and the reply landed in a mail
client — the wrong place for it, because the thing that has to act on the answer
is the coding agent in the repo the issue came from.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue list                     your issues, and who owes a reply&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue show 4                   the whole thread, as markdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue show 4 --save            write it beside your code, for your agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio issue comment 4 &quot;still broken&quot; add to the thread&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;show&lt;/code&gt; prints the same document our own triage reads — the problem, the
diagnostics the CLI attached, and every message either side has written — so
your agent can pick up the answer and implement it without anyone retyping a
summary. &lt;code&gt;comment&lt;/code&gt; adds to it; a person reads it and answers into the same
document. Replying to an issue we already handled reopens it.&lt;/p&gt;
&lt;p&gt;Comment rather than opening a second issue: a follow-up that arrives as a new
report throws away everything the first one established. You see your own
issues and nothing else, and email still carries every message — it is a mirror
of the thread now, not the only copy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;links:&lt;/code&gt; now survives a push.&lt;/strong&gt; A block the platform could not store used to
be dropped in silence — a successful push, a &lt;code&gt;vatio diff&lt;/code&gt; reporting it as added
forever, and an agent behaving as if you had never written it. &lt;code&gt;links:&lt;/code&gt;,
&lt;code&gt;identity:&lt;/code&gt; and &lt;code&gt;inbox:&lt;/code&gt; were all affected. They now deploy, and a root block
the platform does not understand fails the push instead of vanishing.&lt;/p&gt;&lt;h2&gt;0.28.0 — 2026-09-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;An unknown key in &lt;code&gt;vatio.yml&lt;/code&gt; is now an error.&lt;/strong&gt; Before this, a key the CLI
did not recognize was dropped on the way to the platform: a typo deployed a
workspace missing whatever you meant to configure, and a block from a newer
version of the manifest deployed as if you had never written it. Both were
silent. Now the push stops and names the key, and says to run &lt;code&gt;vatio update&lt;/code&gt; if
the key is one you expect to exist — which is the case this is really for:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;vatio.yml: unknown key `links:`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;If this is a newer manifest feature, your CLI is behind — run `vatio update`.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vatio update&lt;/code&gt; says what it is about to install.&lt;/strong&gt; It prints the changelog
entries between the version you have and the one being installed, so an update
is a decision rather than a version number going up.&lt;/p&gt;&lt;h2&gt;0.27.0 — 2026-09-16&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;links:&lt;/code&gt; — the URLs your agent is allowed to share.&lt;/strong&gt; A URL written into
&lt;code&gt;instructions:&lt;/code&gt; never reached a visitor: the no-unauthorized-links safeguard
allows only URLs the agent was actually given, and &lt;code&gt;instructions:&lt;/code&gt; is text the
model may rephrase, so the draft was discarded and the link stripped. &lt;code&gt;links:&lt;/code&gt;
is where a URL is given:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;links&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  login&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://saludtech.cl/login&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;  agendar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;https://saludtech.cl/{especialidad}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    when&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;The visitor wants to book an appointment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;    values&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;      especialidad&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;nutricion&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;kinesiologia&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;psicologia&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;code&gt;{placeholder}&lt;/code&gt; always lists the values it can take, and a deploy expands the
link into one concrete URL per value. Those are what the agent is shown and what
the safeguard allows: it copies one, it never assembles one. Leaving &lt;code&gt;values:&lt;/code&gt;
out is an error — an open template would have the agent fill in the slug itself,
and nothing downstream could tell a real one from a plausible one.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/links&quot;&gt;Links&lt;/a&gt; for the full field reference.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
