Repository navigation
Before upgrading. Five migrations add columns: 0078_routine_title adds a nullable
routines.title, 0079_tool_unclassified adds mcp_tools.unclassified, false on every existing
row, 0080_listing_revision adds mcp_servers.listing_revision, 0 on every existing row,
0081_goal_recurring adds responsibilities.recurring, false on every existing row, and
0082_routine_goal adds routines.goal_id, empty on every existing row, and
routines.goal_by_title, true on every existing row. The database moves to 0082_routine_goal. Eight things change for an existing deployment:
- A goal's tools are named for goals.
create_responsibility,list_responsibilities,
update_responsibility,report_responsibility_progress,run_responsibility,
pause_responsibility,resume_responsibilityandcomplete_responsibilityare now
create_goal,list_goals,update_goal,report_goal_progress,run_goal,pause_goal,
resume_goalandcomplete_goal, andcreate_triggertakesgoalId. The old names are gone, so
update any Bot instructions, skills or goals that mention them. API routes and the database are
unchanged. - At the first start, the saved tools of OpenBot's own apps, Routines and Google Drive (where it is
added), are brought up to this release's, and every Bot gets Routines' seven new goal tools
(below). After that, a start changes them only when a release does. - An app tool whose action is archive, and any app tool its app marks destructive, asks with
Allow once or Deny every time, whatever your settings (below). This starts at once, with
nothing to refresh. - At the first start, every app of your broker (Arcade or Composio) is listed again once, as
Refresh tools does, so an action its app says nothing about is recorded as a fresh install
records it: an ordinary change (below). Nobody has to press anything, and the start doesn't wait
for it. Actions the broker flags destructive, and delete or archive names, still ask every time.
If the broker can't be reached, an app keeps its actions, which ask as before, and OpenBot keeps
trying every few minutes and at the next start. - Existing goals keep their state, but a goal that one of its Bot's routines runs, or that an event
wakes, now counts as repeating, so its runs no longer complete it (below). An existing routine
runs a goal when its instruction names the goal's id, or the goal's whole title in quotes. A goal a run already
completed stays completed, and its routine now says so each time it fires. - The audit trail records a person's denial as the action's own refusal (
computer.action_refused
ormcp.call_rejected), and an approved computer action as onecomputer.action_allowed, where
it wrote up to three. A Bot's actions in folders on OpenBot Desktop arecomputer.action_*events
(actionshost/read_file,host/write_fileand so on), where each was two
configuration.changedrows. OpenBot giving a Bot an app's tools is oneconfiguration.changed
row per Bot and app, where each tool had one. Counts taken from the export or a log collector
change. Rows recorded before the upgrade keep their old shape. - A Bot you run at your own address that hands
ask_personormessage_botback to OpenBot
unanswered now has OpenBot carry it out: the person is asked, or the message is delivered. A Bot
that calls OpenBot's tools itself is unchanged. Any Bot at its own address is never sent more than
128 tools in one request, whatever its provider takes: the app tools least like the request are
left out. - An existing personal edition keeps its Bots. On OpenBot Desktop the Personal Assistant and the
Bot picked in setup stay two Bots, and the Personal Assistant is no longer rewritten from the
package at each Start. The picked Bot's subtitle says "Powered by" and its framework where it
repeated the framework's name, and a picked Bot named "LangGraph" becomes "LangChain (LangGraph)".
An OpenBot Desktop installation still on 0.3.1 that becomes the personal edition with this release
keeps its Bots and gets no Personal Assistant, where 0.3.2 added one.
Bots ask before archiving or deleting in your apps
- Archiving asks as deleting does. An app tool whose action is archive, such as HubSpot's
HUBSPOT_ARCHIVE_CONTACT, archiving a Slack conversation or archiving mail in Gmail, asks with
Allow once or Deny every time. Listing archived items, reading archive settings and
unarchiving don't ask. Archiving used to ask only where any change would. - So does any tool its app marks destructive, whatever it is called: an MCP server's
destructiveHint, Composio's destructive tag or Arcade's destructive flag, such as
Attio.RemoveFromList. The flag used to make no difference to asking. - You're asked once. Bots are told OpenBot asks before these, and a destructive tool's
description says so, so a Bot no longer asks you itself first. - An action its app says nothing about is an ordinary change. An Arcade action that publishes
no behaviour flags, such as every AirtableApi and GithubApi action, or a Composio action with no
label, asks only where any change would (Ask before making changes, or a rule). Check-ins,
tasks and memory still never call one on their own. On an app's page for a Bot, such an Arcade
action no longer says "destroys things". An app listed before this release is listed again at the
first start (above). - Settings → Approvals says what always asks, above its switches: payments, passwords and
security settings are handed to you, deleting, sending, sharing and posting in your apps and on
websites ask first, and so do edits and commands in a folder on your own computer. A Bot's own
computer is its scratch space, so what it does there asks only when your settings or rules say
so. The page said every delete asked first, though a Bot deleting a file on its own computer
asked only when your settings did. Onboarding says the same about your apps and a Bot's own
computer, and Bots are told it.
Goals and routines
- Ask a Bot for a goal in a conversation and it sets one up. It used to say it had no goals
tool and set up a routine instead. Every Bot has the goal tools in Routines, all but
report_goal_progress. A goal made this way reports into the conversation it was asked in, or
another the person names, and shows on the Bot's Goals page. Creating, changing, running, pausing,
resuming and completing a goal ask first while Ask before making changes is on. - Bots say goal, the word every screen uses, and no longer tell you they "marked the
responsibility complete". The tools are renamed (above),create_triggersends you to the goal's
card on the Bot's Goals page, and a goal's steps in a conversation read "Created a goal",
"Checked goals", "Marked a goal complete" and so on, also in conversations from before. - A goal that repeats stays active after its runs. A goal a Bot sets up to repeat ("every
morning"), one a routine runs and one an event wakes are no longer completed by one of their
runs. Each run records its result, and only you end the goal, in a conversation or on its card.
Its first run could complete it, which left the routine nothing to run. A routine that runs a goal
you completed or paused now says so, where it ran nothing and said nothing. Editing a goal, on its
card or by asking a Bot, no longer clears the events that wake it. - A routine records the goal it runs. A Bot making a routine for one of your goals passes the
goal, and a routine whose firing runs a goal is linked to it then. That link, not the routine's
wording, makes the goal repeat, lists it under Scheduled and gives the routine its title. A goal
titled "Email" was taken as run by any routine that mentioned email, so its runs could never
complete it. - A goal's run waits for a busy conversation. A run that starts while its conversation is in
use, such as Run now while the Bot is still answering there, waits and then runs. After about
9 minutes it gives up with "This goal's conversation was busy for about 9 minutes, so the run
never started and nothing was done. Run the goal again when the conversation is free." It failed
at once, with the platform's 409 error as its reason. - A goal that runs only when asked is counted "on demand" on a Bot's page and listed under On
demand on its Activity page, where it was counted and listed as scheduled. A goal a trigger wakes
says so ("Wakes on webhook"), where it said "Runs when asked". - A goal a routine runs is listed with it. On a Bot's Activity page it sits under Scheduled and
says when it runs ("Every day at 08:00 (UTC), from its routine"), where it read "Runs when asked".
Each of its runs is named "Run of" and the goal's title, where it carried the goal's own title. - A routine can have a title. A Bot asked to name a routine ("call it Morning briefing") gives
it that title, up to 100 characters, where it said it couldn't. The title heads the routine's row
on the Routines page, with its schedule under it, and names it in a Bot's Activity. A new routine
a Bot makes to run one of your goals carries the goal's title unless you named it, where it went
by the instruction the Bot wrote for it. Bots are told a routine's id is for their tools only, and
not to read it out. - Bots tell you a routine's next run on your clock: a Bot that creates, changes or lists a
routine is told "Saturday, November 7, 2026 at 9:00 AM UTC, 6 minutes from now", where it was told
"2026-11-07T09:00:00.000Z", so it no longer says a run due in minutes is tomorrow. - A Bot page's Activity list reads in words. A routine's schedule reads "Every day at 09:00
(UTC)", as on the Routines page, where it read "Repeats on 0 9 * * * (UTC)". Each title stays on
one line with an ellipsis and shows whole on hover, and a routine's row carries its whole
instruction, where it was cut at 120 characters. A goal's summary, an error, a question, a
follow-up and a delegated task show as plain text, without Markdown marks. - OpenBot's own apps keep up with the release. At every start the server brings the saved tools
of Routines and Google Drive (where it is added) up to date with the release it runs, so a tool a
release renames, rewords or adds reaches an existing installation without anybody pressing
Refresh tools. A start where nothing changed writes nothing, and which Bots have an app, and
which apps are on, stay as they were. Apps from MCP servers are not refreshed at start, and
Composio and Arcade apps only once, at the first start after this upgrade (above).
Questions reach you, and answers show as they happen
- A question with no answers to pick from, such as which city you're in, reaches you with a
field to type the answer. It was refused before you were asked, and the step read "Blocked: Asked
you", as on the "Find weekend plans" starter. - A Claude Agent SDK Bot's question reaches you above the message box, and your answer goes back
to the Bot. It showed only as a step, and what you typed back was lost. Its messages to another
Bot are delivered the same way. - Your answer's work streams in the conversation, with Stop. When a Bot asks you something in a
conversation and you answer there, its work on your answer appears step by step and can be
stopped. It showed "Personal Assistant is reading your answer…" (with the Bot's name), with no
steps and no Stop, until the turn was over. An answer sent the moment the Bot asks always answers
it, where it could go as a new message and leave the question, and its "1 thing needs you" badge,
open. A question a routine, a goal or another Bot asked is still answered in the background. - A step you declined stays declined after you write again, and the Bot is told you declined
it. It turned into "Saved file" on your next message, and read as done when the conversation was
opened again. A blocked step says what was tried, its target and why ("Blocked: Save file",
"notes.txt · You declined it."), and a step that never ran because the Bot stopped to wait for you
reads "Not done. The Bot stopped to wait for you on another step.", where it read as done. - The first-use starter tasks step aside while a Bot waits on your answer, where they covered
the bottom of its question.
Claude Agent SDK Bots
- They answer after you decide a step they asked about (Allow once, Deny, Don't do
it or I did it myself), also when they asked for several steps at once or you decided more
than five minutes later. A long browser task is no longer cut off five minutes in: the limit is
five minutes without progress. Any Bot is told which of the steps it asked for never ran. - They answer what you write while one of their steps is still open, such as after Stop or a
reload, and your message stays in the conversation. They carried on as if you had said nothing,
and your message was missing when the conversation was opened again. - A step Claude Code refuses before it runs, such as a table sent with broken data, no longer
ends the turn in silence. The Bot goes on to retry or answer in words. - They answer once when their stream from Claude breaks partway and Claude Code recovers. The
Bot used to answer a second time under its first reply, show the same reply twice, leave a
cut-off fragment above the answer, or lose the answer and keep only the fragment. A fragment can
still show while the answer arrives, and is gone when the turn ends.
Activity and Audit
Activity (Settings → Activity in the personal edition) and Audit (Admin → Audit):
- A denied action reads Blocked. A Bot's computer action or app call that a person denied
shows as Blocked ("A person denied it when asked.") and is listed under Blocked, where it read
Allowed. The person's answer reads "Denied by a person", "Allowed once by a person" and so on. - One row per action. A computer action that failed or was stopped shows once, as "Did not
happen", and Computer actions lists blocked, failed and stopped actions as well as allowed ones. - A Bot's folder actions on your computer are computer actions. Reading, saving or running
something in a folder reads "Read a file", "Save a file" or "Run a command", with the file or
command under it, and is listed under Computer actions. One you denied reads Blocked and is
listed under Blocked. Giving a Bot a folder reads "Give a Bot a folder" with the folder and the
Bot, and taking it away or stopping folder access reads "Take a folder from a Bot" or "Stop folder
access". - Activity leaves out OpenBot's own working: choosing tools for a run ("Choose tools for a
run", "96 of 96 tools"), written on every turn; which Bot a message went to ("Choose a Bot for a
message"); the components a build publishes; and the two "Start the computer" rows at every
start. They are gone from every view of Activity and from its export. Admin's Audit still lists
them. - Rows say what they were about in words, such as "Save a file" and "Set up Learning", where
they showed "write_file" and "Change a setting". Admin shows the stored name on hover, and the
export keeps it. In Activity, what a row acted on is in words too: a tool call's app ("Gmail"), a
component by its gallery name ("Activity report") with why it was refused, a skill by its name,
and a saved key by its provider and key ID, where they showed stored names and ids. - Bots are named, never shown by id, here and on the Computers page. A Bot hidden from the
sidebar is named, a deleted Bot reads "A Bot no longer here", and hovering a Bot no longer shows
its id. The export keeps the ids. - The table fits a 1000-pixel window, OpenBot Desktop's default: what an action acted on sits
under it, and who started it under the Bot, so Decision shows without scrolling sideways. - The personal edition's page is titled Activity, as its sidebar entry is, where it was titled
Audit and spoke of "this deployment's policy". Admin keeps Audit. - What OpenBot does by itself is started by OpenBot: giving every Bot Routines' tools at a
start, such as the new goal tools at this upgrade's first start, giving every Bot an app's tools
in the personal edition, turning on Routines, and publishing a build's new components (Admin
only). These read as started by a person. Activity reads "Started by OpenBot" for them, and for
every other row OpenBot started, where it read "Started by this deployment", which Admin keeps.
Giving a Bot an app's tools is one row per Bot, "Give a Bot tools", with the tools and the app in
words, where each tool had its own "Change a setting" row. - A Bot's Activity page links to "Every action this Bot took", which opens this page narrowed
to that Bot until you clear the filter. The link shows in the personal edition, and for admins.
The page also says it lists the Bot's tasks, routines and goals.
OpenBot Desktop
- A new installation starts with one Bot, the Personal Assistant, running on the framework
picked in setup. It started with the Personal Assistant and a second Bot named after the
framework. Its subtitle says what runs it ("Everyday life. Powered by LangChain (LangGraph)."),
and under its name it says what it does ("Help with email, your calendar, research, planning and
everyday errands."). Its Setup page changes its name, its subtitle, what it does and its
Instructions, each on a row of its own. After a change of AI provider it moves to the new
framework, even after you rename it, and the "Powered by" part of its subtitle names the new one,
keeping any words you wrote around it. Its Setup page says "OpenBot runs this Bot, so it can use
its tools without a key." A personal edition started with
scripts/start.shstarts with the Personal Assistant subtitled "Everyday life. Powered by
OpenBot.", which can be changed the same way. - Bots can read folders on your computer. Press Choose folder on a Bot's row under Folders
on this computer in Settings → Computer. A folder is read-only. The desktop app asks in its own
dialog before each file change, and before each command unless Settings → Approvals says
otherwise. Every folder chosen and every call is recorded in Activity, and access ends when
OpenBot stops. Choose folder was refused with ""Local computer access" isn't part of OpenBot
Personal, so that wasn't done." An OpenBot that OpenBot Desktop didn't start, such as one started
withscripts/start.shor a team deployment, says "Needs OpenBot Desktop" there, where it said
the desktop app was offline. - Check for updates works on a signed release. It says "OpenBot 0.3.3 is up to date." (naming
the version you run) or names the newer one with Update and restart. The setup window's
Updates section said signed updates were not configured. You can also ask from Check for
Updates… in the tray menu, under About OpenBot in the OpenBot menu on a Mac, and from Check
for updates on the Version row of Settings → This computer. A build that doesn't update itself,
such as an internal build, says so up front ("This version of OpenBot doesn't update itself.
Install a released version of OpenBot to get updates."), with no button. - A log file you can send. OpenBot Desktop keeps a log file on every platform: each Start,
Stop, update, container command and update check, and every error, with a UTC timestamp.
Settings → This computer and the Status window show its folder under Logs, with Open log
folder. It stays on your computer, rotates at 5 MB keeping four older files, and hides keys,
tokens, passwords, cookies, sign-in codes and email addresses. It used to keep no log file. - Conversations on a Claude or ChatGPT plan get a title in the sidebar, from the plan's own
model, as the built-in Bots' answers are. With no model key nothing titled them, so each showed
the start of its first message. A Bot you brought yourself is never run to title one. - The setup window offers a saved sign-in only when there is one. "Use a saved ChatGPT
sign-in", "Use a saved OpenAI API key" and "Use a saved Anthropic API key" show only when one is
saved. On a computer with nothing saved they were offered anyway, and Start then failed. - The ChatGPT sign-in's own pages show, not a reset connection. "This sign-in link is out of
date" and "OpenBot already has this sign-in" came up as a reset connection when the browser's
request was long, as it is with manylocalhostcookies. And a browser that came back before
the sign-in was listening was told "OpenBot already has this sign-in" while the sign-in never
finished; the sign-in now waits for it. - The setup window's sign-ins show whose account they are: CopilotKit's logo on the CopilotKit
sign-in, Google's and xAI's marks in the "Connect your AI" list, a cloud icon beside "Any
OpenAI-compatible endpoint", and each provider's mark on its "Sign in with" button. Google's
button reads "Sign in with Google", where it read "Sign in with Google Gemini". - The Claude plan sign-in says to approve the request in your browser and paste back the code it
shows, where it said nothing is typed in the window. The link under xAI's API key field reads "Get
an xAI API key", where it read "Get a xAI API key". - The Windows installer shows OpenBot's orb down the side of its Welcome and Finish pages, in
the header of its other pages and as its icon, where it showed NSIS's stock artwork. The
uninstaller has the same icon. - On Windows, folders read
C:\Users\you\OpenBotunder Installed in and in the desktop app's
approval dialogs, where they read\\?\C:\Users\you\OpenBot.
Personal edition
- Sign out is gone where nobody signs in: every personal edition, OpenBot Desktop included,
and any deployment withOPENBOT_SINGLE_USER. Pressing it said "No identity provider is
configured." and left you where you were. - OpenBot, not "this deployment". An app's page under Connections, Add credential under Keys
and the Computer page's update dialog say OpenBot where they said "this deployment". Admin keeps
"this deployment". In both editions, messages anybody can see say OpenBot too, such as "Voice
calls are unavailable. Check OpenBot's voice configuration." - Settings → Setup no longer lists Slack and Teams, which said "Needs setup" and counted in the
number beside Setup in the Settings sidebar. - A Bot names the app card's real button: Turn on (then Connect, if the card offers it),
Connect, Set up for an app that takes a key, or Set it up. It always said to press Connect, which
the card doesn't show for an app that has to be turned on first. - The Activity report works. A Bot asked for one drew "Not shown: Activity report", saying an
admin had to give it the data, and the personal edition has no admin. OpenBot now gives the report
what it reads when the app loads, including the first load after the upgrade, and a refusal says
"It can't read the data it needs." Its figure for each Bot is the number of rows Settings →
Activity lists for that Bot. In both editions the report names each Bot and says what was refused
in words, where it showed ids, and one request writes one row, where a refused one wrote up to
three.
The Bot's browser
- A click, key press or typing that can't finish says why: the page refused to send its form,
something covers the element, it is hidden or turned off, or the page is still loading. The Bot
was told the element was "not on the page any more", and tried the same thing again. - A dropdown keeps the Bot's choice. A Bot that opened a dropdown, typed its choice and pressed
Enter keeps the choice. Enter put the dropdown back to the option it showed when opened, such as
"Choose one", so the form was sent without it. - A token in a page's address no longer counts as changing a credential. A Bot filling in an
ordinary form on a page whose address carries a signature or token after its path (an S3
presigned link'sX-Amz-Credential=, a sign-in'saccess_token=) is no longer handed to you. A
password field, a Change password button or a security page's path still hands it to you.
Smaller changes
- A check-in's next run is counted on the server's clock, the clock that decides when it is due. It
was counted on the database's clock, so with the two clocks apart a check-in came that much
earlier or later than its interval: a database a few milliseconds ahead put a 4-hour check-in a
few milliseconds past 4 hours out. - Asked which AI model it runs on, a Bot whose model you pick in the composer names the one the
model picker shows, such as "GPT-6.1 Terra", and the new one after you pick another, where it said
it couldn't see its model's name. - Asked which framework it runs on, a Bot names what runs it, whatever its subtitle says: OpenBot
for a Bot that runs in OpenBot, the framework picked in OpenBot Desktop's setup, or the framework
picked from New Bot's list, where it said it didn't know. An agent you already run is told
none. - On a Claude or ChatGPT plan, Auto-review and the choice of which Bot an untagged message goes to
run on the plan. Auto-review asked you about every change it should have judged, and such a
message went to your default Bot unless it named an app only one Bot has. Auto-review still asks
you when the plan errors, gives no clear answer or does not answer in time. - A Bot that runs at another address, on a framework such as OpenBot Desktop's starter Bot or one
you run yourself, is never sent more than 128 tools in one request, counting the ones your browser
adds. With an OpenAI key the starter Bot now answers, where every message failed with "Error code:
400 - Invalid 'tools': array too long". OpenBot's own tools, Routines and web search come first,
then the app tools closest to what you asked. On a Claude or ChatGPT plan, choosing which tools a
message needs now runs on the plan, where it failed and every tool was offered. - The sidebar shows the OpenBot release the server runs, such as "v0.3.3", in small grey type under
your name at the bottom left. In OpenDots it is under your name in the account menu and the phone
drawer. Nothing shows when the server has no version, as in development. - A Bot made with New Bot says what runs it under its name: "Powered by OpenBot" for one that
runs in OpenBot, "Powered by" and the framework for one on a framework from the list, and nothing
for an agent you already run. Its subtitle was empty. LangGraph is called "LangChain (LangGraph)"
in that list and in OpenBot Desktop's setup window. - In an interface a Bot draws, such as the "Build a trip budget" starter task, a total adds up the
numbers you type, where it joined them as text ("Total $10025080"). A number box you clear counts
as zero. - The "Find weekend plans" starter task asks the Bot to check each event's date and any price on its
source page, and to leave out what it can't confirm. - A Bot's step reads in words from the moment it starts, whatever the tool: "Drawing an interface",
then "Drew an interface", where it showed "render_ui", and "Web search" for a tool with no label
of its own, where it showed "web_search" until the Bot's next step joined it. - A Bot that can't be reached says so by name: "Couldn't reach Personal Assistant. Check that it's
running and that its address on its Setup page is right, then try again." The conversation showed
the connection error, such as "ECONNREFUSED: Unable to connect. Is the computer able to access the
url?", which now goes to the server log. - When the model provider refuses a turn, the conversation says so in words, names the provider and
says what to do, such as "OpenAI didn't accept the API key. Check that it's set, correct and still
active, then try again." It showed the provider's error, such as "Error code: 400 - Invalid
'tools': array too long", which now goes to the server log. A Claude Agent SDK Bot's refusal no
longer reads as its answer. - A Bot's step that asked for a tool the Bot doesn't have reads "didn't work" and opens to "This Bot
asked for a tool it doesn't have, so it carried on without it." It opened to the error written for
the model, listing every tool the Bot has by its raw name. - A table, chart, card or question a Bot couldn't draw says so in its own card ("Couldn't show the
data table.") and says to ask the Bot to try again. It showed "Waiting for complete table data…"
or an empty card for good, also after a reload. - When a Bot's turn fails partway, after steps such as using its computer, the conversation says so
under the turn, as it does for a turn that fails at once. It ended on the steps with nothing said. - A reply that arrives while OpenBot Desktop's window is covered, or while the tab is in the
background, is drawn in full. It stayed cut off mid-sentence until the window was back in view. - A notice a Bot draws labels its badge "Good news", "Heads up" or "Problem", where it showed the
tone's own name, such as "positive". - With reduced motion turned on in the operating system, a step a Bot is still running shows its
words, in the same muted tone as a finished step. It showed only its ▸, or nothing. - Pressing + starts a new conversation with your Bot picked, the default Bot in the personal
edition and the only Bot wherever there is just one, where To: started empty and you had to pick
it. With several Bots in the team edition, + opens the To: picker with the caret in it every time,
where a second press left it closed. You can write the message before choosing a Bot, and Enter or
Send with nobody in To: keeps the message, opens To: and says "Choose a Bot first." - A renamed Bot's conversations go by its new name in the sidebar, the conversation header and the
lists you pick a conversation from, including conversations started before the rename. They kept
the name the Bot had when each began. - The sign-in dialog that Open private sign-in opens no longer leaves large empty gaps above
"Use a saved login" and "Enter your login". Its fields sit just below the sentence that
introduces them, in the dialog and on the sign-in page. - Settings → Components gallery, and each component's page, say what it shows, such as "Shows what
your Bots have been doing and what was refused, read from OpenBot's own records." They showed the
text written for the model ("Show what this deployment has actually been doing..."). In the
personal edition the intro says every Bot can use all of them, where it said an admin controls
them. - Turning off an app you added from Composio's or Arcade's directory, or by its address, takes you
back to Connections (Admin → Plugins for an admin), where you can add it again. Its page said "Not
an app. There is no app with that name." An app always listed there, such as Notion, still stays
on its page, off. - OpenBot Desktop offers Sign in with Unbiased AI on the Connect your AI screen. Signing in opens
Unbiased AI's approval page in the browser, where a person signs in or creates an account, and
OpenBot receives an API key for theparetomodel on Unbiased AI's OpenAI-compatible gateway. The
key is stored on this computer the way a typed endpoint key is, and an Unbiased AI API key can be
pasted instead. See Model provider OAuth.