Persistent by default
Every Bot is its own Durable Object. History, notes and instructions survive across sessions, deploys and devices.
For the tinkerers
An always-on agent with its own cloud computer, the kind that usually costs US$200 a month, except this one is MIT licensed, runs on the model you choose, and treats every capability as a plugin. Deploying it into your own Cloudflare account is coming soon.
Your Bot
MIT licensed · yours to change
The shape
A Bot is a persistent Durable Object with a conversation, memory, routines, tools, and a desktop on a shared cloud computer. It keeps working after you close the laptop and comes back only when it needs an approval.
Every Bot is its own Durable Object. History, notes and instructions survive across sessions, deploys and devices.
Browser, filesystem and terminal on a Fly Sprite. Each Bot gets its own desktop and folders. Watch the screen or take control.
Cron schedules, webhooks and connected-app events wake a Bot and run a Turn without you in the loop.
Spending, sending, publishing a plugin: each is an approval card on the Turn's own log. Allow once, or always.
Models
Forty providers ship in the box: Anthropic, OpenAI, Google, DeepSeek, Mistral, Groq, OpenRouter, Bedrock, Vertex, Workers AI, and the rest, including OAuth sign-in where a provider offers it. Pick a model per Bot. Credentials stay with the host transport.
The hosted deployment also includes metered models on the same balance as the computer. A deployment with no keys at all still works: Auto resolves to a Workers AI model on the account's own binding.
Sunny’s modelAuto
Plugins
Plugins wrap the agent loop. They declare hooks on the loop's events, register tools under their own namespace, keep their own storage, and name the hosts they may reach. Each User's plugins mount into one Dynamic Worker with a hard CPU budget and a loopback into the kernel; a plugin that throws or overruns is quarantined and the Turn carries on.
Bots can write plugins too. Publishing one never runs it: the Bot puts an approval card in front of you naming the tools, hooks, grants and hosts it wants, and nothing mounts until you say so.
// plugin.ts: one tool, one hook, its own storage import type { PluginExecute, PluginHooks, PluginTool } from "@frockbot/applet-sdk/plugin"; export const tools: PluginTool[] = [{ name: "note_add", description: "Keep one short note for this Bot.", inputSchema: { type: "object", properties: { text: { type: "string" } }, required: ["text"] }, }]; export const execute: PluginExecute = async (tool, input, ctx) => { const stored = await ctx.storage?.get({ key: "notes" }); const notes = stored?.status === "available" ? stored.value : []; await ctx.storage?.put({ key: "notes", value: [...notes, input.text] }); return `Kept it. ${notes.length + 1} note(s) now.`; }; export const hooks: PluginHooks = { "agent/tool-exposure": (payload) => payload.tools.filter((t) => t.name !== "image_generate"), };
system-prompt/assemble add to or rewrite the
prompt before the model sees it
agent/tool-exposure hide, rename or add tools
for this Turn
agent/request change the messages or the options
on each request
tools/pre-execute inspect or veto a tool call
before it runs
tools/post-execute reshape a result before it
reaches the model
agent/turn-stopping receive the notification
that the Turn is stopping
Run it yourself
Deploying FrockBot into a Cloudflare account you own is coming soon: the same code frockbot.com runs, with Cloudflare Access as the sign-in and no billing at all.
It is MIT licensed, so every line is already on GitHub to read.
MIT licensed. Issues, ADRs and the constitution are all in the open.