<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bees</title>
    <description>The latest articles on DEV Community by Bees (@beesbot).</description>
    <link>https://dev.to/beesbot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4135935%2Fdce2b268-a9a6-47b1-baa6-2cd1ca1168da.png</url>
      <title>DEV Community: Bees</title>
      <link>https://dev.to/beesbot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/beesbot"/>
    <language>en</language>
    <item>
      <title>Six small ways to help test Bees, no code needed</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 27 Oct 2026 15:36:40 +0000</pubDate>
      <link>https://dev.to/beesbot/six-small-ways-to-help-test-bees-no-code-needed-5549</link>
      <guid>https://dev.to/beesbot/six-small-ways-to-help-test-bees-no-code-needed-5549</guid>
      <description>&lt;p&gt;The new Bees is on &lt;code&gt;main&lt;/code&gt;, but the releases page still has the older app. So right now the only way to try the new one is to build it from source, and very few people outside our team have done that yet.&lt;/p&gt;

&lt;p&gt;We opened six GitHub issues. Each one is a single report, and none of them need you to write code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/315" rel="noopener noreferrer"&gt;#315&lt;/a&gt; Read the README once and tell us which sentences lost you. No install, about 20 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/314" rel="noopener noreferrer"&gt;#314&lt;/a&gt; Run the headless check and tell us if it passes. You only need Node.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/313" rel="noopener noreferrer"&gt;#313&lt;/a&gt; Build from source on Windows and list what you had to install.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/316" rel="noopener noreferrer"&gt;#316&lt;/a&gt; Use the thread screen with only a keyboard.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/317" rel="noopener noreferrer"&gt;#317&lt;/a&gt; Check the thread screen at small window sizes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Bees-bot/bees-desktop/issues/318" rel="noopener noreferrer"&gt;#318&lt;/a&gt; Run the hosted Client proof on your own Docker host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one and leave a comment on that issue. More than one report on the Windows build and the Docker one is welcome, since every machine turns up something different.&lt;/p&gt;

&lt;p&gt;The whole list is also in &lt;a href="https://github.com/Bees-bot/bees-desktop/discussions/319" rel="noopener noreferrer"&gt;this discussion&lt;/a&gt;. Bees is free and open source, more at &lt;a href="https://bees.bot" rel="noopener noreferrer"&gt;bees.bot&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>testing</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>What Bees sends over the network when you run a local model</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:40:26 +0000</pubDate>
      <link>https://dev.to/beesbot/what-bees-sends-over-the-network-when-you-run-a-local-model-1e63</link>
      <guid>https://dev.to/beesbot/what-bees-sends-over-the-network-when-you-run-a-local-model-1e63</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://bees.bot/blog/what-bees-sends-on-a-local-model" rel="noopener noreferrer"&gt;bees.bot&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Our latest film is called "Nothing leaves your computer". So I went through the Bees code and listed every request it makes to the internet, to check that claim.&lt;/p&gt;

&lt;p&gt;The short answer: when you run a local model, your prompts, your files, your agents' work and your memories stay on your computer. The model runs in &lt;code&gt;llama-server&lt;/code&gt;, which only listens on &lt;code&gt;127.0.0.1&lt;/code&gt;, so nothing outside your machine can reach it. No crash reporting, no analytics and no tracking code ship in Bees.&lt;/p&gt;

&lt;p&gt;But four things still go out by default, and one of them surprised me. I'd rather tell you than have you find it in a packet log.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes out without you doing anything
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;app.bees.bot/api/config&lt;/code&gt;.&lt;/strong&gt; At every start, Bees asks our server how sign-in is set up. It sends no account details and no token, only what any web request carries: your IP address and a user agent. It happens even if you never sign in. There is no switch in the app. Setting the &lt;code&gt;BEES_ACCOUNT_API_URL&lt;/code&gt; environment variable points it somewhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The update check.&lt;/strong&gt; At launch and every 6 hours, Bees fetches &lt;code&gt;bees-update.json&lt;/code&gt; from our GitHub releases on &lt;code&gt;github.com&lt;/code&gt;. The request carries no data about you. Nothing downloads until you click "Update and restart". There is no switch to turn this check off yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;api.freellmapi.co&lt;/code&gt;.&lt;/strong&gt; This is the one I didn't expect. Bees bundles a small server that powers the free cloud AI option. It starts at every launch, even if you only use a local model. Ten seconds after start, and then every 12 hours, it asks &lt;code&gt;api.freellmapi.co&lt;/code&gt; for the latest list of free models. It sends only the version of the list it already has. It sends a key only if you have a paid FreeLLMAPI license. Today the only way to stop it is the &lt;code&gt;CATALOG_SYNC_DISABLED=1&lt;/code&gt; environment variable, which most people will never set. We are fixing this so the server only runs when you pick the free AI option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The first memory setup.&lt;/strong&gt; Local memory is on by default, so agents can remember what they learned. The first time it starts, Bees installs it with &lt;code&gt;uv&lt;/code&gt;. That downloads Python 3.12 from GitHub, the memory packages from PyPI (&lt;code&gt;pypi.org&lt;/code&gt;), and a small embedding model, &lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;, from Hugging Face. Your memories are not part of those requests. Memory reads and writes go only to your local model; the code says in a comment, "Never forward memories to a hosted model". You can turn memory off for a workspace in settings. I'm not yet sure whether the memory service checks Hugging Face for a newer version of that embedding model each time it starts. I'll check on a clean install and update this post.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our help page on &lt;a href="https://bees.bot/help/what-leaves-your-computer" rel="noopener noreferrer"&gt;what leaves your computer&lt;/a&gt; mentions the sign-in check and the model download. It does not mention the FreeLLMAPI list or the memory install. That page gets fixed too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes out only when you or an agent asks
&lt;/h2&gt;

&lt;p&gt;These need an action first. Each one sends what the action needs and nothing else.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Downloading a model.&lt;/strong&gt; When you turn on the Qwen3 4B model, Bees downloads one file of about 2.5 GB from &lt;code&gt;huggingface.co&lt;/code&gt; over https and checks it against a fixed checksum. You can also paste your own GGUF link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web search and page reading.&lt;/strong&gt; Every agent has web search and page reading tools, and there is no switch for them. A search sends the query to &lt;code&gt;search.brave.com&lt;/code&gt;, &lt;code&gt;html.duckduckgo.com&lt;/code&gt;, &lt;code&gt;lite.duckduckgo.com&lt;/code&gt; and &lt;code&gt;bing.com&lt;/code&gt; together. News search uses Google News RSS. Reading a page fetches that page. These fire only when an agent decides to look something up, and the search query is the only part of your work that leaves. If a &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; is set in the environment Bees starts from, one more search tool appears, and it sends queries to &lt;code&gt;api.deepseek.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask Bees planning.&lt;/strong&gt; When you ask Bees to plan a setup, it may search the public add-on registry at &lt;code&gt;registry.modelcontextprotocol.io&lt;/code&gt; and read skill packs from &lt;code&gt;github.com&lt;/code&gt; and &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;. The Skills screen uses the same calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Apps screen.&lt;/strong&gt; Opening it fetches our app list from &lt;code&gt;bees-bot.github.io&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add-ons.&lt;/strong&gt; None are on by default. When you add one, its package may download from npm or PyPI the first time it runs, and the add-on then talks to whatever service it is for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail, Calendar and Drive.&lt;/strong&gt; These reach Google only after you connect them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud models.&lt;/strong&gt; If you pick an API key provider, or a subscription like Codex, your prompts go to that provider. That is the whole point of picking one, and it does not happen on a local model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Bees Cloud team.&lt;/strong&gt; If you sign in and join a team, Bees syncs with &lt;code&gt;app.bees.bot&lt;/code&gt; every 15 seconds. On my own Mac, which is signed in, I counted about 20 open connections from Bees to that server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I checked and found off
&lt;/h2&gt;

