Talorys: A Personal AI Agent in Your Own Cloudflare Account

Deploy a private AI assistant with chat, memory, tasks and reminders to your own Cloudflare account in one command, with no servers to run.

Sanju Singh
·
6 min read
Talorys: A Personal AI Agent in Your Own Cloudflare Account

A closer look at the open-source project rociiu/talorys

Many AI assistants follow the same pattern. You sign up, hand your conversations to someone else's servers, and trust that your notes, tasks and personal details are handled well. Talorys takes the opposite approach. It is a personal AI agent that runs entirely inside your own Cloudflare account, with no server, database or account operated by its developers.

The pitch is short: one person, one Cloudflare account, one command.

npx create-talorys@latest

What you get

Talorys is a small, focused assistant rather than a sprawling platform. Out of the box it includes:

  • Chat with streaming responses, Markdown rendering and indicators that show when the agent is using a tool.

  • Memory for durable facts and preferences. You can view, edit and delete everything it remembers, and only the most relevant memories are sent to the model on each turn.

  • Tasks, notes and projects with full create, read, update and delete in the UI. You can also manage them from chat, for example by saying "Add a task to review my project tomorrow."

  • Automations such as one-time and recurring reminders, daily task digests and optional AI routines, all delivered to an in-app notification center.

It is single-user by design. There is no signup, no teams and no accounts. The installer asks you to set an owner password, and you sign in from any device with it.

One detail I like: it works without AI. If Workers AI is unavailable or you have used up your free daily quota, tasks, notes, memories and reminders keep working. Only chat pauses until the quota resets.

Deploying in one command

