<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TrishaReddygari</title>
    <description>The latest articles on DEV Community by TrishaReddygari (@trishareddygari).</description>
    <link>https://dev.to/trishareddygari</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3910801%2F33dde886-e539-4bb4-aaa1-6743f06551cc.jpeg</url>
      <title>DEV Community: TrishaReddygari</title>
      <link>https://dev.to/trishareddygari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trishareddygari"/>
    <language>en</language>
    <item>
      <title>I built an AI content repurposer in a weekend. The first version returned 4 identical outputs.RocketRide gave me the perfect output</title>
      <dc:creator>TrishaReddygari</dc:creator>
      <pubDate>Sun, 03 May 2026 19:16:04 +0000</pubDate>
      <link>https://dev.to/trishareddygari/i-built-an-ai-content-repurposer-in-a-weekend-the-first-version-returned-4-identical-12gj</link>
      <guid>https://dev.to/trishareddygari/i-built-an-ai-content-repurposer-in-a-weekend-the-first-version-returned-4-identical-12gj</guid>
      <description>&lt;h1&gt;
  
  
  I built an AI content repurposer in a weekend. The first version returned 4 identical outputs.
&lt;/h1&gt;

&lt;p&gt;I'd been meaning to automate content repurposing for months. Every time I publish a long-form post, I end up rewriting the same idea four different ways for LinkedIn, X, dev.to, and Instagram. Each platform wants a different shape, a different attention budget, a different tone. Mechanical work. Boring work. The kind of work where, by the fourth platform, I'm just paraphrasing myself badly.&lt;/p&gt;

&lt;p&gt;Last weekend I sat down to build it. I picked &lt;a href="https://rocketride.org" rel="noopener noreferrer"&gt;RocketRide&lt;/a&gt; — an open-source, developer-native AI pipeline tool — instead of writing a Python script with four LLM calls glued together. The whole thing ended up being one 14-component &lt;code&gt;.pipe&lt;/code&gt; JSON file, no orchestration code, four GPT-4o calls running in parallel. It works.&lt;/p&gt;

&lt;p&gt;But the first version didn't.&lt;/p&gt;

&lt;p&gt;This post is about the design mistake I made on attempt one, why it produced four identical outputs instead of four platform-specific ones, and the one-node-type swap that fixed it. Plus what I learned about RocketRide along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built (the working version)
&lt;/h2&gt;

&lt;p&gt;A pipeline that takes one long-form blog post and produces four platform-native variants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A LinkedIn post (under 1,300 chars, hook + insight + soft question, no hashtags)&lt;/li&gt;
&lt;li&gt;An X thread (5–8 numbered tweets, ≤280 chars each)&lt;/li&gt;
&lt;li&gt;A dev.to article (markdown with TL;DR + 3 takeaways + CTA)&lt;/li&gt;
&lt;li&gt;An Instagram caption (800–1,500 chars, conversational, with hashtags)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─→ agent(LinkedIn)  → GPT-4o ──┐
                    │                                │
                    ├─→ agent(X thread)  → GPT-4o ──┤
chat (paste post) ──┤                                ├─→ response (4 outputs)
                    ├─→ agent(dev.to)    → GPT-4o ──┤
                    │                                │
                    └─→ agent(Instagram) → GPT-4o ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One source feeds four parallel chains. Single response node collects all four outputs. The four LLM calls run in parallel, so the total latency is roughly &lt;em&gt;one&lt;/em&gt; GPT-4o call, not four.&lt;/p&gt;

&lt;p&gt;Full code: &lt;a href="https://github.com/TrishaReddygari/rocketride-content-repurposer" rel="noopener noreferrer"&gt;github.com/TrishaReddygari/rocketride-content-repurposer&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Version 1 returned four identical outputs
&lt;/h2&gt;

&lt;p&gt;For my first cut, I used four &lt;code&gt;prompt&lt;/code&gt; nodes (one per platform) sandwiched between the source and the LLMs. Each prompt had careful platform-specific instructions: "Rewrite as a LinkedIn post, max 1,300 chars, no hashtags, end with a soft question." That kind of thing.&lt;/p&gt;

&lt;p&gt;I ran the pipe. Four LLM calls, four answers came back.&lt;/p&gt;

&lt;p&gt;All four outputs were essentially the same generic blog summary. Same title ("Building an AI Content Repurposer with RocketRide: Key Insights"). Same numbered sections. None of them under 1,300 chars. None of them shaped like a tweet thread. None of them with hashtags.&lt;/p&gt;

&lt;p&gt;I'd written four different platform prompts and the LLM had ignored every one of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why prompts didn't work
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;prompt&lt;/code&gt; node in RocketRide is designed for RAG-style context injection. You feed it documents + a question, it merges them into one blob, and hands the blob to the LLM. The LLM treats the merged content as &lt;em&gt;background to consider&lt;/em&gt;, not &lt;em&gt;rules to obey&lt;/em&gt;. My platform-specific instructions were getting injected as context — the LLM read them, interpreted them as "topics this article is about," and produced a generic summary that touched on all of them.&lt;/p&gt;