&lt;p&gt;The agent runtime inside Bees has telemetry. Bees starts it with &lt;code&gt;DSH_TELEMETRY_DISABLED=1&lt;/code&gt;, and I traced that setting through the runtime code to the place where it turns telemetry off. Even when telemetry is on, it only uploads after you send feedback.&lt;/p&gt;

&lt;p&gt;The app window can't load anything remote. Its content security policy allows only the app itself and &lt;code&gt;127.0.0.1&lt;/code&gt;. No remote fonts, scripts or images. Help links open in your own browser when you click them.&lt;/p&gt;

&lt;p&gt;The memory service has tracing code, but it only exports if an endpoint is set, and Bees doesn't set one. The device id file Bees keeps is only used when you are signed in to a team.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I haven't checked
&lt;/h2&gt;

&lt;p&gt;This list comes from reading the code. I have not yet watched the network on a fresh install. On this Mac I could only look at the Bees that was already running, which is signed in to a team, so it doesn't show the clean first run.&lt;/p&gt;

&lt;p&gt;Two things I couldn't settle from the code. The memory reranker points at Hugging Face, but I couldn't find where it stores its download, so I don't know if it fetches one. And one library in the memory service can fetch a price list from GitHub when it loads, but Bees uses a different path that shouldn't load it. Next I'll run a clean install with nothing but a local model, watch the first 15 minutes of traffic, and post what I see.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes
&lt;/h2&gt;

&lt;p&gt;The FreeLLMAPI list should not run when you never chose free cloud models. The update check should have a switch. The help page should list the memory install. Those are the three fixes I'm making first.&lt;/p&gt;

&lt;p&gt;If you find a request I missed, open an issue. Bees is free and open source, on Mac, Windows and Linux. &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;Download it at bees.bot&lt;/a&gt;, and the code is at &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;github.com/Bees-bot/bees-desktop&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>opensource</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Bees runs its own social accounts</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Thu, 15 Oct 2026 15:33:18 +0000</pubDate>
      <link>https://dev.to/beesbot/bees-runs-its-own-social-accounts-mj1</link>
      <guid>https://dev.to/beesbot/bees-runs-its-own-social-accounts-mj1</guid>
      <description>&lt;p&gt;Launch posts say what a tool can do. This one shows a process we actually run, with the real numbers and the parts that went wrong.&lt;/p&gt;

&lt;p&gt;Bees has brand accounts on Bluesky, dev.to, Substack, a few forums and a long list of directories. Keeping up with all of them by hand is the kind of work that slips. So on 7 October we gave it to a Bees process.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it was built
&lt;/h2&gt;

&lt;p&gt;We typed the outcome into &lt;strong&gt;Ask Bees&lt;/strong&gt;: check every place Bees has an account, answer anyone who replied to us, then join a few relevant conversations, as the Bees account and within a daily limit.&lt;/p&gt;

&lt;p&gt;Bees proposed a process with three agents and four stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check sites.&lt;/strong&gt; A site checker opens each of the 30 places as the Bees account. It notes where it is signed in, who is owed a reply and how many actions are left for the day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engage.&lt;/strong&gt; A poster answers replies first. Then it spends what is left of the daily allowance on likes, comments and answers to questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit log.&lt;/strong&gt; A separate reviewer reopens every action from the public page, not from the poster's own log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Done.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agents get a browser, developer tools and a web fetcher. A schedule starts a fresh run at 9:00 and 18:00 Kathmandu time.&lt;/p&gt;

&lt;p&gt;The rules went into the goal and the agent instructions, not into code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At most 5 actions per site per day, shared by both runs.&lt;/li&gt;
&lt;li&gt;Directories and listings are only watched. On Reddit, LinkedIn and Hacker News it never posts; it logs what it saw for a person.&lt;/li&gt;
&lt;li&gt;Claims about Bees come only from a short facts file, and most replies carry no link.&lt;/li&gt;
&lt;li&gt;Every site gets one log line per run, even when the answer is "nothing worth answering".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the first runs did
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;7 October, first run, 27 minutes.&lt;/strong&gt; It made 12 public actions across Bluesky, dev.to and Substack: likes on posts about local agents and agent security, and one comment on dev.to that said we work on Bees. It also reported what it could not do. Bluesky wanted the account email verified before Bees could reply, and Hashnode had removed our three posts. It did not send the verification email or file an appeal on its own. It left both for us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 October, the reviewer sent it back.&lt;/strong&gt; The poster skipped Substack with "not reached in this run". The reviewer said that is not a reason to skip a signed-in site, and listed exactly what to do: open Substack, answer anything owed, find an on-topic thread or write down why there was none. The poster went back, did it, and the second review passed. The whole run took 49 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 October evening, a cheaper model, 22 minutes, no human touch.&lt;/strong&gt; We moved the agents to DeepSeek V4 Flash. The run went from start to Done with zero clicks from us. The reviewer's notes are the part we trust most. It checked that our Bluesky like was the only one on the post, and that the reply text matched the log word for word. It also said what it could not check: Substack does not show who liked a note, so two likes rest on the poster's word.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not every model got through.&lt;/strong&gt; Before that clean run we made three other attempts the same evening. One, on DeepSeek V4 Pro, failed at the first stage on a provider error. We stopped the other two ourselves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some sites stop agents at the door.&lt;/strong&gt; Two forums sit behind bot checks, one site has no profile page for the account, and two had signed out. The checker logs those as skipped with the reason, and the run carries on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It only runs while Bees is open.&lt;/strong&gt; Agents run on our own computer, not on a server. The run due on the morning of 9 October is still waiting, because Bees has been closed through launch week. That is the trade we chose, and we wrote up &lt;a href="https://bees.bot/blog/no-central-dispatcher" rel="noopener noreferrer"&gt;why&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you build one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Put the hard limits in the goal: where it may post, how many actions a day, which facts it may use.&lt;/li&gt;
&lt;li&gt;Keep a review stage that checks the live pages, not the worker's summary. Ours caught a skipped site the worker had called done.&lt;/li&gt;
&lt;li&gt;Leave account decisions to a person: verifying an email, appealing a removal, anything that changes the account itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process started as a short request in Ask Bees, then took a few rounds of tightening the rules. If you have a chore like this, describe the outcome and read what Bees proposes. &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;Download Bees&lt;/a&gt;, or read &lt;a href="https://bees.bot/help/understanding-basics" rel="noopener noreferrer"&gt;how the reviewer works&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;First published on the Bees blog: &lt;a href="https://bees.bot/blog/bees-runs-its-own-social-accounts" rel="noopener noreferrer"&gt;https://bees.bot/blog/bees-runs-its-own-social-accounts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bees is free and open source: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;https://github.com/Bees-bot/bees-desktop&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>agents</category>
    </item>
    <item>
      <title>What broke when we ran agents on small local models</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:40:25 +0000</pubDate>
      <link>https://dev.to/beesbot/what-broke-when-we-ran-agents-on-small-local-models-mme</link>
      <guid>https://dev.to/beesbot/what-broke-when-we-ran-agents-on-small-local-models-mme</guid>
      <description>&lt;p&gt;Bees runs a team of AI agents on your own computer. You can point it at Claude Code, Codex or an API key, but we also ship a local model so you can run it without paying for an API. That model runs through llama.cpp on a laptop, and it is small: 3 to 4 billion parameters.&lt;/p&gt;

