<?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: Anton Rost</title>
    <description>The latest articles on DEV Community by Anton Rost (@antonships).</description>
    <link>https://dev.to/antonships</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%2F1820531%2Fd047c306-7092-4c50-965d-583dec239ec0.png</url>
      <title>DEV Community: Anton Rost</title>
      <link>https://dev.to/antonships</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antonships"/>
    <language>en</language>
    <item>
      <title>I spend more time rejecting X posts than writing replies</title>
      <dc:creator>Anton Rost</dc:creator>
      <pubDate>Fri, 09 Oct 2026 19:35:22 +0000</pubDate>
      <link>https://dev.to/antonships/i-spend-more-time-rejecting-x-posts-than-writing-replies-23h2</link>
      <guid>https://dev.to/antonships/i-spend-more-time-rejecting-x-posts-than-writing-replies-23h2</guid>
      <description>&lt;p&gt;A pricing conversation, my X analytics and how I decide which posts to answer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI-generated editorial illustration. Selecting a conversation comes before writing a reply.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On 5 October, Vincenzo Nudo asked a question on X that most software customers could answer: would you rather pay monthly, yearly or once? I had a preference, but it wasn’t quite a vote for one of the three. I’ll pay monthly while I’m finding out whether I use an app enough to keep it. A year starts to make sense once I’m relying on it.&lt;/p&gt;

&lt;p&gt;I’m building Sendezeit, a publishing app, so I also read questions like his as someone trying to find customers. X gives me a place to talk about my work and meet other builders, which makes a conversation about software pricing relevant to me. It doesn’t make that conversation a request to hear about my app.&lt;/p&gt;

&lt;p&gt;That distinction matters when I sit down to reply. I want people to discover what I’m building, yet the person whose post I’ve opened usually has something else in mind. Before I can decide what to write, I need to understand what they’re asking and whether I have an answer they might actually want to read. Vincenzo’s question gave me a way in because I could explain my choice as a customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer left room for a conversation
&lt;/h2&gt;

&lt;p&gt;My reply was short enough that there was no need to dress it up:&lt;/p&gt;

&lt;p&gt;“monthly while im figuring out if i actually use it. id only go yearly once its part of my routine”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fspmsmyu7xzoqqo3meb3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fspmsmyu7xzoqqo3meb3g.png" alt="Vincenzo Nudo asks whether people prefer monthly, yearly or one-time SaaS pricing. Anton replies that he pays monthly while testing a tool and switches to yearly once it becomes a routine." width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vincenzo’s pricing question and my reply on 5 October 2026. Screenshot captured on 9 October.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vincenzo called monthly a paid trial and yearly the prize for tools that survived. His response picked up on the hesitation behind my choice: I can like an app before I know whether I’ll still be using it in a few months. We had moved from choosing a payment option to talking about what would make a longer commitment reasonable, without either of us needing to prescribe a pricing strategy.&lt;/p&gt;

&lt;p&gt;A link to Sendezeit wouldn’t have helped explain that hesitation. He hadn’t asked for a publishing tool, and adding one would have given him a different conversation to deal with. I could still be visible as a founder by answering his question. Anyone curious about me could choose to open my profile.&lt;/p&gt;

&lt;p&gt;That is something I want from replying on X, although my analytics can only tell me so much about whether it happens. On 9 October, the four-week view showed 93.8K impressions and 573 profile visits, with 933 followers on the account. Those are account-wide figures covering my posts and replies together. They don’t identify which conversation brought a visit, and 933 is the follower total at capture, not the number gained during those four weeks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fasiuz7g7q9jqrsl6nxhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fasiuz7g7q9jqrsl6nxhe.png" alt="Anton’s real X Analytics four-week overview, from 12 September to 9 October 2026, shows 93.8K impressions, 573 profile visits and a current total of 933 followers." width="800" height="924"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My four-week X Analytics, 12 September–9 October 2026. The account had 933 followers when I captured this screen.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The report gives me a reason to pay attention to what I’m doing on the account, but it can’t turn that pricing exchange into a growth case study. For that, I’d need evidence connecting the reply to what happened afterwards. What the exchange does show is a question I could answer honestly and a response that continued the thought. I can look for those qualities again without promising myself another profile visit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the next question takes more reading
&lt;/h2&gt;

