Composed Workflows
Composed workflows chain simpler workflows into end-to-end pipelines. They combine research, hook generation, and video production into single invocations.
Research to Shorts
Section titled “Research to Shorts”Workflow: video/research_to_shorts
Deep research on a topic, generate viral hooks from findings, select the best hook, and produce a complete AI short video — grounded in real data.
fabric run video/research_to_shorts \ --input query="Why developers are switching to Rust" \ --input platform="TikTok" \ --input quality=premiumcurl -X POST "$FABRIC_URL/v1/workflows/run?name=video/research-to-shorts" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "query": "Why developers are switching to Rust", "platform": "TikTok", "quality": "premium" } }'Pipeline
Section titled “Pipeline”deep_research → bridge_research_to_hooks → generate_hooks →select_best_hook → generate_script (research-grounded) →video_production_pipeline| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | required | Research topic |
platform | string | "TikTok" | Target platform |
duration_secs | int | 45 | Video duration |
mood | string | "high-energy" | Visual and narrative mood |
quality | string | "" | Quality preset |
Output
Section titled “Output”Complete video with research-informed script and all intermediate artifacts (research synthesis, hooks, script, b-roll paths).
Hot Topics to Short
Section titled “Hot Topics to Short”Workflow: composed/hot_topics_to_short
Scan trending topics, generate hooks, pick the strongest, and produce a single viral short video.
fabric run composed/hot_topics_to_short \ --input platform="YouTube Shorts" \ --input categories='["tech", "AI"]'curl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/hot-topics-to-short" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "platform": "YouTube Shorts", "categories": ["tech", "AI"] } }'Pipeline
Section titled “Pipeline”hot_topics_pipeline → bridge_topics_to_hooks → generate_hooks →select_best_hook → generate_script → video_production_pipelineHot Topics to Content
Section titled “Hot Topics to Content”Workflow: composed/hot_topics_to_content
Scan trending topics, generate hooks, and batch-produce content items (scripts, outlines, or posts).
fab-workflow composed/hot_topics_to_content \ --input categories='["tech", "business"]' \ --input num_content=5curl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/hot-topics-to-content" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "categories": ["tech", "business"], "num_content": 5 } }'Pipeline
Section titled “Pipeline”hot_topics_pipeline → bridge_topics_to_hooks → generate_hooks →generate_content_batchOutput
Section titled “Output”{ "content_items": [ { "topic": "...", "hook": "...", "hook_type": "controversial_take", "estimated_strength": 0.87 } ]}Hot Topics to Content with Text Adaptation
Section titled “Hot Topics to Content with Text Adaptation”Workflow: composed/hot_topics_to_content_with_text
Extended version that adds cross-platform text adaptation after content batch generation. Produces both content items and platform-native text for the top hook.
fab-workflow global/hot-topics-to-content-with-text \ --input categories='["tech", "AI"]' \ --input platforms=instagram,linkedin,twitter,threads \ --input tone_mode=narrativecurl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/hot-topics-to-content-with-text" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "categories": ["tech", "AI"], "platforms": ["instagram", "linkedin", "twitter", "threads"], "tone_mode": "narrative" } }'Pipeline
Section titled “Pipeline”hot_topics_pipeline → bridge_topics_to_hooks → generate_hooks →generate_content_batch → bridge_content_to_platform_adapt →adapt_for_platformsOutput
Section titled “Output”Includes everything from hot_topics_to_content plus:
{ "platform_texts": [ { "platform": "instagram", "text": "Caption text adapted for Instagram...", "hashtags": ["ai", "tech", "productivity"], "char_count": 142, "tone_mode": "narrative" }, { "platform": "linkedin", "text": "Professional post adapted for LinkedIn...", "hashtags": ["artificialintelligence", "techleadership"], "char_count": 847, "tone_mode": "narrative" } ]}Research to Video (Fan-Out)
Section titled “Research to Video (Fan-Out)”Workflow: composed/research_to_video
Research a topic, generate hooks, then fan out N parallel AI Shorts runs — one per hook. Produces multiple videos from a single research session.
fabric run composed/research_to_video \ --input topic="AI replacing junior developers" \ --input videos=3 \ --input quality=premiumcurl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/research-to-video" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "topic": "AI replacing junior developers", "videos": 3, "quality": "premium" } }'Pipeline
Section titled “Pipeline”deep_research → generate_hooks → select_top_N →fork(ai_shorts × N)| Parameter | Type | Default | Description |
|---|---|---|---|
topic | string | required | Research topic |
videos | int | 3 | Number of videos to produce |
quality | string | "" | Quality preset for all videos |
--from-research | string | — | Reuse prior research output file |
--from-hooks | string | — | Reuse prior hooks output file |
Research to Hooks
Section titled “Research to Hooks”Workflow: composed/my_research_hooks
Lightweight pipeline: research a topic and extract viral hooks. No video production.
fabric run composed/my_research_hooks --input query="AI agents in production"curl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/my-research-hooks" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "query": "AI agents in production" } }'Pipeline
Section titled “Pipeline”deep_research → bridge_to_hooks → generate_hooksOutput
Section titled “Output”{ "hook_ideas": [ { "hook_text": "Most AI agents fail in production. Here's why.", "hook_type": "controversial_take", "emotional_trigger": "fear_of_failure", "estimated_strength": 0.91 } ]}Epic Remix
Section titled “Epic Remix”Workflow: composed/epic_remix
Takes a YouTube, TikTok, or Instagram video, detects its most epic moments, extracts the key ideas, then generates a completely original short-form video inspired by those ideas — styled to a user-defined persona. No source footage is reused.
# With a style profile JSON filefabric run composed/epic_remix \ --input url="https://youtube.com/watch?v=..." \ --input style_profile='{"tone":"sarcastic and irreverent","persona":"tech skeptic who has seen it all"}'curl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/epic-remix" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "url": "https://youtube.com/watch?v=...", "style_profile": { "tone": "sarcastic and irreverent", "persona": "tech skeptic who has seen it all" } } }'# CLI shorthandpython -m workflows.composed.epic_remix "https://youtube.com/watch?v=..." \ --tone "sarcastic and irreverent" \ --persona "tech skeptic who has seen it all" \ --hooks-style "rhetorical questions" \ --visual-aesthetic "warm film grain"
# Ideas only (no video generation)python -m workflows.composed.epic_remix "https://tiktok.com/@user/video/123" \ --tone "warm and educational" --persona "excited science nerd" \ --ideas-onlyPipeline
Section titled “Pipeline”transcription → detect_viral_moments → extract_epic_ideas →generate_remix_script (style-aware) → video_production_pipeline| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | required | YouTube, TikTok, or Instagram video URL |
style_profile | object | required | Style profile (see below) |
platform | string | "TikTok" | Target platform |
duration_secs | int | 45 | Video duration |
quality | string | "premium" | Quality preset (cheap, premium, ultra, local) |
num_clips | int | 5 | How many epic moments to detect |
top_k_ideas | int | 3 | How many ideas to extract for remix |
mood | string | from tone | Override mood (defaults to style tone) |
Style Profile
Section titled “Style Profile”The style profile controls the voice, visual aesthetic, and personality of the generated video. Only tone and persona are required.
{ "tone": "sarcastic and irreverent", "persona": "tech skeptic who has seen it all", "hooks_style": "rhetorical questions", "visual_aesthetic": "warm film grain", "vocabulary": "casual gen-z slang", "catchphrases": ["here's the thing though", "let me cook"], "avoid": ["clickbait", "fear mongering"]}The style flows through every production step:
- Script narration — persona and tone override the default “virality strategist” voice
- Avatar —
presenter_lookderived from persona description - B-roll —
visual_aestheticembedded in every broll prompt and the continuity brief - Background music — mood derived from tone instead of generic “viral TikTok energy”
Output
Section titled “Output”{ "output_path": "/tmp/fabric_effects.mp4", "epic_ideas": { "themes": ["Strategic Negotiation", "Power Dynamics"], "key_ideas": [ { "idea": "A coach's history of leveraging job offers reveals a consistent pattern...", "talking_points": ["..."], "emotional_core": "surprise, intrigue", "controversy_angle": "Is this strategic leveraging brilliant or disloyal?" } ], "original_creator_style": "analytical and opinionated...", "remix_opportunities": ["Create a 'Playbook' series...", "Host a debate panel..."] }, "script": { "full_narration": "...", "segments": [...] }, "duration": 29.4}Video to Shorts
Section titled “Video to Shorts”Workflow: video/video_to_shorts
Extract viral clips from a longer video (podcast, talk, lecture) and produce short-form content.
fabric run video/video_to_shorts \ --input url="https://youtube.com/watch?v=..."curl -X POST "$FABRIC_URL/v1/workflows/run?name=video/video-to-shorts" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "url": "https://youtube.com/watch?v=..." } }'Pipeline
Section titled “Pipeline”transcription → detect_viral_moments → extract_clips →reframe_to_vertical → burn_subtitles → compose_finalYouTube Studio
Section titled “YouTube Studio”Workflow: youtube/studio
Complete YouTube metadata preparation: transcribe, generate title options, create thumbnails, and write description with chapters.
fabric run youtube/studio --input url="https://youtube.com/watch?v=..."curl -X POST "$FABRIC_URL/v1/workflows/run?name=youtube/studio" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "url": "https://youtube.com/watch?v=..." } }'Pipeline
Section titled “Pipeline”transcription → title_generation → thumbnail_generation →description_generation → collect_outputOutput
Section titled “Output”{ "title": "Selected title", "title_options": [...], "thumbnail": "/tmp/thumbnail.png", "description": "Full YouTube description with chapters...", "transcript": [...], "duration": 345.6}Topic to Platforms Chain
Section titled “Topic to Platforms Chain”Workflow: composed/topic-to-platforms-chain
Sequential rethink chain — one topic produces 8 platform-native posts, each re-derived from the topic (not re-formatted from a single source). Counterpart to the parallel global/platform-adapt for cases where deeper platform adaptation matters more than throughput.
The order is deliberate: each step inherits constraints discovered by the prior one.
twitter → linkedin → instagram → tiktok → youtube → newsletter → threads → facebookTwitter goes first because its 280-char limit forces the tightest articulation of the core idea; each later step expands or reframes from there.
fabric run composed/topic-to-platforms-chain \ --input topic="Why most prompt-engineering advice is wrong"curl -X POST "$FABRIC_URL/v1/workflows/run?name=composed/topic-to-platforms-chain" \ -H "Authorization: Bearer $FABRIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "input": { "topic": "Why most prompt-engineering advice is wrong", "platforms": ["twitter", "linkedin", "instagram", "tiktok", "youtube", "newsletter", "threads", "facebook"], "brand_voice": { "voice_description": "punchy, opinionated, anti-fluff", "target_audience": "solo founders building AI products", "niche": "AI tools", "platform_tone": {"linkedin": "narrative"} } } }'Pipeline
Section titled “Pipeline”rethink_chain (one LLM call per platform, sequential, prior outputs as context)Output
Section titled “Output”{ "platform_posts": [ {"platform": "twitter", "text": "...", "hashtags": [], "angle": "...", "char_count": 268}, {"platform": "linkedin", "text": "...", "hashtags": ["..."], "angle": "...", "char_count": 1240} ]}- Pass a
BrandVoiceobject (or dict) asbrand_voiceto apply per-platform tone overrides; a bare string is also accepted for backward compatibility withglobal/platform-adapt. - Override or shorten the
platformslist to skip channels. - Each step is its own LLM call — expect ~8× the latency and cost of
global/platform-adapt. Use that workflow when you want fan-out, this one when you want platform-native depth.