&lt;p&gt;Getting agents to do real work on a model that size took us most of August and September. Almost none of the failures were "the model is too dumb". Most of them were our code, or a mismatch between our code and the model, and they looked exactly like a dumb model from the outside.&lt;/p&gt;

&lt;p&gt;Here are the five that cost us the most time.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The agent finished and nothing happened
&lt;/h2&gt;

&lt;p&gt;The first local model we tried was Nanbeige 4.2 3B. On the first turn it called tools perfectly. Then the run would just end. No error. The agent said it was done, and no file was written, no search was run.&lt;/p&gt;

&lt;p&gt;We first read this as "a 3B model is too weak for agents" and started planning around it: one tool call per agent, a bigger model for some roles. That was the wrong fix for the wrong problem.&lt;/p&gt;

&lt;p&gt;The real cause took a two-turn request to reproduce. Nanbeige sends its first tool call as JSON. Once a tool result is in the history, it switches to an XML style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;tool_call&amp;gt;&amp;lt;function&lt;/span&gt;&lt;span class="err"&gt;=write_file&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;parameter&lt;/span&gt;&lt;span class="err"&gt;=path&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;notes.md&lt;span class="nt"&gt;&amp;lt;/parameter&amp;gt;&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;llama.cpp locks its parser to the first format it detects. So the second call never got parsed. It came back as plain text in &lt;code&gt;content&lt;/code&gt;, with &lt;code&gt;finish_reason: stop&lt;/code&gt; and &lt;code&gt;tool_calls: null&lt;/code&gt;. To our agent loop that is a model saying "I'm finished". Nothing ran because, as far as the code could tell, nothing was asked for.&lt;/p&gt;

&lt;p&gt;It wasn't a missing &lt;code&gt;--jinja&lt;/code&gt; flag, which is on by default in our llama.cpp build. Forcing the XML parser would just have broken turn one instead.&lt;/p&gt;

&lt;p&gt;The same model had a second problem hiding behind the first. Our catalog pinned it to an 8k context window, and our own agent prompt measures 8,567 tokens. So the code that sizes the context for the prompt never ran.&lt;/p&gt;

&lt;p&gt;What fixed it: we stopped offering models that can't hold one tool-call format for a whole run. Bees now offers Qwen3 4B Instruct as its local model for agents, and dropped the ones that couldn't run one.&lt;/p&gt;

&lt;p&gt;The lesson we took: when an agent run "does nothing", look at the raw reply before you blame the prompt or the model. If you see &lt;code&gt;&amp;lt;tool_call&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;function=&lt;/code&gt; sitting in the text, the model did its job and the parser didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tools the model was told to use but never shown
&lt;/h2&gt;

&lt;p&gt;Bees has a lot of tools. One planning agent's first request was about 22k tokens, and 15.6k of that was the schemas for 79 tools. On a laptop running a 16k context that does not fit at all.&lt;/p&gt;

&lt;p&gt;So most schemas sit behind a search tool. The model sees a small base set and calls the search tool to load the rest. It loads 4 matching schemas at a time.&lt;/p&gt;

&lt;p&gt;Two things went wrong with small models.&lt;/p&gt;

&lt;p&gt;First, a small model searches for its task words, not for a capability. Asked to fetch the top 5 news stories, it searched, matched nothing, and decided the run had no tools at all. In another run it searched "nepal news in nepali api", matched an unrelated add-on, and reported the same. Both times it gave up. A big model would try a second search. A 4B model takes the first answer as the truth. We moved reading, writing and the web back into the always-visible set, and an empty search now lists the tool names it could have asked for.&lt;/p&gt;

&lt;p&gt;Second, and worse, our own prompt contradicted the tool list. It said "the tools listed are ready to call, only search when nothing listed can do the job". Then, two lines down, it told the model to call our delegation and knowledge tools. Those weren't listed. A big model notices and goes looking. A small model believes the harness, sees the tool is missing, and stops.&lt;/p&gt;

&lt;p&gt;That bug made eight local models "fail" one of our internal team tests on a tool they were never given. Every failing result we had recorded for those test tasks up to that day was measured this way. We were grading models on whether they would second-guess our prompt.&lt;/p&gt;

&lt;p&gt;What fixed it: a sweep. We grep every tool name that our prompts and error messages mention and compare it against the set the model can actually see. Anything named but hidden is a bug. We also hide a tool entirely when it can't work. Our web search needs a key, and without it every call failed, yet the model kept calling it because it was listed. Now it only shows up when the key is there.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A tool cap that killed long runs at random
&lt;/h2&gt;

&lt;p&gt;The search tool keeps the last 8 loaded schemas and drops the oldest. The tool itself still works after its schema is dropped. Only its description leaves the prompt.&lt;/p&gt;

&lt;p&gt;On a long email run, after 14 searches, the model called a browser tool it had loaded much earlier. Its schema had already been dropped. Our adapter checked the name against that turn's list, didn't find it, threw "unknown tool" and killed the run.&lt;/p&gt;

&lt;p&gt;This one happened on a big model through Claude Code, but it would hit any model. The model wasn't wrong here. It remembered a real tool. We had treated a cache miss in the prompt as a protocol violation.&lt;/p&gt;

&lt;p&gt;What fixed it: the adapter now passes the call through. If the tool exists, it runs. If the model made the name up, it gets back a normal tool error it can recover from. A long run with many tools no longer fails at random.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A thinking model outran the save timeout
&lt;/h2&gt;

&lt;p&gt;Bees agents keep a memory so they can skip things they already handled and stick to daily limits. At one point every memory save failed with "Extraction failed". Agents saw saves time out and recall return nothing.&lt;/p&gt;

&lt;p&gt;The memory service uses the local model to pull facts out of text. That was Qwen3.5 4B, and with the chat template on, it thinks by default. It wrote 2,000 to 8,500 tokens of thinking for each fact extraction, at about 30 tokens a second. That is well past the memory service's 300 second timeout. And llama.cpp had one slot, so every other save queued behind it. When the laptop was deep in swap, output fell to about 1 token a second.&lt;/p&gt;

&lt;p&gt;What fixed it was one field. Our bridge to the model now sends &lt;code&gt;chat_template_kwargs: { enable_thinking: false }&lt;/code&gt; for memory calls. The same extraction took 1.8 seconds and 43 tokens.&lt;/p&gt;

&lt;p&gt;If you run a thinking model locally behind anything with a timeout, check what it does by default. A reasoning model's real cost is the tokens it spends before it answers, and on a laptop those tokens are seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Prompts don't bind small models, so check in code
&lt;/h2&gt;

&lt;p&gt;After the fixes above, small models still took shortcuts. A run would say it wrote a report when the file was empty. A summary would describe a search that never happened. A model would ask the user a question with only one possible answer and stall the run on it. A model stuck in a loop would hand out the exact same batch of work again.&lt;/p&gt;

