Repository navigation
Before upgrading. There are no migrations: the database stays at 0077_channel_opening. Ten
things change for an existing deployment:
- On OpenBot Desktop, the first Start after the app updates to this release moves the installed
OpenBot to it too. Until now an installation kept the release it was installed at until you moved
it under Runtime updates. While the old release keeps running, Start checks the installation
against its release's published manifest and downloads the new release and its images; then it
stops OpenBot, backs up the database, installs the new release and starts it, which can take a few
minutes. A move that fails is undone, database included, and the old release starts. Pinned builds
(internal and candidates), and an installation already on a newer release than the app, are left
as they are (below). - OpenBot Desktop installations signed in to CopilotKit with no Composio key get one at their next
Start: the bundled CopilotKit CLI asks CopilotKit for this installation's own Composio project,
and the key goes to the app's protected store, never to.env. Apps, unavailable on Desktop since
0.3.0, become available. ACOMPOSIO_API_KEYin~/OpenBot/.envor the environment, or an Arcade
choice, still wins, and then nothing is asked (below). - When nobody has picked a model, built-in Bots now answer on
BOT_MODELwhile the provider lists
it, and otherwise on the middle of the provider's current line: the newest model of each line,
ordered by price, and the one in the middle (on 2026-11-05,gpt-6.1-terra,claude-sonnet-5-5,
gemini-3.8-flashandgrok-4.7). With noBOT_MODEL, that replaces the tenant package's
default_model(gpt-5.6-terrain the bundled packages) or, on Anthropic,claude-sonnet-5-5.
On OpenAI's own API,BOT_MODELnow applies to built-in Bots, where it used to be ignored. A
BOT_MODELthe provider doesn't list gives way to the middle: a ChatGPT plan givengpt-5.5runs
the plan's middle model. Behind a gateway inOPENAI_BASE_URL, the configured model stays the
default while the gateway lists it, and until the provider's list has been read the configured
model is used. The Bot framework picked at setup, when it is OpenBot's own LangGraph or Claude
Agent SDK harness, is sent the same model on every run (below). - Nothing writes a
BOT_MODELon your behalf any more, so an unset one means the middle of the
line.docker-compose.ymlgives the picked harness an emptyBOT_MODELwhen it is unset, rather
thangpt-5.5. OpenBot Desktop no longer writesBOT_MODEL=claude-sonnet-5-5for an Anthropic
key, and takes out the one it wrote at the next Start; a model chosen on a Desktop setup screen
(an OpenAI-compatible endpoint's, or a Google or xAI sign-in's) is still written and stays the
default. The harness answers on the model the server sends each run, and only when the server
sends none, because it has not read the provider's list, on the provider spec file's model for it
(gpt-4o-minion OpenAI). - The server now reads the provider's model list (a plan's own, through its harness) and
https://models.dev/api.jsonwhen it starts and every six hours after, whether or not anybody
picks, and again at once, at most once a minute, when a provider refuses a model as unknown or
unsupported. A refresh that fails keeps the last good list.OPENBOT_MODEL_CAPABILITIES_URL
points at a mirror of models.dev, oroffreads none, and then the default is the configured
model while the provider lists it. - With
OPENBOT_SINGLE_USER=true(OpenBot Desktop and the personal edition among them), the one
person is offered every model the provider lists, with no switch and no allowlist. Admin →
Providers shows neither, and a model allowlist saved earlier no longer applies. - In a team, people pick among the models an admin allows under Admin → Providers → Allowed models,
plus the default, and "Let people choose a model" is gone. Until an admin allows one, people get
the default and see no picker: a team that let people pick before upgrading has no picker until
models are allowed there, and one whose list already holds models now shows them, whatever the old
switch said. A pick on a model no longer allowed, or no longer listed by the provider, runs on the
default and is kept for when it is offered again. "Only allowed models" still refuses a run on any
model not allowed, the default included, so with it on, allow the new default (above) or runs
nobody picked a model for are refused. - A Bot's commands now run in one interactive bash on its computer, one for each Bot a person uses,
instead of a freshbash -ceach (below).cdand exported variables carry over to the next
command. A command's stdout and stderr come back together as its output, withstderrempty, as a
terminal shows them. Something a command starts in the background with&keeps running after the
command returns, even while it still prints; such a process used to hold the command open until
its time limit stopped both. Two commands from the same Bot and person run one after the other,
and the wait counts against each one's time limit. Commands seeTERM=xterm-256color, and
PAGER=cat,GIT_PAGER=catandGIT_TERMINAL_PROMPT=0unlessCOMPUTER_SHELL_ENVpasses
others. - Upgrade the server and its computers together. A computer from 0.3.0 has no terminal for the
Computer panel's new Terminal tab to connect to, and refuses every pointer move made with no
button held, which the live screen now sends as you hover. - The Python LangGraph and Pydantic AI Bots set no upper bound on
google-genai, so an image of
either built from source since 3.0.0 came out on 2026-11-06 installed it, and 3.0.0 sends Gemini
requests to/v1instead of/v1beta. Both now holdgoogle-genaiat 2.34 or later and below 3,
and the Google ADK Bot names the same range, so Gemini is called on/v1betaas before.
A Bot's commands run in one live shell you can watch and take control of
The Computer panel has a Terminal tab beside the Screen: a real terminal where you watch each of the
Bot's commands typed and its output stream, in colour. Whoever may watch a Bot's screen may watch
its terminal. Take control gives you its keyboard, as it does the browser's, and the Bot waits until
you hand back, then carries on in the same shell. The panel opens on the view the Bot last worked
in, the terminal after a command and the screen after a page; a tab you pick, or a command you click
in the conversation, holds until the panel closes.
- The Bot gets what it got before. Each command's output and exit code come back within the same
time limit (120 seconds unless the Bot asks for up to 600) and the same 64 KB of output, and
approvals and policy for commands are unchanged. What changes is under Before upgrading. - Commands in the conversation and in Activity are terminal blocks: the prompt and the command,
the last lines of output with "Show all N lines" for the rest, and how it ended, as "Exit 0",
"Exit 1", "Running", "Blocked", "Declined" or "Done by you". Clicking one opens the Computer panel
on its terminal. - A shell left busy is not typed over. If you hand back with something still running in the
foreground, the Bot's next command is not run and the Bot is told why. A command the Bot sends
unfinished (an unclosed quote, bracket or here-document) is abandoned at once with exit code 2,
instead of waiting out its time limit. - The shell ends when the computer is stopped or reset, or after an hour nobody used or watched
it, and a new one starts when it is next needed.
Taking over a Bot's screen feels like using your own browser
- Clicks land at once. Your browser sends at most one pointer position per screen refresh and
adds scrolls together, and the Bot's computer replaces a waiting move with the newer one instead
of playing every move before your click. Clicks, keys and pastes are never merged or dropped, and
land in the order you made them. - The picture is the page as it is now. The computer sends the next frame only once the last has
gone out, with at most two on their way to your browser, and a newer frame replaces one still
waiting, so a slow connection no longer shows frames seconds old. The once-a-second screenshot
stops while the full-size live view is open, and a hidden tab draws nothing until you come back. - Keys and the mouse behave as on your own page. Hovering is a hover, not a drag with the left
button held. Letting go of the mouse outside the screen lets go on the page, and releasing Command
releases the keys held with it. Emoji type as text, Firefox scrolls normal distances, and the
cursor is an arrow rather than a crosshair. - A missed input is a note, not an error screen. One key or click that doesn't land shows a
short note in the corner for a few seconds, and the screen stays live. One missed check of who has
control no longer pauses your input; two in a row do, and the computer still refuses input from
anyone not in control. A click made the moment the screen appears is held until the connection to
the computer opens, not lost.
OpenBot Desktop moves your OpenBot to the app's release when it starts
An updated app used to keep running the OpenBot it was first installed with, so server fixes never
reached an existing installation. Now Start moves a stable app's installation to the app's own
release, through the same path as Runtime updates, and says "Updating OpenBot from v0.3.0 to v0.3.1.
Your Bots, sign-ins and data stay as they are." while it runs. A modified installation is refused
before anything stops.
- A move that fails before OpenBot stopped changes nothing, and the next Start tries again. One that
fails after is undone, the database restored from its backup, and the old release starts with a
note saying so. Start does not try that release again by itself; Runtime updates can. - Stop or Quit during a move stops it, and the next Start recovers it as any interrupted update.
- Runtime updates, and this move, download only the images this installation runs: eight for 0.3.0,
where the release names nineteen. Staging an update no longer fails on an Apple silicon Mac with
"no matching manifest for linux/arm64/v8" over the all-in-oneopenbotimage, which Desktop never
runs and which 0.3.0 published for x86-64 only.
OpenBot Desktop gets your apps from your CopilotKit sign-in again
0.3.0 started every Desktop installation without a Composio key, so apps were unavailable unless you
put your own COMPOSIO_API_KEY in ~/OpenBot/.env. The Account step now connects your apps once
you have signed in ("Connecting your apps…"): the bundled CopilotKit CLI, with its own sign-in,
makes or reuses this installation's Composio project, and the app keeps the key in its protected
store. If that fails, the step says so, with Connect apps to try again and Continue to go on without
apps, and every Start tries again by itself without ever stopping Start. An installation signed in
under 0.3.0 gets its key at its next Start, without signing in again.
Signing in with ChatGPT in Desktop setup no longer ends on "localhost refused to connect"
- A browser tab that comes back after the sign-in finished (from "Open the sign-in page", or from
approving again at OpenAI) gets an OpenBot page saying OpenBot is signed in and the tab isn't
needed. OpenBot answers that address for 15 minutes after a sign-in ends, then gives the port up,
and gives it up sooner to a new sign-in or to the Codex CLI. - Starting a sign-in again no longer fails with "port is already allocated". The earlier sign-in is
stopped first, and so is one you leave by picking another provider, Change, Escape or leaving the
screen, whose tab then says the sign-in ended rather than "You're signed in". Quit stops it too. - A tab left over from an earlier attempt can no longer end the attempt in progress: it is told its
link is out of date.
Pick the model and thinking effort for every Bot, from the provider's live list
The composer's model picker is now a text button naming the model and its thinking effort ("Claude
Sonnet 5.5 · High"), and its list adds a Thinking group with the levels the model in use accepts,
its default marked. A model is only ever shown, saved and sent the levels it takes, and switching to
a model that doesn't take the chosen effort clears it. The pick is still kept per person and
conversation, a change applies from the next message, and a new conversation saves both before its
first message.
- Who picks from what. One person on their own machine picks from every model the provider
lists. In a team, people pick among the models an admin allows under Admin → Providers → Allowed
models, which lists each with its maker's mark and thinking levels, and see no picker until one is
allowed (above). - More Bots and every sign-in. It is offered for the Bot framework picked at setup when it is
OpenBot's own LangGraph or Claude Agent SDK harness, and on OpenAI, Anthropic, Google and xAI keys
and sign-ins, any OpenAI-compatible endpoint, and ChatGPT and Claude plans, each listed from its
own source (see The model list indocs/configuration.md). A Bot on any other framework, or a
harness somebody brought, still picks its own model. - Fixed: every message failed on a ChatGPT plan with "The 'gpt-5.5' model is not supported when
using Codex with a ChatGPT account". A plan now runs only a model its own list offers. - Out of credit says so. A provider refusing because the account is out of credit or at its
spending limit now reads as that, naming the provider and quoting it, on built-in Bots (which
showed "Forbidden" or a retry count) and on the LangGraph harness (which asked you to sign in
again, and flagged the sign-in as failed). Any other refusal from the provider ends the harness's
run with the provider's own words, where the run used to stop with no answer. - Admin → Providers names who serves the model: OpenAI, Anthropic, Google, xAI, ChatGPT plan, Claude
plan or OpenAI-compatible endpoint, with Google, xAI and Claude marks beside OpenAI's and
Anthropic's. Each run logs onerun-modelline with its Bot, run id, model and effort. CHATGPT_CODEX_CLIENT_VERSION(default0.167.0) is the Codex client version the LangGraph
harness names when it reads a ChatGPT plan's list.
Every step a Bot takes with one of OpenBot's own tools reads as words
Each tool OpenBot itself gives a Bot is named in words chosen for it, in the present while it runs
and the past once done ("Using a skill", then "Used a skill"; "Saved a memory"; "Checked existing
Bots"), where most showed words split from their identifier ("Copilotkit load skill", "Remember
personal fact"). That covers skills, memory, follow-ups, check-ins, responsibilities, asking a
person or another Bot, subtasks, the browser, and files and commands on the Bot's computer or yours.
The Mastra Bot's image installs from a lockfile
The Mastra Bot was the one Bot image built from version ranges with no lockfile, so two builds of
one release could ship different code, and a build could fail on a package npm had only just
published. It now installs from agent-mastra/bun.lock with --frozen-lockfile.