<?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: Jonas Nguyen</title>
    <description>The latest articles on DEV Community by Jonas Nguyen (@jonas_nguyen).</description>
    <link>https://dev.to/jonas_nguyen</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%2F4122484%2F3f82be42-a2fd-4a74-84d3-5de5442b2771.png</url>
      <title>DEV Community: Jonas Nguyen</title>
      <link>https://dev.to/jonas_nguyen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jonas_nguyen"/>
    <language>en</language>
    <item>
      <title>One composer, sixteen networks: every network has its own rules</title>
      <dc:creator>Jonas Nguyen</dc:creator>
      <pubDate>Wed, 21 Oct 2026 19:54:49 +0000</pubDate>
      <link>https://dev.to/jonas_nguyen/one-composer-sixteen-networks-every-network-has-its-own-rules-5ebf</link>
      <guid>https://dev.to/jonas_nguyen/one-composer-sixteen-networks-every-network-has-its-own-rules-5ebf</guid>
      <description>&lt;p&gt;The pitch of every scheduler is "write once, post everywhere". Building one, I learned it really means "write once, then satisfy sixteen different rulebooks".&lt;/p&gt;

&lt;h2&gt;
  
  
  What the rulebooks look like
&lt;/h2&gt;

&lt;p&gt;A few real examples from Clienzo's networks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt; cuts a photo caption at 1,024 characters, while a plain text message can run to 4,096.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt; messages stop at 2,000 characters, with up to 10 files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bluesky and Mastodon&lt;/strong&gt; take up to four photos, or one video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dribbble&lt;/strong&gt; takes exactly one image per shot, at a 4:3 size, and the title — which Clienzo takes from the first line of your caption — has a 64-character limit. I found that limit the honest way: a real post came back with an error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viber&lt;/strong&gt; channels want each picture as a JPEG under 1 MB, one picture per message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube and Dailymotion&lt;/strong&gt; take a video, and need a title too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is unusual. It is just different everywhere, and it changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules live in one place
&lt;/h2&gt;

&lt;p&gt;The first decision was to keep all of those limits in one shared set of post rules, used by the composer in the app, by the public API and by the publishing job. If the composer lets you schedule a post, the API would have accepted it too, and the publisher will not be surprised by it at 3 a.m.&lt;/p&gt;

&lt;p&gt;When a network's rule changes, it changes in one file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix it for the network, not for the user
&lt;/h2&gt;

&lt;p&gt;Some rules can be satisfied without asking you. Clienzo resizes an image to fit Dribbble's 4:3 frame, re-encodes a picture as a JPEG for Viber, and turns hashtags into tags where a network has tags instead.&lt;/p&gt;

&lt;p&gt;Others cannot be guessed: a caption that is too long for one network needs a human to shorten it. Those show up as a clear warning on that network only, before you schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  The preview matters more than anything clever
&lt;/h2&gt;

&lt;p&gt;The feature I would keep if I had to drop everything else is the preview per network. It shows the post the way each network will get it: where the caption gets cut, how many images make it, and a note where links in captions are not clickable, as on Instagram and YouTube.&lt;/p&gt;

&lt;p&gt;It is not glamorous. It is the thing that stops a post from going out wrong.&lt;/p&gt;

&lt;p&gt;Next: what happens after you press Schedule, and how a post gets published at the right minute.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://jonasnguyen.com/writing/one-composer-sixteen-networks/" rel="noopener noreferrer"&gt;jonasnguyen.com&lt;/a&gt;, where I write about building Clienzo and the next startups.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>product</category>
      <category>integrations</category>
    </item>
    <item>
      <title>Why I'm building a social media scheduler in a crowded market</title>
      <dc:creator>Jonas Nguyen</dc:creator>
      <pubDate>Wed, 21 Oct 2026 19:10:06 +0000</pubDate>
      <link>https://dev.to/jonas_nguyen/why-im-building-a-social-media-scheduler-in-a-crowded-market-b47</link>
      <guid>https://dev.to/jonas_nguyen/why-im-building-a-social-media-scheduler-in-a-crowded-market-b47</guid>
      <description>&lt;p&gt;Every list of "best social media tools" already has twenty entries. If you are building alone, entering that market needs a better reason than "mine will be nicer".&lt;/p&gt;

&lt;p&gt;This is the reason I settled on, and the first part of a series where I go through Clienzo one piece at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it is for
&lt;/h2&gt;

&lt;p&gt;I did not want to build for marketing teams with approval chains. Clienzo is for people who post for themselves or a handful of clients: a founder announcing a launch, a freelancer running three clients' accounts, a small agency that wants each client kept separate.&lt;/p&gt;

&lt;p&gt;Those people have one thing in common. Posting is not their job. It is the thing between them and their actual job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The narrow bet
&lt;/h2&gt;

&lt;p&gt;Most schedulers are built around their own composer. You open the app, write, pick accounts, schedule. That works, and Clienzo has it too.&lt;/p&gt;

&lt;p&gt;The bet is that more and more writing does not start in a scheduler. It starts in a chat with an AI assistant, in a changelog, in a script that runs when a release is tagged. So Clienzo is built to be driven from outside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A public REST API&lt;/strong&gt;, so anything that can make an HTTP request can schedule a post.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MCP server&lt;/strong&gt;, so an assistant like Claude can create, schedule and retry posts from the same conversation where the post was written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat apps as channels.&lt;/strong&gt; Discord, Telegram, Slack and Viber are first-class destinations, next to Facebook, Instagram, Threads, LinkedIn and the rest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sixteen networks are live today. Each one turned out to have its own rules, quirks and review process — which is most of what this series is about.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want to be honest about
&lt;/h2&gt;

&lt;p&gt;A scheduler is only useful if you can trust it. So two rules shaped the product early:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every network gets its own result.&lt;/strong&gt; A post that went out on five networks and failed on one says exactly that, and lets you retry just the one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No made-up numbers.&lt;/strong&gt; If a network does not report views for a post, the analytics show a blank, not an estimate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both rules cost more work than the alternative. Both come up again in later parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;Tomorrow: the composer, and why "write once, post everywhere" is really "write once, then satisfy sixteen different sets of rules".&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://jonasnguyen.com/writing/why-a-social-media-scheduler/" rel="noopener noreferrer"&gt;jonasnguyen.com&lt;/a&gt;, where I write about building Clienzo and the next startups.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>productstrategy</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