&lt;p&gt;We had rules against all of this in the prompt. A small model reads a rule as a suggestion.&lt;/p&gt;

&lt;p&gt;So the step where an agent hands in its result now checks the work instead of trusting the description:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A named deliverable has to exist and have content. An empty file doesn't count.&lt;/li&gt;
&lt;li&gt;A summary may not name a tool that this run never actually called. We record every real tool call, so this check costs nothing.&lt;/li&gt;
&lt;li&gt;A question with one option is refused.&lt;/li&gt;
&lt;li&gt;A delegation that repeats the last batch exactly is refused.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part: a much bigger model tried every one of those shortcuts too. The checks bounced it, and then it did the work. So these aren't small-model crutches. They are how the harness should have worked from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd tell anyone building on small models
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read the raw model output and the exact tool list the model saw before you change models. Most of our "weak model" failures were our bugs.&lt;/li&gt;
&lt;li&gt;Never let a prompt name a tool the model can't see. Sweep for it.&lt;/li&gt;
&lt;li&gt;Treat an unknown tool name as a recoverable error, not a crash.&lt;/li&gt;
&lt;li&gt;Turn thinking off for background calls that have a timeout.&lt;/li&gt;
&lt;li&gt;If a rule matters, enforce it where the result is handed in. Don't just ask for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bees is free and open source, on Mac, Windows and Linux, and runs agents on Claude Code, Codex, an API key or a local model. &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;Download it at bees.bot&lt;/a&gt;, and the code is at &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;github.com/Bees-bot/bees-desktop&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>localllm</category>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Day one of Bees in public: the honest numbers</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Wed, 14 Oct 2026 14:46:34 +0000</pubDate>
      <link>https://dev.to/beesbot/day-one-of-bees-in-public-the-honest-numbers-4oad</link>
      <guid>https://dev.to/beesbot/day-one-of-bees-in-public-the-honest-numbers-4oad</guid>
      <description>&lt;p&gt;Bees went public on 13 Oct. It's a free, open source desktop app that runs a small team of AI agents on your own computer. Here are the real numbers a day later, plus what surprised us.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;15 GitHub stars&lt;/li&gt;
&lt;li&gt;4 forks&lt;/li&gt;
&lt;li&gt;About 67 installer downloads across v0.2.0 to v0.2.2&lt;/li&gt;
&lt;li&gt;0 issues opened by people outside the team&lt;/li&gt;
&lt;li&gt;64 repo visitors in the last 14 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small, and that's fine. We'd rather know where we stand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biggest surprise
&lt;/h2&gt;

&lt;p&gt;On 6 Oct someone we don't know posted a Show HN about Bees. That one post sent more people to bees.bot than all of our own posts put together. A stranger finding it worth sharing did more than anything we wrote about ourselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Launch day was quiet.&lt;/strong&gt; We expected a spike. We got a trickle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get to the point in the first seconds.&lt;/strong&gt; One Reddit reader said our launch video took 15 seconds to get to the point. That's fair, and we're taking it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many launch sites block new accounts.&lt;/strong&gt; A lot of the usual "submit your project" sites put a bot check or a paid tier in front of new accounts, so a good chunk of our launch list never happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What would help
&lt;/h2&gt;

&lt;p&gt;If you try it and something breaks, or a screen makes no sense, please open an issue. Zero outside issues means we're flying blind on what real use looks like. Blunt feedback is welcome too.&lt;/p&gt;

&lt;p&gt;Code and releases: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;https://github.com/Bees-bot/bees-desktop&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Two ways into Bees: describe the job, or point it at your files</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:38:42 +0000</pubDate>
      <link>https://dev.to/beesbot/two-ways-into-bees-describe-the-job-or-point-it-at-your-files-hhg</link>
      <guid>https://dev.to/beesbot/two-ways-into-bees-describe-the-job-or-point-it-at-your-files-hhg</guid>
      <description>&lt;p&gt;Most AI agent tools hand you a blank canvas and expect you to wire up the whole thing. We wanted the first ten minutes of Bees to feel different, so there are two easy ways in: tell it the job in plain English, or point it at the files you already have.&lt;/p&gt;

&lt;p&gt;Bees is a free, open source desktop app that runs a team of AI agents on your own computer. It went public today. Here's how those two pieces work, each with a short video.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Ask Bees: describe the job, it builds the process
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YNUJFK_51WY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You write what you want done the way you'd say it to a person. Bees asks a few quick questions, creates an agent just for that job, plans the steps and sets a schedule.&lt;/p&gt;

&lt;p&gt;Nothing runs until you press &lt;strong&gt;Apply&lt;/strong&gt;, so you can read the plan first and change it. And if the job involves email, it asks before it sends anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Knowledge Base: search every file in plain words
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CkKdRK2VHfQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Approve a folder once and Bees reads and indexes every file in it, right on your machine. Then you search in plain words instead of guessing file names.&lt;/p&gt;

&lt;p&gt;Your agents read the same knowledge while they work, so a report or a reply can lean on your own documents instead of a guess. None of it leaves your computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it runs
&lt;/h2&gt;

&lt;p&gt;You connect your own AI: Codex or Claude Code from the command line, a hosted provider, or a local model. There's no bill from us for the AI itself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://bees.bot" rel="noopener noreferrer"&gt;bees.bot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;github.com/Bees-bot/bees-desktop&lt;/a&gt; (MIT or Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's the first job you'd hand to an agent if you trusted it to ask before doing anything risky? I'd like to know what people try first.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Agents that ask first and remember what you told them</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:28:27 +0000</pubDate>
      <link>https://dev.to/beesbot/agents-that-ask-first-and-remember-what-you-told-them-3nfn</link>
      <guid>https://dev.to/beesbot/agents-that-ask-first-and-remember-what-you-told-them-3nfn</guid>
      <description>&lt;p&gt;The part of AI agents that worried us most wasn't whether they could do the work. It was whether we'd trust them to do it without watching every step. So three of the things we built into Bees are about that: agents that stop and ask, agents that keep what you told them, and a way to get more than one view before a decision.&lt;/p&gt;

&lt;p&gt;Bees is a free, open source desktop app that runs a team of AI agents on your own computer. It went public today. Here's how those three pieces work, each with a short video.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Agents ask first
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/fpBwRhiHkGA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Finished work doesn't just go out. It waits under &lt;strong&gt;Needs your attention&lt;/strong&gt; until you approve it, or send it back with a reason. You can also mark a stage as needing approval, and then its agent can't send, post, delete or pay through a tool until you say yes. When an agent isn't sure what you want, it asks instead of guessing.&lt;/p&gt;

&lt;p&gt;Approval is off by default and you turn it on per stage, so you only pay the waiting cost where a mistake would actually hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tell it once
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YOqB3f9JCis" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;When a report is wrong, reject it and say why in plain words. You pick whether the note is for this run only or for every future run. If it's for every run, Bees writes your note into that job's playbook, so next time it gets it right.&lt;/p&gt;

&lt;p&gt;The playbook is plain text you can read. You can edit or undo any change Bees made to it, which matters, because a rule you can't see is a rule you can't fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Roundtable: three views, one answer
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CEnfhqMMsYo" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Some questions don't have one obvious answer. Ask one in Roundtable and three agents debate it, each with its own job: one pushes for growth, one guards the money, one speaks for the customer. Then a lead agent writes one clear call, with every reason written down, so you can see what it weighed and disagree with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it runs
&lt;/h2&gt;

