Skip to content

HectorZarate/rsslobster

RSS Lobster

Publish and read on the open web. Own both sides of the feed.

CI

Personal publishing and reading system built on RSS. Send a message from any chat app, get a static site with feeds. Subscribe to other people's feeds in the same place. Zero JS output. No algorithms. No platform.

read:                                 publish:

  subscribe → poll → notify             phone → classify → html + rss
              ↓                                   ↓
  star → reblog → publish               git push → deploy
              ↓                                   ↓
  your site ← link post                 live in < 4 seconds

Quick Start

Requires Node.js >= 22.

npm install -g rsslobster
rsslobster onboard

RSS Reader

Subscribe to RSS and Atom feeds. Star, reblog, mark read. AI recaps on your schedule. OPML import/export.

rsslobster feed add https://simonwillison.net
rsslobster feed                        # inbox
rsslobster feed read 3                 # open entry
rsslobster feed reblog 1 -m "Worth reading"

CLI

Command Description
feed Inbox, add, read, star, reblog, mark read, OPML

RSS Publisher

Send a message. The lobster classifies type (micro, post, image, carousel, link, video, audio), generates semantic HTML with inlined CSS, updates RSS and JSON feeds, and deploys.

rsslobster publish "Hello"
rsslobster start                       # daemon for chat-app publishing

Capabilities

rsslobster enable telegram   # publish from your phone
rsslobster enable model      # AI classification (Ollama, OpenAI, Anthropic)
rsslobster enable deploy     # auto-deploy via git push
rsslobster enable comments   # comment system (Cloudflare Worker)

Styles

Four presets: minimal, brutalist, magazine, terminal. System fonts, WCAG AA, zero external requests. See DESIGN.md.

Multi-site

Publish across multiple registered sites from one CLI.

Hooks

Shell commands at afterClassify, afterPublish, afterDeploy.

Deploy

rsslobster enable deploy
rsslobster publish "Hello"

Cloudflare Pages

Deploy your static site to Cloudflare Pages:

# 1. Init with Cloudflare platform (generates wrangler.toml with pages_build_output_dir)
rsslobster init --domain mysite.com --title "My Site" --platform cloudflare

# 2. Create a Cloudflare Pages project
npx wrangler pages project create mysite-com --production-branch main

# 3. Deploy
npx wrangler deploy

Auto-deploy from GitHub: Connect your repo to Cloudflare Pages (Workers & Pages > Create > Pages > Connect to Git). Use these build settings:

Setting Value
Build command (none)
Deploy command npx wrangler deploy
Root directory /

The wrangler.toml generated by --platform cloudflare tells wrangler to deploy _site/ as a Pages site. Commit the _site/ directory to your repo — every push auto-deploys.

Custom domain: Add your domain in the Cloudflare dashboard under the Pages project > Custom Domains. Point your DNS to Cloudflare.

Using comments (Worker + Pages in the same repo): When your repo has both a static site and a comments Worker, they are separate Cloudflare resources:

  • Pages project serves the static site (e.g. mysite.com)
  • Worker serves the comments API (e.g. comments.mysite.com or mysite.hdz.workers.dev)

Each needs its own wrangler.toml. If both are in the same repo, set the Root directory in the Cloudflare build settings to the appropriate subdirectory:

Resource Root directory wrangler.toml location
Pages (static site) / ./wrangler.toml
Worker (comments API) worker worker/wrangler.toml

If you use a single Cloudflare build connected to your repo, set the Root directory to worker so the deploy command deploys the comments API. For the static site, either:

  • Deploy Pages separately via npx wrangler pages deploy _site --project-name mysite-com
  • Or create a second Cloudflare Pages project connected to the same repo with Root directory /

Comments

Zero-JS comment system baked into static HTML. Cloudflare Worker + D1 storage, HTMLRewriter for instant feedback, GitHub Actions auto-rebuilds. Rate limiting, CSRF.

Setup

# Create D1 database and deploy the Worker
wrangler d1 create comments
cd worker
# Update wrangler.toml with your database_id
wrangler d1 execute comments --remote --file=src/schema.sql

# Generate and set a secure admin secret
openssl rand -hex 32
wrangler secret put ADMIN_SECRET

wrangler deploy

# Enable comments in your rsslobster site
cd ..
rsslobster enable comments
rsslobster regenerate

Important: Set commentsEndpoint to your site's custom domain (e.g. https://mysite.com), not the workers.dev URL. If the Worker serves your site via Static Assets, using the same domain keeps the user on your site after posting a comment. Using the workers.dev URL will redirect them away.

Cloudflare build settings for the Worker (if auto-deploying from GitHub):

Setting Value
Build command (none)
Deploy command npx wrangler deploy
Root directory worker

For auto-rebuilds on new comments, add this GitHub Action:

# .github/workflows/rebuild-comments.yml
name: Rebuild page with comments
on:
  repository_dispatch:
    types: [rebuild-comments]

permissions:
  contents: write

jobs:
  rebuild:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
        with: { version: 10 }
      - uses: actions/setup-node@v4
        with: { node-version: 22 }

      - name: Install rsslobster
        run: |
          git clone --depth 1 https://github.com/HectorZarate/rsslobster.git /tmp/rsslobster
          cd /tmp/rsslobster
          pnpm install --frozen-lockfile
          pnpm build
          pnpm link --global

      - name: Regenerate page
        run: rsslobster regenerate --slug ${{ github.event.client_payload.slug }} .

      - name: Commit and push
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add _site/
          git diff --cached --quiet && echo "No changes" && exit 0
          git commit -m "rebuild: bake comments into ${{ github.event.client_payload.slug }}"
          git push

Create a GitHub token so the Worker can trigger rebuilds:

  1. Go to https://github.com/settings/personal-access-tokens/new
  2. Repository access → Only select repositories → pick your site repo
  3. Permissions → Contents → Read and write
  4. Generate token and copy it
cd worker
wrangler secret put GITHUB_TOKEN     # paste the token

Set GITHUB_REPO in worker/wrangler.toml:

[vars]
GITHUB_REPO = "yourname/yoursite"

Without this, comments still work — the commenter sees theirs instantly via HTMLRewriter; everyone else sees it after your next rsslobster regenerate + deploy.

Moderation

rsslobster comments                         # dashboard
rsslobster comments list                    # pending queue
rsslobster comments approve <id>
rsslobster comments reject <id>
rsslobster comments spam <id>
rsslobster comments delete <id>
rsslobster comments approve-all <slug>
rsslobster comments mode off                # disable
rsslobster comments mode paused             # accept but hide
rsslobster comments ban <ip-hash>

CLI

Command Description
onboard Interactive setup
enable <cap> telegram, model, deploy, comments
start Start daemon
publish <text> Publish from CLI
dev Local preview
regenerate [--slug <s>] Rebuild pages
comments Moderation
sites Multi-site management
delete <slug> Remove a post

Development

git clone https://github.com/HectorZarate/rsslobster.git
cd rsslobster && pnpm install
pnpm check

License

MIT — Hector Zarate

About

RSS Lobster. Unplatform yourself.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages