CrewAI made multi-agent setups feel approachable. You write a crew, a few agents, and the tasks that bind them. The structure is good but it stays trapped inside Python and the wiring still costs lines. Digitorn keeps the multi-agent shape and turns it into nested YAML.
CrewAI works best for one-off scripts. The minute you need scheduled runs, webhooks, real credentials, or a UI, you write the surrounding plumbing yourself. Digitorn gives you the same coordinator-and-specialists model with channel providers, the Hub registry, a credential vault, and a streaming UI already wired in.
Every CrewAI primitive maps to a Digitorn equivalent. Where the mapping is not 1-to-1, the notes call out what changed.
Real apps in both stacks. The Digitorn version is what you would commit to a repo, no scaffolding hidden offscreen.
1from crewai import Agent, Task, Crew, Process2from langchain_anthropic import ChatAnthropic34llm = ChatAnthropic(model="claude-haiku-4-5", api_key=API_KEY)56researcher = Agent(7 role="Researcher", goal="Find facts about the topic",8 backstory="...", llm=llm, tools=[search_tool],9)10writer = Agent(11 role="Writer", goal="Compose a clear summary",12 backstory="...", llm=llm,13)1415task1 = Task(description="Research {topic}", agent=researcher)16task2 = Task(description="Write summary based on research", agent=writer)1718crew = Crew(agents=[researcher, writer], tasks=[task1, task2],19 process=Process.sequential)2021crew.kickoff(inputs={"topic": "agentic frameworks"})1schema_version: 223app:4 app_id: research-crew5 name: "Research crew"6 version: "1.0.0"78modules:9 web: {}10 agent_spawn: {}1112runtime:13 mode: one_shot14 entry_agent: lead1516agents:17 - id: lead18 role: coordinator19 modules: [{agent_spawn: [agent]}]20 brain: { provider: anthropic, model: claude-sonnet-5, credential: anthropic_main }21 system_prompt: |22 You coordinate research. Call agent(agent="researcher", task="...") first,23 then call agent(agent="writer", task="...") with the findings.2425 - id: researcher26 role: specialist27 modules: [{web: [search, fetch]}]28 brain: { provider: anthropic, model: claude-haiku-4-5, credential: anthropic_main }29 system_prompt: "Find sources and return facts with citations."3031 - id: writer32 role: specialist33 brain: { provider: anthropic, model: claude-haiku-4-5, credential: anthropic_main }34 system_prompt: "Compose a clear summary from the research output."The crew, agent, and task triple collapses into a list of agents. The lead's prompt explains the dispatch order, no Process enum needed. Switching to parallel research is a prompt change, not a config flag.
Subtle differences that look the same on paper and break on first run. Read these before you start porting.
A Digitorn specialist is just an agent block the coordinator can spawn via agent_spawn. There is no separate Crew object to instantiate.
Where CrewAI uses Process.sequential or Process.hierarchical, you describe the dispatch logic in the coordinator's system prompt. The runtime does not enforce a process, the prompt does.
agent(agent, task) is deliberately minimal - no built-in wait-for-many or cancel modes to reach for. Design the coordinator's prompt around that.
# 1. install runtime
curl -sSL https://digitorn.ai/install | sh
# 2. save the YAML above as app.yaml in a new folder
mkdir from-crewai
# 3. install and chat
digitorn install ./from-crewai
digitorn chat from-crewaiEngineering notes from the Digitorn team. No marketing, no launch announcements, no "10 prompts that will change your life". Just the things we write that we'd want to read.