Bluesky Feed Generator Hosting: Free vs Paid Options Compared
🔍 WiseChecker

Bluesky Feed Generator Hosting: Free vs Paid Options Compared

Bluesky feed generators let you create custom algorithmic feeds that filter posts by topic, language, or engagement. Running your own feed generator requires hosting it on a server that meets Bluesky’s technical specifications. This article compares free hosting options like Vercel and Railway with paid cloud services such as AWS and DigitalOcean.

The main difference between free and paid hosting is reliability, uptime, and resource limits. Free tiers often impose CPU, memory, or request quotas that can cause your feed to go offline when traffic spikes. Paid plans provide guaranteed resources, custom domains, and professional support.

You will learn the exact requirements for each hosting tier, step-by-step setup instructions for the most common providers, and common mistakes that cause feed generators to fail. By the end, you can decide which option fits your budget and traffic expectations.

Key Takeaways: Free vs Paid Bluesky Feed Generator Hosting

  • Free tiers (Vercel, Railway): Suitable for low-traffic personal feeds under 1,000 requests per day with cold-start delays.
  • Paid plans (AWS EC2, DigitalOcean Droplet): Provide dedicated CPU, 24/7 uptime, and custom domain support for production feeds.
  • Bluesky PDS requirement: Feed generators must run a PDS-compatible server with WebSocket support, which free hobby plans often lack.

Understanding Bluesky Feed Generator Hosting Requirements

A Bluesky feed generator is a server that implements the AT Protocol’s app.bsky.feed.getFeedSkeleton endpoint. It must run continuously and respond to subscription requests from the Bluesky relay. The server needs the following:

  • Node.js or Python runtime: Most generators are built with Node.js 18+ or Python 3.10+.
  • WebSocket support: The generator must maintain a persistent WebSocket connection to the Bluesky relay for real-time updates.
  • Public URL: Bluesky needs to reach your generator via a public HTTPS URL with a valid TLS certificate.
  • Database: A SQLite or PostgreSQL database to store subscription state and cached posts.
  • Uptime guarantee: The generator should be available 24/7. Downtime causes the feed to disappear from Bluesky clients.

Free hosting platforms often limit these capabilities. For example, Vercel’s serverless functions have a 10-second timeout, which is too short for WebSocket connections. Railway’s free tier spins down after 30 minutes of inactivity. Paid plans remove these restrictions.

Free Hosting Providers Overview

The most common free options are Vercel, Railway, and Fly.io free tier. Each has specific limitations:

  • Vercel: 100 GB bandwidth per month, 60 requests per second, but no persistent WebSocket support on hobby plan. You must use a wrapper that polls the relay instead of maintaining a live connection.
  • Railway: 500 hours of runtime per month, 1 GB RAM, 1 vCPU. The free plan spins down after 30 minutes of inactivity. You can use a cron job to keep it alive, but this consumes hours.
  • Fly.io: 3 shared VMs with 256 MB RAM each, 3 GB persistent storage. No free tier for custom domains. WebSocket works but the small RAM may cause crashes under load.

Paid Hosting Providers Overview

Paid options include AWS EC2, DigitalOcean Droplets, Linode, and Hetzner. They offer dedicated resources and full control:

  • AWS EC2 t2.micro: 1 vCPU, 1 GB RAM, 30 GB EBS storage. Costs about $8.50 per month on-demand. You get a static IP and full WebSocket support.
  • DigitalOcean Basic Droplet: 1 vCPU, 1 GB RAM, 25 GB SSD. Costs $6 per month. Includes a public IP and automatic backups.
  • Hetzner CX11: 1 vCPU, 2 GB RAM, 20 GB SSD. Costs €3.99 per month. Excellent value for production feeds.

Step-by-Step Setup for Free Hosting

This section shows how to deploy a feed generator on Railway’s free tier. Railway is the most practical free option because it supports persistent processes and WebSocket connections.

