<?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>Forem: Twisted-Code'r</title>
    <description>The latest articles on Forem by Twisted-Code'r (@jeffrin-dev).</description>
    <link>https://forem.com/jeffrin-dev</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%2F3817901%2F6517f8eb-a101-4823-9acb-d0ce98eaa1ff.jpg</url>
      <title>Forem: Twisted-Code'r</title>
      <link>https://forem.com/jeffrin-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jeffrin-dev"/>
    <language>en</language>
    <item>
      <title>Free for PUBLIC REPOS in Github</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Tue, 12 May 2026 16:27:43 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/free-for-public-repos-in-github-4b6</link>
      <guid>https://forem.com/jeffrin-dev/free-for-public-repos-in-github-4b6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom" class="crayons-story__hidden-navigation-link"&gt;I Built a GitHub App That Catches AI and Cloud Security Mistakes Automatically — In 4 Days, Zero Budget&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jeffrin-dev" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817901%2F6517f8eb-a101-4823-9acb-d0ce98eaa1ff.jpg" alt="jeffrin-dev profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffrin-dev" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Twisted-Code'r
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Twisted-Code'r
                
              
              &lt;div id="story-author-preview-content-3631834" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jeffrin-dev" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817901%2F6517f8eb-a101-4823-9acb-d0ce98eaa1ff.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Twisted-Code'r&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom" id="article-link-3631834"&gt;
          I Built a GitHub App That Catches AI and Cloud Security Mistakes Automatically — In 4 Days, Zero Budget
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>automation</category>
      <category>github</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built a GitHub App That Catches AI and Cloud Security Mistakes Automatically — In 4 Days, Zero Budget</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Fri, 08 May 2026 08:00:04 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom</link>
      <guid>https://forem.com/jeffrin-dev/i-built-a-github-bot-that-catches-ai-and-cloud-security-mistakes-automatically-in-4-days-zero-1pom</guid>
      <description>&lt;p&gt;Four days ago I had an idea. Today it's live, catching real security issues in real pull requests.&lt;/p&gt;

&lt;p&gt;This is the story of how I built VrothSec — a GitHub App that automatically reviews every PR for AI and cloud security mistakes — with no money, no team, and no prior experience shipping a SaaS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most security tools were built before AI apps existed.&lt;/p&gt;

&lt;p&gt;They don't know what an exposed OpenAI key looks like. They don't flag overpermissioned IAM roles. They don't catch unprotected model endpoints or prompt injection risks through retrieval chains.&lt;/p&gt;

&lt;p&gt;A developer in the comments of my build-in-public post put it better than I could:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The real risk usually is not just leaked keys. It is model endpoints with no auth or rate limits, overly broad IAM on storage and inference paths, prompt injection exposure through retrieval and tool use, logging sensitive prompts into places they should never land."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly what existing tools miss. That's the gap VrothSec fills.&lt;/p&gt;




&lt;h2&gt;
  
  
  What VrothSec Catches
&lt;/h2&gt;

&lt;p&gt;Install it on your repo. It runs automatically on every PR and flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔴 &lt;strong&gt;Hardcoded API keys&lt;/strong&gt; — OpenAI, Anthropic, AWS, GCP credentials committed in code&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;Unsafe S3 configs&lt;/strong&gt; — buckets set to public-read&lt;/li&gt;
&lt;li&gt;🟠 &lt;strong&gt;Missing rate limiting&lt;/strong&gt; on AI inference endpoints&lt;/li&gt;
&lt;li&gt;🟠 &lt;strong&gt;Overpermissioned IAM&lt;/strong&gt; roles on storage and inference paths&lt;/li&gt;
&lt;li&gt;🟡 &lt;strong&gt;Prompt injection risks&lt;/strong&gt; through retrieval chains and tool use&lt;/li&gt;
&lt;li&gt;🟡 &lt;strong&gt;Sensitive prompt logging&lt;/strong&gt; — outputs written to places they should never land&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a real example of what it posted on one of my test PRs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔒 Cloud Security Review

🔴 Critical — cloud_config.py, Line 5
Hardcoded AWS Access Key detected.
Fix: Use environment variables or AWS IAM roles.

🔴 Critical — cloud_config.py, Line 9
Hardcoded OpenAI API key detected.
Fix: Use environment variables or a secrets manager.

🟠 High — cloud_config.py, Line 13
S3 bucket set to public-read.
Fix: Remove ACL='public-read' and restrict with IAM policies.