&lt;p&gt;This is a category of mistake I'd missed in their docs but probably should have caught: &lt;code&gt;prompt&lt;/code&gt; is for &lt;em&gt;what to think about&lt;/em&gt;, not &lt;em&gt;how to behave&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: agent nodes
&lt;/h2&gt;

&lt;p&gt;RocketRide's &lt;code&gt;agent_rocketride&lt;/code&gt; node treats &lt;code&gt;instructions&lt;/code&gt; as a real &lt;strong&gt;system prompt&lt;/strong&gt; — the LLM is told "you are a LinkedIn-rewriter agent, follow these rules, do not deviate." It's not background context, it's the agent's role.&lt;/p&gt;

&lt;p&gt;I replaced the four &lt;code&gt;prompt&lt;/code&gt; nodes with four &lt;code&gt;agent_rocketride&lt;/code&gt; nodes (each with its own LLM and &lt;code&gt;memory_internal&lt;/code&gt; sidecar — agents need both). Same input, same prompts, same source post.&lt;/p&gt;

&lt;p&gt;Re-ran the pipe.&lt;/p&gt;

&lt;p&gt;The LinkedIn output came back at 995 characters with a punchy hook line and a soft closing question. The X thread output came back as eight numbered tweets, every one under 280 chars. The dev.to output was actual markdown with a TL;DR blockquote and three bullet takeaways. The Instagram output had emoji, casual line breaks, and a row of hashtags at the end.&lt;/p&gt;

&lt;p&gt;One node-type swap. Everything else stayed the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that surprised me about RocketRide
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;.pipe&lt;/code&gt; JSON file is the right level of abstraction.&lt;/strong&gt; Most AI workflow tools force you to pick: visual canvas (which is then a nightmare to version-control) or pure code (which gives up the visual debugging). RocketRide pipelines are plain JSON files that live in your repo and &lt;code&gt;git diff&lt;/code&gt; cleanly — and the same JSON renders as a visual canvas when you open it in their VS Code extension. I wrote my pipe by hand in a text editor because their docs were good enough that I didn't need the canvas. The canvas is right there for screenshots, debugging, and onboarding teammates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lane-typing catches mistakes at validation, not runtime.&lt;/strong&gt; Components in RocketRide connect via typed lanes (&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;questions&lt;/code&gt;, &lt;code&gt;answers&lt;/code&gt;, &lt;code&gt;documents&lt;/code&gt;, &lt;code&gt;image&lt;/code&gt;). You can't accidentally wire a &lt;code&gt;text&lt;/code&gt; output into a &lt;code&gt;questions&lt;/code&gt; input — the engine refuses. The category of bug where your LangChain pipeline silently produces empty strings because of a wrong field name is structurally impossible. After enough hours debugging that exact class of bug elsewhere, this felt like a quiet luxury.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;COMMON_MISTAKES.md&lt;/code&gt; is the best single document I've read in any OSS AI tool.&lt;/strong&gt; RocketRide ships a 1,400-line &lt;code&gt;ROCKETRIDE_COMMON_MISTAKES.md&lt;/code&gt; that reads like someone debugged a hundred broken pipelines and decided to short-circuit the entire support cycle. Two of its rules saved me real time on this build. (The one I missed about &lt;code&gt;prompt&lt;/code&gt; vs &lt;code&gt;agent&lt;/code&gt; nodes? It wasn't in there. I should probably open a PR adding it.)&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The next step for the repurposer is swapping the &lt;code&gt;chat&lt;/code&gt; source node for a &lt;code&gt;webhook&lt;/code&gt; source — so the pipe runs automatically when I publish a new post via my CMS, instead of me pasting into a chat panel. That's a one-node change in the &lt;code&gt;.pipe&lt;/code&gt; file. The four agents and the LLM fan-out stay exactly the same.&lt;/p&gt;

&lt;p&gt;The deeper thing I'm taking from this build: small, single-purpose, version-controlled AI pipelines beat one-giant-agent architectures for production work. The repurposer does &lt;em&gt;one specific thing&lt;/em&gt;, lives in a &lt;code&gt;.pipe&lt;/code&gt; file, fits in 14 components. RocketRide bets on that shape, and I think they're right.&lt;/p&gt;

&lt;p&gt;Full pipe and README at &lt;strong&gt;&lt;a href="https://github.com/TrishaReddygari/rocketride-content-repurposer" rel="noopener noreferrer"&gt;github.com/TrishaReddygari/rocketride-content-repurposer&lt;/a&gt;&lt;/strong&gt;. MIT-licensed. Copy it. Swap the LLM. Add a fifth platform. Wire it to your own publishing flow.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
