A lightweight URL-to-RSS bridge that turns bookmarked links into RSS feeds you can share or keep private. The hosted instance runs at https://rsstodolist.eu/ but the project is built to be self-hosted for privacy and uptime.
- Treats each named feed as a to-read list that can be accessed as HTML or RSS (
?format=rss). - Automatically scrapes page titles and descriptions when metadata is missing.
- Exposes
/list,/searchon private instance (or ifLIST_KEYis compared to key parameter). - Exposes
/suggestfor Firefox / Chrome addon. - Ships with PostgreSQL (or MariaDB) migrations, Docker builds, and PM2-friendly runtime scripts.
- Node.js >= 20 (package
enginesenforces this). - PostgreSQL or MariaDB (see
sql/rsstodolist.*for schema). Alternatively, run everything with Docker Compose. - Copy
.env.sampleto.env(or use.env.docker_compose) and tweak the values before booting the app.
| Name | Description | Default |
|---|---|---|
PORT |
HTTP port | 8080 |
DATABASE_DIALECT |
Sequelize dialect (postgres or mariadb) |
postgres |
DATABASE_HOST |
Database host | 127.0.0.1 |
DATABASE_PORT |
Database port | 5432 |
DATABASE_NAME |
Database name | rsstodolist |
DATABASE_USER / DATABASE_PASS |
Credentials | required (unless DATABASE_URL overrides) |
DATABASE_URL |
Full DB connection string; takes precedence over individual fields | dialect://user:pass@host:port/name |
LIST_KEY |
Protects /list and /search when PUBLIC=true |
unset |
PUBLIC |
When true, hides the private UI and enforces LIST_KEY |
false |
ROOT_URL |
Force the root URL used in feeds | autodetected via request host |
TZ |
Timezone used by Sequelize | Etc/GMT0 |
cp .env.sample .envand fill in database credentials.npm ito install dependencies.- Start your database (Postgres example):
docker compose -f ./docker/docker-compose.yml up db
- Apply the schema manually (
sql/rsstodolist.postgresfor Postgres or.mysqlfor MariaDB). - Run the server in watch mode:
npm run dev
- When you're ready to test the production build:
or use
npm run build npm start
pm2.shto keep the process alive (NODE_ENV=production pm2 start dist/index.js ...).
docker compose -f ./docker/docker-compose.yml build
docker compose -f ./docker/docker-compose.yml upThe compose stack builds the app, seeds PostgreSQL from sql/rsstodolist.postgres, and exposes port 8080.
To inspect the database:
docker exec -it rsstodolist-db_rsstodolist-postgres_1 psql -U rsstodolist -d rsstodolistnpm run docker-build
docker run --env-file ./.env rsstodolistThe Dockerfile bundles wait-for-it.sh so it waits for the database host before launching npm start.
npm run dev: run viatsxfor hot reload.npm run build: compile todist/and copy static assets.npm start: run the compiled server in production mode.npm run test: runvitest --run.npm run tdd: runvitestin watch mode.npm run dump: export every row from the database to CSV (dist/dump.js).
/: form-driven UI; acceptsn/name,u/url,t/title,d/description,l/limit, andf/format. Withoutnit shows the add form, withnit renders a feed (HTML or RSS)./add: adds a new entry (GET). Requiresn(feed name) andu(URL); fetches title/description if omitted./del: removes an entry fornandu./count: returns the number of entries in a feed vian./list: lists all feeds when the instance is private or whenLIST_KEYmatcheskeyquery. Responds in HTML./search: search entries across feeds withq, optionalf=rss,l/limit, andkeywhenPUBLIC=true./suggest: returns autocomplete-style suggestions for private instances (qrequired; disabled whenPUBLIC=true).
format=rss on /, /search, and /list returns an RSS feed. Lengths are truncated per FeedModel constraints.
- Run the test suite:
npm run test(ornpm run tdd). - Keep static helpers in sync by rerunning
npm run buildafter modifyingsrc/static. - Use
npm run dumpto snapshot the database if you need to audit or migrate data.
- Fly.io currently hosts the official instance; self-hosting gives you more features and better privacy.
- set
PUBLIC=falsefor a private deployment. pm2.shis provided to restart the server automatically if it exceeds 192 MB of memory.
Enjoy turning links into shareable RSS feeds!