Idyllic
Most AI frameworks assume you’re building a chatbot. Idyllic assumes you’re building something more interesting. Your backend is a TypeScript class. Properties sync to clients automatically. Methods become your API. Streaming is a type annotation, not infrastructure you build. You write a class, deploy with one command, and watch your AI system work in real time.@field decorator marks state that syncs to all connected clients. The @action() decorator exposes a method as callable from React. The stream<string> type creates a field that updates incrementally as AI generates output. Open two browser tabs and click the button—both tabs update instantly.
What Makes This Different
Not chat. Most AI tools give youuseChat and a messages array. That’s fine for chatbots, but a document editor has documents, a research tool has sources and findings, a dashboard has queries and results. Idyllic lets you define whatever state shape your application needs.
No infrastructure code. When you call this.message.append(chunk), the framework broadcasts that chunk to every connected client over WebSocket. When you assign to this.count, that change persists to durable storage and syncs to all clients. You don’t write SSE parsers, WebSocket handlers, or database queries.
Type safety across the network. The useSystem<Counter>() hook knows that count is a number and increment takes no arguments because it reads your class definition. Change a method signature on the server and TypeScript shows errors in your React code.
One command to production. npx idyllic deploy bundles your code and ships it to Cloudflare’s edge network. Your system runs in 300+ locations worldwide with ~10ms cold starts. State persists automatically. No containers, no database config.
Agents as Properties
The real power appears when you build multi-agent systems. In Idyllic, agents aren’t separate processes that send messages to each other—they’re objects that live inside your class. Coordination is just code.Autonomous Systems
Systems can schedule their own future execution, even when no one is watching.check(), and hibernates again. A user can close their browser, come back days later, and find accumulated findings waiting.
Core Primitives
| Primitive | Purpose |
|---|---|
@field | Marks a property as synced to clients and persisted |
@action() | Marks a method as callable from React |
stream<T>() | Creates a field that supports incremental updates |
useSystem<T>() | React hook that connects to a system instance |
schedule() | Runs a method at a future time or on a recurring basis |
When to Use Idyllic
Idyllic works well for AI applications where:- You need real-time streaming to multiple clients
- State should persist across sessions
- The data model isn’t just chat messages
- You want agents that work autonomously
- You’d rather write TypeScript than configure infrastructure
- Simple chatbots where
useChatis enough - Applications that need to run outside Cloudflare
- Systems that require distributed agents across machines