Deploy on Railway (Free Tier)

  1. Fork the Bluesky feed generator template
    Go to github.com/bluesky-social/feed-generator and click Fork. This creates your own copy of the official template.
  2. Create a Railway account and project
    Sign up at railway.app with your GitHub account. Click New Project and select Deploy from GitHub repo. Choose your forked feed generator repository.
  3. Set environment variables
    In Railway dashboard, go to Variables. Add FEEDGEN_HOST=0.0.0.0, FEEDGEN_PORT=3000, and DATABASE_URL=sqlite:///data/feedgen.db. For the subscription endpoint, add SUBSCRIPTION_ENDPOINT with your Bluesky relay URL.
  4. Configure the keep-alive cron job
    To prevent the free tier from spinning down, add a cron job that pings your generator every 20 minutes. Use a free service like cron-job.org to send a GET request to your Railway URL every 20 minutes.
  5. Verify the deployment
    Open the Railway-generated domain in a browser. You should see a JSON response with did and feed endpoints. Then go to Bluesky settings and add your feed URL to test it.

Step-by-Step Setup for Paid Hosting

For production feeds, use a DigitalOcean Droplet. This gives you full control and no spinning down.

Deploy on DigitalOcean Droplet ($6/month)

  1. Create a Droplet with Docker
    In DigitalOcean control panel, click Create Droplet. Choose Ubuntu 22.04 with Docker pre-installed. Select the $6/month plan (1 GB RAM, 1 vCPU). Add your SSH key for secure access.
  2. Clone the feed generator repository
    SSH into your Droplet: ssh root@your_droplet_ip. Then run git clone https://github.com/bluesky-social/feed-generator.git and cd feed-generator.
  3. Set up environment variables
    Create a .env file with FEEDGEN_HOST=0.0.0.0, FEEDGEN_PORT=3000, and DATABASE_URL=sqlite:///data/feedgen.db. Add your Bluesky relay subscription endpoint.
  4. Build and run the Docker container
    Run docker compose up -d --build. This builds the image and starts the generator in detached mode. Check logs with docker compose logs -f.
  5. Configure a custom domain with HTTPS
    In DigitalOcean Networking, add a domain and point an A record to your Droplet IP. Use Nginx as a reverse proxy with Certbot to get a free TLS certificate from Let’s Encrypt.

Common Mistakes and Issues

Feed Generator Shows ‘Feed Offline’ After Deployment

This usually happens because the generator cannot maintain a WebSocket connection to the Bluesky relay. On free tiers, check if the platform terminates idle connections. On Railway, set FEEDGEN_HOST=0.0.0.0 and ensure the cron job keeps the process alive. On paid Droplets, verify that port 3000 is open in the firewall: sudo ufw allow 3000.

Generator Runs Out of Memory and Crashes

Bluesky feed generators cache posts in memory. Free tiers with 256 MB RAM (Fly.io) crash after caching a few hundred posts. Switch to a paid plan with at least 1 GB RAM. Alternatively, reduce the cache size by setting CACHE_SIZE=100 in environment variables.

Custom Domain Not Accepted by Bluesky

Bluesky requires a valid TLS certificate on the custom domain. Free hosting platforms that offer custom domains only on paid plans. Use Cloudflare DNS with Full (strict) SSL mode to get a free certificate. Point your domain to the free platform’s IP, then enable SSL/TLS in Cloudflare.

Free vs Paid Hosting: Comparison Table

Item Free Tier (Railway) Paid Tier (DigitalOcean)
Monthly cost $0 $6
CPU 1 shared vCPU 1 dedicated vCPU
RAM 1 GB 1 GB
Persistent storage Yes, 1 GB 25 GB SSD
WebSocket support Yes, but idle timeout after 30 min Yes, no timeout
Custom domain with HTTPS No on free tier Yes, with Certbot
Uptime guarantee None (spins down) 99.99% SLA
Best for Personal test feeds Production feeds

Conclusion

You now understand the trade-offs between free and paid hosting for Bluesky feed generators. Free tiers work for low-traffic personal experiments but require keep-alive workarounds and cannot use custom domains. Paid plans starting at $6 per month provide dedicated resources, persistent WebSocket connections, and professional uptime.

For a production feed that serves more than 100 users, choose a DigitalOcean Droplet or Hetzner CX11. Deploy with Docker and set up a custom domain with Let’s Encrypt. Monitor your feed’s performance using Bluesky’s built-in feed stats under Settings > Moderation > Feed Generators.

As an advanced tip, configure a health check endpoint that returns HTTP 200 and set up UptimeRobot to monitor it every 5 minutes. This way you receive alerts before your feed goes offline.