The installer does the tedious parts for you. It checks your Node.js version (20.18 or newer), verifies your Cloudflare login (or opens Cloudflare's authorization page in your browser), and lets you pick an account and an agent name. It then asks for an owner password, which is hashed locally with PBKDF2-SHA256 and stored only as a Cloudflare secret.

From there it generates a session secret, deploys a private Worker along with its SQLite-backed Durable Object, creates the Pages project, and verifies the live deployment before printing your pages.dev URL. The verification step checks the frontend, the auth endpoint and storage health without running any AI inference.

Here is the whole run at a glance, split by where each step happens:

flowchart TD
    s0(["npx create-talorys@latest"])
    subgraph machine["On your machine"]
        n1["Check Node.js 20.18+"] --> n2["Verify Cloudflare login<br/>or open browser authorization"]
        n2 --> n3["Choose account and agent name"]
        n3 --> n4["Set owner password<br/>hashed locally with PBKDF2-SHA256"]
        n4 --> n5["Generate session secret<br/>and unique resource names"]
    end
    subgraph cloud["In your Cloudflare account"]
        c1["Deploy private Worker<br/>and its SQLite Durable Object"] --> c2["Store secrets"]
        c2 --> c3["Create and deploy Pages project<br/>with the service binding"]
        c3 --> c4["Verify the live deployment<br/>without any AI inference"]
    end
    s0 --> n1
    n5 --> c1
    c4 --> done(["Print your pages.dev URL"])

The installer is also forgiving. If it gets interrupted, you run the same command again and it reconciles what already exists, with no duplicate resources and no data deleted. When you want the latest version later, npx create-talorys@latest update redeploys to the same resources and keeps your password and sessions. There are also status and doctor commands, plus a reset-password command if you get locked out.

How it works under the hood

The architecture is lean, and it shows how far Cloudflare's platform can go on its own:

flowchart TD
    B["Browser"] -->|"HTTPS"| P["Cloudflare Pages<br/>React app + /api Pages Function"]
    P -->|"service binding, no public URL"| W["Private Worker<br/>Hono router"]
    W -->|"fixed instance: personal-agent"| A["TalorysAgent<br/>Agents SDK Durable Object"]
    A --> S[("SQLite<br/>conversations, memories, tasks, notes,<br/>projects, automations, sessions, settings, usage")]
    A --> AI["Workers AI<br/>GLM-4.7-flash, streaming + tool calling"]
    A --> AL["Alarms<br/>reminders and recurring schedules"]

A few design choices stand out:

  • The agent has no public URL. The Worker is deployed with workers_dev and preview URLs turned off. Your browser only talks to the Pages site, whose /api function forwards requests over a service binding.

  • Auth happens in the Worker, not the frontend. Sessions ride in an HttpOnly, SameSite=Strict cookie, the database stores only a keyed hash of each session token, and five failed logins from one IP within 15 minutes lock that client out.

  • All state lives in one SQLite-backed Durable Object. Conversations, memories, tasks, notes, projects, automations, sessions and usage data share a single store.

  • Scheduling uses Durable Object alarms. Reminders and routines fire without anything having to stay online. Per the architecture doc, each enabled automation holds one pending schedule, and a run missed by less than 24 hours still executes once.

One automation cycles like this, with nothing staying online in between:

flowchart LR
    A["Automation enabled<br/>one pending schedule"] --> B["Durable Object alarm fires"]
    B --> C{"Kind of run"}
    C -->|"Reminder or task digest"| D["Runs without AI"]
    C -->|"AI routine"| E["Runs with read-only tools<br/>plus a notify tool"]
    D --> F["Notification in the in-app center<br/>run recorded"]
    E --> F
    F -->|"next occurrence, in your timezone"| A

On the AI side, chat runs on Workers AI using the @cf/zai-org/glm-4.7-flash model, with streaming and tool calling. Responses stream as Server-Sent Events from end to end, and reasoning is switched off to conserve Workers AI Neurons. Models sit behind a small provider interface, so adding another provider means implementing it in code rather than flipping a setting.

The agent's tools are tightly scoped, too. According to the security doc, destructive actions such as deleting a task or note need explicit confirmation in your latest message, enforced in code rather than only in the prompt. Scheduled AI runs get read-only tools plus a notify tool, and there are no shell, code-execution or outbound-HTTP tools at all.

Free-tier friendly, with honest caveats

Talorys is built to fit within the Cloudflare Workers Free plan. It uses only Pages, Workers, SQLite Durable Objects and Workers AI, and it does not provision R2, D1, KV, Vectorize or any paid service.

The README is refreshingly candid that this is not "unlimited free." Cloudflare sets account-level quotas, including a daily Workers AI allocation, and those can change. When the AI allocation runs out, chat tells you clearly and resumes after the daily reset. If your account is on a paid plan, usage beyond the included amounts is billed by Cloudflare.

To keep usage predictable, there are adjustable guardrails in Settings → AI: maximum output tokens, maximum context tokens (older history gets summarized), limits on tool calls and reasoning steps per request, and daily caps on AI requests and scheduled AI runs. Simple reminders and task digests never touch the model at all.

Privacy and data ownership

Talorys includes no telemetry, analytics, tracking or advertising code, and it sends nothing to its developers. Your data sits in your own Cloudflare account.

One thing to keep in mind is that Cloudflare itself processes your data to provide its services. That includes running Workers AI inference on your chat messages and the relevant memories included in each prompt. "Self-hosted on Cloudflare" is not the same as "never leaves your machine," so it is worth reading Cloudflare's privacy policy and Workers AI terms.

You also keep an exit. Settings → Privacy → Download backup exports conversations, memories, tasks, notes, projects, settings and automations as a single JSON file, never sessions or credentials. Importing validates the file and merges it in one transaction, so restoring the same backup twice is harmless.

Trying it locally

If you would rather poke around before deploying, local development needs only Node.js 20.18 or newer:

git clone https://github.com/rociiu/talorys.git
cd talorys
npm install
npm run dev

This starts the agent Worker, the Pages Function proxy and the Vite UI together, using a deterministic mock AI provider, so no Cloudflare login is required. The repo is a TypeScript monorepo with a Hono-based agent app, a React and Vite frontend, shared Zod schemas, the installer package, and Playwright end-to-end tests.

Who is it for?

Talorys fits people who want a private, low-maintenance assistant without running servers or paying for yet another subscription, and who already have, or are happy to create, a Cloudflare account. It is also a useful reference for anyone curious about building agents on Durable Objects, alarms and Workers AI.

A few things to weigh before adopting it. It is a small project so far, with 10 commits and 10 stars at the time of writing. It is deliberately single-user, so it will not suit teams. And chat quality depends on the Workers AI model it uses by default (GLM-4.7-flash) rather than a frontier model you pick yourself.

Still, the core idea is compelling: a personal agent you deploy in minutes, own completely, and can export or tear down whenever you like. If that appeals to you, the repository is at github.com/rociiu/talorys and it is MIT licensed.

Comments(0)

Join the discussion by logging into your account.

No comments yet. Be the first to comment!

Sanju Singh

Passionate developer sharing knowledge about modern web technologies and best practices.

Subscribe to Sanju Singh's Newsletter

Direct email dispatches when new stories are published. Zero algorithms.