<?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: buchylx</title>
    <description>The latest articles on DEV Community by buchylx (@buchylx).</description>
    <link>https://dev.to/buchylx</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4096571%2F95fcacae-9594-470c-8886-e5cb639b747d.png</url>
      <title>DEV Community: buchylx</title>
      <link>https://dev.to/buchylx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/buchylx"/>
    <language>en</language>
    <item>
      <title>dsh-crosspost triple-platform test</title>
      <dc:creator>buchylx</dc:creator>
      <pubDate>Thu, 27 Aug 2026 03:33:58 +0000</pubDate>
      <link>https://dev.to/buchylx/dsh-crosspost-triple-platform-test-48j1</link>
      <guid>https://dev.to/buchylx/dsh-crosspost-triple-platform-test-48j1</guid>
      <description>&lt;p&gt;dsh-crosspost now supports three platforms in one call. Testing dev.to + github gist + bluesky simultaneously. This is a throwaway test.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I automated my content distribution with a DSH plugin I scaffolded myself</title>
      <dc:creator>buchylx</dc:creator>
      <pubDate>Thu, 27 Aug 2026 03:22:54 +0000</pubDate>
      <link>https://dev.to/buchylx/how-i-automated-my-content-distribution-with-a-dsh-plugin-i-scaffolded-myself-2gbg</link>
      <guid>https://dev.to/buchylx/how-i-automated-my-content-distribution-with-a-dsh-plugin-i-scaffolded-myself-2gbg</guid>
      <description>&lt;h1&gt;
  
  
  How I automated my content distribution with a DSH plugin I scaffolded myself
&lt;/h1&gt;

&lt;p&gt;Posting is easy. &lt;strong&gt;Posting everywhere, consistently, is the hard part.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted a single command that takes one markdown article and pushes it to Dev.to, GitHub (as a gist), and eventually Bluesky and Mastodon — without my ever touching those web editors again. So I built it as a plugin for &lt;strong&gt;DSH (DeepSeek Harness)&lt;/strong&gt;, using a scaffolding tool that I published myself.&lt;/p&gt;

&lt;p&gt;Here's the story, the 3 pitfalls that cost me the most time, and how you can get the same thing running in about a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why automate distribution at all?
&lt;/h2&gt;

&lt;p&gt;Writing in public is the cheapest compounding asset a developer has. But cross-posting manually has two failure modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You skip platforms&lt;/strong&gt; — the "I'll do it later" tab that stays open forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You lose the content graph&lt;/strong&gt; — each platform becomes a silo with a slightly different version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A plugin that accepts &lt;code&gt;content + title + [platforms]&lt;/code&gt; and returns &lt;code&gt;per-platform status + links&lt;/code&gt; removes both. One source, many destinations, audited every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;A DSH &lt;strong&gt;content-automation plugin&lt;/strong&gt; (&lt;code&gt;dsh-crosspost&lt;/code&gt;) with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform adapters&lt;/strong&gt;: Dev.to (real), GitHub gist (real), Bluesky + Mastodon (stubs, next milestone).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BYOK credentials&lt;/strong&gt;: your tokens live in your DSH profile config — never in code, no platform approval needed from the plugin author.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error classification&lt;/strong&gt;: every adapter wraps HTTP in try/catch and returns &lt;code&gt;auth / rate-limit / bad-request&lt;/code&gt; instead of a raw stack trace, so an agent can decide to retry or skip per platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel orchestration&lt;/strong&gt;: one platform failing never blocks the others.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 3 pitfalls that cost me the most time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The stale &lt;code&gt;latest&lt;/code&gt; dist-tag (the big one)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;npm install @deepseek-ai/dsh-tools&lt;/code&gt; gives you a &lt;strong&gt;stale 0.0.1-rc.1&lt;/strong&gt; — the real line lives under the &lt;code&gt;next&lt;/code&gt; tag. Wasted an evening debugging failures that were purely "wrong version resolved." Lesson: &lt;strong&gt;check dist-tags before installing anything in a fast-moving young ecosystem&lt;/strong&gt; (&lt;code&gt;npm view pkg dist-tags&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pure ESM + bare specifiers
&lt;/h3&gt;

&lt;p&gt;The plugin must be pure ESM (&lt;code&gt;"type": "module"&lt;/code&gt;), built with &lt;code&gt;module: esnext&lt;/code&gt; + &lt;code&gt;moduleResolution: bundler&lt;/code&gt;. Half my build errors were me fighting CJS habits (&lt;code&gt;require&lt;/code&gt;, &lt;code&gt;module.exports&lt;/code&gt;) at the boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The bundle patch, not a relative path
&lt;/h3&gt;

&lt;p&gt;Deps aren't installed via npm in the profile directory — the profile loader resolves bundle &lt;code&gt;name&lt;/code&gt;s through &lt;code&gt;node_modules&lt;/code&gt;/profile store. Unlearning "relative path == works" was harder than the API calls themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 60-second scaffold
&lt;/h2&gt;

&lt;p&gt;Instead of hand-writing the plugin skeleton, I packaged everything I learned into &lt;strong&gt;&lt;code&gt;create-dsh-content&lt;/code&gt;&lt;/strong&gt; — a scaffold that generates a working, verifying content plugin in one command, then runs &lt;code&gt;--verify&lt;/code&gt; (type-check + loader dry-run) until it's green.&lt;/p&gt;

&lt;p&gt;What it bakes in: version pins (no stale-tag trap), pure-ESM tsconfig, the cordis patch wiring, BYOK credential plumbing, and a &lt;code&gt;generate → verify → install → publish&lt;/code&gt; loop you can dogfood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best part: dogfooding it
&lt;/h2&gt;

&lt;p&gt;The final step was using &lt;strong&gt;my own published package&lt;/strong&gt; to generate the very plugin that published this post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;create-dsh-content&lt;/code&gt; (published to npm) → generates &lt;code&gt;dsh-crosspost&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dsh plugin add&lt;/code&gt; → loads it into my profile&lt;/li&gt;
&lt;li&gt;Agent calls the &lt;code&gt;dsh_crosspost&lt;/code&gt; tool → this article + a GitHub gist live&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the loop I'd recommend for anyone shipping dev tools: &lt;strong&gt;dogfood = honest docs.&lt;/strong&gt; When your instructions mysteriously work, you know they're real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scaffold repo: &lt;a href="https://github.com/buchylx/create-dsh-content-plugin" rel="noopener noreferrer"&gt;github.com/buchylx/create-dsh-content-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Scaffold on npm: &lt;a href="https://www.npmjs.com/package/create-dsh-content" rel="noopener noreferrer"&gt;npmjs.com/package/create-dsh-content&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;This plugin: &lt;code&gt;dsh-crosspost&lt;/code&gt; (multi-platform cross-poster for DSH)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give the scaffold a try and let me know what your first automated cross-post looks like. 🚀&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devtools</category>
      <category>plugins</category>
      <category>devrel</category>
    </item>
  </channel>
</rss>
