<?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: Stephano kambeta</title>
    <description>The latest articles on DEV Community by Stephano kambeta (@procwire).</description>
    <link>https://dev.to/procwire</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%2F3036801%2F527330a7-33b7-404f-ba1d-b6483bc0f45d.png</url>
      <title>DEV Community: Stephano kambeta</title>
      <link>https://dev.to/procwire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/procwire"/>
    <language>en</language>
    <item>
      <title>I Was Spending Hours on Bluesky Engagement, So I Built a Serverless AI Bot for Free</title>
      <dc:creator>Stephano kambeta</dc:creator>
      <pubDate>Sat, 18 Jul 2026 06:24:23 +0000</pubDate>
      <link>https://dev.to/procwire/i-was-spending-hours-on-bluesky-engagement-so-i-built-a-serverless-ai-bot-for-free-19g2</link>
      <guid>https://dev.to/procwire/i-was-spending-hours-on-bluesky-engagement-so-i-built-a-serverless-ai-bot-for-free-19g2</guid>
      <description>&lt;p&gt;A few months ago, I noticed something interesting about Bluesky.&lt;/p&gt;

&lt;p&gt;The people who were growing weren't necessarily posting the most brilliant content. They were simply consistent. They showed up every day, joined conversations, experimented with ideas, and stayed visible.&lt;/p&gt;

&lt;p&gt;I wanted to do the same.&lt;/p&gt;

&lt;p&gt;The problem was that I also had code to write, bugs to fix, blog posts to publish, and projects to maintain. Opening Bluesky every couple of hours just to post something or reply to notifications quickly became another distraction.&lt;/p&gt;

&lt;p&gt;I knew I needed automation.&lt;/p&gt;

&lt;p&gt;Not because I wanted to spam the platform, but because I wanted consistency without sacrificing my development time.&lt;/p&gt;

&lt;p&gt;The obvious solution would have been renting a VPS or deploying another cloud service.&lt;/p&gt;

&lt;p&gt;But honestly, I didn't want another monthly bill.&lt;/p&gt;

&lt;p&gt;I started asking myself a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Could I build a Bluesky AI bot that runs entirely on free services?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question eventually led me to GitHub Actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GitHub Actions?
&lt;/h2&gt;

&lt;p&gt;Most automation tutorials immediately recommend a VPS, Docker container, or cloud function.&lt;/p&gt;

&lt;p&gt;Those work well.&lt;/p&gt;

&lt;p&gt;But for a personal automation project, they felt like overkill.&lt;/p&gt;

&lt;p&gt;GitHub Actions already gives developers something incredibly useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduled workflows&lt;/li&gt;
&lt;li&gt;Secure secret storage&lt;/li&gt;
&lt;li&gt;Python support&lt;/li&gt;
&lt;li&gt;Free minutes for public repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of paying for infrastructure, I could let GitHub execute my script several times a day.&lt;/p&gt;

&lt;p&gt;No servers.&lt;br&gt;
No maintenance.&lt;br&gt;
No SSH.&lt;br&gt;
No uptime monitoring.&lt;/p&gt;

&lt;p&gt;Just commit the code and let GitHub handle the rest.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The entire workflow is surprisingly small.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Actions (Cron Schedule)
            │
            ▼
      Python Script
            │
     Generates Prompt
            │
            ▼
       Gemini API
            │
     Returns AI Post
            │
            ▼
      Bluesky API
            │
            ▼
      Publish Content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every scheduled run follows the same sequence.&lt;/p&gt;

&lt;p&gt;GitHub wakes up the workflow.&lt;/p&gt;

&lt;p&gt;The Python script builds a prompt.&lt;/p&gt;

&lt;p&gt;Gemini generates a post.&lt;/p&gt;

&lt;p&gt;The script authenticates using a Bluesky App Password.&lt;/p&gt;

&lt;p&gt;The post gets published automatically.&lt;/p&gt;

&lt;p&gt;After that, GitHub shuts everything down until the next scheduled run.&lt;/p&gt;

&lt;p&gt;Because every run starts fresh, there is no server sitting online waiting for requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the First Version
&lt;/h2&gt;