&lt;p&gt;To find another conversation like it, I start with my timeline, saved lists and notifications. They put posts in front of me, but they also show fragments of discussions already underway. If someone in a list has replied to an older post, I need to open that parent before I can tell what their sentence means. Otherwise I’m answering a line that has been separated from the question that produced it.&lt;/p&gt;

&lt;p&gt;Reading the parent can change what I was about to say. A suggestion may already have been tried, a quoted post may explain the disagreement, or another reply may have covered my point. I also check whether I’ve answered the person myself. When our exchange has reached “yeah, fair enough”, seeing it again in the feed isn’t a reason to restart it.&lt;/p&gt;

&lt;p&gt;Since this reading can easily fill a session, I narrow the scan to recent conversations: up to 24 minutes old on my regular timeline and often an hour in my saved lists. Those are working limits for my routine, not timings I’ve proved produce better growth. I use exact timestamps rather than rounded labels, and measure a reply’s age separately from its parent. A new answer to yesterday’s post can still be a current conversation.&lt;/p&gt;

&lt;p&gt;Within that smaller set, I’m looking for a connection I can explain. In Vincenzo’s post, it was the difference between trying an app and depending on it. In a discussion about a product change, I might have a question about how customers responded, provided the thread hasn’t already answered it. That gives the reply something specific to do instead of merely announcing that I agree.&lt;/p&gt;

&lt;p&gt;I read the draft beside the source before sending, because a pleasant sentence can still be irrelevant. If I could paste it under ten unrelated posts, I need to go back to what this person said. Sometimes that produces a better answer, and sometimes it confirms that I don’t have one. Leaving those posts alone keeps me from inventing an experience or manufacturing a question just to take up space.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I brought into Sendezeit
&lt;/h2&gt;

&lt;p&gt;By then, I’ve spent time finding and reading a conversation before writing anything. I wanted Sendezeit to help with that search while leaving the decision to join it with me. Reply Finder lets you request a scan around topics, selected accounts or your connected account’s chronological Following timeline. It returns recent original posts with their age, ranking and a reason they matched, so you have a smaller set to read.&lt;/p&gt;

&lt;p&gt;If you want help with wording, you can request an AI draft and edit it before returning to X to review and send. A scan runs when you ask for it. The feature doesn’t keep polling in the background or send replies automatically. It also finds original posts only, whereas my manual list scans sometimes lead me to people’s replies inside threads. I wouldn’t describe those as the same workflow or use my account analytics as a performance test of the feature.&lt;/p&gt;

&lt;p&gt;That’s the help I want from an AI social media tool: fewer posts to sift through, with enough context to decide which ones deserve a closer look. You can do this manually, too, by starting with a subject you know and reading the exchange before drafting. &lt;a href="https://sendezeit.app/product/x-reply-finder" rel="noopener noreferrer"&gt;Reply Finder in Sendezeit&lt;/a&gt; offers the on-demand scan, and the &lt;a href="https://sendezeit.app/tools/x-reply-timing-checker" rel="noopener noreferrer"&gt;X Reply Timing Checker&lt;/a&gt; can help check the age of a single post.&lt;/p&gt;

