# django-rss-filter
This is a Django app that creates filtered RSS feeds. It does this by filtering existing RSS feeds, removing articles that match filtered words and/or filtered categories. It's what powers https://www.rssfilter.com.
It comes with one view that returns the filtered feed XML, as well as Django Admin configuration to make it possible and easy to self-host your own instance of django-rss-filter. It does not come with views to create or edit filtered feeds; this can be done using the Django Admin.
## What is this?
This is a plugin (an "app") for the Django web framework. It is **not a standalone application** ready to deploy, and requires a Django project to run.
**If you are a Django developer:** You're in the right place! Skip to the "Getting started" section to integrate this app into your project.
**If you just want ready-to-use RSS filtering:** Simply use https://www.rssfilter.com which has user-friendly ways to create and edit filtered RSS feeds.
## Getting started
All instructions use [uv](https://docs.astral.sh/uv/), but should work just as well with pip or Poetry for example.
In an existing Django project:
1. Install: `uv add django-rss-filter`
2. Add `rssfilter` to `INSTALLED_APPS`
3. `uv run ./manage.py migrate`
4. Include the URL config: `path("", include("rssfilter.urls"))`
If you don't have a Django project yet, these are the steps to get started:
1. `uv init my-django-project`
2. `cd my-django-project`
3. `uv add django`
4. `uv run django-admin startproject my_django_app .`
5. `uv run ./manage.py migrate`
6. `uv run ./manage.py createsuperuser`
7. `uv run ./manage.py runserver`
This will get you up and running with a working Admin site at http://127.0.0.1:8000/admin/.
Then follow the first four steps to add django-rss-filter to your Django project.
## How to run the example project
There's an example Django project using django-rss-filter under `example/`.
All instructions use [uv](https://docs.astral.sh/uv/), but should work just as well with pip or Poetry for example.
1. **Clone this repository and navigate into the example project folder:**
```sh
git clone https://github.com/loopwerk/django-rss-filter.git
cd django-rss-filter/example
```
2. **Set up the database and create an admin user:**
```sh
uv run ./manage.py migrate
uv run ./manage.py createsuperuser
```
3. **Run the server:**
```sh
uv run ./manage.py runserver
```
4. **You're done!** You can now go to http://127.0.0.1:8000/admin/ to create a feed using the superuser account you just created. You can then access the filtered feed at `http://127.0.0.1:8000/[feed_uuid]/`.
## Settings
There is one setting that can be configured: `RSS_FILTER_CACHE_SECONDS`. The default value is 300 (5 minutes).
This setting controls how long a feed will be cached before it's fetched, filtered, and stored again.
## Tests
Unit tests can be run with `uv run pytest`.
## About Feature Requests
This project is feature-complete — it does what I needed it to do, and I’m not actively looking to expand its functionality.
I’m not accepting feature requests via issues. Please understand that asking for new features is essentially asking for free work — not just to build something, but to maintain it over time. And since I don’t personally need those features, I’m unlikely to invest time in them.
If you’d like to add a new feature, you’re welcome to open a pull request. Just know that I’ll evaluate it carefully, because even merged contributions become part of what I maintain. To avoid spending time on a PR that may not be accepted, I recommend starting a discussion first — that way we can talk through the idea and see if it fits.
This approach helps me avoid burnout and keep the project sustainable. Thanks for understanding!
Raw data
{
"_id": null,
"home_page": null,
"name": "django-rss-filter",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "rss, atom, feed, filter, mute, django",
"author": "Kevin Renskers",
"author_email": "Kevin Renskers <kevin@loopwerk.io>",
"download_url": "https://files.pythonhosted.org/packages/f3/48/5d1d898943eb24e30e825299a00e74809a425c77a59888b23460fa61a2e1/django_rss_filter-0.14.0.tar.gz",
"platform": null,
"description": "# django-rss-filter\n\nThis is a Django app that creates filtered RSS feeds. It does this by filtering existing RSS feeds, removing articles that match filtered words and/or filtered categories. It's what powers https://www.rssfilter.com.\n\nIt comes with one view that returns the filtered feed XML, as well as Django Admin configuration to make it possible and easy to self-host your own instance of django-rss-filter. It does not come with views to create or edit filtered feeds; this can be done using the Django Admin.\n\n## What is this?\n\nThis is a plugin (an \"app\") for the Django web framework. It is **not a standalone application** ready to deploy, and requires a Django project to run.\n\n**If you are a Django developer:** You're in the right place! Skip to the \"Getting started\" section to integrate this app into your project.\n\n**If you just want ready-to-use RSS filtering:** Simply use https://www.rssfilter.com which has user-friendly ways to create and edit filtered RSS feeds.\n\n## Getting started\n\nAll instructions use [uv](https://docs.astral.sh/uv/), but should work just as well with pip or Poetry for example.\n\nIn an existing Django project:\n\n1. Install: `uv add django-rss-filter`\n2. Add `rssfilter` to `INSTALLED_APPS`\n3. `uv run ./manage.py migrate`\n4. Include the URL config: `path(\"\", include(\"rssfilter.urls\"))`\n\nIf you don't have a Django project yet, these are the steps to get started:\n\n1. `uv init my-django-project`\n2. `cd my-django-project`\n3. `uv add django`\n4. `uv run django-admin startproject my_django_app .`\n5. `uv run ./manage.py migrate`\n6. `uv run ./manage.py createsuperuser`\n7. `uv run ./manage.py runserver`\n\nThis will get you up and running with a working Admin site at http://127.0.0.1:8000/admin/.\n\nThen follow the first four steps to add django-rss-filter to your Django project.\n\n## How to run the example project\n\nThere's an example Django project using django-rss-filter under `example/`.\n\nAll instructions use [uv](https://docs.astral.sh/uv/), but should work just as well with pip or Poetry for example.\n\n1. **Clone this repository and navigate into the example project folder:**\n ```sh\n git clone https://github.com/loopwerk/django-rss-filter.git\n cd django-rss-filter/example\n ```\n\n2. **Set up the database and create an admin user:**\n ```sh\n uv run ./manage.py migrate\n uv run ./manage.py createsuperuser\n ```\n\n3. **Run the server:**\n ```sh\n uv run ./manage.py runserver\n ```\n\n4. **You're done!** You can now go to http://127.0.0.1:8000/admin/ to create a feed using the superuser account you just created. You can then access the filtered feed at `http://127.0.0.1:8000/[feed_uuid]/`.\n\n## Settings\n\nThere is one setting that can be configured: `RSS_FILTER_CACHE_SECONDS`. The default value is 300 (5 minutes).\n\nThis setting controls how long a feed will be cached before it's fetched, filtered, and stored again.\n\n## Tests\n\nUnit tests can be run with `uv run pytest`.\n\n## About Feature Requests\n\nThis project is feature-complete \u2014 it does what I needed it to do, and I\u2019m not actively looking to expand its functionality.\n\nI\u2019m not accepting feature requests via issues. Please understand that asking for new features is essentially asking for free work \u2014 not just to build something, but to maintain it over time. And since I don\u2019t personally need those features, I\u2019m unlikely to invest time in them.\n\nIf you\u2019d like to add a new feature, you\u2019re welcome to open a pull request. Just know that I\u2019ll evaluate it carefully, because even merged contributions become part of what I maintain. To avoid spending time on a PR that may not be accepted, I recommend starting a discussion first \u2014 that way we can talk through the idea and see if it fits.\n\nThis approach helps me avoid burnout and keep the project sustainable. Thanks for understanding!\n",
"bugtrack_url": null,
"license": null,
"summary": "Filter public RSS feeds, remove articles that contain certain keywords or categories.",
"version": "0.14.0",
"project_urls": {
"Homepage": "https://github.com/loopwerk/django-rss-filter/",
"Issues": "https://github.com/loopwerk/django-rss-filter/issues",
"Repository": "https://github.com/loopwerk/django-rss-filter.git"
},
"split_keywords": [
"rss",
" atom",
" feed",
" filter",
" mute",
" django"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4c786f29f5f1e049057e1f776430de2e510c98df97f628b11c7f879b1e667bac",
"md5": "9be05c4563ef2ed10d9c500642213430",
"sha256": "392f8cb0657112f3641098b804fbc2ecb8de7e616e7364d0506e0fee83328073"
},
"downloads": -1,
"filename": "django_rss_filter-0.14.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9be05c4563ef2ed10d9c500642213430",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 9223,
"upload_time": "2025-08-10T14:21:47",
"upload_time_iso_8601": "2025-08-10T14:21:47.346774Z",
"url": "https://files.pythonhosted.org/packages/4c/78/6f29f5f1e049057e1f776430de2e510c98df97f628b11c7f879b1e667bac/django_rss_filter-0.14.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f3485d1d898943eb24e30e825299a00e74809a425c77a59888b23460fa61a2e1",
"md5": "08128ac8c745315f48476ded686bc5cd",
"sha256": "c4a5ac3ea0cbdd47f8978f720a716b71db1899cfcd3a26904c28b4c915487726"
},
"downloads": -1,
"filename": "django_rss_filter-0.14.0.tar.gz",
"has_sig": false,
"md5_digest": "08128ac8c745315f48476ded686bc5cd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 6483,
"upload_time": "2025-08-10T14:21:48",
"upload_time_iso_8601": "2025-08-10T14:21:48.606151Z",
"url": "https://files.pythonhosted.org/packages/f3/48/5d1d898943eb24e30e825299a00e74809a425c77a59888b23460fa61a2e1/django_rss_filter-0.14.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-10 14:21:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "loopwerk",
"github_project": "django-rss-filter",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "django-rss-filter"
}