Remote OpenClaw
Menu
SkillsMCPPluginsMarketplaceGuideAgentsAdvertise
Remote OpenClaw
SkillsMCPPluginsMarketplaceGuideAgentsAdvertise
Skills/aradotso/marketing-skills/marketing-pipeline-share-ai-content-automation

marketing-pipeline-share-ai-content-automation

aradotso/marketing-skills
585 installs2 stars

Installation

npx skills add https://github.com/aradotso/marketing-skills --skill marketing-pipeline-share-ai-content-automation

Summary

Automated AI content pipeline from research to video generation using Claude/OpenAI and Remotion

SKILL.md

Marketing Pipeline Share - AI Content Automation

Skill by ara.so — Marketing Skills collection.

This skill enables AI coding agents to use marketing-pipeline-share, an automated content pipeline that performs research, generates scripts, and creates videos using AI (Claude 3, OpenAI) and Remotion. The system crawls news sources, analyzes trends, generates multi-format content (blog posts, social media), and renders videos automatically.

What It Does

  • Auto-Research: Crawls TechCrunch, a16z, Twitter/X, LinkedIn for recent content (24h window)
  • AI Content Generation: Uses Claude/OpenAI to create content in multiple formats (Toplist, POV, Case Study, How-to)
  • Multi-language: Generates Vietnamese and English versions simultaneously
  • Video Rendering: Converts content to videos using Remotion for Reels/TikTok/Shorts
  • Full Automation: Keyword → Research → Content → Video in one pipeline

Installation

# Clone the repository
git clone https://github.com/pennydinh/marketing-pineline-share.git
cd marketing-pineline-share

# Install dependencies
npm install
# or
yarn install

# Set up environment variables
cp .env.example .env

Environment Configuration

Create .env file with required API keys:

# AI Provider Keys
ANTHROPIC_API_KEY=your_claude_api_key
OPENAI_API_KEY=your_openai_api_key

# Research APIs
RAPIDAPI_KEY=your_rapidapi_key

# Database (if applicable)
DATABASE_URL=your_database_connection_string

# Remotion (Video Rendering)
REMOTION_LICENSE_KEY=your_remotion_license

# Optional: Social Media APIs
FACEBOOK_PAGE_TOKEN=your_facebook_token
TWITTER_API_KEY=your_twitter_api_key

Project Structure

marketing-pineline-share/
├── src/
│   ├── research/          # Auto-crawling and data extraction
│   ├── content/           # AI content generation logic
│   ├── video/             # Remotion video rendering
│   ├── api/               # API routes (Next.js)
│   └── utils/             # Helper functions
├── pages/                 # Next.js pages
├── public/                # Static assets
└── remotion/              # Remotion video compositions

Core Features and Usage

1. Auto-Research Module

Crawl and analyze news sources for fresh content:

import { autoResearch } from './src/research/crawler';

interface ResearchConfig {
  keyword: string;
  sources: string[];
  timeframe: string; // '24h', '7d', etc.
  language?: 'en' | 'vi';
}

async function performResearch(config: ResearchConfig) {
  const results = await autoResearch({
    keyword: config.keyword,
    sources: config.sources || ['techcrunch', 'a16z', 'twitter'],
    timeframe: config.timeframe,
    maxResults: 50
  });

  // Returns structured data with insights
  return {
    articles: results.articles,
    insights: results.insights,
    trends: results.trends,
    statistics: results.statistics
  };
}

// Example usage
const research = await performResearch({
  keyword: 'AI marketing automation',
  sources: ['techcrunch', 'linkedin'],
  timeframe: '24h',
  language: 'en'
});

2. AI Content Generation

Generate content in multiple formats using Claude or OpenAI:

import { generateContent } from './src/content/generator';
import Anthropic from '@anthropic-ai/sdk';

interface ContentConfig {
  format: 'toplist' | 'pov' | 'case-study' | 'how-to';
  tone: 'professional' | 'friendly' | 'humorous';
  language: 'en' | 'vi' | 'both';
  researchData: any;
}

async function createContent(config: ContentConfig) {
  const anthropic = new Anthropic({
    apiKey: process.env.ANTHROPIC_API_KEY
  });

  const prompt = buildPrompt(config);

  const message = await anthropic.messages.create({
    model: 'claude-3-opus-20240229',
    max_tokens: 4096,
    messages: [{
      role: 'user',
      content: prompt
    }]
  });

  return {
    content: message.content,
    format: config.format,
    metadata: {
      wordCount: message.content[0].text.split(' ').length,
      generatedAt: new Date()
    }
  };
}

// Generate bilingual content
const content = await createContent({
  format: 'toplist',
  tone: 'professional',
  language: 'both',
  researchData: research
});