&lt;p&gt;Neither changes what made Vincenzo’s question worth answering. I had a preference and could explain when it would change. My product didn’t need to come with me into that conversation, even though finding people who might care about it was one reason I’d opened X.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>socialmedia</category>
      <category>ai</category>
      <category>saas</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Social media API approval: OAuth, review, and publishing</title>
      <dc:creator>Anton Rost</dc:creator>
      <pubDate>Sun, 04 Oct 2026 12:22:58 +0000</pubDate>
      <link>https://dev.to/antonships/social-media-api-approval-oauth-review-and-publishing-392p</link>
      <guid>https://dev.to/antonships/social-media-api-approval-oauth-review-and-publishing-392p</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical guide to separating account access, provider review, media processing, and the result your user actually receives.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5bis07uco76v5w8rpwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5bis07uco76v5w8rpwu.png" alt="Meta's app dashboard shows unfinished review steps beside Google Auth Platform's verified branding and data-access status." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Google OAuth verification and Meta app review were in different states on 27 September 2026. Neither screen establishes YouTube API audit approval or a successful public post. Screenshots by Anton Rost.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A connected account is the beginning of a publishing job, not evidence that the job can be completed. The callback may succeed while the application still lacks provider approval, the selected destination lacks a capability, or an uploaded video remains private.&lt;/p&gt;

&lt;p&gt;While building Sendezeit, I realised that “ready” could mean three different things: an account was connected, the app had provider approval, or a post was actually live. I needed to stop treating those as the same milestone. A more useful approach was to follow the work from authorization to the result the user actually receives, checking what each stage proves before moving to the next.&lt;/p&gt;

&lt;p&gt;The phrase social media approval workflow sometimes describes teammates signing off on content. Here it means the provider-side authorization and review needed to deliver that content; it is not a description of a team-approval feature in Sendezeit.&lt;/p&gt;

&lt;p&gt;The checks below follow the publishing job in order. They start with the connection, then move through the destination, submission, unfinished provider work, and the evidence needed to describe a result honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A reliable publishing path starts with the connection
&lt;/h2&gt;

&lt;p&gt;Before checking a post, make the authorization path unambiguous. The public application URL is where the user works, the OAuth redirect URI receives the browser after consent, and a webhook endpoint receives later provider events without that browser session. These addresses serve different purposes.&lt;/p&gt;

&lt;p&gt;Register the production redirect accurately rather than assuming that a development callback, alternate hostname, or different path will be accepted. The OAuth security best-current-practice document calls for exact redirect matching, with a specific exception for localhost ports in native applications. It also addresses PKCE and protection against authorization-code attacks. &lt;a href="https://www.rfc-editor.org/rfc/rfc9700.html" rel="noopener noreferrer"&gt;RFC 9700&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tie the authorization flow to an expiring server-side record containing the provider, initiating user, and allowed return path. Validate the callback against that record and prevent reuse. Apply the provider's documented PKCE requirements rather than copying one adapter's parameters into every other adapter.&lt;/p&gt;

&lt;p&gt;For example, X's OAuth 2.0 authorization-code flow uses PKCE, and its &lt;code&gt;offline.access&lt;/code&gt; scope enables refresh-token access. A connection that works now does not by itself establish that the application can keep working after the access token expires. &lt;a href="https://docs.x.com/fundamentals/authentication/oauth-2-0/authorization-code" rel="noopener noreferrer"&gt;X authorization documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Keep token exchange and confidential client credentials on the server, protect stored tokens, and keep them out of logs. Test expiry, revocation, and disconnection alongside the successful path. Once access is established, the next check is where that access can actually be used.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Access must lead to a specific destination and capability
&lt;/h2&gt;

&lt;p&gt;The person granting consent may manage several Pages or channels. Discover the destinations permitted by the grant and make the selected destination visible before submission. Otherwise, a successful connection can hide uncertainty about where the post will go.&lt;/p&gt;

&lt;p&gt;Record the stable provider identifier, relevant granted permissions, and capability restrictions for that destination. Test the account type and login route you intend to support: one working professional account is not evidence of support for every account type.&lt;/p&gt;

