<?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: Aditya Singh</title>
    <description>The latest articles on DEV Community by Aditya Singh (@itsadityasingh).</description>
    <link>https://dev.to/itsadityasingh</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%2F4155671%2F1896d69b-4d73-460e-817b-97b836f09f1e.png</url>
      <title>DEV Community: Aditya Singh</title>
      <link>https://dev.to/itsadityasingh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itsadityasingh"/>
    <language>en</language>
    <item>
      <title>too lazy to post too obsessed with building so built slothgram, one Dev one Post🦥</title>
      <dc:creator>Aditya Singh</dc:creator>
      <pubDate>Sun, 25 Oct 2026 06:29:10 +0000</pubDate>
      <link>https://dev.to/itsadityasingh/too-lazy-to-post-too-obsessed-with-building-so-built-slothgram-one-dev-one-psot-492a</link>
      <guid>https://dev.to/itsadityasingh/too-lazy-to-post-too-obsessed-with-building-so-built-slothgram-one-dev-one-psot-492a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Slothgram: ONE DEV ONE POST.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You ship something, then open four tabs, rewrite the same update four times, pick hashtags, and publish one platform at a time. Slothgram turns that into one step: write the update once, get a separate version for each destination (X, LinkedIn, DEV.to, GitHub), edit each version, and publish them as independent jobs.&lt;/p&gt;

&lt;p&gt;It's for developers, students and open-source contributors who would rather build than post. The "lazy" part is deliberate. You get less repetitive writing, but you still approve every post before it goes anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://claude.ai/artifact/4xB9hQ1caPYRogVi2NNdD3" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;claude.ai&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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%2Fwk650q8klb1os9wk1d2k.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%2Fwk650q8klb1os9wk1d2k.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo runs in your browser in a clearly labeled &lt;strong&gt;demo mode&lt;/strong&gt;. You can write a post, choose destinations, get an editable version per destination with character-limit checks, confirm, and watch simulated publishing, including a failed destination you can retry without touching the ones that succeeded. Nothing is really published, and the page never claims otherwise. The connection indicators are all red because no real platform is connected.&lt;/p&gt;

&lt;p&gt;The browser demo adapts text with simple rules. The open-weight model step lives in the backend (see below).&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/its-adityasingh" rel="noopener noreferrer"&gt;
        its-adityasingh
      &lt;/a&gt; / &lt;a href="https://github.com/its-adityasingh/Slothgram" rel="noopener noreferrer"&gt;
        Slothgram
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Slothgram: ONE DEV ONE POST&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Write once, adapt, and publish to developer communities. Publishing runs on &lt;strong&gt;Temporal&lt;/strong&gt;, so every
destination is a durable, retryable, independent job.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Project layout&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;slothgram/
  frontend/index.html       landing page + browser demo (open it in a browser, no build step)
  backend/slothgram/        ai.py, workflows.py, activities.py, adapters.py, client.py, worker.py, cli.py
  backend/tests/            24 tests
  docker-compose.yml        local Temporal server
  .env.example, LICENSE (MIT)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Temporal&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;How it is done&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One job per destination&lt;/td&gt;
&lt;td&gt;One &lt;code&gt;PublishDestinationWorkflow&lt;/code&gt; per destination. One failure never touches another.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User must approve first&lt;/td&gt;
&lt;td&gt;Workflow waits for the &lt;code&gt;approve&lt;/code&gt; signal (7 day timeout, then canceled).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule after confirmation&lt;/td&gt;
&lt;td&gt;After approval, a durable timer waits until &lt;code&gt;scheduled_at&lt;/code&gt;. &lt;code&gt;cancel&lt;/code&gt; interrupts it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retries with backoff&lt;/td&gt;
&lt;td&gt;Activity &lt;code&gt;RetryPolicy&lt;/code&gt;: 2s start, x2, max 2 min, 5 attempts. Rate limits use &lt;code&gt;next_retry_delay&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No duplicate posts&lt;/td&gt;
&lt;td&gt;Idempotency key = hash(user, post, destination, content). Workflow ID is derived from it with &lt;code&gt;REJECT_DUPLICATE&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/its-adityasingh/Slothgram" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Open-weight AI (local inference).&lt;/strong&gt; The backend sends the post to a model running on your own machine through an Ollama-compatible server. The default is &lt;code&gt;qwen2.5:7b-instruct&lt;/code&gt;, and you can switch to another instruct model such as &lt;code&gt;gemma3:4b&lt;/code&gt; by changing one setting. The model returns JSON-schema-constrained output: a variant per destination with title, text, hashtags, link handling, an explanation and warnings.&lt;/p&gt;

&lt;p&gt;The model only proposes text. Deterministic code checks everything it returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exactly one variant per destination&lt;/li&gt;
&lt;li&gt;each platform's character limits&lt;/li&gt;
&lt;li&gt;the link is still present&lt;/li&gt;
&lt;li&gt;hashtag counts are capped&lt;/li&gt;
&lt;li&gt;a warning appears for any number that wasn't in the original post, so invented metrics get flagged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post is sent as delimited untrusted data, so instructions hidden inside it are not followed. The AI module has no publishing credentials and no way to publish. If the server is down or the model isn't installed, you get the exact fix (for example &lt;code&gt;ollama pull qwen2.5:7b-instruct&lt;/code&gt;). Malformed output is retried once, then fails with a clear message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reliable publishing with Temporal.&lt;/strong&gt; Each destination is its own durable workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nothing sends until an explicit approval signal arrives. Scheduled posts then wait on a durable timer.&lt;/li&gt;
&lt;li&gt;One destination failing never affects another.&lt;/li&gt;
&lt;li&gt;Failures that never reached the platform retry with exponential backoff, up to 5 attempts.&lt;/li&gt;
&lt;li&gt;Job IDs come from a hash of user, post, destination and content, so resubmitting the same content never starts a duplicate. Retry only re-runs destinations that actually failed.&lt;/li&gt;
&lt;li&gt;If a request may have landed but the response was lost, the job moves to &lt;code&gt;needs_review&lt;/code&gt; instead of being retried automatically.&lt;/li&gt;
&lt;li&gt;Demo results are always marked simulated and carry no URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a DEV.to adapter that creates &lt;strong&gt;drafts&lt;/strong&gt; through the official API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python, Temporal, httpx, Pydantic. 24 tests pass, with the workflow tests running against a local Temporal dev server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest status&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Done: Temporal workflows, demo adapter, Ollama module and CLI, DEV.to draft adapter.&lt;/li&gt;
&lt;li&gt;Tested with mocked HTTP only: the DEV.to adapter and the Ollama module.&lt;/li&gt;
&lt;li&gt;Not built yet: X, LinkedIn and GitHub adapters (they need official API access), the FastAPI layer, a database, authentication, and a settings screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;A tool that reads your unpublished work and writes in your voice shouldn't have to send that text to someone else's server. With an open-weight model on local inference, your drafts stay on your machine, you can swap models without rewriting the app, and there's no account or per-token bill. A closed API would have made the privacy story a promise instead of a design. Temporal being open source also means the publishing engine can be self-hosted and inspected, which matters for software that holds API keys and posts on your behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Temporal&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