&lt;p&gt;All of this runs on your machine. You connect your own AI: Codex or Claude Code from the command line, a hosted provider, or a local model. Your files, browser sessions and passwords stay on your computer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://bees.bot" rel="noopener noreferrer"&gt;bees.bot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;github.com/Bees-bot/bees-desktop&lt;/a&gt; (MIT or Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've run agents on real work, where did you have to add a human check? I'm curious whether it's the same places we found.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Bees is public: a free desktop app that runs a team of AI agents on your computer</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:28:26 +0000</pubDate>
      <link>https://dev.to/beesbot/bees-is-public-a-free-desktop-app-that-runs-a-team-of-ai-agents-on-your-computer-2887</link>
      <guid>https://dev.to/beesbot/bees-is-public-a-free-desktop-app-that-runs-a-team-of-ai-agents-on-your-computer-2887</guid>
      <description>&lt;p&gt;Bees went public today. It's a free, open source desktop app for macOS, Windows and Linux that runs a team of AI agents on your own computer, instead of one assistant in a single chat window.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/PNyZpxs6nsU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You describe an outcome in plain language, in the &lt;strong&gt;What would you like to achieve?&lt;/strong&gt; box on Home. Bees turns it into stages on a shared board. Agents work through those stages, and a separate reviewer agent checks each result before the work moves on.&lt;/p&gt;

&lt;p&gt;A small example from the README: ask it to browse Hacker News and give you a table of the current stories, grouped into news, Show HN and Ask HN. Bees plans the stages, the agents do the browsing and sorting, the reviewer checks the table, and the finished result lands in that run.&lt;/p&gt;

&lt;h2&gt;
  
  
  You bring the AI
&lt;/h2&gt;

&lt;p&gt;Bees doesn't sell you a model. Under &lt;strong&gt;Settings, AI connections&lt;/strong&gt; you connect one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codex or Claude Code from the command line, so Bees uses a subscription you already pay for&lt;/li&gt;
&lt;li&gt;a hosted provider&lt;/li&gt;
&lt;li&gt;a local model on your own machine, run through a bundled llama.cpp server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can set a model per agent or one default for everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays on your computer
&lt;/h2&gt;

&lt;p&gt;Your agents, files, browser sessions, cookies and passwords stay local. Bees opens a private workspace with no sign-in, so you can try it right away. It also runs its own local memory service, so agents remember past work without a cloud memory provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Control over what agents can do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools per agent.&lt;/strong&gt; Agents reach outside tools through MCP servers. You can give one agent every tool, none, or a named few.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval per stage.&lt;/strong&gt; Mark a stage as needing your approval, and its agent can't send, post, delete or pay through a tool until you say yes. Questions, approvals and failures show up under &lt;strong&gt;Needs your attention&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File scope.&lt;/strong&gt; An agent in a run reads and writes inside that run's own folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other things it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Company Brain:&lt;/strong&gt; local search over folders and Google Drive locations you map yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduling:&lt;/strong&gt; turn a request into a recurring process, like a weekly report.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's rough
&lt;/h2&gt;

&lt;p&gt;The Mac build is signed and notarized. The Windows and Linux builds aren't code signed yet, so Windows shows a SmartScreen warning. You need 8 GB of memory for a cloud model, or 16 GB for a local one, plus 15 GB of free disk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://bees.bot" rel="noopener noreferrer"&gt;bees.bot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;github.com/Bees-bot/bees-desktop&lt;/a&gt; (MIT or Apache 2.0)&lt;/li&gt;
&lt;li&gt;Questions and ideas: &lt;a href="https://github.com/Bees-bot/bees-desktop/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two of us built this. If you've used a multi-agent tool before, I'd like to hear what made you trust it, or what made you stop.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>agents</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How Bees works under the hood</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:54:16 +0000</pubDate>
      <link>https://dev.to/beesbot/how-bees-works-under-the-hood-987</link>
      <guid>https://dev.to/beesbot/how-bees-works-under-the-hood-987</guid>
      <description>&lt;p&gt;Bees is an open source desktop app that runs a team of AI agents on your own computer. Earlier posts covered the review loop, where keys live, and team work without a central dispatcher. This one is for people who want to read the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three processes and a webview
&lt;/h2&gt;

&lt;p&gt;Bees is a Tauri app. The Rust side in &lt;code&gt;src-tauri/src&lt;/code&gt; is small. &lt;code&gt;lib.rs&lt;/code&gt; is about 1,100 lines and &lt;code&gt;local_models.rs&lt;/code&gt; about 1,300. It owns the window, the tray, the updater and the installer. Its main job is to start and supervise other processes.&lt;/p&gt;

&lt;p&gt;When the window opens, it shows a splash screen (&lt;code&gt;src/entry.ts&lt;/code&gt;, under 40 lines) and calls one Tauri command, &lt;code&gt;ensure_dsh_runtime&lt;/code&gt;. That command does the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Starts a local Temporal dev server on a random loopback port, backed by a SQLite file in the app data folder. Temporal is the workflow engine that remembers which stage each piece of work is at, so a restart doesn't lose its place.&lt;/li&gt;
&lt;li&gt;Starts a bundled Node 24 runtime running &lt;code&gt;dsh-runtime/start.mjs&lt;/code&gt; on a second loopback port, which it remembers between launches, with a fresh random token.&lt;/li&gt;
&lt;li&gt;Waits for &lt;code&gt;/healthz&lt;/code&gt;, then points the webview at the runtime's own URL with that token.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From that moment the whole interface is served by the Node process. The Rust side keeps polling &lt;code&gt;/healthz&lt;/code&gt; every two seconds. If the runtime stops answering for about 30 seconds, it sends the window back to the splash, which starts a new one. A third process, &lt;code&gt;llama-server&lt;/code&gt; from llama.cpp, starts only when you run a local model.&lt;/p&gt;

