Publish and read on the open web. Own both sides of the feed.
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
Requires Node.js >= 22.
npm install -g rsslobster
rsslobster onboardSubscribe 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"| Command | Description |
|---|---|
feed |
Inbox, add, read, star, reblog, mark read, OPML |
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 publishingrsslobster 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)Four presets: minimal, brutalist, magazine, terminal. System fonts, WCAG AA, zero external requests. See DESIGN.md.
Publish across multiple registered sites from one CLI.
Shell commands at afterClassify, afterPublish, afterDeploy.
rsslobster enable deploy
rsslobster publish "Hello"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 deployAuto-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.comormysite.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
/
Zero-JS comment system baked into static HTML. Cloudflare Worker + D1 storage, HTMLRewriter for instant feedback, GitHub Actions auto-rebuilds. Rate limiting, CSRF.
# 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 regenerateImportant: 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 pushCreate a GitHub token so the Worker can trigger rebuilds:
- Go to https://github.com/settings/personal-access-tokens/new
- Repository access → Only select repositories → pick your site repo
- Permissions → Contents → Read and write
- Generate token and copy it
cd worker
wrangler secret put GITHUB_TOKEN # paste the tokenSet 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.
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>| 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 |
git clone https://github.com/HectorZarate/rsslobster.git
cd rsslobster && pnpm install
pnpm checkMIT — Hector Zarate