Build a team of agents and work with them from any device.
- Best UX for working with multiple agents.
- Each agent has its own personality, skills, tools, and workspace.
- OpenAI Sub compatible for frontier models at a flat rate. Or, use any model on OpenRouter or Workers AI.
- Self-hosted.
- Runs in your Cloudflare account or locally.
- Multi-agent w/ purpose built UX.
- Each agent has its own personality, skills, tools, and workspace.
- Manage workspaces, tools, and background tasks directly in the app — no Obsidian, no CLI.
- Use w/ any Model, including your OpenAI Sub.
- Kimi 2.6 on Workers AI by default — no API keys to wire up.
- Swap in ChatGPT Plus/Pro or any OpenRouter model when you want.
- Access anywhere.
- Reach Downy from any device behind Cloudflare's secure network.
I had been meaning to make something like Downy for a while, but this blog post made me actually build it: https://blog.cloudflare.com/project-think/. I highly recommend reading it if you want to understand how Downy works. But, basically each agent and subagent is its own Durable Object.
Full system map: docs/architecture.md.
Warning
This is a brand new project being "agentically engineered" rapidly. It's self editing features are very powerful, but inherently prone to prompt injection like OpenClaw. Be considerate of what data and tools you give it access to. Use at your own risk.
You'll need:
- Node 24 LTS and pnpm:
nvm install 24 && nvm use 24 npm install -g pnpm - Cloudflare account — the free Workers plan works if you bring your own model.
- Workers AI (the default Kimi setup) needs the Workers Paid plan ($5/mo).
- Pi proxy (ChatGPT) and OpenRouter both run on the free plan.
- Exa API key — free $10 credit, effectively unlimited for personal use. Required for search.
Clone the repo and install dependencies:
git clone https://github.com/bensenescu/downy
cd downy
pnpm installLogin into Cloudflare with Alchemy
- Alchemy makes it simpler to deploy to Cloudflare.
npx alchemy configure # Authorize in Cloudflare and accept the defaults
pnpm alchemy login # one-time browser OAuth to your Cloudflare account
Set up env vars and deploy:
- Read through the .env which has further instructions
cp .env.example .env # then fill in EXA_API_KEY and ALCHEMY_PASSWORD (random string)
pnpm deploy
The Worker rejects every request until Cloudflare Access is in front of it — that's next.
By putting Downy behind Cloudflare Access, it gates all traffic to the service unless you've authenticated. This authentication is managed by Cloudflare, not Downy. By default, Cloudflare Access adds the email tied to your Cloudflare Account to the allow list and authenticates by sending a One Time Password to your email.
Here is how you set it up:
- Go to your Worker's settings in the Cloudflare dashboard:
- Open the sidebar and find Workers & Pages.
- Click into your downy worker.
- Open the Settings tab.
- Turn on Cloudflare Access:
- Under Domains & Routes, click the three-dot menu next to your
workers.devvalue. - Toggle Cloudflare Access on.
- A modal pops up with your
TEAM_DOMAINandPOLICY_AUD.
- Under Domains & Routes, click the three-dot menu next to your
- Copy those values into
.env:TEAM_DOMAIN=https://<team>.cloudflareaccess.comPOLICY_AUD=<aud-tag>
pnpm deploy, then open your Worker URL and log in.
Sign-in works but you still see "Authentication required"?
pnpm tail shows the verifier's failure reason — usually TEAM_DOMAIN missing https:// or a stale POLICY_AUD.
Deploy fails with VPC service ... does not exist?
PI_RELAY_VPC_SERVICE_ID should be unset in .env by default. If you set it, either remove it or follow docs/pi-proxy-setup.md to provision the VPC service.
Point Downy at your ChatGPT Plus/Pro subscription instead of Kimi:
- Smarter models at a flat rate — no per-token API billing.
- Secure by network boundary — a small proxy on your hardware holds the OAuth tokens, reached only via a Cloudflare Tunnel + Workers VPC binding (never the public internet).
- Walkthrough:
docs/pi-proxy-setup.md.
Note: OpenAI currently allows third-party harnesses to use ChatGPT subscriptions for personal use, but that policy could change.
pnpm run ci:check # prettier + knip + tsc + oxlint
pnpm run format:write
pnpm run lint:fix