&lt;p&gt;The first version wasn't complicated.&lt;/p&gt;

&lt;p&gt;I only needed three credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bluesky App Password
&lt;/h3&gt;

&lt;p&gt;Instead of using my account password, I created an App Password.&lt;/p&gt;

&lt;p&gt;That keeps the account safer because the script never stores the real login credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gemini API Key
&lt;/h3&gt;

&lt;p&gt;Rather than writing every post manually, I wanted AI to generate ideas from a configurable topic list.&lt;/p&gt;

&lt;p&gt;Gemini turned out to be a good fit because the API is easy to integrate and generous enough for personal projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitHub Secrets
&lt;/h3&gt;

&lt;p&gt;Hardcoding credentials inside Python files is never a good idea.&lt;/p&gt;

&lt;p&gt;Everything lives inside GitHub Secrets instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;GEMINI_API_KEY&lt;/span&gt;
&lt;span class="err"&gt;BSKY_HANDLE&lt;/span&gt;
&lt;span class="err"&gt;BSKY_PASSWORD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow loads those variables automatically whenever it runs.&lt;/p&gt;

&lt;p&gt;That means I can share the repository without exposing my credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making It Configurable
&lt;/h2&gt;

&lt;p&gt;One thing I dislike about automation projects is editing Python every time I want to change behavior.&lt;/p&gt;

&lt;p&gt;Instead, I moved almost everything into a configuration file.&lt;/p&gt;

&lt;p&gt;The bot's personality.&lt;br&gt;
Its topics.&lt;br&gt;
The writing instructions.&lt;br&gt;
The posting frequency.&lt;/p&gt;

&lt;p&gt;Everything became configurable.&lt;/p&gt;

&lt;p&gt;Changing from a developer account to a cybersecurity account now only takes a few edits inside the configuration file.&lt;/p&gt;

&lt;p&gt;No code changes required.&lt;/p&gt;
&lt;h2&gt;
  
  
  Scheduling Posts
&lt;/h2&gt;

&lt;p&gt;GitHub Actions uses cron expressions.&lt;/p&gt;

&lt;p&gt;Mine started with four runs each day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 7 * * *
30 10 * * *
0 14 * * *
0 18 * * *
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nice thing is that nothing is hardcoded.&lt;/p&gt;

&lt;p&gt;Want hourly posts?&lt;/p&gt;

&lt;p&gt;Change one line.&lt;/p&gt;

&lt;p&gt;Want one post every evening?&lt;/p&gt;

&lt;p&gt;Change another line.&lt;/p&gt;

&lt;p&gt;Commit.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Repository
&lt;/h2&gt;

&lt;p&gt;Once everything was working reliably, I cleaned up the project and published it on GitHub.&lt;/p&gt;

&lt;p&gt;I figured other developers probably had the same problem I did.&lt;/p&gt;

&lt;p&gt;Instead of explaining every setup step repeatedly, I made the repository forkable so anyone could clone it, add their secrets, and start experimenting.&lt;/p&gt;

&lt;p&gt;It also became much easier to improve because contributors could submit fixes and new ideas.&lt;/p&gt;

&lt;p&gt;That's one of the reasons I enjoy open source.&lt;/p&gt;

&lt;p&gt;Someone else almost always finds a better solution than you originally built.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Broke After a Few Weeks
&lt;/h2&gt;

&lt;p&gt;Here's where things became interesting.&lt;/p&gt;

&lt;p&gt;Technically...&lt;/p&gt;

&lt;p&gt;The bot worked perfectly.&lt;/p&gt;

&lt;p&gt;Posts were being published.&lt;/p&gt;

&lt;p&gt;The workflow never crashed.&lt;/p&gt;

&lt;p&gt;GitHub Actions did exactly what it was supposed to do.&lt;/p&gt;

&lt;p&gt;But my profile still felt...&lt;/p&gt;

&lt;p&gt;robotic.&lt;/p&gt;

&lt;p&gt;The bot could publish.&lt;/p&gt;

&lt;p&gt;It couldn't participate.&lt;/p&gt;