3. Video Rendering with Remotion

Convert content to video format:

import { bundle } from '@remotion/bundler';
import { renderMedia, selectComposition } from '@remotion/renderer';
import path from 'path';

interface VideoConfig {
  content: string;
  template: 'reels' | 'tiktok' | 'youtube-shorts';
  aspectRatio: '9:16' | '16:9' | '1:1';
}

async function generateVideo(config: VideoConfig) {
  const compositionId = getCompositionId(config.template);
  const bundleLocation = await bundle(
    path.join(process.cwd(), 'remotion/index.ts')
  );

  const composition = await selectComposition({
    serveUrl: bundleLocation,
    id: compositionId
  });

  const outputPath = path.join(
    process.cwd(),
    'public',
    'videos',
    `${Date.now()}.mp4`
  );

  await renderMedia({
    composition,
    serveUrl: bundleLocation,
    codec: 'h264',
    outputLocation: outputPath,
    inputProps: {
      content: config.content,
      aspectRatio: config.aspectRatio
    }
  });

  return {
    videoPath: outputPath,
    duration: composition.durationInFrames / composition.fps
  };
}

// Render video for TikTok
const video = await generateVideo({
  content: content.content,
  template: 'tiktok',
  aspectRatio: '9:16'
});

4. Complete Pipeline Execution

End-to-end automation:

import { runContentPipeline } from './src/pipeline';

interface PipelineConfig {
  keyword: string;
  contentFormats: string[];
  outputFormats: ('text' | 'video' | 'image')[];
  autoPublish?: boolean;
}

async function executeFullPipeline(config: PipelineConfig) {
  console.log(`Starting pipeline for: ${config.keyword}`);

  // Step 1: Research
  const research = await performResearch({
    keyword: config.keyword,
    sources: ['techcrunch', 'a16z', 'twitter'],
    timeframe: '24h'
  });

  // Step 2: Generate content for each format
  const contentPieces = await Promise.all(
    config.contentFormats.map(format =>
      createContent({
        format: format as any,
        tone: 'professional',
        language: 'both',
        researchData: research
      })
    )
  );

  // Step 3: Render videos if requested
  const videos = config.outputFormats.includes('video')
    ? await Promise.all(
        contentPieces.map(content =>
          generateVideo({
            content: content.content,
            template: 'reels',
            aspectRatio: '9:16'
          })
        )
      )
    : [];

  // Step 4: Auto-publish (optional)
  if (config.autoPublish) {
    await publishToSocialMedia(contentPieces, videos);
  }

  return {
    research,
    content: contentPieces,
    videos,
    summary: {
      articlesAnalyzed: research.articles.length,
      contentGenerated: contentPieces.length,
      videosCreated: videos.length
    }
  };
}

// Execute complete pipeline
const result = await executeFullPipeline({
  keyword: 'AI marketing trends 2024',
  contentFormats: ['toplist', 'how-to', 'pov'],
  outputFormats: ['text', 'video'],
  autoPublish: false
});

API Routes (Next.js)

Start Research Job