&lt;p&gt;A connection screen should therefore answer both “Which account is this?” and “What can the application do with it?” Leaving the second question unanswered pushes the discovery of restrictions into the publishing flow, after the user has already prepared their content.&lt;/p&gt;

&lt;p&gt;With a destination and usable capability identified, the application can record a publishing attempt without confusing that attempt with its eventual result.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Submission records the attempt, not necessarily publication
&lt;/h2&gt;

&lt;p&gt;Create the local attempt before making the external write. Link it to the reviewed content version, destination, media, and requested visibility, then retain the provider's response and identifiers when they arrive. This gives later status checks a specific job to reconcile.&lt;/p&gt;

&lt;p&gt;In the Sendezeit code checked for this article, a submission returns &lt;code&gt;accepted&lt;/code&gt; or &lt;code&gt;published&lt;/code&gt;. Subsequent provider checks use &lt;code&gt;processing&lt;/code&gt;, &lt;code&gt;published&lt;/code&gt;, &lt;code&gt;needs_action&lt;/code&gt;, or &lt;code&gt;failed&lt;/code&gt;. The content lifecycle is a separate layer, with states such as &lt;code&gt;scheduled&lt;/code&gt; and &lt;code&gt;publishing&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Those names are implementation labels, not interchangeable proofs. An identifier may establish that a provider knows about the job without establishing that an ordinary viewer can see the content. The YouTube adapter's processing-complete result, in particular, is not an independent public-visibility check.&lt;/p&gt;

&lt;p&gt;Keep requested visibility, reported provider status, and verified audience access as separate observations. Public, unlisted, and private are not one successful-upload category: an unlisted video can be accessible by link without being publicly discoverable. The next step is to determine what remains unfinished for the particular provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The remaining work depends on the provider and mode
&lt;/h2&gt;

&lt;p&gt;TikTok's Upload Content flow makes this visible through &lt;code&gt;SEND_TO_USER_INBOX&lt;/code&gt;. That status leaves the creator with a native step to complete; &lt;code&gt;PUBLISH_COMPLETE&lt;/code&gt; is a later outcome. Publicly available post identifiers also depend on the documented public-viewership and moderation conditions. &lt;a href="https://developers.tiktok.com/docs/en/content-posting-api-reference-get-video-status" rel="noopener noreferrer"&gt;TikTok status reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An inbox handoff should not silently replace direct publishing because the two modes leave the user with different work. Provider approval matters here too: unaudited TikTok Direct Post clients are restricted to private viewing. Implementing the adapter does not remove that restriction. &lt;a href="https://developers.tiktok.com/docs/en/content-posting-api-get-started" rel="noopener noreferrer"&gt;TikTok Direct Post setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The capture below establishes an earlier stage, not either completed outcome. It shows an unconnected preview and a disabled draft button. Its caption needs to respect that boundary just as the product's status message does.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2anih0c57xakxveamysv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2anih0c57xakxveamysv.png" alt="TikTok implementation notes beside an unconnected Sendezeit composer labelled Preview only and Not published, with Create draft disabled." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This 27 September capture shows an unconnected preview with a disabled draft button, not a delivered draft. Screenshots by Anton Rost.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;YouTube has a different sequence. The upload response may arrive before video processing finishes, so processing status must be checked separately. &lt;a href="https://developers.google.com/youtube/v3/guides/implementation/videos" rel="noopener noreferrer"&gt;YouTube video implementation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Google OAuth verification also differs from the YouTube API compliance audit. YouTube documents private-viewing restrictions for uploads from unverified API projects created after 28 July 2020, with an audit required to lift them. The verified consent-screen capture at the start of this article is not evidence that this audit passed. &lt;a href="https://developers.google.com/youtube/v3/docs/videos/insert" rel="noopener noreferrer"&gt;YouTube upload reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These intermediate stages make a missing response especially important to handle carefully. The absence of a result in the application is not always evidence that the provider did nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. An uncertain outcome needs reconciliation before a retry
&lt;/h2&gt;