🟡 Medium — cloud_config.py, Line 18
No rate limiting on AI inference endpoint.
Fix: Add rate limiting to prevent abuse.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;File. Line number. Issue. Fix. No manual review needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Probot&lt;/strong&gt; — GitHub App framework (Node.js)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini 2.5 Flash Lite&lt;/strong&gt; — free tier, 1500 requests/day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; — free hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub API&lt;/strong&gt; — stores subscriber data in a private repo (no database needed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paddle&lt;/strong&gt; — handles subscriptions and billing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost to build and run: &lt;strong&gt;$0&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hardest Part
&lt;/h2&gt;

&lt;p&gt;Not the code.&lt;/p&gt;

&lt;p&gt;The hardest part was figuring out the payment logic. Specifically: how do you gate a GitHub App by subscription without a database, without a backend, without any infrastructure?&lt;/p&gt;

&lt;p&gt;My solution: store paying customers as installation IDs in a &lt;code&gt;subscribers.json&lt;/code&gt; file in a private GitHub repo. When a PR opens, the app checks the file. If the installation ID is there — scan. If not — post a subscription prompt.&lt;/p&gt;

&lt;p&gt;No database. No server. No maintenance. Just a JSON file and the GitHub API.&lt;/p&gt;

&lt;p&gt;When someone pays, the Paddle webhook fires and writes their installation ID to the file automatically. Zero manual intervention.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Business Model
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free for public repos.&lt;/strong&gt; Open source projects get full security scanning at no cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$15/month for private repos.&lt;/strong&gt; That's the founding member price — locked in forever for the first 10 subscribers.&lt;/p&gt;

&lt;p&gt;The logic: developers building commercial AI products on private repos are the ones with the most to lose from a security breach. One exposed key can cost thousands. $15/month is nothing compared to that.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Ship before you're ready.&lt;/strong&gt; I posted about this on Indie Hackers on Day 1 before writing a single line of code. The comments I got shaped what I built. The positioning feedback, the security failure modes I hadn't thought of — all came from sharing early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The wedge matters.&lt;/strong&gt; "GitHub bot" is a distribution frame, not a product frame. VrothSec is security infrastructure for AI shipping workflows. The name and positioning need to reflect that as it grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free tools are enough.&lt;/strong&gt; Gemini free tier, Render free tier, GitHub free tier. You don't need money to build and launch a real product in 2026.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;GitHub Marketplace submission&lt;/li&gt;
&lt;li&gt;Paddle webhook integration for automated activation&lt;/li&gt;
&lt;li&gt;More detection rules — model endpoint exposure, insecure deserialization in ML pipelines, secrets in Dockerfiles&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VrothSec is free for public repos.&lt;/strong&gt; Install it in 30 seconds:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/apps/vrothsec" rel="noopener noreferrer"&gt;github.com/apps/vrothsec&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For private repos: &lt;a href="https://jeffrin-dev.github.io/VrothSec-site/" rel="noopener noreferrer"&gt;vrothsec.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Founding member spots: 10 available at $15/month, locked in forever.&lt;/p&gt;




&lt;p&gt;If you build on AWS or use AI APIs in your stack — this is built for you.&lt;/p&gt;

&lt;p&gt;Questions, feedback, or roasting welcome in the comments.&lt;/p&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>security</category>
      <category>cloud</category>
    </item>
    <item>
      <title>I built a free open-source LocalStack alternative in Go — v0.7.0 is out</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Thu, 07 May 2026 09:48:36 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-built-a-free-open-source-localstack-alternative-in-go-v070-is-out-3iae</link>
      <guid>https://forem.com/jeffrin-dev/i-built-a-free-open-source-localstack-alternative-in-go-v070-is-out-3iae</guid>
      <description>&lt;h2&gt;
  
  
  CloudDev v0.7.0 is live 🚀
&lt;/h2&gt;

&lt;p&gt;CloudDev is a free, open-source local AWS emulator built in Go — a self-hosted alternative to LocalStack. No Docker, no Python, no Java. Just a single binary.&lt;/p&gt;

&lt;p&gt;Today I'm releasing v0.7.0 with 6 new AWS services, bringing the total to &lt;strong&gt;43 emulated services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Jeffrin-dev/CloudDev" rel="noopener noreferrer"&gt;github.com/Jeffrin-dev/CloudDev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;LocalStack is great — but the free tier is limited and the pro tier is expensive. I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works completely offline&lt;/li&gt;
&lt;li&gt;Has zero runtime dependencies&lt;/li&gt;
&lt;li&gt;Is free forever, for everyone&lt;/li&gt;
&lt;li&gt;Is open source and hackable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built CloudDev.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's new in v0.7.0
&lt;/h2&gt;

&lt;p&gt;This release focuses on compute infrastructure, managed data services, and developer tooling — the services that make CloudDev viable for real-world application stacks beyond serverless.&lt;/p&gt;

&lt;h3&gt;
  
  
  EC2 (port 4600)
&lt;/h3&gt;

&lt;p&gt;Instance lifecycle, AMIs, key pairs, and security groups.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4600 ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-00000001 &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t2.micro &lt;span class="nt"&gt;--key-name&lt;/span&gt; mykey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RDS (port 4601)
&lt;/h3&gt;

&lt;p&gt;DB instances, snapshots, and parameter groups. PostgreSQL and MySQL supported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4601 rds create-db-instance &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--db-instance-identifier&lt;/span&gt; mydb &lt;span class="nt"&gt;--db-instance-class&lt;/span&gt; db.t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--engine&lt;/span&gt; postgres &lt;span class="nt"&gt;--master-username&lt;/span&gt; admin &lt;span class="nt"&gt;--db-name&lt;/span&gt; mydb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OpenSearch (port 4602)
&lt;/h3&gt;

&lt;p&gt;Domain management and tag support.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws opensearch create-domain &lt;span class="nt"&gt;--domain-name&lt;/span&gt; mydomain &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--engine-version&lt;/span&gt; OpenSearch_2.3 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4602
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MSK — Managed Kafka (port 4603)
&lt;/h3&gt;

&lt;p&gt;Cluster management with realistic bootstrap broker endpoints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws kafka create-cluster &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; mycluster &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--number-of-broker-nodes&lt;/span&gt; 2 &lt;span class="nt"&gt;--kafka-version&lt;/span&gt; 3.4.0 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--broker-node-group-info&lt;/span&gt; &lt;span class="nv"&gt;InstanceType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kafka.m5.large,ClientSubnets&lt;span class="o"&gt;=&lt;/span&gt;subnet-1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4603
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CodePipeline (port 4604)
&lt;/h3&gt;

&lt;p&gt;Full pipeline lifecycle with execution tracking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws codepipeline start-pipeline-execution &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; mypipeline &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4604
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WAF (port 4605)
&lt;/h3&gt;

&lt;p&gt;Web ACLs, rule groups, and resource associations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws wafv2 create-web-acl &lt;span class="nt"&gt;--name&lt;/span&gt; myacl &lt;span class="nt"&gt;--scope&lt;/span&gt; REGIONAL &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--default-action&lt;/span&gt; &lt;span class="nv"&gt;Allow&lt;/span&gt;&lt;span class="o"&gt;={}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--visibility-config&lt;/span&gt; &lt;span class="nv"&gt;SampledRequestsEnabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;,CloudWatchMetricsEnabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;,MetricName&lt;span class="o"&gt;=&lt;/span&gt;myacl &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt; http://localhost:4605
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jeffrin-dev/CloudDev.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CloudDev
go build &lt;span class="nt"&gt;-o&lt;/span&gt; clouddev &lt;span class="nb"&gt;.&lt;/span&gt;
./clouddev init my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
../clouddev up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. All 43 services start instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full service list
&lt;/h2&gt;

&lt;p&gt;43 services: S3, DynamoDB, DynamoDB Streams, Lambda, Lambda Layers, Lambda Function URLs, SQS (+ FIFO), SNS, API Gateway, API Gateway v2, IAM, STS, KMS, CloudFormation, Step Functions, EventBridge, CloudWatch Events, Secrets Manager, CloudWatch Logs, CloudWatch Metrics, ElastiCache, Cognito, X-Ray, Route53, SSM Parameter Store, Rekognition, SES, Bedrock, Kinesis Data Streams, Kinesis Firehose, ECS, ECR, CloudFront, AppSync, Athena, ACM, EC2, RDS, OpenSearch, MSK, CodePipeline, WAF, and Dashboard.&lt;/p&gt;




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

&lt;p&gt;I'm focused on stability and community feedback for now. If there's a service you need, open an issue on GitHub!&lt;/p&gt;

&lt;p&gt;⭐ If CloudDev saves you time or money, a star on GitHub goes a long way.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Jeffrin-dev/CloudDev" rel="noopener noreferrer"&gt;github.com/Jeffrin-dev/CloudDev&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Built for Devs · Apache 2.0&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>go</category>
      <category>aws</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I built a free LocalStack alternative in Go — v0.6.0 is out with 37 AWS services</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Wed, 06 May 2026 05:35:48 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-built-a-free-localstack-alternative-in-go-v060-is-out-with-37-aws-services-3mgp</link>
      <guid>https://forem.com/jeffrin-dev/i-built-a-free-localstack-alternative-in-go-v060-is-out-with-37-aws-services-3mgp</guid>
      <description>&lt;p&gt;&lt;strong&gt;So&lt;/strong&gt; I've been working on this project called &lt;strong&gt;CloudDev&lt;/strong&gt; for a while now. It's basically a local AWS emulator — think LocalStack but free, open source, and a single Go binary with zero dependencies.&lt;/p&gt;

&lt;p&gt;I just shipped v0.6.0 and wanted to share what's new.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;Honestly? LocalStack's free tier kept getting more and more limited. Every time I needed a service it was "pro only". I just wanted to test my AWS code locally without spinning up real infrastructure or paying for a subscription.&lt;/p&gt;

&lt;p&gt;So I started building CloudDev. The goal was simple — emulate the AWS services I actually use, make it work with the existing AWS CLI and SDKs without any config changes, and keep it as a single binary I can just run anywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's new in v0.6.0
&lt;/h2&gt;

&lt;p&gt;This release was focused on infrastructure completeness. I added 8 new services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; — shards, records, iterators, the whole thing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kinesis Firehose&lt;/strong&gt; — delivery streams, PutRecord, PutRecordBatch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECS&lt;/strong&gt; — clusters, task definitions, run/stop tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECR&lt;/strong&gt; — repositories, image push/pull, auth token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudFront&lt;/strong&gt; — distributions, origins, invalidations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppSync&lt;/strong&gt; — GraphQL APIs, data sources, schema upload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Athena&lt;/strong&gt; — query execution, results, named queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACM&lt;/strong&gt; — certificates, tags, mock PEM output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That brings the total to &lt;strong&gt;37 AWS services&lt;/strong&gt; across 47 modules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jeffrin-dev/CloudDev.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CloudDev
go build &lt;span class="nt"&gt;-o&lt;/span&gt; clouddev &lt;span class="nb"&gt;.&lt;/span&gt;

./clouddev init my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
../clouddev up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. All 37 services start up immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Some examples
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Kinesis&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4568 kinesis create-stream &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stream-name&lt;/span&gt; my-stream &lt;span class="nt"&gt;--shard-count&lt;/span&gt; 2

aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4568 kinesis put-record &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stream-name&lt;/span&gt; my-stream &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="nt"&gt;--partition-key&lt;/span&gt; &lt;span class="s2"&gt;"pk1"&lt;/span&gt;

&lt;span class="c"&gt;# ECS&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4561 ecs create-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; my-cluster

aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4561 ecs register-task-definition &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--family&lt;/span&gt; my-task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--container-definitions&lt;/span&gt; &lt;span class="s1"&gt;'[{"name":"app","image":"nginx","memory":128}]'&lt;/span&gt;

&lt;span class="c"&gt;# ECR&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4562 ecr create-repository &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repository-name&lt;/span&gt; my-repo

aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4562 ecr get-authorization-token

&lt;span class="c"&gt;# Athena&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4564 athena start-query-execution &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query-string&lt;/span&gt; &lt;span class="s2"&gt;"SELECT * FROM my_table"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query-execution-context&lt;/span&gt; &lt;span class="nv"&gt;Database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mydb

&lt;span class="c"&gt;# ACM&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4560 acm request-certificate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--domain-name&lt;/span&gt; example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No endpoint configuration files, no fake credentials setup beyond the usual &lt;code&gt;AWS_ACCESS_KEY_ID=test&lt;/code&gt; — just point the CLI at localhost and it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full service list
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ACM&lt;/td&gt;
&lt;td&gt;4560&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECS&lt;/td&gt;
&lt;td&gt;4561&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECR&lt;/td&gt;
&lt;td&gt;4562&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFront&lt;/td&gt;
&lt;td&gt;4563&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Athena&lt;/td&gt;
&lt;td&gt;4564&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;4566&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppSync&lt;/td&gt;
&lt;td&gt;4567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis Data Streams&lt;/td&gt;
&lt;td&gt;4568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;4569&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB Streams&lt;/td&gt;
&lt;td&gt;4570&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kinesis Firehose&lt;/td&gt;
&lt;td&gt;4571&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway&lt;/td&gt;
&lt;td&gt;4572&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway v2&lt;/td&gt;
&lt;td&gt;4573&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;4574&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS&lt;/td&gt;
&lt;td&gt;4575&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS&lt;/td&gt;
&lt;td&gt;4576&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda Layers&lt;/td&gt;
&lt;td&gt;4578&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SES&lt;/td&gt;
&lt;td&gt;4579&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dashboard&lt;/td&gt;
&lt;td&gt;4580&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFormation&lt;/td&gt;
&lt;td&gt;4581&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Metrics&lt;/td&gt;
&lt;td&gt;4582&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSM Parameter Store&lt;/td&gt;
&lt;td&gt;4583&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets Manager&lt;/td&gt;
&lt;td&gt;4584&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step Functions&lt;/td&gt;
&lt;td&gt;4585&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Logs&lt;/td&gt;
&lt;td&gt;4586&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge&lt;/td&gt;
&lt;td&gt;4587&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Ray&lt;/td&gt;
&lt;td&gt;4588&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route53&lt;/td&gt;
&lt;td&gt;4589&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Events&lt;/td&gt;
&lt;td&gt;4590&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bedrock&lt;/td&gt;
&lt;td&gt;4591&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STS&lt;/td&gt;
&lt;td&gt;4592&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM&lt;/td&gt;
&lt;td&gt;4593&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rekognition&lt;/td&gt;
&lt;td&gt;4594&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda Function URLs&lt;/td&gt;
&lt;td&gt;4595&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito&lt;/td&gt;
&lt;td&gt;4596&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache&lt;/td&gt;
&lt;td&gt;4597/4598&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;td&gt;4599&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Web dashboard
&lt;/h2&gt;

&lt;p&gt;There's also a web dashboard at &lt;code&gt;localhost:4580&lt;/code&gt; that shows all running services in real time. It flips red when the server goes down which is a small thing but honestly pretty useful when you're running tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;It's pure Go 1.22, no external runtime dependencies. Each AWS service is its own HTTP server listening on its port, routing requests by the &lt;code&gt;X-Amz-Target&lt;/code&gt; header or REST path depending on the service protocol.&lt;/p&gt;

&lt;p&gt;One thing I learned the hard way — AWS CLI doesn't always use the protocol the docs say it does. KMS, Kinesis, ECS, ECR all use &lt;code&gt;JSON + X-Amz-Target&lt;/code&gt;. CloudFront uses &lt;code&gt;REST + XML&lt;/code&gt;. AppSync uses &lt;code&gt;REST + JSON&lt;/code&gt;. I had to sniff actual requests with &lt;code&gt;nc&lt;/code&gt; a few times to figure out what the CLI was actually sending.&lt;/p&gt;




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

&lt;p&gt;Not sure yet honestly. Maybe RDS, SQS dead letter queues, or better Lambda container support. Open to suggestions.&lt;/p&gt;

&lt;p&gt;If you try it out let me know what breaks. There's definitely rough edges still.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub:&lt;a href="https://github.com/Jeffrin-dev/CloudDev" rel="noopener noreferrer"&gt;github.com/Jeffrin-dev/CloudDev&lt;/a&gt; 
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;BUILD FOR DEVS&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>aws</category>
      <category>go</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I wasted 45 minutes debugging a GitHub Actions failure that turned out to be a one-line fix</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Wed, 29 Apr 2026 12:01:03 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-wasted-45-minutes-debugging-a-github-actions-failure-that-turned-out-to-be-a-one-line-fix-3278</link>
      <guid>https://forem.com/jeffrin-dev/i-wasted-45-minutes-debugging-a-github-actions-failure-that-turned-out-to-be-a-one-line-fix-3278</guid>
      <description>&lt;p&gt;The logs were 800 lines long. Nothing obvious. I compared two runs manually, checked Stack Overflow, and eventually found it.&lt;/p&gt;

&lt;p&gt;This happens to me every week. I'm a solo dev — I don't have an SRE team to hand this off to.&lt;/p&gt;

&lt;p&gt;The existing tools don't solve this. GitHub's UI shows you logs but doesn't explain them. Writing custom scripts to analyze runs works but takes time I don't have.&lt;/p&gt;

&lt;p&gt;So I'm building a GitHub App that does one thing:&lt;br&gt;
&lt;strong&gt;Tells you exactly why your GitHub Actions pipeline failed or slowed down — in plain English.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more log archaeology&lt;/li&gt;
&lt;li&gt;Spots flaky steps across runs automatically&lt;/li&gt;
&lt;li&gt;Works instantly on any repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$15/month. 2-click install like any GitHub App.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question for fellow devs:&lt;/strong&gt; how much time do you lose weekly to CI failures or slow pipelines? Would plain-English explanations actually help?&lt;/p&gt;

&lt;p&gt;Validating before building — honest feedback appreciated.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>github</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I spent 2 hours manually checking Dev.to, IH, and GitHub for mentions of my product. There has to be a better way.</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:30:32 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-spent-2-hours-manually-checking-devto-ih-and-github-for-mentions-of-my-product-there-has-to-1h4i</link>
      <guid>https://forem.com/jeffrin-dev/i-spent-2-hours-manually-checking-devto-ih-and-github-for-mentions-of-my-product-there-has-to-1h4i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update: Changed pricing to freemium based on feedback — Free for 1 product, $5/month for unlimited.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;I launched a small dev tool recently. My entire distribution strategy is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reply to relevant threads fast&lt;/li&gt;
&lt;li&gt;Show up where people are already asking questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem? I manually check Dev.to, Indie Hackers, and GitHub Discussions every single day. By the time I find a relevant thread it's already 2 days old and buried.&lt;/p&gt;

&lt;p&gt;F5Bot solves this for Reddit. Nothing solves it for Dev.to, IH, and GitHub.&lt;/p&gt;

&lt;p&gt;So I'm building it.&lt;/p&gt;

&lt;p&gt;Simple concept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter your product name + keywords&lt;/li&gt;
&lt;li&gt;Get alerted when someone mentions it on Dev.to, IH, or GitHub Discussions&lt;/li&gt;
&lt;li&gt;Reply fast, while the thread is still warm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free for 1 product. $5/month for unlimited.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No dashboards. No fluff. Just alerts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick question:&lt;/strong&gt; do you manually check these platforms for mentions? Would instant alerts actually save you time?&lt;/p&gt;

&lt;p&gt;Honest yes/no — validating before building.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>discuss</category>
      <category>showdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>AUTO WRITES PR FOR YOU - PRDRAFT</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Sat, 18 Apr 2026 07:17:35 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/auto-writes-pr-for-you-prdraft-9cd</link>
      <guid>https://forem.com/jeffrin-dev/auto-writes-pr-for-you-prdraft-9cd</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd" class="crayons-story__hidden-navigation-link"&gt;I got tired of PRs that just said "fix" — so I built a GitHub App that writes the description for you&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jeffrin-dev" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817901%2F6517f8eb-a101-4823-9acb-d0ce98eaa1ff.jpg" alt="jeffrin-dev profile" class="crayons-avatar__image" width="800" height="450"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffrin-dev" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Twisted-Code'r
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Twisted-Code'r
                
              
              &lt;div id="story-author-preview-content-3486556" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jeffrin-dev" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817901%2F6517f8eb-a101-4823-9acb-d0ce98eaa1ff.jpg" class="crayons-avatar__image" alt="" width="800" height="450"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Twisted-Code'r&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 11&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd" id="article-link-3486556"&gt;
          I got tired of PRs that just said "fix" — so I built a GitHub App that writes the description for you
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I got tired of PRs that just said "fix" — so I built a GitHub App that writes the description for you</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Sat, 11 Apr 2026 10:54:30 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd</link>
      <guid>https://forem.com/jeffrin-dev/i-got-tired-of-prs-that-just-said-fix-so-i-built-a-github-app-that-writes-the-description-for-obd</guid>
      <description>&lt;p&gt;We've all seen it.&lt;/p&gt;

&lt;p&gt;You open a pull request from a teammate — or your past self — and the description says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"fix bug"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. No context. No what changed. No why. You're now a code archaeologist trying to reverse-engineer intent from a diff.&lt;/p&gt;

&lt;p&gt;I've been that person. I've also been on the reviewing end, nudging people repeatedly for context that should've been in the description from the start. It's death by a thousand tiny frustrations.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real problem isn't laziness
&lt;/h2&gt;

&lt;p&gt;Developers don't skip PR descriptions because they don't care. They skip them because by the time the code is done, switching context to write documentation feels like starting a second job. You've been deep in the problem for hours. Writing "what changed and why" in plain English requires a different gear entirely.&lt;/p&gt;

&lt;p&gt;So most people don't. Or they write something just good enough to pass review, which ends up useless to anyone reading it six months later.&lt;/p&gt;




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

&lt;p&gt;I'm a solo developer in Kerala, India, building &lt;strong&gt;PRDraft&lt;/strong&gt; — a GitHub App that reads your PR diff and auto-writes a structured description. Two-click install, zero config.&lt;/p&gt;

&lt;p&gt;When you open a PR, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches the diff&lt;/li&gt;
&lt;li&gt;Sends it to an LLM (Groq / llama-3.3-70b)&lt;/li&gt;
&lt;li&gt;Posts a structured description directly to your PR body&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## What changed
Refactored the auth middleware to use JWT validation instead of session cookies.
Removed the legacy session store dependency.

## Why
Session-based auth was causing intermittent failures in the load-balanced setup.
JWT tokens eliminate the shared state problem entirely.

## How to test
- Log in with an existing account — confirm token is returned in response header
- Test expired token path — confirm 401 is returned correctly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not perfect every time. But dramatically better than "fix auth" — and it takes zero effort from the developer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack (all free)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Next.js on Vercel&lt;/li&gt;
&lt;li&gt;Supabase (PostgreSQL)&lt;/li&gt;
&lt;li&gt;Groq API (free tier — 14,400 req/day)&lt;/li&gt;
&lt;li&gt;Paddle for payments&lt;/li&gt;
&lt;li&gt;GitHub App webhooks via Octokit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total infra cost: &lt;strong&gt;$0/month&lt;/strong&gt;. Built this in evenings over 4 weeks while learning most of it as I went.&lt;/p&gt;




&lt;h2&gt;
  
  
  The thing nobody tells you about building GitHub Apps
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't the AI integration. It was webhook deduplication.&lt;/p&gt;

&lt;p&gt;GitHub retries webhooks aggressively if your endpoint doesn't respond in time. I once had a single PR trigger 38 webhook calls. My PR count was wildly inflated, users were hitting the free tier cap immediately, and I had no idea why.&lt;/p&gt;

&lt;p&gt;Fix: unique constraint on &lt;code&gt;(installation_id, pr_number)&lt;/code&gt; in Supabase, plus a dedup guard before processing. The webhook still fires 38 times — but only the first one does anything.&lt;/p&gt;

&lt;p&gt;If you're building on GitHub webhooks, add this early. Don't find out the hard way like I did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it is now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live at &lt;a href="https://github.com/apps/prdraft" rel="noopener noreferrer"&gt;github.com/apps/prdraft&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free for first 5 PRs, then $9/month&lt;/li&gt;
&lt;li&gt;2 installs so far (one of which is me)&lt;/li&gt;
&lt;li&gt;GitHub Marketplace listing submitted, waiting on review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No paid users yet. That's the next problem to solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you're tired of writing PR descriptions — or tired of reviewing PRs with no context — install it and let me know what the output looks like on your actual diffs.&lt;/p&gt;

&lt;p&gt;Feedback at this stage means everything. I read every reply.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/apps/prdraft" rel="noopener noreferrer"&gt;Install PRDraft — free for 5 PRs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Review
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fm4754jivm89k1s7j5jpy.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.amazonaws.com%2Fuploads%2Farticles%2Fm4754jivm89k1s7j5jpy.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building in public. Day 10 of however long this takes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>github</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built a GitHub App that auto-writes PR descriptions — here's what happened in 8 days</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:30:22 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-built-a-github-app-that-auto-writes-pr-descriptions-heres-what-happened-in-8-days-5b79</link>
      <guid>https://forem.com/jeffrin-dev/i-built-a-github-app-that-auto-writes-pr-descriptions-heres-what-happened-in-8-days-5b79</guid>
      <description>&lt;p&gt;I hate writing PR descriptions.&lt;/p&gt;

&lt;p&gt;Not because I'm lazy — I know what I changed. Articulating it clearly, in a format that helps reviewers, takes 10 extra minutes of context switching. Every. Single. Time.&lt;/p&gt;

&lt;p&gt;So I built PRDraft — a GitHub App that reads your diff when you open a PR and posts a structured description automatically. 2-click install, zero config, no CLI.&lt;/p&gt;

&lt;p&gt;Here's what 8 days of building looks like from scratch, solo, from Kerala, India.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 1–2: Does anyone actually care?
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of code I posted in GitHub Discussions and dropped a question on Dev.to:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Who actually writes good PR descriptions consistently?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Got real responses. Two that stuck:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Yes, real pain point especially on fast-moving teams"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"I'd trust it if it accurately reflects the diff and I can edit before submitting"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was enough. Building justified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 3–5: Building the thing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tech stack I landed on:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js (App Router) + Tailwind&lt;/li&gt;
&lt;li&gt;Supabase (PostgreSQL) for installs and PR event tracking&lt;/li&gt;
&lt;li&gt;Groq API (llama-3.3-70b-versatile) for AI generation — genuinely free, 14,400 requests/day, works in India&lt;/li&gt;
&lt;li&gt;Octokit for GitHub App integration&lt;/li&gt;
&lt;li&gt;Vercel for hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Groq instead of Claude or Gemini:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic API costs money, no free tier&lt;/li&gt;
&lt;li&gt;Google Gemini free tier has limit:0 quota for India region — confirmed bug&lt;/li&gt;
&lt;li&gt;Groq is genuinely free and fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total infra cost: $0/month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The core flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User opens PR → GitHub sends webhook → verify signature → 
fetch diff → send to Groq → post structured description back to PR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated description looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## What changed&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Added webhook signature verification using Octokit
&lt;span class="p"&gt;-&lt;/span&gt; Introduced free tier cap logic (5 PRs/month) checked before incrementing

&lt;span class="gu"&gt;## Why&lt;/span&gt;
Prevents unauthorized webhook calls and limits free usage before billing is set up.

&lt;span class="gu"&gt;## How to test&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Open a PR on a repo where PRDraft is installed
&lt;span class="p"&gt;-&lt;/span&gt; Check that the description is auto-populated within seconds

&lt;span class="gu"&gt;## Notes&lt;/span&gt;
Free tier cap is checked BEFORE incrementing pr_count to avoid off-by-one errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Day 5: First external user
&lt;/h2&gt;

&lt;p&gt;roshhellwett installed it, opened a PR, got a description within seconds.&lt;/p&gt;

&lt;p&gt;Their feedback: &lt;em&gt;"Works as expected — the structure is solid and actually saves time. Groq is noticeably fast. For complex PRs with scattered changes it can feel a bit generic — but as a starting point to edit from? Definitely useful."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That was the moment this stopped being a side project and started being a product.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 6–7: Bug fixes and distribution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bugs I fixed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier cap was incrementing BEFORE the check — off-by-one error meant users got 6 PRs, not 5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;account_login&lt;/code&gt; was being overwritten as 'unknown' on every PR event — upsert was hitting the wrong fields&lt;/li&gt;
&lt;li&gt;GitHub retries webhooks every 15s on timeout — PR #15 fired 38 times. Fixed with a unique constraint on &lt;code&gt;(installation_id, pr_number)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Distribution channels I tried:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev.to — fully open, post live ✅&lt;/li&gt;
&lt;li&gt;Indie Hackers — post live, daily updates ✅&lt;/li&gt;
&lt;li&gt;GitHub Marketplace — submitted for review ✅&lt;/li&gt;
&lt;li&gt;Reddit — karma 3, blocked until Day 9&lt;/li&gt;
&lt;li&gt;Hacker News — karma -8, commenting daily to recover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Painful lesson:&lt;/strong&gt; Every platform blocks new accounts. Don't assume channels are open.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 7: Dashboard
&lt;/h2&gt;

&lt;p&gt;Built a full dashboard at &lt;code&gt;/dashboard&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan badge (Free / Pro)&lt;/li&gt;
&lt;li&gt;PRs used vs cap with a colour-coded progress bar&lt;/li&gt;
&lt;li&gt;Recent PR activity — repo, PR number, timestamp&lt;/li&gt;
&lt;li&gt;Upgrade CTA&lt;/li&gt;
&lt;li&gt;Installation info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub automatically redirects users to the dashboard after install via the Setup URL — no OAuth needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 8: More dashboard improvements
&lt;/h2&gt;

&lt;p&gt;Shipped today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recent activity now shows &lt;strong&gt;PR titles&lt;/strong&gt; alongside repo and PR number&lt;/li&gt;
&lt;li&gt;Every generated PR description now has a &lt;strong&gt;dashboard link in the footer&lt;/strong&gt; — so anyone on the team can check usage without hunting for the URL&lt;/li&gt;
&lt;li&gt;Free tier cap now &lt;strong&gt;posts a comment directly on the PR&lt;/strong&gt; when the limit is hit, instead of silently doing nothing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The payment provider saga
&lt;/h2&gt;

&lt;p&gt;This is the part nobody talks about.&lt;/p&gt;

&lt;p&gt;Building the product took days. Setting up payments is taking longer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; — invite-only in India since 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lemon Squeezy&lt;/strong&gt; — international payments blocked for individuals in India&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad&lt;/strong&gt; — payout setup issues for Indian bank accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paddle&lt;/strong&gt; — working on it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product is ready to charge. The money pipe is the blocker.&lt;/p&gt;

&lt;p&gt;Update Apr 18: Automated outreach system now running daily. 57+ emails sent to team leads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current numbers (Day 8)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Installs&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid users&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PRs described&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infra cost&lt;/td&gt;
&lt;td&gt;$0/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;ul&gt;
&lt;li&gt;Get payment provider working (Paddle)&lt;/li&gt;
&lt;li&gt;Invite more beta users&lt;/li&gt;
&lt;li&gt;Reddit posts unlock ~Day 9&lt;/li&gt;
&lt;li&gt;HN karma grind back to positive&lt;/li&gt;
&lt;li&gt;Month 2: first paid conversion push&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;2-click install, no config, free for 5 PRs/month:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/apps/prdraft" rel="noopener noreferrer"&gt;github.com/apps/prdraft&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Landing page: &lt;a href="https://prdraft.carrd.co" rel="noopener noreferrer"&gt;prdraft.carrd.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related: I stopped writing PR descriptions — here's what I did instead&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building in public from Kerala, India. Following along on Indie Hackers → search PRDraft.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I stopped writing PR descriptions. Here's what I did instead.</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Thu, 02 Apr 2026 15:58:14 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-stopped-writing-pr-descriptions-heres-what-i-did-instead-1eon</link>
      <guid>https://forem.com/jeffrin-dev/i-stopped-writing-pr-descriptions-heres-what-i-did-instead-1eon</guid>
      <description>&lt;p&gt;I opened 6 PRs last week.&lt;br&gt;
I wrote a good description for exactly one of them.&lt;/p&gt;

&lt;p&gt;The rest looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"fix bug"&lt;/li&gt;
&lt;li&gt;"update styles"
&lt;/li&gt;
&lt;li&gt;"wip"&lt;/li&gt;
&lt;li&gt;"changes" (my personal low point)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I'm not even ashamed — I've seen senior engineers with &lt;br&gt;
10 years of experience do the same thing.&lt;/p&gt;

&lt;p&gt;Here's why it happens:&lt;/p&gt;

&lt;p&gt;You just finished 3 hours of deep work. You know exactly what &lt;br&gt;
you changed and why. Writing it down feels like explaining a &lt;br&gt;
joke — the effort of articulating it kills the momentum. So &lt;br&gt;
you type something vague and hit submit.&lt;/p&gt;

&lt;p&gt;The reviewer then has to reverse-engineer your intent from &lt;br&gt;
the diff. They leave a comment asking what you changed. &lt;br&gt;
You explain it in the comment. Everyone wastes 20 minutes &lt;br&gt;
doing what the PR description should have done in the first place.&lt;/p&gt;

&lt;p&gt;So I started building a GitHub App to fix this for myself.&lt;/p&gt;

&lt;p&gt;It hooks into GitHub, reads the diff when you open a PR, &lt;br&gt;
and writes the description for you. Structured — what changed, &lt;br&gt;
why, how to test it, what to watch for. Takes about 4 seconds.&lt;/p&gt;

&lt;p&gt;I'm still building it. Calling it PRDraft.&lt;/p&gt;

&lt;p&gt;Honest question for this community: is this a real pain &lt;br&gt;
for you, or have you just accepted it as part of the job?&lt;/p&gt;

&lt;p&gt;If you want it : &lt;a href="https://prdraft.carrd.co" rel="noopener noreferrer"&gt;https://prdraft.carrd.co&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>productivity</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built an open-source tool that stops personal data from leaking into AI chatbots</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Sun, 29 Mar 2026 05:40:46 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/i-built-an-open-source-tool-that-stops-personal-data-from-leaking-into-ai-chatbots-1fno</link>
      <guid>https://forem.com/jeffrin-dev/i-built-an-open-source-tool-that-stops-personal-data-from-leaking-into-ai-chatbots-1fno</guid>
      <description>&lt;p&gt;Ever copy-pasted something into ChatGPT and immediately &lt;br&gt;
thought "wait, should I have done that?"&lt;/p&gt;

&lt;p&gt;If you're building an AI app that handles user data, you need to know what's leaking into your LLM API before a regulator does.&lt;/p&gt;

&lt;p&gt;That's the problem ShadowAudit solves.&lt;/p&gt;

&lt;p&gt;It sits between your app and any LLM API and scans every &lt;br&gt;
prompt before it leaves your system — catching emails, &lt;br&gt;
phone numbers, API keys, and Indian national IDs like &lt;br&gt;
Aadhaar and PAN numbers.&lt;/p&gt;

&lt;p&gt;Two lines to integrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ShadowAudit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shadowaudit.yaml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Everything else stays the same.&lt;/p&gt;

&lt;p&gt;It also generates GDPR Article 30 compliance reports &lt;br&gt;
automatically from your audit log — one command, done.&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.amazonaws.com%2Fuploads%2Farticles%2Ftpf9v4b2n5wlpqwxiloi.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.amazonaws.com%2Fuploads%2Farticles%2Ftpf9v4b2n5wlpqwxiloi.png" alt="Demo of ShadowAudit scanning API and masking it." width="730" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built this over summer as part of my open-source portfolio.&lt;br&gt;
Would love feedback from the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub: &lt;a href="//github.com/Jeffrin-dev/ShadowAudit"&gt;github.com/Jeffrin-dev/ShadowAudit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CloudDev v0.3.0 — I built a free LocalStack alternative in Go with 17 AWS services published: true</title>
      <dc:creator>Twisted-Code'r</dc:creator>
      <pubDate>Tue, 24 Mar 2026 09:47:56 +0000</pubDate>
      <link>https://forem.com/jeffrin-dev/clouddev-v030-i-built-a-free-localstack-alternative-in-go-with-17-aws-servicespublished-true-5ci4</link>
      <guid>https://forem.com/jeffrin-dev/clouddev-v030-i-built-a-free-localstack-alternative-in-go-with-17-aws-servicespublished-true-5ci4</guid>
      <description>&lt;p&gt;If you've ever used LocalStack and balked at the $35/month price tag for the pro version, CloudDev might be exactly what you're looking for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudDev&lt;/strong&gt; is a free, open-source local AWS emulator built in Go — a single binary, zero runtime dependencies, works with your existing AWS CLI and SDKs out of the box.&lt;/p&gt;

&lt;p&gt;Today I'm releasing &lt;strong&gt;v0.3.0&lt;/strong&gt;, which adds 8 new AWS services and brings the total to &lt;strong&gt;17 emulated services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Jeffrin-dev/CloudDev" rel="noopener noreferrer"&gt;github.com/Jeffrin-dev/CloudDev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;The "vendor kills free tier, community builds alternative" pattern keeps playing out everywhere. LocalStack's free tier is increasingly limited, and most developers just need basic local emulation for dev and CI — not a $35/month SaaS subscription.&lt;/p&gt;

&lt;p&gt;The goal was simple: a tool that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works with zero config changes to your existing AWS CLI setup&lt;/li&gt;
&lt;li&gt;Ships as a single Go binary with no runtime dependencies&lt;/li&gt;
&lt;li&gt;Covers the AWS services that 90% of applications actually use&lt;/li&gt;
&lt;li&gt;Is completely free and open source&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's in v0.3.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔐 Auth &amp;amp; Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAM&lt;/strong&gt; (port 4593) — users, roles, policies, AssumeRole&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STS&lt;/strong&gt; (port 4592) — GetCallerIdentity, AssumeRole, GetSessionToken&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KMS&lt;/strong&gt; (port 4599) — CreateKey, Encrypt, Decrypt, GenerateDataKey&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏗️ Orchestration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudFormation&lt;/strong&gt; (port 4581) — CreateStack, UpdateStack, parses YAML/JSON templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step Functions&lt;/strong&gt; (port 4585) — state machines, executions, RUNNING → SUCCEEDED transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌉 Events &amp;amp; Cache
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EventBridge&lt;/strong&gt; (port 4587) — event buses, rules, PutEvents with Lambda/SQS routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElastiCache&lt;/strong&gt; (ports 4597/4598) — Redis-compatible TCP server + HTTP management API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognito&lt;/strong&gt; (port 4596) — user pools, users, InitiateAuth with mock tokens&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Jeffrin-dev/CloudDev.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CloudDev
go build &lt;span class="nt"&gt;-o&lt;/span&gt; clouddev &lt;span class="nb"&gt;.&lt;/span&gt;

./clouddev init my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
../clouddev up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. All 17 services start immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Works With Your Existing AWS CLI
&lt;/h2&gt;

&lt;p&gt;No special tooling needed. Just point &lt;code&gt;--endpoint-url&lt;/code&gt; at CloudDev:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# KMS — create a key and encrypt/decrypt&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4599 kms create-key &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"my-key"&lt;/span&gt; &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1

aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4599 kms encrypt &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--key-id&lt;/span&gt; key-1 &lt;span class="nt"&gt;--plaintext&lt;/span&gt; &lt;span class="s2"&gt;"hello-world"&lt;/span&gt; &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1

&lt;span class="c"&gt;# Cognito — create a user pool and authenticate&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4596 cognito-idp create-user-pool &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--pool-name&lt;/span&gt; my-pool &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1

aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4596 cognito-idp initiate-auth &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--auth-flow&lt;/span&gt; USER_PASSWORD_AUTH &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--auth-parameters&lt;/span&gt; &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user,PASSWORD&lt;span class="o"&gt;=&lt;/span&gt;pass &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--client-id&lt;/span&gt; client-1 &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1

&lt;span class="c"&gt;# Step Functions — create and run a state machine&lt;/span&gt;
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4585 stepfunctions create-state-machine &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; my-machine &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--definition&lt;/span&gt; &lt;span class="s1"&gt;'{"StartAt":"Hello","States":{"Hello":{"Type":"Pass","End":true}}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--role-arn&lt;/span&gt; arn:aws:iam::000000000000:role/role &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Web Dashboard
&lt;/h2&gt;

&lt;p&gt;Every service gets a real-time status indicator in the dashboard at &lt;code&gt;localhost:4580&lt;/code&gt;. It auto-refreshes every 5 seconds so you can see at a glance what's running.&lt;/p&gt;

&lt;p&gt;All 17 services show up with their port and a green/red status dot.&lt;/p&gt;




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

&lt;p&gt;This project was built with an unusual workflow: &lt;strong&gt;Claude as the instructor and Codex as the developer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Claude designed the architecture, wrote the detailed implementation prompts for each module, debugged issues from test output, and caught protocol mismatches (like the AWS CLI sending &lt;code&gt;AWSStepFunctions.*&lt;/code&gt; instead of &lt;code&gt;AmazonStates.*&lt;/code&gt; as the X-Amz-Target prefix — something you only discover by sniffing the actual HTTP request).&lt;/p&gt;

&lt;p&gt;Codex implemented each module from those prompts, one PR at a time.&lt;/p&gt;

&lt;p&gt;It's been a genuinely interesting experiment in human-AI-AI collaboration. The hardest bugs were always the subtle protocol differences between what the AWS documentation says and what the AWS CLI actually sends.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Service &amp;amp; Port Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;4566&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;4569&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;4574&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQS&lt;/td&gt;
&lt;td&gt;4576&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway&lt;/td&gt;
&lt;td&gt;4572&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SNS&lt;/td&gt;
&lt;td&gt;4575&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets Manager&lt;/td&gt;
&lt;td&gt;4584&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Logs&lt;/td&gt;
&lt;td&gt;4586&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM&lt;/td&gt;
&lt;td&gt;4593&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STS&lt;/td&gt;
&lt;td&gt;4592&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KMS&lt;/td&gt;
&lt;td&gt;4599&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudFormation&lt;/td&gt;
&lt;td&gt;4581&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step Functions&lt;/td&gt;
&lt;td&gt;4585&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EventBridge&lt;/td&gt;
&lt;td&gt;4587&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache (Redis)&lt;/td&gt;
&lt;td&gt;4598&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ElastiCache (HTTP)&lt;/td&gt;
&lt;td&gt;4597&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognito&lt;/td&gt;
&lt;td&gt;4596&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;v0.4.0 will focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatch Metrics&lt;/li&gt;
&lt;li&gt;SQS FIFO queues&lt;/li&gt;
&lt;li&gt;Lambda layers&lt;/li&gt;
&lt;li&gt;X-Ray tracing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;p&gt;The project is Apache 2.0 licensed and contributions are very welcome. Check out &lt;a href="https://github.com/Jeffrin-dev/CloudDev/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt; to get started.&lt;/p&gt;

&lt;p&gt;If CloudDev saves you time or money, a ⭐ on GitHub goes a long way — it helps other developers find the project.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Jeffrin-dev/CloudDev" rel="noopener noreferrer"&gt;github.com/Jeffrin-dev/CloudDev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>devops</category>
      <category>aws</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
