npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@jerdog/serverless-social-bot

v2.0.0

Published

A serverless social media bot using Markov chains

Downloads

389

Readme

Serverless Social Media Markov Bot

A serverless bot that generates and posts content using Markov chain text generation across multiple social media platforms (Mastodon, Bluesky). Built using Cloudflare Workers.

Features

Content Generation

  • Generates unique social media content using Markov chains
  • Configurable parameters for content generation
  • Filters out excluded words and phrases
  • 30% random posting probability

Multi-Platform Support

  • Posts to Mastodon
  • Posts to Bluesky
  • Extensible for additional platforms

AI-Powered Reply Generation

  • Generates witty, contextual replies using ChatGPT
  • Supports both Mastodon and Bluesky post URLs
  • Smart reply behavior:
    • Always replies to first interaction in a thread
    • 30% chance to reply to subsequent interactions
    • Skips replies containing excluded words
    • Won't reply to posts older than 24 hours
    • Avoids replying to its own posts
  • Test endpoint for trying replies before posting
  • Configurable response style and tone

Configuration

Required Environment Variables

  • MASTODON_API_URL - Your Mastodon instance URL
  • MASTODON_ACCESS_TOKEN - Mastodon API access token
  • BLUESKY_API_URL - Bluesky API URL (default: https://bsky.social)
  • BLUESKY_USERNAME - Your Bluesky username
  • BLUESKY_PASSWORD - Your Bluesky app password
  • OPENAI_API_KEY - Your OpenAI API key (required for reply generation)

Optional Environment Variables

  • MASTODON_SOURCE_ACCOUNTS - Mastodon accounts to source content from
  • BLUESKY_SOURCE_ACCOUNTS - Bluesky accounts to source content from
  • EXCLUDED_WORDS - Words to exclude from generated content and replies
  • DEBUG_MODE - When set to 'true', prevents actual posting and enables detailed logging
  • DEBUG_LEVEL - Debug log level (verbose/info/error)
  • MARKOV_STATE_SIZE - Markov chain state size (default: 2)
  • MARKOV_MIN_CHARS - Minimum characters in generated post (default: 100)
  • MARKOV_MAX_CHARS - Maximum characters in generated post (default: 280)
  • MARKOV_MAX_TRIES - Maximum attempts to generate valid post (default: 100)

Debug Mode

The bot includes a comprehensive debug mode that allows you to test functionality without actually posting to social media platforms.

Enabling Debug Mode

You can enable debug mode in one of three ways:

  1. In .dev.vars for local development:

    DEBUG_MODE=true
  2. In wrangler.toml for development and testing:

    [vars]
    DEBUG_MODE = "true"
  3. In Cloudflare Dashboard for production:

    • Go to Workers & Pages > Your Worker > Settings > Variables
    • Add DEBUG_MODE with value true

What Debug Mode Does

When DEBUG_MODE is set to 'true':

  • No actual posts will be made to any platform
  • Detailed logs show what would have been posted
  • Reply tracking still works to prevent duplicate debug logs
  • All other functionality (notifications, reply generation) works normally

This is useful for:

  • Testing reply generation
  • Verifying post content before going live
  • Debugging notification processing
  • Testing rate limit handling

Debug Logs

With debug mode enabled, you'll see detailed logs like:

Debug mode: Would post to Bluesky: [post content]
Debug mode: Would reply to Mastodon post: [reply content]

Local Development

  1. Install dependencies:

    npm install
  2. Create a .dev.vars file with your environment variables:

    MASTODON_API_URL=https://your.mastodon.instance
    MASTODON_ACCESS_TOKEN=your_token
    BLUESKY_API_URL=https://bsky.social
    BLUESKY_USERNAME=your.username
    BLUESKY_PASSWORD=your_app_password
    MASTODON_SOURCE_ACCOUNTS=@user@instance
    [email protected]
    DEBUG_MODE=true    # Start with debug mode enabled for safety
    DEBUG_LEVEL=verbose
    OPENAI_API_KEY=your_openai_api_key
  3. Start the development server:

    wrangler dev

API Endpoints

  • POST /run - Execute the bot (30% chance to post)
  • POST /upload-tweets - Upload source content
  • GET /upload-tweets - Get source content count
  • POST /test-reply - Test AI-powered reply generation
  • POST /check-replies - Check for and process new replies

Deployment

  1. Configure your environment variables in Cloudflare:

    wrangler secret put MASTODON_ACCESS_TOKEN
    # Repeat for other secrets
  2. Deploy to Cloudflare Workers:

    wrangler deploy

Behavior

  • The bot has a 30% chance of posting each time it runs
  • When posting, it will attempt to post to both Mastodon and Bluesky
  • Generated content is based on source content from specified accounts
  • Content is filtered to remove excluded words
  • Debug logs show the random percentage and whether a post was attempted

Development

  • Written in JavaScript
  • Uses Cloudflare Workers for serverless execution
  • Stores source content in Cloudflare KV
  • Implements Markov chain text generation
  • Supports multiple social media platforms

Reply Behavior

The bot uses the following criteria to determine when to reply:

  1. First Interactions

    • Always replies to the first interaction in a thread
    • Helps establish initial engagement
  2. Subsequent Interactions

    • 30% chance to reply to follow-up messages
    • Prevents excessive back-and-forth conversations
  3. Content Filtering

    • Skips replies containing words from EXCLUDED_WORDS
    • Won't reply to its own posts
    • Ignores posts older than 24 hours
  4. Debug Mode

    • Set DEBUG_MODE=true to see detailed decision logging
    • Helpful for understanding reply behavior

Testing Guide

Testing Reply Generation

There are several ways to test the reply functionality:

  1. Using the Test Endpoint

    # Create test-payload.json with your test data
    {
      "postUrl": "https://bsky.app/profile/username.bsky.social/post/postid",
      "replyContent": "Your test reply content here"
    }
    
    # Test reply generation
    curl -X POST http://127.0.0.1:8787/test-reply \
      -H "Content-Type: application/json" \
      --data-binary "@test-payload.json"
  2. Testing Live Reply Behavior

    # First, make the bot post something
    curl -X POST http://127.0.0.1:8787/run
    
    # Then reply to that post from another account
       
    # Finally, trigger reply checking
    curl -X POST http://127.0.0.1:8787/check-replies
  3. Debug Mode Testing

    # Enable debug mode in .dev.vars
    DEBUG_MODE=true
    DEBUG_LEVEL=verbose
    
    # Run the reply checker to see detailed logs
    curl -X POST http://127.0.0.1:8787/check-replies

Testing Different Scenarios

  1. First Reply Testing

    • Post something from the bot
    • Reply to it from another account
    • Run /check-replies - bot should always respond
  2. Subsequent Reply Testing

    • Continue the conversation
    • Run /check-replies multiple times
    • Bot should respond ~30% of the time
  3. Content Filter Testing

    # Add test words to .dev.vars
    EXCLUDED_WORDS=test,spam,ignore
    
    # Reply to bot with these words
    # Bot should skip these replies
  4. Age Limit Testing

    • Reply to an old post (>24h)
    • Bot should skip these replies
  5. Self-Reply Testing

    • Reply to the bot's post using the bot's account
    • Bot should skip these replies

Troubleshooting

  1. Check Logs

    • Enable verbose logging:
      DEBUG_MODE=true
      DEBUG_LEVEL=verbose
    • Look for "Processing notification" and "Reply decision" messages
  2. Common Issues

    • API authentication errors: Check credentials in .dev.vars
    • Missing replies: Verify notification fetching is working
    • Unexpected behavior: Check debug logs for decision reasoning
  3. Testing Environment

    • Use wrangler dev for local testing
    • Create test accounts on both platforms
    • Keep test-payload.json in .gitignore

License

MIT License - See LICENSE file for details