@@ -8,6 +8,201 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged.
88
99## Unreleased
1010
11+ ** Before upgrading.** There are no migrations: the database stays at ` 0077_channel_opening ` . Ten
12+ things change for an existing deployment:
13+ - On OpenBot Desktop, the first Start after the app updates to this release moves the installed
14+ OpenBot to it too. Until now an installation kept the release it was installed at until you moved
15+ it under Runtime updates. While the old release keeps running, Start checks the installation
16+ against its release's published manifest and downloads the new release and its images; then it
17+ stops OpenBot, backs up the database, installs the new release and starts it, which can take a few
18+ minutes. A move that fails is undone, database included, and the old release starts. Pinned builds
19+ (internal and candidates), and an installation already on a newer release than the app, are left
20+ as they are (below).
21+ - OpenBot Desktop installations signed in to CopilotKit with no Composio key get one at their next
22+ Start: the bundled CopilotKit CLI asks CopilotKit for this installation's own Composio project,
23+ and the key goes to the app's protected store, never to ` .env ` . Apps, unavailable on Desktop since
24+ 0.3.0, become available. A ` COMPOSIO_API_KEY ` in ` ~/OpenBot/.env ` or the environment, or an Arcade
25+ choice, still wins, and then nothing is asked (below).
26+ - When nobody has picked a model, built-in Bots now answer on ` BOT_MODEL ` while the provider lists
27+ it, and otherwise on the middle of the provider's current line: the newest model of each line,
28+ ordered by price, and the one in the middle (on 2026-11-05, ` gpt-6.1-terra ` , ` claude-sonnet-5-5 ` ,
29+ ` gemini-3.8-flash ` and ` grok-4.7 ` ). With no ` BOT_MODEL ` , that replaces the tenant package's
30+ ` default_model ` (` gpt-5.6-terra ` in the bundled packages) or, on Anthropic, ` claude-sonnet-5-5 ` .
31+ On OpenAI's own API, ` BOT_MODEL ` now applies to built-in Bots, where it used to be ignored. A
32+ ` BOT_MODEL ` the provider doesn't list gives way to the middle: a ChatGPT plan given ` gpt-5.5 ` runs
33+ the plan's middle model. Behind a gateway in ` OPENAI_BASE_URL ` , the configured model stays the
34+ default while the gateway lists it, and until the provider's list has been read the configured
35+ model is used. The Bot framework picked at setup, when it is OpenBot's own LangGraph or Claude
36+ Agent SDK harness, is sent the same model on every run (below).
37+ - Nothing writes a ` BOT_MODEL ` on your behalf any more, so an unset one means the middle of the
38+ line. ` docker-compose.yml ` gives the picked harness an empty ` BOT_MODEL ` when it is unset, rather
39+ than ` gpt-5.5 ` . OpenBot Desktop no longer writes ` BOT_MODEL=claude-sonnet-5-5 ` for an Anthropic
40+ key, and takes out the one it wrote at the next Start; a model chosen on a Desktop setup screen
41+ (an OpenAI-compatible endpoint's, or a Google or xAI sign-in's) is still written and stays the
42+ default. The harness answers on the model the server sends each run, and only when the server
43+ sends none, because it has not read the provider's list, on the provider spec file's model for it
44+ (` gpt-4o-mini ` on OpenAI).
45+ - The server now reads the provider's model list (a plan's own, through its harness) and
46+ ` https://models.dev/api.json ` when it starts and every six hours after, whether or not anybody
47+ picks, and again at once, at most once a minute, when a provider refuses a model as unknown or
48+ unsupported. A refresh that fails keeps the last good list. ` OPENBOT_MODEL_CAPABILITIES_URL `
49+ points at a mirror of models.dev, or ` off ` reads none, and then the default is the configured
50+ model while the provider lists it.
51+ - With ` OPENBOT_SINGLE_USER=true ` (OpenBot Desktop and the personal edition among them), the one
52+ person is offered every model the provider lists, with no switch and no allowlist. Admin →
53+ Providers shows neither, and a model allowlist saved earlier no longer applies.
54+ - In a team, people pick among the models an admin allows under Admin → Providers → Allowed models,
55+ plus the default, and "Let people choose a model" is gone. Until an admin allows one, people get
56+ the default and see no picker: a team that let people pick before upgrading has no picker until
57+ models are allowed there, and one whose list already holds models now shows them, whatever the old
58+ switch said. A pick on a model no longer allowed, or no longer listed by the provider, runs on the
59+ default and is kept for when it is offered again. "Only allowed models" still refuses a run on any
60+ model not allowed, the default included, so with it on, allow the new default (above) or runs
61+ nobody picked a model for are refused.
62+ - A Bot's commands now run in one interactive bash on its computer, one for each Bot a person uses,
63+ instead of a fresh ` bash -c ` each (below). ` cd ` and exported variables carry over to the next
64+ command. A command's stdout and stderr come back together as its output, with ` stderr ` empty, as a
65+ terminal shows them. Something a command starts in the background with ` & ` keeps running after the
66+ command returns, even while it still prints; such a process used to hold the command open until
67+ its time limit stopped both. Two commands from the same Bot and person run one after the other,
68+ and the wait counts against each one's time limit. Commands see ` TERM=xterm-256color ` , and
69+ ` PAGER=cat ` , ` GIT_PAGER=cat ` and ` GIT_TERMINAL_PROMPT=0 ` unless ` COMPUTER_SHELL_ENV ` passes
70+ others.
71+ - Upgrade the server and its computers together. A computer from 0.3.0 has no terminal for the
72+ Computer panel's new Terminal tab to connect to, and refuses every pointer move made with no
73+ button held, which the live screen now sends as you hover.
74+ - The Python LangGraph and Pydantic AI Bots set no upper bound on ` google-genai ` , so an image of
75+ either built from source since 3.0.0 came out on 2026-11-06 installed it, and 3.0.0 sends Gemini
76+ requests to ` /v1 ` instead of ` /v1beta ` . Both now hold ` google-genai ` at 2.34 or later and below 3,
77+ and the Google ADK Bot names the same range, so Gemini is called on ` /v1beta ` as before.
78+
79+ ### A Bot's commands run in one live shell you can watch and take control of
80+
81+ The Computer panel has a Terminal tab beside the Screen: a real terminal where you watch each of the
82+ Bot's commands typed and its output stream, in colour. Whoever may watch a Bot's screen may watch
83+ its terminal. Take control gives you its keyboard, as it does the browser's, and the Bot waits until
84+ you hand back, then carries on in the same shell. The panel opens on the view the Bot last worked
85+ in, the terminal after a command and the screen after a page; a tab you pick, or a command you click
86+ in the conversation, holds until the panel closes.
87+
88+ - ** The Bot gets what it got before.** Each command's output and exit code come back within the same
89+ time limit (120 seconds unless the Bot asks for up to 600) and the same 64 KB of output, and
90+ approvals and policy for commands are unchanged. What changes is under Before upgrading.
91+ - ** Commands in the conversation and in Activity are terminal blocks** : the prompt and the command,
92+ the last lines of output with "Show all N lines" for the rest, and how it ended, as "Exit 0",
93+ "Exit 1", "Running", "Blocked", "Declined" or "Done by you". Clicking one opens the Computer panel
94+ on its terminal.
95+ - ** A shell left busy is not typed over.** If you hand back with something still running in the
96+ foreground, the Bot's next command is not run and the Bot is told why. A command the Bot sends
97+ unfinished (an unclosed quote, bracket or here-document) is abandoned at once with exit code 2,
98+ instead of waiting out its time limit.
99+ - ** The shell ends** when the computer is stopped or reset, or after an hour nobody used or watched
100+ it, and a new one starts when it is next needed.
101+
102+ ### Taking over a Bot's screen feels like using your own browser
103+
104+ - ** Clicks land at once.** Your browser sends at most one pointer position per screen refresh and
105+ adds scrolls together, and the Bot's computer replaces a waiting move with the newer one instead
106+ of playing every move before your click. Clicks, keys and pastes are never merged or dropped, and
107+ land in the order you made them.
108+ - ** The picture is the page as it is now.** The computer sends the next frame only once the last has
109+ gone out, with at most two on their way to your browser, and a newer frame replaces one still
110+ waiting, so a slow connection no longer shows frames seconds old. The once-a-second screenshot
111+ stops while the full-size live view is open, and a hidden tab draws nothing until you come back.
112+ - ** Keys and the mouse behave as on your own page.** Hovering is a hover, not a drag with the left
113+ button held. Letting go of the mouse outside the screen lets go on the page, and releasing Command
114+ releases the keys held with it. Emoji type as text, Firefox scrolls normal distances, and the
115+ cursor is an arrow rather than a crosshair.
116+ - ** A missed input is a note, not an error screen.** One key or click that doesn't land shows a
117+ short note in the corner for a few seconds, and the screen stays live. One missed check of who has
118+ control no longer pauses your input; two in a row do, and the computer still refuses input from
119+ anyone not in control. A click made the moment the screen appears is held until the connection to
120+ the computer opens, not lost.
121+
122+ ### OpenBot Desktop moves your OpenBot to the app's release when it starts
123+
124+ An updated app used to keep running the OpenBot it was first installed with, so server fixes never
125+ reached an existing installation. Now Start moves a stable app's installation to the app's own
126+ release, through the same path as Runtime updates, and says "Updating OpenBot from v0.3.0 to v0.3.1.
127+ Your Bots, sign-ins and data stay as they are." while it runs. A modified installation is refused
128+ before anything stops.
129+
130+ - A move that fails before OpenBot stopped changes nothing, and the next Start tries again. One that
131+ fails after is undone, the database restored from its backup, and the old release starts with a
132+ note saying so. Start does not try that release again by itself; Runtime updates can.
133+ - Stop or Quit during a move stops it, and the next Start recovers it as any interrupted update.
134+ - Runtime updates, and this move, download only the images this installation runs: eight for 0.3.0,
135+ where the release names nineteen. Staging an update no longer fails on an Apple silicon Mac with
136+ "no matching manifest for linux/arm64/v8" over the all-in-one ` openbot ` image, which Desktop never
137+ runs and which 0.3.0 published for x86-64 only.
138+
139+ ### OpenBot Desktop gets your apps from your CopilotKit sign-in again
140+
141+ 0.3.0 started every Desktop installation without a Composio key, so apps were unavailable unless you
142+ put your own ` COMPOSIO_API_KEY ` in ` ~/OpenBot/.env ` . The Account step now connects your apps once
143+ you have signed in ("Connecting your apps…"): the bundled CopilotKit CLI, with its own sign-in,
144+ makes or reuses this installation's Composio project, and the app keeps the key in its protected
145+ store. If that fails, the step says so, with Connect apps to try again and Continue to go on without
146+ apps, and every Start tries again by itself without ever stopping Start. An installation signed in
147+ under 0.3.0 gets its key at its next Start, without signing in again.
148+
149+ ### Signing in with ChatGPT in Desktop setup no longer ends on "localhost refused to connect"
150+
151+ - A browser tab that comes back after the sign-in finished (from "Open the sign-in page", or from
152+ approving again at OpenAI) gets an OpenBot page saying OpenBot is signed in and the tab isn't
153+ needed. OpenBot answers that address for 15 minutes after a sign-in ends, then gives the port up,
154+ and gives it up sooner to a new sign-in or to the Codex CLI.
155+ - Starting a sign-in again no longer fails with "port is already allocated". The earlier sign-in is
156+ stopped first, and so is one you leave by picking another provider, Change, Escape or leaving the
157+ screen, whose tab then says the sign-in ended rather than "You're signed in". Quit stops it too.
158+ - A tab left over from an earlier attempt can no longer end the attempt in progress: it is told its
159+ link is out of date.
160+
161+ ### Pick the model and thinking effort for every Bot, from the provider's live list
162+
163+ The composer's model picker is now a text button naming the model and its thinking effort ("Claude
164+ Sonnet 5.5 · High"), and its list adds a Thinking group with the levels the model in use accepts,
165+ its default marked. A model is only ever shown, saved and sent the levels it takes, and switching to
166+ a model that doesn't take the chosen effort clears it. The pick is still kept per person and
167+ conversation, a change applies from the next message, and a new conversation saves both before its
168+ first message.
169+
170+ - ** Who picks from what.** One person on their own machine picks from every model the provider
171+ lists. In a team, people pick among the models an admin allows under Admin → Providers → Allowed
172+ models, which lists each with its maker's mark and thinking levels, and see no picker until one is
173+ allowed (above).
174+ - ** More Bots and every sign-in.** It is offered for the Bot framework picked at setup when it is
175+ OpenBot's own LangGraph or Claude Agent SDK harness, and on OpenAI, Anthropic, Google and xAI keys
176+ and sign-ins, any OpenAI-compatible endpoint, and ChatGPT and Claude plans, each listed from its
177+ own source (see The model list in ` docs/configuration.md ` ). A Bot on any other framework, or a
178+ harness somebody brought, still picks its own model.
179+ - ** Fixed: every message failed on a ChatGPT plan** with "The 'gpt-5.5' model is not supported when
180+ using Codex with a ChatGPT account". A plan now runs only a model its own list offers.
181+ - ** Out of credit says so.** A provider refusing because the account is out of credit or at its
182+ spending limit now reads as that, naming the provider and quoting it, on built-in Bots (which
183+ showed "Forbidden" or a retry count) and on the LangGraph harness (which asked you to sign in
184+ again, and flagged the sign-in as failed). Any other refusal from the provider ends the harness's
185+ run with the provider's own words, where the run used to stop with no answer.
186+ - Admin → Providers names who serves the model: OpenAI, Anthropic, Google, xAI, ChatGPT plan, Claude
187+ plan or OpenAI-compatible endpoint, with Google, xAI and Claude marks beside OpenAI's and
188+ Anthropic's. Each run logs one ` run-model ` line with its Bot, run id, model and effort.
189+ - ` CHATGPT_CODEX_CLIENT_VERSION ` (default ` 0.167.0 ` ) is the Codex client version the LangGraph
190+ harness names when it reads a ChatGPT plan's list.
191+
192+ ### Every step a Bot takes with one of OpenBot's own tools reads as words
193+
194+ Each tool OpenBot itself gives a Bot is named in words chosen for it, in the present while it runs
195+ and the past once done ("Using a skill", then "Used a skill"; "Saved a memory"; "Checked existing
196+ Bots"), where most showed words split from their identifier ("Copilotkit load skill", "Remember
197+ personal fact"). That covers skills, memory, follow-ups, check-ins, responsibilities, asking a
198+ person or another Bot, subtasks, the browser, and files and commands on the Bot's computer or yours.
199+
200+ ### The Mastra Bot's image installs from a lockfile
201+
202+ The Mastra Bot was the one Bot image built from version ranges with no lockfile, so two builds of
203+ one release could ship different code, and a build could fail on a package npm had only just
204+ published. It now installs from ` agent-mastra/bun.lock ` with ` --frozen-lockfile ` .
205+
11206## 0.3.0
12207
13208** Before upgrading.** Forty things change for an existing deployment:
@@ -159,16 +354,6 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged.
159354 ` secrets ` restarts the server.
160355- Migration ` 0077_channel_opening ` adds a nullable ` channels.opening ` .
161356
162- ### A Bot's commands run in one live shell you can watch and take control of
163-
164- The Computer panel has a Terminal tab beside the screen: a real terminal where you watch each of the
165- Bot's commands typed and its output stream, in colour. Take control gives you the keyboard there, as
166- it does in the browser, and the Bot waits until you hand it back, then carries on in the same shell.
167- ` cd ` and exported variables carry over from one command to the next. The Bot still gets each
168- command's output and exit code within the same time and size limits, and approvals and policy for
169- commands are unchanged. A command's stdout and stderr now come back as one stream, as a terminal
170- shows them.
171-
172357### Teach a Bot: do a task once in your own browser, and your Bots learn it
173358
174359The OpenBot Recorder is a Chrome and Edge extension that records a task while a person does it and
0 commit comments