NewsBlur self-hosted: running your own RSS reader with Docker
NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument.
At a glance
- What is it?
- NewsBlur is a Django and Backbone.js feed reader with training, blurblogs and a bundled MCP server. The repository ships a Docker Compose stack, so self-hosting is a make command rather than a weekend of configuration.
- Who is it for?
- Adopt NewsBlur if you want a full reader you control and you are comfortable with a multi-service Docker stack (PostgreSQL, MongoDB, Redis, Elasticsearch, Node.js). Skip it if you want a single binary, a SQLite file, or a reader that runs on a laptop without containers.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem NewsBlur solves for people who read too many feeds
Most readers treat filtering as a per-feed setting: you either subscribe to a site or you do not. NewsBlur's premise is that the interesting decision happens per story. You train the reader on individual items, and the classifier then highlights what resembles the stories you kept and hides what resembles the ones you discarded. The README describes the feature as "Train NewsBlur to learn what you like and dislike, and it will automatically highlight and hide stories." The audience is the heavy subscriber: someone with dozens or hundreds of feeds who cannot read everything and does not want to scroll past the same noise every morning.
The second audience is the self-hoster. The hosted service at newsblur.com is free up to 64 sites with premium plans above that, and the repository exists so you can run the same application yourself. That matters if you want your read states, classifiers and saved stories in a database you control, or if you want to modify the reader rather than just use it.
How NewsBlur is put together: Django, Celery, MongoDB and a Node sidecar
The README states the stack plainly: a Django application on Python 3.7+ with a Backbone.js frontend. Data is split across four stores. PostgreSQL holds relational data (feeds, subscriptions, accounts), MongoDB holds stories and read states, Redis handles story assembly and caching, and Elasticsearch backs search but is optional. Celery runs background tasks, which in practice means feed fetching. Node.js services handle text extraction and image processing.
That split is the architectural decision worth understanding before you deploy. Read states live in MongoDB while accounts and subscriptions live in PostgreSQL, so a restore is not a single dump. The docker-compose.yml reflects the same shape: newsblur_web depends on newsblur_db_mongo, newsblur_db_postgres, newsblur_db_redis and newsblur_db_elasticsearch, and a separate newsblur_node container runs node newsblur.js on port 8008. A third container runs imageproxy, with the compose file noting that the ghcr.io/willnorris/imageproxy image is the original and the yusukeito/imageproxy:v0.11.2 image is used when you need arm64.
The web container exposes port 8000 and mounts the working directory into /srv/newsblur, with the entrypoint at newsblur_web/entrypoint.sh. The node container mounts node/ into /srv and node/originals into /srv/originals. If you plan to back up a self-hosted instance, those two mount points plus the four databases are the complete set of stateful pieces.
Installing a self-hosted NewsBlur with Docker Compose
The README lists Docker and Docker Compose as the only prerequisites. Clone the repository and run the default make target, which the README says starts or updates the stack and applies migrations.
git clone https://github.com/samuelclay/NewsBlur.git
cd NewsBlur
makeWhen the containers are up, visit https://localhost. The certificate is self-signed, so the README instructs you to type thisisunsafe to bypass the browser warning. That is the browser's bypass phrase, not a NewsBlur setting.
Configuration goes in newsblur_web/local_settings.py, which overrides values from docker_local_settings.py. The README lists NEWSBLUR_URL as your domain (default https://localhost, also used for the Archive browser extension OAuth), SESSION_COOKIE_DOMAIN for the authentication cookie, AUTO_PREMIUM and AUTO_ENABLE_NEW_USERS (both default True), ENFORCE_SIGNUP_CAPTCHA (default False), OPENAI_API_KEY for AI features and Discover, DAYS_OF_UNREAD (default 30 for premium) and DAYS_OF_UNREAD_FREE (default 14), and HOMEPAGE_USERNAME (default "popular").
# newsblur_web/local_settings.py
NEWSBLUR_URL = "https://reader.example.com"
SESSION_COOKIE_DOMAIN = ".example.com"
AUTO_PREMIUM = True
AUTO_ENABLE_NEW_USERS = True
DAYS_OF_UNREAD = 30If you do not want to wait for feed fetching during setup, the README documents a bootstrap command that creates PopularFeed records from the curated fixtures file without pulling any content.
docker exec -t newsblur_web python manage.py bootstrap_popular_feeds --skip-fetchThe same command accepts a type filter: --type youtube, --type reddit, --type podcast, --type newsletter or --type rss. Day-to-day commands are make log for web and node logs, make logall for every container, make shell for a Django shell with models pre-imported, make bash for a shell inside the web container, make test, make lint (isort, black, flake8) and make down. Database shells are make mongo, make redis and make postgres. Run make after git pull to apply migrations.
There is also a worktree workflow aimed at running several feature branches at once, which the README says is useful with AI coding assistants. git worktree add .worktree/feature-name followed by cd and make worktree starts the branch on its own ports, with make worktree-log for logs. The main repository keeps ports 80 and 443; each worktree gets unique ports derived from its directory name.
What the Docker stack costs you in practice
The honest limitation is operational weight. A personal feed reader that needs PostgreSQL, MongoDB, Redis and an optional Elasticsearch node is not something you run on a small always-on box without thinking about memory. The compose file sets nproc and nofile ulimits to 10000 on the web container, which hints at how many open connections and worker processes the application expects under load. The imageproxy container mounts /tmp for its cache, so image caching is local to that container and is lost if you replace it without a volume.
Elasticsearch being optional is a real fork in the road. Skip it and you lose the full text search the README advertises, because search is the one feature the README ties to that service. Search across all subscriptions is the feature that makes a large archive usable, so most self-hosters will end up running it anyway, which brings the stack back to five containers plus Node.
The repository also carries files that describe production pain rather than hide it: DOWNTIME.md, SLOW_LOAD_TIMES.md and UPGRADING.md sit at the top level next to ARCHITECTURE.md. Those names tell you the maintainers document outages and slow paths for their own hosted instance. A self-hoster inherits the same architecture and therefore the same failure modes, without the operational history behind those files.
Finally, the dependency list is pinned and old in places. Django==3.1.10, celery==4.4.7, mongoengine==0.21.0 and pymongo>=3,<4 are not current major versions. That is normal for a long-lived application, but it means upgrading the Python side is not a matter of bumping a few lines. UPGRADING.md exists for a reason.
NewsBlur vs FreshRSS, Miniflux and Inoreader: where the approaches diverge
The closest comparison in the search data is FreshRSS, and the difference is philosophical. FreshRSS is a PHP application built to run cheaply on shared hosting with MySQL or PostgreSQL and a filesystem cache. NewsBlur is a Python application that assumes a service-oriented deployment with MongoDB for stories and Redis for assembly. If your goal is the smallest possible self-hosted reader, FreshRSS is the better fit and NewsBlur is the wrong tool. If your goal is training, blurblogs and an API that mobile clients already speak, NewsBlur is the one that ships those.
Against Inoreader, the split is hosted versus self-hosted rather than feature versus feature. Inoreader is a commercial service; you do not run it. NewsBlur gives you both options, and the repository is the self-hosted half. The trade is that you take on the database and upgrade work that a hosted service absorbs for you.
Against Miniflux, the difference is scope. Miniflux is deliberately minimal and Go-based, which makes it a single binary with a small database. NewsBlur carries training classifiers, shared stories, saved searches, story tagging, change tracking, newsletter reading, YouTube channel following, IFTTT integration, an MCP server and native iOS, macOS and Android clients. That list is the reason the deployment is heavy. You are not choosing between a good reader and a bad one; you are choosing how much machinery you want to operate.
One practical point for client compatibility: the README says NewsBlur supports third-party apps including Reeder, ReadKit and Unread. Those clients talk to the API, so a self-hosted instance is useful to them only if NEWSBLUR_URL points at a domain the client can reach over HTTPS.
Licence, maintenance and what upgrading actually involves
The repository is MIT licensed, which is permissive and places few obligations on a self-hoster beyond keeping the copyright notice. That is a statement about the code licence, not about the hosted service, the mobile apps or any third-party API you connect through settings such as STRIPE_SECRET, PAYPAL_API_CLIENTID or the S3 keys. Those are separate relationships and the MIT licence says nothing about them.
On maintenance: the last push to the default branch was on 2026-09-21, and the most recent releases listed are NewsBlur CLI v0.2.2 on 2026-08-11 and Android v13.12.3 on 2026-03-04. The repository is not archived. The presence of a CLI release line alongside the web application and the mobile clients suggests the project is maintained across several surfaces at once, though the README does not describe a release cadence or a support policy for self-hosted instances.
Upgrade cost is where self-hosting bites. The README's instruction after pulling changes is simply make, which starts the stack and applies migrations. Migrations against four data stores are the part you cannot skip, and UPGRADING.md is the file to read before you pull. Because the compose file mounts the repository into the container, your local checkout is the running code, so a pull changes production immediately on the next make. There is no documented rollback path in the README; if you need one, that is on you to build from database snapshots. The Docker image is pulled as newsblur/newsblur_${NEWSBLUR_BASE:-python3}:latest, and pinning that tag is the one lever the compose file gives you against surprise rebuilds.
Editorial conclusion
Adopt NewsBlur if you want a full reader you control and you are comfortable with a multi-service Docker stack (PostgreSQL, MongoDB, Redis, Elasticsearch, Node.js). Skip it if you want a single binary, a SQLite file, or a reader that runs on a laptop without containers. Before you commit, read docker_local_settings.py and confirm which of NEWSBLUR_URL, DAYS_OF_UNREAD and OPENAI_API_KEY you actually need, then run make and check that https://localhost serves the reader.
Frequently asked questions
Is NewsBlur free?
The README says NewsBlur is free to use at newsblur.com for up to 64 sites, with premium plans available above that. Self-hosting from the repository is a separate option and the README does not describe a licence fee for it.
How do I use NewsBlur?
You subscribe to sites and read stories in the layout you prefer (Grid, List, Split or Magazine), then train the classifier by highlighting or hiding individual stories. The README says NewsBlur will then automatically highlight and hide similar stories for you.
Is NewsBlur down?
Nothing in the repository reports service status for newsblur.com, so the README cannot answer that. For a self-hosted instance, the relevant checks are make log for web and node logs and make logall for every container.
What is NewsBlur vs Inoreader?
Inoreader is a hosted commercial service you do not run yourself. NewsBlur is available as the hosted newsblur.com service and as this repository, which the README says contains everything needed to run your own instance with complete control over your data.
What is NewsBlur vs FreshRSS?
The README does not mention FreshRSS, so no direct comparison is documented here. What the README does state is NewsBlur's deployment shape: a Django application using PostgreSQL, MongoDB, Redis and optional Elasticsearch, run through Docker Compose.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/samuelclay-newsblur)