&lt;p&gt;It never replied to interesting conversations.&lt;/p&gt;

&lt;p&gt;It never reacted to trending topics.&lt;/p&gt;

&lt;p&gt;It never generated images.&lt;/p&gt;

&lt;p&gt;It never searched for people discussing subjects I cared about.&lt;/p&gt;

&lt;p&gt;Every post happened on a fixed schedule.&lt;/p&gt;

&lt;p&gt;It looked automated because it was automated.&lt;/p&gt;

&lt;p&gt;That realization changed how I thought about social automation.&lt;/p&gt;

&lt;p&gt;Consistency alone isn't enough.&lt;/p&gt;

&lt;p&gt;Real growth comes from interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Next Generation
&lt;/h2&gt;

&lt;p&gt;Instead of patching more and more features into the original script, I decided to redesign the project from scratch.&lt;/p&gt;

&lt;p&gt;The goal wasn't just scheduling posts anymore.&lt;/p&gt;

&lt;p&gt;It was building something that behaved more like a real content assistant.&lt;/p&gt;

&lt;p&gt;That project eventually became &lt;strong&gt;SkyPulse AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of solving only one problem, it combines several systems into one workflow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Basic GitHub Bot&lt;/th&gt;
&lt;th&gt;SkyPulse AI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled posts&lt;/td&gt;
&lt;td&gt;Scheduled posts + intelligent timing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini content&lt;/td&gt;
&lt;td&gt;Multi-model content generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text only&lt;/td&gt;
&lt;td&gt;AI-generated images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateless workflow&lt;/td&gt;
&lt;td&gt;Context-aware conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual topic management&lt;/td&gt;
&lt;td&gt;Dynamic topic discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No engagement&lt;/td&gt;
&lt;td&gt;Replies, likes, reposts and follows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed schedule&lt;/td&gt;
&lt;td&gt;Human-like delays and activity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rather than generating a single post every few hours, the system can monitor conversations, respond naturally, discover new content opportunities, and generate visuals automatically.&lt;/p&gt;

&lt;p&gt;It feels much closer to having an AI assistant than running a scheduled script.&lt;/p&gt;

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

&lt;p&gt;This project taught me several things.&lt;/p&gt;

&lt;p&gt;The first is that free developer tools are much more capable than many people realize.&lt;/p&gt;

&lt;p&gt;GitHub Actions isn't only for CI/CD.&lt;/p&gt;

&lt;p&gt;It can power surprisingly useful automation projects.&lt;/p&gt;

&lt;p&gt;The second lesson is that configuration matters.&lt;/p&gt;

&lt;p&gt;Separating prompts and behavior from code makes experimentation much faster.&lt;/p&gt;

&lt;p&gt;Finally, automation should remove repetitive work—not authenticity.&lt;/p&gt;

&lt;p&gt;The goal isn't replacing yourself.&lt;/p&gt;

&lt;p&gt;The goal is spending less time repeating simple tasks so you have more time to create things that actually matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You Want to Build Your Own
&lt;/h2&gt;

&lt;p&gt;If you're curious about the implementation, I've published the complete project along with the &lt;a href="https://www.procwire.com/2026/05/bluesky-automation-bot.html" rel="noopener noreferrer"&gt;📖 &lt;strong&gt;full setup guide&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It walks through creating the Bluesky App Password, generating a Gemini API key, configuring GitHub Secrets, editing the workflow schedule, and customizing the bot for your own niche.&lt;/p&gt;

&lt;p&gt;If you'd rather skip building the advanced automation layer yourself, I also customize and deploy the more capable SkyPulse AI framework for creators and businesses who want a hands-off solution.&lt;/p&gt;

&lt;p&gt;Either way, I hope this project gives you ideas for your own automations.&lt;/p&gt;

&lt;p&gt;Sometimes the best side projects don't start with a brilliant idea.&lt;/p&gt;

&lt;p&gt;They start with one annoying problem you get tired of solving manually.&lt;/p&gt;

&lt;p&gt;Mine just happened to be posting on Bluesky.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
      <category>bluesky</category>
    </item>
  </channel>
</rss>