&lt;p&gt;A timeout can leave the provider's write completed while the application lacks its response. Repeating every failed-looking request risks creating duplicate posts, so preserve the uncertain attempt instead of immediately treating it as a failed publication.&lt;/p&gt;

&lt;p&gt;Use a stable local attempt identity, without assuming that every provider honours a client-supplied idempotency key. Reconcile through the documented status endpoint, returned identifiers, or destination checks before deciding whether another write is safe.&lt;/p&gt;

&lt;p&gt;Webhooks and polling can provide overlapping evidence about the same attempt. Follow the provider's signature, event, and replay rules rather than applying a universal signature recipe. Processing the same evidence twice should not create another publication or count another success.&lt;/p&gt;

&lt;p&gt;If reconciliation is impossible, explain the uncertainty and offer a controlled next step. “Needs checking” is more useful than a confident success badge attached to a possible duplicate. Once individual attempts can be tracked this way, the release decision still needs a broader check: whether the path is available to the customers who will use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A founder's successful test is not the release decision
&lt;/h2&gt;

&lt;p&gt;A provider may allow a founder or administrator to do something an ordinary external account cannot. Working code and a successful test therefore need to sit alongside production configuration, provider approval, and account-specific evidence.&lt;/p&gt;

&lt;p&gt;The September captures show different dashboard states, not a completed availability audit. I use these five questions to keep that distinction visible:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Evidence to retain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is the adapter implemented?&lt;/td&gt;
&lt;td&gt;The supported path in code and its tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is production configured?&lt;/td&gt;
&lt;td&gt;The correct app identity, redirect, scopes, and mode.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is required access approved?&lt;/td&gt;
&lt;td&gt;The provider's approval or audit record for that capability.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can an ordinary external account use it?&lt;/td&gt;
&lt;td&gt;A dated test outside the founder/admin role.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Did the intended result happen?&lt;/td&gt;
&lt;td&gt;Provider status, actual visibility, destination, and result identifier or URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a checklist, not a claim that every Sendezeit destination passes all five checks. Name the account type, requested mode, observed result, and date in the release record. That prevents an old administrator test from becoming a broad promise about current customer access.&lt;/p&gt;

&lt;p&gt;Prepare the reviewer journey from the real product: a stable entry point, reproducible credentials where requested, reasons for each permission, and a recording of the supported path. Privacy, retention, disconnection, and deletion information should match the application.&lt;/p&gt;

&lt;p&gt;A release record built around these checks gives the interface a sounder basis for its final message. It can describe the stage reached without borrowing certainty from an earlier milestone.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Tell the user which part of the job actually finished
&lt;/h2&gt;

&lt;p&gt;Before showing success, check the destination and content version, processing status, actual visibility, and any remaining native step. Retain the result identifier or URL where available, together with the verification time. A URL alone is not a visibility test.&lt;/p&gt;

&lt;p&gt;If authorization is all that completed, say connected. If the provider accepted an upload, say accepted or processing. If the creator must finish in the native app, make that step explicit. Reserve a public-access claim for evidence of public access.&lt;/p&gt;

&lt;p&gt;Following the job in this order prevents the earliest green checkmark from standing in for the last. A social publishing platform should save the user from decoding several provider dashboards without hiding the differences between them.&lt;/p&gt;

&lt;p&gt;I am building &lt;a href="https://sendezeit.app/" rel="noopener noreferrer"&gt;Sendezeit&lt;/a&gt; around that separation. This guide describes the implementation and review approach, not a guarantee that every provider is approved for every account or publishing mode.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Implementation checked and linked documentation reviewed on 3 October 2026. Screenshots record 27 September 2026; provider requirements and account access can change.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>oauth</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Had Plenty of Content Ideas and Almost Nothing Published</title>
      <dc:creator>Anton Rost</dc:creator>
      <pubDate>Tue, 29 Sep 2026 08:51:18 +0000</pubDate>
      <link>https://dev.to/antonships/i-had-plenty-of-content-ideas-and-almost-nothing-published-2a0o</link>
      <guid>https://dev.to/antonships/i-had-plenty-of-content-ideas-and-almost-nothing-published-2a0o</guid>
      <description>&lt;p&gt;I made separate Instagram and YouTube upload documents for the same Pocket Orbit videos.&lt;/p&gt;

