AI teammates you actually own.
bdots is an open-source project by Fayaz Ahmed (@fayazara). You create bots, give each one a job, and they keep working while you’re away. Each bot gets its own computer and browser. It all runs on your Cloudflare account, so the data and the bill are yours.
Repo: github.com/fayazara/bdots · MIT license · free to use, fork and change.
Chat Streaming chat. It names itself from your first task.
Drive a browser A real Chromium session you can watch live. It hands you the browser when it needs a login.
Run commands Its own files and a shell (curl, jq) in a sandbox. No container.
Work on a schedule Cron or one-off routines. Can watch a URL and only wake up when it changes.
Ask first Per-action rules: allow, ask first, or block. Risky stuff waits for your approval.
No lock-in. No $20 minimum plan.
What I hate about most AI gadgets and bots: you pay, and then you’re stuck with their model. Meta glasses only use Meta’s AI. Grok Bot only uses Grok. bdots lets you pick the model and keep the data.
Piece What it does Where UserHub Your bot list, app connections, shared memory 1 per user BotAgent One bot: chat, memory, rules, routines, files, browser 1 per bot AppLive Live updates for small web apps a bot builds 1 per app
All three are Durable Objects with their own SQLite. There’s no separate database to set up.
Your data Each bot’s memory lives in your own account
1 Worker runs the whole thing
Run it, then deploy it.
Get the code
You need a free Cloudflare account, Node and pnpm.
~ % git clone https://github.com/fayazara/bdots ~ % cd bdots
Run it on your laptop
~ % npm i -g cf ~ % pnpm install ~ % npx wrangler login ~ % pnpm dev # open http://localhost:3000
Wrangler login is needed because Workers AI and the browser can’t run locally, so dev calls your real account for those two.
Deploy to your Cloudflare
~ % cf auth login ~ % pnpm run deploy
Before you share the URL: put the Worker behind Cloudflare Access (Zero Trust → Access → add an application for your Worker’s domain). Without it, every visitor is the same “demo” user and sees the same bots. Add a bypass for /api/hooks/* and /apps/*, which use a token in the URL.
One line in cloudflare.config.ts
Only MODEL matters to get started. A @cf/… id runs on Workers AI. A provider/model slug goes through AI Gateway (with Unified Billing or your own provider keys).
MODEL Chat model. Default: @cf/deepseek-ai/deepseek-v4.1-flash-1017. For browser work use a strong one, e.g. anthropic/claude-sonnet-5-5.
BACKGROUND_MODEL A cheaper model for routines, check-ins and email. Empty = same as MODEL.
AI_GATEWAY_ID Sends Workers AI calls through a gateway too: logs, caching, spend limits.
EMAIL_DOMAIN Turns on inbound email. Each bot gets its own address.
VAPID_* Push notifications to your phone (npx web-push generate-vapid-keys).
What it costs
The code is free. You pay Cloudflare for what you use: model tokens (Workers AI or your AI Gateway provider) and browser time. Cloudflare’s Workers Paid plan starts at $5/month. Use a cheap BACKGROUND_MODEL and set a spend limit in AI Gateway so a bot that runs all night can’t surprise you.
Heads up: some Cloudflare pieces it uses (think, computer, the cf CLI, Vite plugin 2.0) are preview/beta. Expect breaking changes, and pull updates from the repo.