// pages/api/research/start.ts
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== 'POST') {
    return res.status(405).json({ error: 'Method not allowed' });
  }

  const { keyword, sources, timeframe } = req.body;

  try {
    const jobId = await startResearchJob({
      keyword,
      sources,
      timeframe
    });

    res.status(200).json({ jobId, status: 'started' });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

Generate Content

// pages/api/content/generate.ts
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const { researchId, format, language } = req.body;

  try {
    const content = await createContent({
      format,
      tone: 'professional',
      language,
      researchData: await getResearchData(researchId)
    });

    res.status(200).json({ content });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

Render Video

// pages/api/video/render.ts
import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const { contentId, template, aspectRatio } = req.body;

  try {
    const content = await getContent(contentId);
    const video = await generateVideo({
      content: content.text,
      template,
      aspectRatio
    });

    res.status(200).json({ videoUrl: video.videoPath });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

Running the Application

# Development mode
npm run dev

# Build for production
npm run build

# Start production server
npm start

# Render Remotion videos
npm run render

Common Patterns

Pattern 1: Scheduled Content Generation

import cron from 'node-cron';

// Run daily at 9 AM
cron.schedule('0 9 * * *', async () => {
  const keywords = ['AI trends', 'marketing automation', 'social media'];

  for (const keyword of keywords) {
    await executeFullPipeline({
      keyword,
      contentFormats: ['toplist', 'how-to'],
      outputFormats: ['text', 'video'],
      autoPublish: true
    });
  }
});

Pattern 2: Custom Content Templates

interface CustomTemplate {
  name: string;
  structure: string[];
  minSections: number;
  includeStats: boolean;
}

function buildCustomPrompt(template: CustomTemplate, research: any): string {
  return `
You are a content creator. Create a ${template.name} with the following structure:
${template.structure.map((s, i) => `${i + 1}. ${s}`).join('\n')}

${template.includeStats ? 'Include relevant statistics and data.' : ''}

Based on this research data:
${JSON.stringify(research.insights)}

Write engaging, SEO-optimized content.
  `.trim();
}

Pattern 3: Multi-Platform Video Export

const platforms = [
  { name: 'tiktok', ratio: '9:16', maxDuration: 60 },
  { name: 'reels', ratio: '9:16', maxDuration: 90 },
  { name: 'youtube-shorts', ratio: '9:16', maxDuration: 60 },
  { name: 'linkedin', ratio: '1:1', maxDuration: 120 }
];

async function exportToAllPlatforms(content: string) {
  return await Promise.all(
    platforms.map(platform =>
      generateVideo({
        content,
        template: platform.name as any,
        aspectRatio: platform.ratio as any
      })
    )
  );
}

Troubleshooting

API Rate Limits

import pRetry from 'p-retry';

async function callAPIWithRetry(apiFunction: () => Promise<any>) {
  return pRetry(apiFunction, {
    retries: 3,
    onFailedAttempt: error => {
      console.log(
        `Attempt ${error.attemptNumber} failed. Retries left: ${error.retriesLeft}`
      );
    }
  });
}

Video Rendering Memory Issues

// Adjust Remotion memory settings
const video = await renderMedia({
  composition,
  serveUrl: bundleLocation,
  codec: 'h264',
  outputLocation: outputPath,
  chromiumOptions: {
    headless: true,
    gl: 'angle'
  },
  envVariables: {
    NODE_OPTIONS: '--max-old-space-size=4096'
  }
});

Claude API Timeout

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
  timeout: 60000, // 60 seconds
  maxRetries: 2
});

Content Quality Validation

function validateContent(content: string): boolean {
  const minLength = 500;
  const hasStructure = content.includes('\n\n');
  const hasKeywords = true; // Implement keyword check

  return (
    content.length >= minLength &&
    hasStructure &&
    hasKeywords
  );
}

Best Practices

  1. Always validate research data before content generation
  2. Cache research results to avoid redundant API calls
  3. Use queues for video rendering to manage server resources
  4. Implement rate limiting for all external API calls
  5. Store generated content in database for reuse and tracking
  6. Test video templates before bulk rendering
  7. Monitor AI costs with usage tracking middleware

This skill provides comprehensive automation for content marketing workflows, from research through video production.

Featured

SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it — secured from day one.

Get it set up for you →
MoltAwards - Agent internet for government contracts + jobs. logoMoltAwards - Agent internet for government contracts + jobs.

MoltAwards is an agent-native social layer for matchawards.com.

Learn more →
CLN.Work — Stop prompting, start hiring AI employees logoCLN.Work — Stop prompting, start hiring AI employees

Turn your Claude agents into a real team — onboard them, assign tasks, and manage them like staff.

Hire AI employees →
Deploy your own AI agent logoDeploy your own AI agent

Launch OpenClaw or Hermes on Hostinger in about 60 seconds, keep your agent live 24/7, earn 20%-40% on your next referral up to $25-$45, and give your friend 20% off.

Launch on Hostinger →
AdvertiseGet your AI tool in front of 67,000+ AI enthusiastsSee placements & pricing →
View on GitHub

Recommended skills

Browse all →
LS

lark-shared

open.feishu.cn

300K installsInstall

lark-shared

larksuite/cli

280K installsInstall

twitter-automation

halt-catch-fire/skills

173K installsInstall

marketing-psychology

coreyhaines31/marketingskills

101K installsInstall

content-strategy

coreyhaines31/marketingskills

96K installsInstall

marketing-ideas

coreyhaines31/marketingskills

90K installsInstall

Browse

Skills by category

Frontend250Git198Data154Testing120Design105Docs103Security96Automation87Backend76Devops37Productivity29Mcp23

Advertise on Remote OpenClaw

Get your AI tool in front of 67,000+ AI enthusiasts a month

See placements & pricing →

Remote OpenClaw

AI agent skills directory, marketplace, and workflow hub for OpenClaw, Hermes Agent, Claude Code, Codex, and MCP-powered operator stacks.

Explore

  • Home
  • Skills Directory
  • Claude Code Skills
  • Codex Skills
  • Marketplace
  • Hermes Ecosystem
  • Agents
  • Guide
  • Learn
  • Blog

More

  • Playbook
  • Free Tools
  • Shipping
  • Contact
  • Terms
  • Privacy
© 2026 Remote OpenClaw