&lt;p&gt;They were supposed to stay in sync, which sounds perfectly reasonable until two files have had a few months to develop independent lives.&lt;/p&gt;

&lt;p&gt;When I opened them again, the lists no longer matched. The Instagram document contained entries the YouTube one did not, and one of its rows still carried a YouTube tracking link. The calendar held yet another version of the week, although a row could mean planned, drafted, scheduled, attempted, or actually public depending on when I last remembered to update it.&lt;/p&gt;

&lt;p&gt;One source library. Two upload documents. Several answers to what existed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqseclqi0t55tpkqcyxe2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqseclqi0t55tpkqcyxe2.webp" alt="Obsidian showing the original Pocket Orbit Instagram and YouTube upload playbooks side by side. The Instagram file says it covers the same 19 videos as the YouTube file." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same source library ended up with two separate upload playbooks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Screenshots: Anton Rost. Source: original Pocket Orbit upload playbooks opened in Obsidian, 20 September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I blamed the documents first. Then I followed one post through the rest of the workflow and found the same drift in the calendar, the exports, and the upload state.&lt;/p&gt;

&lt;p&gt;I could decide what to make. Getting the right version all the way to a public URL still depended on my memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  I kept fixing the research because it was easier
&lt;/h2&gt;

&lt;p&gt;The research system was genuinely useful. It started with phrases people were already searching around iPad notes, Apple Pencil workflows, lecture notes, handwriting, organisation, summaries, exports, and study methods.&lt;/p&gt;

&lt;p&gt;I kept a knowledge base behind those phrases because I did not want a search term to turn straight into a confident answer I could not support. A query could be popular and still need better evidence, fall outside Pocket Orbit, or require review from somebody who actually spoke the language.&lt;/p&gt;

&lt;p&gt;By then, the registry had grown into hundreds of search queries. A much smaller set had enough evidence to move into production.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Ready&lt;/code&gt; still only meant I could start making the thing.&lt;/p&gt;

&lt;p&gt;So I kept returning to the registry. Cleaning another row felt manageable. Finishing, adapting, and publishing the work attached to it did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I counted the finished work
&lt;/h2&gt;

&lt;p&gt;There were three completed carousels.&lt;/p&gt;

&lt;p&gt;Each one had five slides: a hook based on the search query, three useful answer slides, and one action at the end. Pocket Orbit could appear once when it genuinely helped with the answer.&lt;/p&gt;

&lt;p&gt;Those fifteen finished slides still required visual research, copy, real product screens, claim checks, layout, exports, and upload preparation.&lt;/p&gt;

&lt;p&gt;Clearing the research check only put a topic at the start of production. It still needed a script, visuals, exports, and a version for each platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3oj7azgjwrt80ugvls5h.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3oj7azgjwrt80ugvls5h.webp" alt="The original Pocket Orbit query production registry open in Obsidian beside the live @antonships.app TikTok profile and its published carousel grid." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The registry kept growing. The smaller grid on the right is what actually made it live.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Screenshots: Anton Rost. Sources: Pocket Orbit query production registry in Obsidian and &lt;a class="mentioned-user" href="https://dev.to/antonships"&gt;@antonships&lt;/a&gt;.app on TikTok, 20 September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Every file remembered a different version
&lt;/h2&gt;

&lt;p&gt;One recording could become a TikTok edit, an Instagram caption, a YouTube title and description, sometimes a Facebook version, and a few notes about what I wanted to change later.&lt;/p&gt;

