Riverbucket is an app with two faces:
- River: an organized collection of recent posts from your lovingly curated collection of RSS/Atom feeds.
- Bucket: a list of links from around the web, bookmarked for later reading.
- Subscribe by feed or site URL -- this includes blogs, YouTube channels and playlists, Medium profiles/tags/publications, Mastodon accounts, Reddit listings and GitHub releases/tags/commits. Subscriptions are updated periodically or on demand.
- Browse recent feed items grouped by tag and source.
- Save feed items to the bucket with one click.
- Configure select feeds to automatically save new entries to the bucket.
- Import and export feeds via OPML and bookmarks via JSON/HTML.
- Add sites to the river current site and pages to the bucket through the companion webextension.
| River, dark theme | River, light theme |
|---|---|
![]() |
![]() |
| Bucket, dark theme | Bucket, light theme |
|---|---|
![]() |
![]() |
Riverbucket intentionally does not do any of the following:
- Track or count which feed items you have or haven't read like an email inbox.
- Provide a reader mode or text backup for article content.
- Provide algorithmic ranking or similar content suggestions.
- Use LLMs to summarise articles or provide digests.
Riverbucket is a single-user Cloudflare Workers app, with a password for authentication. To use it, sign up for a free Cloudflare account and follow these steps to deploy it with Wrangler.
Install dependencies:
npm installCreate your Wrangler config from the example:
cp wrangler.example.jsonc wrangler.jsoncCreate the remote D1 database and feed refresh queue:
npx wrangler d1 create riverbucketdb
npx wrangler queues create riverbucket-feed-refreshCopy the D1 database ID from the wrangler d1 create output into wrangler.jsonc as database_id, or update the existing value if your checkout already has a config. If you change the database or queue names, update both wrangler.jsonc and the matching database name in the db:migrate:* scripts in package.json.
Generate a password hash:
npm run password:hash -- "YOUR-SUPER-SECURE-PASSWORD-HERE"It should resemble this: pbkdf2-sha256$.... Paste it into a secret:
npx wrangler secret put APP_PASSWORD_HASHThen generate and set a session-signing secret:
openssl rand -base64 48
npx wrangler secret put SESSION_SECRETApply the remote database migrations:
npm run db:migrate:remoteAnd finally, deploy to Cloudflare Workers:
npm run deployYour instance should then be available at https://riverbucket.YOURNAME.workers.dev. Log in with your password and start reading.
The extension lives in extension/. To install it:
- Open your browser's extensions page.
- Enable Developer Mode.
- Load
extension/as an unpacked extension. - Configure the Riverbucket app URL and an extension token in the extension options. You can provision extension tokens from the Settings tab on your Riverbucket instance.
The extension can save the current page, save right-clicked links, and discover feeds from the current page.
Install dependencies:
npm installRun the frontend dev server:
npm run devTypecheck the app and Worker:
npm run typecheckBuild the frontend and typecheck the Worker:
npm run buildApply D1 migrations locally:
npm run db:migrate:localApply D1 migrations remotely:
npm run db:migrate:remoteThe configured production D1 database name is riverbucketdb.
Riverbucket is licensed under the GNU Affero General Public License v3.0. See LICENSE.