&lt;p&gt;The Node runtime is DSH, short for DeepSeek Harness, an open source agent runtime. DSH gives us model providers, a credential store, sessions, the agent loop, tools, skills, an MCP client and approvals. MCP is the standard way to plug outside tools into an agent. Bees is written as DSH plugins on top of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dsh-runtime/plugin&lt;/code&gt; is the product: the board, schedules, runs, recovery, file boundaries, document search, audit records and the UI shell. The server code is in &lt;code&gt;plugin/lib&lt;/code&gt;, the UI is in &lt;code&gt;plugin/client&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dsh-runtime/plugins/*&lt;/code&gt; holds the model connections: &lt;code&gt;local-ai&lt;/code&gt;, &lt;code&gt;subscriptions&lt;/code&gt; (Claude Code and Codex), &lt;code&gt;free-ai&lt;/code&gt; and &lt;code&gt;custom-ai&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Product data lives in one SQLite file, &lt;code&gt;bees-stage1.db&lt;/code&gt;. Tauri passes its path, along with every other folder the runtime needs, as environment variables when it starts Node.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a run executes
&lt;/h2&gt;

&lt;p&gt;A request becomes a work item in a process. A process is a list of stages, such as Work, Review and Done. Temporal drives the item from stage to stage. Each stage runs as a fresh agent session in its own run folder, with &lt;code&gt;inputs/&lt;/code&gt; and &lt;code&gt;outputs/&lt;/code&gt;. The only files a stage carries in are the ones the previous worker stage left. The agent's base instructions live in &lt;code&gt;RUN_PERSONA&lt;/code&gt; in &lt;code&gt;dsh-runtime/plugin/lib/agent-runtime.js&lt;/code&gt;, which is the biggest server file at about 2,600 lines.&lt;/p&gt;

&lt;p&gt;Before every tool call, &lt;code&gt;agent-runtime.js&lt;/code&gt; checks the call. Paths outside the run folder are refused until the person approves that exact path. Folders that hold passwords, keys or Bees' own files can't be read at all. Small local models often write to &lt;code&gt;/outputs/report.md&lt;/code&gt; with a leading slash, so the refusal tells them the relative path instead of only saying no.&lt;/p&gt;

&lt;p&gt;Agents that edit shared files go through a lock tool. &lt;code&gt;docs/file-access.md&lt;/code&gt; covers it. The agent acquires every destination path, reads again after the lock is granted, writes, and releases. Each replacement is written to a staging file and renamed over the target, so a crash never leaves a half-written file. Shell commands can still bypass these locks, and the doc says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The restart problem
&lt;/h2&gt;

&lt;p&gt;This was the first trade-off we had to make on purpose. Bees can restart in the middle of a tool call. The app might crash, or an update might install. When it comes back, Temporal knows which stage was running, but nobody knows whether the last call finished.&lt;/p&gt;

&lt;p&gt;For reading tools that doesn't matter. Running &lt;code&gt;grep&lt;/code&gt; twice is fine. For a tool that sends an email or posts a reply, running it again could send it twice. Skipping it could lose it.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;recoveryToolContext&lt;/code&gt; in &lt;code&gt;agent-runtime.js&lt;/code&gt; sorts the calls. A fixed list, &lt;code&gt;REPEATABLE_TOOLS&lt;/code&gt;, holds the calls that are safe to repeat: reads, searches, fetches, and the stage submit, which commits in one transaction. Any other call without a recorded result stops the run with a message asking the owner to check whether the action happened. Once the owner continues, the agent gets the finished calls from the interrupted turn as evidence. It's told to reuse those results and to find out what the unknown call did before trying it again.&lt;/p&gt;

&lt;p&gt;The cost is that some runs stop and wait for a person after a crash, even when the call never reached the outside service. We tried auto-retrying first. A run that hit this state once stayed stuck for good, and a retry that guessed wrong would have sent something twice. Asking the owner is slower, but it can't double-send.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and add-ons
&lt;/h2&gt;

&lt;p&gt;DSH provides skills and built-in tools. MCP servers are managed by Bees. Each enabled server is a row in &lt;code&gt;bees-stage1.db&lt;/code&gt;, and &lt;code&gt;Capabilities&lt;/code&gt; in &lt;code&gt;plugin/lib/capabilities.js&lt;/code&gt; mounts one long-lived process for each row. Secrets go in DSH's credential store, never in the database. The servers shipped out of the box are listed in &lt;code&gt;plugin/lib/mcp-catalog.js&lt;/code&gt;, and none of them installs without a review screen.&lt;/p&gt;

&lt;p&gt;Each agent has an MCP access policy: &lt;code&gt;all&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, or a named list. The browser is the exception to one process per server. Two runs browsing at the same time used to land on each other's pages, so each run now mounts its own browser server, which goes away when the run ends.&lt;/p&gt;

&lt;p&gt;Approval is enforced at the tool call too, not only at the end of the stage. We started by checking approval when a stage finished. Then we noticed a bid or an email could go out before anyone had seen it. Now, if a stage needs approval, any MCP call that sends something has to be preceded by an approval recorded after the last outgoing call. This includes any non-GET API request and any browser step. So one approval covers one send, and a later rejection wins. Local-only servers like &lt;code&gt;filesystem&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt; and &lt;code&gt;time&lt;/code&gt; skip the check. The query reads the run's audit events in SQLite, so the rule survives a restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models: local, subscriptions and keys
&lt;/h2&gt;

&lt;p&gt;The second trade-off is how we use Claude Code and Codex. For Claude Code, we don't hand the CLI our tools or let it run its own loop. &lt;code&gt;plugins/subscriptions/lib/index.js&lt;/code&gt; calls the CLI with its own tools turned off and an empty MCP config. It passes a JSON schema that forces every reply into one shape: a tool name, its arguments, and text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--tools "" --strict-mcp-config --mcp-config {"mcpServers":{}} --json-schema {...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bees then runs the tool itself, through the same checks every other model goes through. This means the file fence, the approval guard and the audit trail apply the same way whichever model you pick. The cost is that the CLI never sees real tool schemas, so it sometimes sends &lt;code&gt;"1"&lt;/code&gt; instead of &lt;code&gt;1&lt;/code&gt; or a list as JSON text. The plugin has code to repair those arguments. It's extra work on every turn, but the alternative was a second, weaker set of permission checks inside each CLI.&lt;/p&gt;

&lt;p&gt;Local models run on llama.cpp's &lt;code&gt;llama-server&lt;/code&gt;, which ships in &lt;code&gt;llama-runtime/&lt;/code&gt;. The tricky part is choosing the context window. &lt;code&gt;local_models.rs&lt;/code&gt; reads the GGUF file header without loading any weights, to get the model's trained context length and how many bytes of KV cache each token needs. Then it sizes the window so weights and cache fit in a third of system memory. The automatic window stays between 16k and 32k tokens, and a per-model override can ask for more. The comments explain why. Our 3B default model was trained for 262,144 tokens at 88 KiB each. Taken literally, that's 23.6 GB of cache. Below 16k, the roughly 4.5k tokens of instructions and tool schemas Bees sends leave no room for the model to answer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;llama-server&lt;/code&gt; runs with &lt;code&gt;--parallel 1&lt;/code&gt;, one request at a time. &lt;code&gt;local-inference.js&lt;/code&gt; queues requests in front of it, so five agents on a local model take turns instead of hitting timeouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays local and what syncs
&lt;/h2&gt;

&lt;p&gt;A private organization, the default with no sign-in, never syncs. If a team turns on sync, the optional Bees Cloud server receives organizations, members, process templates, runs, work items, schedules, agent definitions, the titles you type, and a folder's ID and relative path. File contents, credentials, model connections, the search index and run folders stay on the machine. The sync code is in &lt;code&gt;plugin/lib/team-sync.js&lt;/code&gt;. The desktop app is fully open source. Bees Cloud lives in a separate closed repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's rough today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The UI is one huge file.&lt;/strong&gt; &lt;code&gt;dsh-runtime/plugin/client.js&lt;/code&gt; is about 30,000 lines. It's the hardest file in the repo to navigate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We patch DSH at install time.&lt;/strong&gt; We pin DSH to &lt;code&gt;0.1.7-rc.2&lt;/code&gt;, and &lt;code&gt;scripts/install-dsh-runtime.mjs&lt;/code&gt; reapplies a few exact-match patches to it. One batches client module builds, which took DSH boot from 22.7 seconds to 2.9 seconds in our measurements. Every DSH upgrade means rechecking those patches. &lt;code&gt;docs/dsh-upgrade-checklist.md&lt;/code&gt; lists the steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent's Chrome debugging port has no password.&lt;/strong&gt; &lt;code&gt;docs/limitations.md&lt;/code&gt; says this plainly. Port 9333 has no auth, so another program on the same machine could drive that browser while it runs. We plan to close it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac gets far more use.&lt;/strong&gt; Windows installers aren't signed yet, and the Linux and Windows builds have seen much less real use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0.1.1 data doesn't carry over&lt;/strong&gt; to 0.2, because the database changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reading and building it
&lt;/h2&gt;

&lt;p&gt;To be upfront: we don't take outside pull requests right now. We are a small team, and reviewing a PR properly takes longer than making the change. &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; explains this. Bug reports, feature requests and forks are all welcome, and a bug report that points at the right file is a big help.&lt;/p&gt;

&lt;p&gt;You need Node 24 (pinned in &lt;code&gt;.nvmrc&lt;/code&gt;), Rust 1.88+, and CMake on macOS for the first &lt;code&gt;llama-server&lt;/code&gt; build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm run check        &lt;span class="c"&gt;# typecheck, project checks and build&lt;/span&gt;
npm run prepare:dsh  &lt;span class="c"&gt;# stage Node, llama.cpp and uv for the Rust build&lt;/span&gt;
make bees            &lt;span class="c"&gt;# run the app against the hosted API&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good files to start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src-tauri/src/lib.rs&lt;/code&gt;, at &lt;code&gt;ensure_dsh_runtime_blocking&lt;/code&gt;, for the whole launch sequence.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dsh-runtime/plugin/lib/agent-runtime.js&lt;/code&gt;, for the run persona, the tool guards and restart recovery.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dsh-runtime/plugin/lib/capabilities.js&lt;/code&gt; and &lt;code&gt;mcp-catalog.js&lt;/code&gt;, for add-ons.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/startup-timing.md&lt;/code&gt;, if startup feels slow. Every launch writes &lt;code&gt;[bees-startup]&lt;/code&gt; JSON lines to &lt;code&gt;dsh-state/startup.log&lt;/code&gt;, with no URLs or prompts in them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;https://github.com/Bees-bot/bees-desktop&lt;/a&gt;&lt;br&gt;
Download: &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;https://bees.bot/download/&lt;/a&gt;&lt;br&gt;
Questions: &lt;a href="https://github.com/Bees-bot/bees-desktop/discussions" rel="noopener noreferrer"&gt;https://github.com/Bees-bot/bees-desktop/discussions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tauri</category>
      <category>opensource</category>
      <category>ai</category>
      <category>architecture</category>
    </item>
    <item>
      <title>What happens when you reject an AI agent's work in Bees</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Thu, 08 Oct 2026 14:11:18 +0000</pubDate>
      <link>https://dev.to/beesbot/what-happens-when-you-reject-an-ai-agents-work-in-bees-4881</link>
      <guid>https://dev.to/beesbot/what-happens-when-you-reject-an-ai-agents-work-in-bees-4881</guid>
      <description>&lt;p&gt;Most agent tools give you two choices when the output is wrong. Start over, or edit the prompt and hope. We wanted something in between for Bees, the open source desktop app we build that runs a team of AI agents on your own computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every goal gets a reviewer
&lt;/h2&gt;

&lt;p&gt;A goal in Bees runs through three stages: Work, Review, Done. A work agent does the job. Then a fresh reviewer agent checks the result. It gets the goal, the deliverables and the evidence Bees recorded, but not the worker's private reasoning, so it judges the result on its own.&lt;/p&gt;

&lt;p&gt;If the result falls short, the reviewer sends the same item back to Work with specific feedback, and the next attempt sees both the old output and the notes. Retries are capped. A goal that keeps failing stops under &lt;strong&gt;Needs your attention&lt;/strong&gt; instead of looping all night.&lt;/p&gt;

&lt;p&gt;You can also put yourself in that loop. A goal or a stage can ask for your review, and then you get &lt;strong&gt;Approve&lt;/strong&gt; or &lt;strong&gt;Reject&lt;/strong&gt;. Reject needs a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reason has a scope
&lt;/h2&gt;

&lt;p&gt;This is the part I think matters most. On a one-off goal, your reason goes back to the agent for a revision and nothing else changes.&lt;/p&gt;

&lt;p&gt;On a scheduled job, say a weekday support briefing, Bees asks where the reason should apply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;This run only&lt;/strong&gt;: the agent revises this run, and future runs behave the same as before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future schedule runs&lt;/strong&gt;: the reason is also added to a playbook for that job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That playbook belongs to a specialist. The first time an agent handles a named schedule, Bees creates a specialist for that pair. It inherits the base agent and only adds the job-specific notes. So a lesson like this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not count auto-replies as customer conversations.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sticks to the support briefing. It doesn't leak into everything else that agent does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One-off goals never change future behavior.&lt;/li&gt;
&lt;li&gt;The reviewer can't edit the worker.&lt;/li&gt;
&lt;li&gt;Nothing changes because of a score.&lt;/li&gt;
&lt;li&gt;No rejection changes the base agent for the whole organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saying no to a tool action is kept apart from rejecting the work, too. If you deny an agent sending an email, that's a permission call for this moment. It doesn't turn into a rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can see it and undo it
&lt;/h2&gt;

&lt;p&gt;Under &lt;strong&gt;Process Runs → Schedules&lt;/strong&gt;, each specialist shows its playbook, a revision number and the history of where each change came from: your feedback, a manual edit, an undo or a reset. You can edit it, undo the last change, or reset it to empty and go back to the base agent.&lt;/p&gt;

&lt;p&gt;We picked this over automatic learning for a simple reason. "Bad result" makes a bad rule, and a rule you can't see is worse. A specific reason written by a person, scoped to one job, is something you can check later.&lt;/p&gt;

&lt;p&gt;Bees is free and open source (MIT or Apache 2.0). Version 0.2.0 runs on Mac, Windows and Linux, with your own Codex or Claude Code subscription, a hosted model, or a local model.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;https://bees.bot/download/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/Bees-bot/bees-desktop" rel="noopener noreferrer"&gt;https://github.com/Bees-bot/bees-desktop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How the review loop works: &lt;a href="https://bees.bot/help/loop-engineering" rel="noopener noreferrer"&gt;https://bees.bot/help/loop-engineering&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Specialists and playbooks: &lt;a href="https://bees.bot/help/self-improving-agents" rel="noopener noreferrer"&gt;https://bees.bot/help/self-improving-agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>Why execution stays local</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 06 Oct 2026 09:37:51 +0000</pubDate>
      <link>https://dev.to/beesbot/why-execution-stays-local-2ehf</link>
      <guid>https://dev.to/beesbot/why-execution-stays-local-2ehf</guid>
      <description>&lt;p&gt;&lt;em&gt;This post first appeared on the &lt;a href="https://bees.bot/blog/why-execution-stays-local" rel="noopener noreferrer"&gt;Bees blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most agent platforms ask for your files. Upload the folder, connect the drive, grant the scope — then the work happens on someone else's computer. That is a reasonable trade when the files are a support inbox. It is a bad trade when they are contracts, payroll, patient records, or source code.&lt;/p&gt;

&lt;p&gt;Bees draws the line somewhere else. Agent runs happen on your computer, against files in storage you already control. What synchronizes to Bees Cloud is coordination metadata: which process a work item sits in, which status it moved to, which agent picked it up, and relative filenames and paths. Not the file contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it is a boundary and not a setting
&lt;/h2&gt;

&lt;p&gt;A privacy toggle is a promise about behaviour. A boundary is a statement about where the code runs. If execution happens on your machine, there is no server-side copy to leak, subpoena, or accidentally log — regardless of what any setting says.&lt;/p&gt;

&lt;p&gt;That choice has consequences worth knowing before you adopt it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your machine does the work.&lt;/strong&gt; Throughput is bounded by your hardware and your model access, not by a plan tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination still needs the network.&lt;/strong&gt; Teams that never connect still run, but they do not see each other's progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model choice is yours.&lt;/strong&gt; Run local models, use an existing Codex or Claude Code subscription, or point at a model API. The file contents go wherever you point them — which is exactly why the decision stays with you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where this shows up in practice
&lt;/h2&gt;

&lt;p&gt;The clearest case is a regulated team that wants agents but cannot move documents off managed storage. They keep the documents where compliance already approved them, install Bees on the machines that already have access, and get shared status across the team without the files ever becoming someone else's asset.&lt;/p&gt;

&lt;p&gt;Start with &lt;a href="https://bees.bot/help/getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;, or read &lt;a href="https://bees.bot/help/why-bees" rel="noopener noreferrer"&gt;why Bees exists&lt;/a&gt; for the longer argument.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your keys and logins stay on your computer</title>
      <dc:creator>Bees</dc:creator>
      <pubDate>Tue, 06 Oct 2026 09:36:35 +0000</pubDate>
      <link>https://dev.to/beesbot/your-keys-and-logins-stay-on-your-computer-5dcn</link>
      <guid>https://dev.to/beesbot/your-keys-and-logins-stay-on-your-computer-5dcn</guid>
      <description>&lt;p&gt;&lt;em&gt;This post first appeared on the &lt;a href="https://bees.bot/blog/keys-and-logins-stay-local" rel="noopener noreferrer"&gt;Bees blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An AI agent that does real work needs real access. It needs an AI key to think with, your Google account to read your mail or Drive, and a logged-in browser for the sites that have no API.&lt;/p&gt;

&lt;p&gt;Most hosted agent products keep all of that on their servers. You paste your key into their web page. You click "Connect Google" and the refresh token (the long-lived pass that lets an app back into your account) goes into their database. Their browser runs in their cloud, holding your cookies.&lt;/p&gt;

&lt;p&gt;That works, but it means one company holds a copy of every key and session its users have. One breach, one careless log line or one curious employee reaches all of them at once.&lt;/p&gt;

&lt;p&gt;Bees does it the other way. The agents run on your computer, so the keys and logins can stay there too. Here is where each one lives, and what our server sees.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mrfpnghol4nsvhvrvnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mrfpnghol4nsvhvrvnm.png" alt="Your AI keys, Google sign-ins, browser cookies, files and agents stay on your computer. Prompts go straight to an AI company only if you pick a cloud model. Google calls use your own tokens. Bees Cloud is optional and gets names, titles and run summaries, never keys, tokens, cookies or file contents." width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI keys
&lt;/h2&gt;

&lt;p&gt;When you add a key for OpenAI, Anthropic, OpenRouter or Google, Bees first sends one small test request straight to that provider to check the key works. Only then does it save the key on your computer.&lt;/p&gt;

&lt;p&gt;After that, your prompts go straight from your computer to the provider. No Bees server sits in the middle, so we never see the key or the prompts. Google keys go in a request header rather than the web address, because addresses end up in logs far more often than headers do.&lt;/p&gt;

&lt;p&gt;The default model runs on your own computer. With it, your prompts are not sent to any AI company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google: Gmail, Calendar and Drive
&lt;/h2&gt;

&lt;p&gt;Connecting a Google account happens on your computer. Bees opens Google's consent page in your browser. Google then sends you back to a small listener on your own machine (&lt;code&gt;127.0.0.1&lt;/code&gt;), which shuts itself down after a few minutes.&lt;/p&gt;

&lt;p&gt;The tokens Google hands back are saved on your computer. The Gmail, Calendar and Drive add-ons read them from there and call Google directly. Our server never receives them.&lt;/p&gt;

&lt;p&gt;Signing in to Bees itself with Google is different, and we want to be clear about it. Our server learns your name and email so it can create your Bees account. It does not get access to your mail, calendar or files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser logins
&lt;/h2&gt;

&lt;p&gt;Some work only happens in a browser: a site with no API, or a dashboard behind a login. A hosted agent runs that browser in its own cloud, so your cookies, the things that keep you logged in, live on its machines.&lt;/p&gt;

&lt;p&gt;Bees drives the Google Chrome already installed on your Mac, with a separate profile that belongs to Bees. Your everyday Chrome profile is not touched. You log in to a site once inside the Bees profile, and those cookies stay in that profile's folder on your disk. Bees also saves a copy of them to a local file, so you stay logged in after a restart. None of that code talks to our server.&lt;/p&gt;

&lt;p&gt;We use your real Chrome instead of a bundled test browser for a practical reason: Google refuses sign-ins from browsers that announce they are automated. For now the agent's browser works on Mac only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the keys are kept
&lt;/h2&gt;

&lt;p&gt;AI keys, Google tokens, add-on keys and your Bees session all go into one credentials file in the Bees folder under your home directory. On Mac and Linux, Bees creates that file so only your user account can read it, and refuses to start if someone loosens that.&lt;/p&gt;

&lt;p&gt;The screen where you manage AI keys is only told whether a key is set, never the key itself. When a run's history shows a tool call, values with names like token, password or API key are shown as hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  What our server does see
&lt;/h2&gt;

&lt;p&gt;Bees Cloud is optional. It exists so a team can see each other's work. When you use it, the app sends seven kinds of records, each with a fixed list of fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the names and settings of your processes, agents and schedules&lt;/li&gt;
&lt;li&gt;work item titles, status and who owns them&lt;/li&gt;
&lt;li&gt;file names and paths relative to a shared folder, never full paths from your disk and never file contents&lt;/li&gt;
&lt;li&gt;a summary of each run, capped at 20,000 characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It never sends keys, tokens, cookies or file contents. One honest caveat: a run summary is the agent's own words about what it did, so it can mention things from your files.&lt;/p&gt;

&lt;p&gt;The app sends no usage analytics and no crash reports. It starts its agent engine with telemetry switched off, and there is no analytics code in it. It does ask our server for its sign-in settings when it starts, even if you never sign in. That request carries no account token and no usage data, but like any request it shows us your IP address. It also asks GitHub whether a new version is out, when it starts and every six hours. That request goes to GitHub, not us. It names only the update tool Bees uses, not you or your Bees version, and your computer compares the versions itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not protect you from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A cloud model sees what you send it.&lt;/strong&gt; If you pick a cloud AI model, the text an agent works on goes to that AI company under its own terms. Use the local model when that matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The credentials file is not encrypted.&lt;/strong&gt; It is protected the way your SSH keys are, by file permissions. That stops other users on the same computer. It does not stop malware running as you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A run folder is not a full sandbox.&lt;/strong&gt; Bees gives each run its own folder with only the files it needs. That narrows what an agent can touch, but it is not a wall against hostile code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your computer has to be on.&lt;/strong&gt; Agents run on your computer, so they only work while it is awake.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We think this is the right trade for a desktop app that handles work files and real accounts. If a hosted tool fits you better, that is a fair choice too. Just ask it where your refresh tokens live.&lt;/p&gt;

&lt;p&gt;If you want to try Bees on your own machine, &lt;a href="https://bees.bot/download/" rel="noopener noreferrer"&gt;download it here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>security</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