&lt;p&gt;Updating one version did not update the others. Moving a date in the &lt;a href="https://sendezeit.app/product/social-media-calendar" rel="noopener noreferrer"&gt;calendar&lt;/a&gt; did not prove the file was ready. A successful upload did not necessarily mean somebody else could see the post.&lt;/p&gt;

&lt;p&gt;Planned, scheduled, attempted, and public were quietly becoming the same state.&lt;/p&gt;

&lt;p&gt;The calendar looked organised because Tuesday had a row. It still could not tell me what had actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  I was reusing the wrong thing
&lt;/h2&gt;

&lt;p&gt;I had treated the final caption as the reusable unit. It should have been the real source underneath it.&lt;/p&gt;

&lt;p&gt;That source might be a Pocket Orbit feature, a TikTok result, a paywall failure, or something I noticed while building after work. The event and its evidence should remain stable while the presentation changes for each destination.&lt;/p&gt;

&lt;p&gt;On X, I can explain the reasoning. On TikTok, the useful visual has to arrive almost immediately. Instagram may use similar footage but still needs its own framing. YouTube needs another title, description, thumbnail, and link setup.&lt;/p&gt;

&lt;p&gt;Copying one finished caption into every box was quick, but it flattened the idea into a version that fit nowhere particularly well.&lt;/p&gt;

&lt;p&gt;The workflow I needed was simple enough to explain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;One real source&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versions for each platform&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check what really went live&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I was still the only thing keeping those pieces connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  That became Sendezeit
&lt;/h2&gt;

&lt;p&gt;Sendezeit starts with something that actually happened, then keeps the &lt;a href="https://sendezeit.app/product/adapt" rel="noopener noreferrer"&gt;destination versions&lt;/a&gt;, edits, approvals, calendar entries, and &lt;a href="https://sendezeit.app/product/publish" rel="noopener noreferrer"&gt;provider results&lt;/a&gt; attached to that source.&lt;/p&gt;

&lt;p&gt;It does not fix the Pocket Orbit paywall or explain why somebody watched a TikTok and did not subscribe. Those questions still belong in the product, RevenueCat, and the analytics.&lt;/p&gt;

&lt;p&gt;Sendezeit cuts out that weekly scavenger hunt. One source sits beside its X, TikTok, and YouTube versions. Each one keeps its own copy, media, review, schedule, and final publication result. I no longer have to remember which draft was final, reopen every platform to check it, or compare a calendar with a folder full of exports.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5idxzjzl14c1z8i0lws.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5idxzjzl14c1z8i0lws.webp" alt="The live Sendezeit composer showing one source attached to separate X, TikTok, and YouTube drafts, with the YouTube preview open." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The replacement: one source, separate destination drafts, and the publishing state kept together.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Screenshot: Anton Rost. Source: live Sendezeit workspace, 20 September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can run the same method in a spreadsheet: keep one source, write each platform version separately, review it, and record the public result beside the plan. I built Sendezeit because I was tired of maintaining those joins myself.&lt;/p&gt;

&lt;p&gt;I had spent most of my time improving research because it was easy to organise. Meanwhile, I kept losing time at the other end, working out which version went where and whether it really went live. That gave me one clear requirement for the product: keep a reliable record of what I published.&lt;/p&gt;

&lt;p&gt;Sendezeit is live now. &lt;a href="https://sendezeit.app/integrations/x-twitter" rel="noopener noreferrer"&gt;X&lt;/a&gt; and &lt;a href="https://sendezeit.app/integrations/youtube" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; have passed real-connection and provider-confirmed publishing checks. &lt;a href="https://sendezeit.app/integrations/tiktok" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt; uses Direct Post when the account is eligible or an explicit draft handoff when it is not. Instagram and Facebook stay labelled coming soon while Meta review finishes.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>saas</category>
      <category>socialmedia</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
