With Talorys's default settings, a long conversation can use up Cloudflare's free AI allowance in about 35 messages. On short chats you get closer to 550 model calls a day. Both numbers come from the same 10,000 free Workers AI "neurons".
Talorys is an MIT-licensed personal agent that showed up on HN this week, and it's built to live inside that allowance: chat, memory, tasks, notes and reminders, with no VPS, subscription or paid database behind it. I cloned it, built it, ran it locally and checked the neuron math against Cloudflare's own price sheet. The free tier is real, but it's smaller than "$0/month" makes it sound, and CPU, requests and storage aren't what runs out first.
What you actually get
Talorys is one Cloudflare account, one owner, one agent. The architecture from the README:
Browser ──HTTPS──▶ Cloudflare Pages (React app + /api Pages Function)
│ service binding (no public URL)
▼
Private Worker (Hono router)
▼
TalorysAgent (Agents SDK Durable Object)
├─ SQLite: conversations, memories, tasks, notes, ...
├─ Workers AI: @cf/zai-org/glm-4.7-flash
└─ Alarms: reminders and recurring schedules
All your data sits in a single SQLite-backed Durable Object called personal-agent. The Worker is deployed with workers_dev: false and preview_urls: false, so the only public surface is your *.pages.dev site. Auth happens in the Worker; the password is hashed with PBKDF2-SHA256 and stored as a Cloudflare secret. No R2, D1, KV or Vectorize gets provisioned.
The agent has 22 tools in v0.1.2: create_task, update_task, remember, search_memories, create_reminder, create_automation, notify_owner, create_note, update_note, create_project and so on. It has no web access. The search tool searches your own tasks, notes, memories and past conversations, not the internet. What you get is a very well-built personal organizer with an LLM front end, so if you were picturing an agent that browses and books things for you, keep looking.
Deploying it
The whole install is one command:
npx create-talorys@latest
It checks your Node version (v0.1.2 accepted 20.18+, but the README now requires Node 22+ because the bundled Wrangler needs it), opens Cloudflare's OAuth page, asks you for an owner password, deploys the private Worker plus its Durable Object, creates the Pages project with the service binding, runs health checks that deliberately skip AI inference, and prints your URL. If it dies halfway through, run the same command again and it picks up where it stopped. It doesn't delete anything.
Later you'll use:
npx create-talorys@latest update
npx create-talorys@latest doctor
npx create-talorys@latest reset-password
For CI or a headless box: TALORYS_OWNER_PASSWORD=... npx create-talorys@latest --yes --account-id <id> with CLOUDFLARE_API_TOKEN set.
What I ran
I didn't push it to a Cloudflare account for this post, so I can't show you a dashboard screenshot. What I did:
git clone https://github.com/rociiu/talorys.git
cd talorys
npm ci
npm run build
npm test
npm run dev
The test suites passed (14 + 58 + 3 + 32 tests). One create-talorys test file fails if you run tests before npm run build, because it looks for the built Worker template. Build first.
npm run dev starts wrangler dev on 8787, wrangler pages dev on 8788 and Vite on 5173, using a deterministic mock model, so you don't need a Cloudflare login. I logged in with the dev password and sent "Add a task to review my Cloudflare bill tomorrow" through /api/chat. The SSE stream showed a create_task tool call, then the reply, in 0.249s. /api/tasks had the new row. /api/usage reported 1 AI request, 370 input tokens and 13 output tokens.
Remember the mock: that 370 is Talorys's own ~4-chars-per-token estimate of system prompt plus message. It leaves out the JSON schemas for all 22 tools, which a real model call has to send, so real calls are heavier.
The math nobody in the HN thread finished
Most of the HN discussion was an argument over whether "self-hosted" is the right word, and only a few people posted numbers. One commenter said they spent 500 neurons in a few minutes of chatting and guessed the free 10,000 would cover "maybe 20-30 minutes of back and forth." Another linked the price sheet to put the whole 10k at about $0.11, but nobody worked out what that buys in messages, so here's the Workers AI pricing page applied to Talorys's defaults:
-
glm-4.7-flashinput: 5,500 neurons per million tokens - output: 36,400 neurons per million tokens
- free: 10,000 neurons/day, reset at 00:00 UTC
- above that, on Workers Paid: $0.011 per 1,000 neurons
The defaults in packages/shared/src/constants.ts are maxContextTokens: 6000, maxOutputTokens: 1024, maxAgentIterations: 4, maxAiRequestsPerDay: 200.
| Scenario per model call | Neurons | Calls per free day |
|---|---|---|
| Short chat: 2,000 in / 200 out | ~18 | ~550 |
| Full context: 6,000 in / 1,024 out | ~70 | ~140 |
| Full context, 4 agent iterations | ~280 per message | ~35 messages |
Output costs about 6.6x what input costs per token, so long replies drain the budget much faster than long history. The default cap of 200 AI requests/day multiplied by ~70 neurons is 14,000, which is more than the free allocation. On a long-running conversation, the app's own guardrail won't stop you before Cloudflare does.
On the Free plan you can't be billed, so going over just means chat returns an "allocation used for today" error until 00:00 UTC, and tasks, notes and plain reminders keep working because they never touch the model. If you're on Workers Paid, the overage is real money, but tiny: the entire 10k free allocation would cost $0.11 at list price.
The other limits are nowhere close for one person. Workers Free gives you 100,000 requests/day and 10 ms of CPU per request, and time spent waiting on inference doesn't count as CPU. Durable Objects on Free get 100,000 requests, 13,000 GB-s, 5M rows read and 100,000 rows written per day, with 5 GB of storage. You won't run out of any of those by managing your own to-do list. The neuron budget is the binding constraint: around 35 to 550 model calls a day, depending on how you use it.
Settings I'd change on day one
Go to Settings → AI and:
- Lower
maxOutputTokensfrom 1024 to around 400. Output is the expensive side, and a personal assistant rarely needs a 1,000-token answer. - Lower
maxContextTokensfrom 6000 to 3000 or 4000. Older history gets summarized, so you lose less than you'd expect. - Set
maxAiRequestsPerDayto something your neuron math supports, like 100, so the app hits its own limit before Cloudflare's. - Leave
maxScheduledAiRunsPerDayat 6 unless you really want AI routines. Plainreminderandtask_digestautomations run on Durable Object alarms and cost zero neurons. Onlyagent_promptcalls the model.
Also, the in-app Usage panel is an estimate, and it says so. The actual neuron count lives in the Cloudflare dashboard under Workers AI. Look there once a week for the first month.
Is it "self-hosted"? No. Does that matter?
The most common HN complaint was the label. "Selfhosted on cloudflare is a great oxymoron," one commenter wrote, and others offered "self-managed" and "self-hosted but not self-owned" instead. They're right. Your data sits in a Durable Object on Cloudflare's hardware, Cloudflare runs inference on your messages, and the storage layer won't move to a VPS without a rewrite.
I still think it's the more interesting design. The usual self-hosted AI setup is a $5-10 VPS you patch yourself plus an API key for someone's model. Talorys trades the VPS for a free account, a scale-to-zero object and alarms that fire whether or not anything is "running." The model layer is the easy part to swap: one commenter said they'd replaced Workers AI in Cloudflare's own agents example apps with a local whisperfile binary in about 5 minutes, another estimated pointing it at a local model server is under 20 minutes of work, and the provider interface in apps/agent/src/ai/provider.ts is small. The Durable Object is where the real lock-in is, and I can't wave that away.
The backup export (talorys-backup.json, Settings → Privacy) is what keeps that lock-in tolerable. Download it on a schedule.
Who should bother
If you want a private tasks/notes/memory app you can talk to, with a hard spending cap of zero, this is the cleanest version of that idea I've seen. If you want an agent that does things in the outside world, you'll be writing tools, and each tool call is another round trip through your neuron budget.
So, for anyone already running a personal agent: what does it do for you every day, and how many model calls does that actually take? I'd like to know if 35 full-context messages is plenty or a joke.
Sources
- Talorys repo, v0.1.2: https://github.com/rociiu/talorys
- HN discussion: https://news.ycombinator.com/item?id=50031614
- Workers AI pricing: https://developers.cloudflare.com/workers-ai/platform/pricing/
- Workers limits: https://developers.cloudflare.com/workers/platform/limits/
- Durable Objects pricing: https://developers.cloudflare.com/durable-objects/platform/pricing/
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.