Iβve been deep in multi-agent automation with workflows lately. Not chat demos. Pipelines that have to finish a job when Iβm not staring at a terminal.
Balakatha is the clearest example Iβve got. Itβs a Hindu mythology story factory for kids in English, Nepali, and Hindi. No ads, no tracking, no login. Built through Parents in Tech.
People see the site and ask about the reader. Fair. The interesting story is the factory behind it.
One run isnβt βgenerate a storyβ
A Balakatha run is a manufacturing line:
- Research. Gather and shape the story brief.
- Generate. Story text and illustrations.
- Narrate. Audio per language.
- Publish. Human review, then the public shelf and social handoff.
That maps to four Cloudflare Workflows: ResearchWorkflow, GenerateWorkflow, NarrateWorkflow, and PublishWorkflow. Persist-and-end stages. Strict schemas. R2 checkpoints. Canonical store in D1 and R2. Human review. Generated images need explicit approval before they ship.
AI proposes inside the stages. Deterministic code owns publish, storage, and distribution. I still own what merges and publishes.
Thatβs the split that makes this real. Coding agents helped build all of the wiring. Different tools for different jobs. They are not the factory runtime. The factory is Cloudflare Workflows, not an AI chat loop and not a SDK for batch media rendering.
Where video actually happens
Reel and YouTube formats matter for Balakatha. Families find stories on Instagram, YouTube, and TikTok as much as on the site.
The videos are generated by Remotion on Node (StoryYouTube at 16:9, StoryReels at 9:16). Cloudflare Workers canβt run Remotion. So the publish path stages Remotion specs in R2, reports MP4s that already exist, then distribute posts only when both formats are present for a language. No guessed URLs.
Short version: Workflows orchestrate the line and the social handoff. They donβt render the videos.
A constraint that shaped the design
Gemini TTS has a daily request ceiling (at least for the tier Iβm at). The counter increments per attempt. A retried 429 still burns quota the same as a successful clip.
So a story that hits the cap can still publish with multi-langage text and images, with narration_status=unavailable, instead of faking audio or blocking the whole line. Re-running a partly narrated story only spends quota on clips R2 doesnβt already hold.
Thatβs the kind of boring detail that decides whether a factory is real.
What I refuse to automate
Everything above still has human gates. Story prose and morals go through review before the public shelf. Generated images need explicit approval. Social distribute only fires when the rendered assets are actually there. Kids-category store rules are load-bearing, so those gates stay.
Agents keep the line moving so Iβm not stuck writing glue between research, generation, narration, and publish.
The takeaway
The product is the workflow.
If youβre wiring multi-agent systems for something that has to ship every day, ask what still refuses to automate. For Balakatha, thatβs review, compliance, and anything that would let a model write straight into a side effect.
Try the stories at balakatha.app. If youβre building a similar factory, tell me what breaks when you put agents on the line. Ping me on X @opynrijal.