# RssTUI - RSS protocol inside your terminal
This is made for Summer of Making 2025! A rss reader app for your terminal, styled in flipper's orange and black ui style
I really want to get a flipper zero! And im only like 300 shells short!
## Table of Contents
- [Quick Start](#-quick-start)
- [What is this & How it's made](#what-is-this--how-its-made)
- [Idea](#idea)
- [How it's made](#how-its-made)
- [What is this](#what-is-this)
- [Installation](#installation)
- [Easy Installation from PyPI (Recommended)](#easy-installation-from-pypi-recommended)
- [Development Installation](#development-installation)
- [Linux! (tested, works 100%)](#linux-tested-works-100)
- [Windows (not fully tested)](#windows-not-fully-tested)
- [MacOS](#macos)
- [Running](#running)
- [Please vote for me!!](#please-vote-for-me)
## What is this & How it's made
### Idea
So i asked people in Hackclub's slack for ideas, on what i can make for SoM (summer of making). And Youssef gave an idea to make an app with Textual. So here i am!
### How it's made
The project uses Python 3.11.4, Textual and a Venv python virtual enviroment
Textual draws clickable and interactable User Interfaces inside your terminal with symbols!
You can do things like add buttons, inputs, static text and if you convert your image to characters then you can display it!
Learn more on Textual wiki: https://textual.textualize.io/
### Inner workings
_And i wonder, if you know..._ how it works! - _probably kanye east_
As i said previously, i use Textual. It's really a great library. But some feeds return HTML content. And as you have guessed: it isn't easibly readable for us humans, and we arent horses, we are humans.
So how do i go around this? Well it's actually pretty easy (if you don't count in regex i hate regex with all of my hearth)
I just use the `html2text` library! Then i can write pretty simple (again not counting regex) methods to parse html into pretty text
First we need to write a main class for html parsing, it initiates the parser and says what to parse, heres it:
```python
class ParseHTML(HTMLParser):
def __init__(self):
super().__init__()
self.text = []
self.in_tag = False
def handle_starttag(self, tag, attrs):
if tag in ['br', 'p']:
self.text.append('\n')
elif tag in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:
self.text.append('\n## ')
elif tag == 'a':
for attr, value in attrs:
if attr == 'href':
self.text.append(f'[')
break
def handle_endtag(self, tag):
if tag == 'a':
self.text.append(']')
elif tag in ['p', 'div']:
self.text.append('\n')
def handle_data(self, data):
self.text.append(data.strip())
def get_text(self):
return ''.join(self.text)
```
Not much right? Yeah i think so
Now important thing is we ont use it directly, it just makes changes to the `HTMLParser` from `html`
We then use the `HTML2Text` in code from `html2text`. Now i dont really understand fully how this all works, classes are like dark magic for me. But they work!
### Why doesnt the app support images
Because it's a pain in the butt to do so. WHy? Images are big, like very big 1080x1920 pixel, that's 2073600 in total!!!!!
And the terminal (textual library) can draw pixels as text or unicode color blobs or something i dont remember honestly. all of what i say may be wrong so dont really use what i say as a guide okay?
So to draw an image we need a lot of pixels, that we dont have. Now there are workorounds but theyr hard to do etc etc. I can always convert an image to be 40x40 pixels which is much smaller, but that means we lose all the details and probably you wouldn't be even able to recognise what it was before pixelifying
### What type of feed can i add?
A rss feed, any rss feed. as long as it doesnt use [buss:// protocol or something](https://youtu.be/qiOtinFFfk8?si=iK7dqXbvJcF0ulY5)
It can have HTML inside it, but only basic nothing crazy. Yeah that's about it
### What is this
Firts let's go throught the basics: **What Is RSS**?
RSS - [ereses]:
Really
Simple
Syndication
-or-
RDF
Site
Summary
It's a simple protocol to provide short snippets for sites/news sites/blogs whatever you want tbh. I guess it could be even made into some sort of api response? Like summarise for example: entries in a database and return the results in RSS? Will probably look into something like this.
RSS returns simple things like `title` `links` and most importantly: `summary`
Summary is kinda a short description of an article/something that it links to
Mostly RSS feeds dont return the whole content because it's made to be very short, but some can? idk prob
A lot of sites use rss! Here are some of the examples!
-- built into rsstui --
- TechCrunch: https://techcrunch.com/feed.xml
- NYT Global: https://rss.nytimes.com/services/xml/rss/nyt/World.xml (has feeds for different subpages but not all)
- Reddit!: All sub-reddits have rss feeds, just add `.rss` to the end of the link like https://www.reddit.com/r/JDVancePics.rss UPDATE: Reddit feeds seem to have a really really small limit on rss requests, so they dont work reliably
- And other! like https://theverge.com/rss.xml https://xkcd.com/rss.xml
It's pretty cool huh?
# Installation
## Easy Installation from PyPI (Recommended)
PyPi is a great service to host python scripts and packages. Here's how to install it:
First u need to create some sort of folder for my app and activate the venv
```bash
mkdir rsstui
```
Then activate env
```bash
python3 -m venv venv
```
And
```bash
source venv/bin/activate
```
Note: If u use fish then add `.fish` to the end of the command so it looks like: `source venv/bin/activate.fish`
Now there's easy part
```bash
pip install rsstui
```
And then run
```bash
rsstui
```
Congrtats u so smart
## Development Installation
Want to contribute or run from source? Here's how:
## Linux! (tested, works 100%)
The app was written on Linux Mint. Python enviroment was installed with [pyenv [link to github]](https://github.com/pyenv/pyenv), which is a very good way to manage Python versions, it even supports custom python compilers, check it out!!!
Alright Here is how:
First clone the repo onto your computer
```bash
git clone https://github.com/yehorscode/RssTUI RssTUI
```
[Optional] If you have a pyenv enviroment i highly reccomend to install 3.11.4 with this command (takes 2-4 mins)
```bash
pyenv install 3.11.4
```
Then cd into your folder
```bash
cd RssTUI
```
And if you have pyenv activate your 3.11.4 installation with
```bash
pyenv shell 3.11.4
```
Remember how i mentioned `venv`? It is a virtual enviroment you need to activate it
Bash:
```bash
source venv/bin/activate
```
Fish:
```fish
source venv/bin/activate.fish
```
Csh:
```csh
source venv/bin/activate.csh
```
Now all that's left is install Textual
```bash
pip install -r requirements.txt
```
Wait some time for it to finish, then you can run the app with:
```bash
python3 rsstui/app.py
```
## Windows (not fully tested)
Just use WSL, learn how to install and use it: [Microsoft docs link](https://learn.microsoft.com/en-us/windows/wsl/install)
For using it inside wsl PLEASE use Windows Terminal and not cmd or powershell consoles. Wundows Terminal is a standalone app but it works a lot better then the other ones + looks very cool see [microsoft windows terminal documentation](https://learn.microsoft.com/en-us/windows/terminal/install)
## MacOS
I have never owned ANY mac device, so i do not know how does it know, and how to activate enviroments, sadly i can't reccomend anything. BUT BUT BUT the Linux methods may work. Please try them! Use bash methods
In theory mac os and linux both use unix, so installing the app should work right out of the box and maybe even with the auto installer
### Running
If installed via PyPi just run
```bash
rsstui
```
If u did it with the manual masochist method do:
```bash
python3 rsstui/app.py
```
Simple and clean! 🚀
# Please vote for me!!
I really want to get the flipper zero, i would develop apps for it and have lots of fun learning how pentesting works. Thanks! If u have issues just find me
Raw data
{
"_id": null,
"home_page": null,
"name": "rsstui",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "rss, feed, reader, tui, terminal, textual, news",
"author": "yehorscode",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/f3/d1/4c0f622d592f173dd89ff3008a4c47c3329b619f3d4ee929497cfaf8018a/rsstui-1.0.0.tar.gz",
"platform": null,
"description": "# RssTUI - RSS protocol inside your terminal\n\nThis is made for Summer of Making 2025! A rss reader app for your terminal, styled in flipper's orange and black ui style\nI really want to get a flipper zero! And im only like 300 shells short!\n\n## Table of Contents\n\n- [Quick Start](#-quick-start)\n- [What is this & How it's made](#what-is-this--how-its-made)\n - [Idea](#idea)\n - [How it's made](#how-its-made)\n - [What is this](#what-is-this)\n- [Installation](#installation)\n - [Easy Installation from PyPI (Recommended)](#easy-installation-from-pypi-recommended)\n - [Development Installation](#development-installation)\n - [Linux! (tested, works 100%)](#linux-tested-works-100)\n - [Windows (not fully tested)](#windows-not-fully-tested)\n - [MacOS](#macos)\n - [Running](#running)\n- [Please vote for me!!](#please-vote-for-me)\n\n## What is this & How it's made\n\n### Idea\n\nSo i asked people in Hackclub's slack for ideas, on what i can make for SoM (summer of making). And Youssef gave an idea to make an app with Textual. So here i am!\n\n### How it's made\n\nThe project uses Python 3.11.4, Textual and a Venv python virtual enviroment\n\nTextual draws clickable and interactable User Interfaces inside your terminal with symbols!\nYou can do things like add buttons, inputs, static text and if you convert your image to characters then you can display it!\nLearn more on Textual wiki: https://textual.textualize.io/\n\n### Inner workings\n\n_And i wonder, if you know..._ how it works! - _probably kanye east_\n\nAs i said previously, i use Textual. It's really a great library. But some feeds return HTML content. And as you have guessed: it isn't easibly readable for us humans, and we arent horses, we are humans.\n\nSo how do i go around this? Well it's actually pretty easy (if you don't count in regex i hate regex with all of my hearth)\nI just use the `html2text` library! Then i can write pretty simple (again not counting regex) methods to parse html into pretty text\n\nFirst we need to write a main class for html parsing, it initiates the parser and says what to parse, heres it:\n\n```python\nclass ParseHTML(HTMLParser):\n def __init__(self):\n super().__init__()\n self.text = []\n self.in_tag = False\n\n def handle_starttag(self, tag, attrs):\n if tag in ['br', 'p']:\n self.text.append('\\n')\n elif tag in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:\n self.text.append('\\n## ')\n elif tag == 'a':\n for attr, value in attrs:\n if attr == 'href':\n self.text.append(f'[')\n break\n\n def handle_endtag(self, tag):\n if tag == 'a':\n self.text.append(']')\n elif tag in ['p', 'div']:\n self.text.append('\\n')\n\n def handle_data(self, data):\n self.text.append(data.strip())\n\n def get_text(self):\n return ''.join(self.text)\n```\n\nNot much right? Yeah i think so\nNow important thing is we ont use it directly, it just makes changes to the `HTMLParser` from `html`\nWe then use the `HTML2Text` in code from `html2text`. Now i dont really understand fully how this all works, classes are like dark magic for me. But they work!\n\n### Why doesnt the app support images\n\nBecause it's a pain in the butt to do so. WHy? Images are big, like very big 1080x1920 pixel, that's 2073600 in total!!!!!\nAnd the terminal (textual library) can draw pixels as text or unicode color blobs or something i dont remember honestly. all of what i say may be wrong so dont really use what i say as a guide okay?\nSo to draw an image we need a lot of pixels, that we dont have. Now there are workorounds but theyr hard to do etc etc. I can always convert an image to be 40x40 pixels which is much smaller, but that means we lose all the details and probably you wouldn't be even able to recognise what it was before pixelifying\n\n### What type of feed can i add?\nA rss feed, any rss feed. as long as it doesnt use [buss:// protocol or something](https://youtu.be/qiOtinFFfk8?si=iK7dqXbvJcF0ulY5)\nIt can have HTML inside it, but only basic nothing crazy. Yeah that's about it\n\n### What is this\n\nFirts let's go throught the basics: **What Is RSS**?\n\nRSS - [ereses]:\nReally\nSimple\nSyndication\n-or-\nRDF\nSite\nSummary\n\nIt's a simple protocol to provide short snippets for sites/news sites/blogs whatever you want tbh. I guess it could be even made into some sort of api response? Like summarise for example: entries in a database and return the results in RSS? Will probably look into something like this.\nRSS returns simple things like `title` `links` and most importantly: `summary`\nSummary is kinda a short description of an article/something that it links to\nMostly RSS feeds dont return the whole content because it's made to be very short, but some can? idk prob\n\nA lot of sites use rss! Here are some of the examples!\n-- built into rsstui --\n\n- TechCrunch: https://techcrunch.com/feed.xml\n- NYT Global: https://rss.nytimes.com/services/xml/rss/nyt/World.xml (has feeds for different subpages but not all)\n- Reddit!: All sub-reddits have rss feeds, just add `.rss` to the end of the link like https://www.reddit.com/r/JDVancePics.rss UPDATE: Reddit feeds seem to have a really really small limit on rss requests, so they dont work reliably\n- And other! like https://theverge.com/rss.xml https://xkcd.com/rss.xml\n\nIt's pretty cool huh?\n\n# Installation\n\n## Easy Installation from PyPI (Recommended)\n\nPyPi is a great service to host python scripts and packages. Here's how to install it:\n\nFirst u need to create some sort of folder for my app and activate the venv\n\n```bash\nmkdir rsstui\n```\n\nThen activate env\n\n```bash\npython3 -m venv venv\n```\n\nAnd\n\n```bash\nsource venv/bin/activate\n```\n\nNote: If u use fish then add `.fish` to the end of the command so it looks like: `source venv/bin/activate.fish`\n\nNow there's easy part\n\n```bash\npip install rsstui\n```\n\nAnd then run\n\n```bash\nrsstui\n```\n\nCongrtats u so smart\n\n## Development Installation\n\nWant to contribute or run from source? Here's how:\n\n## Linux! (tested, works 100%)\n\nThe app was written on Linux Mint. Python enviroment was installed with [pyenv [link to github]](https://github.com/pyenv/pyenv), which is a very good way to manage Python versions, it even supports custom python compilers, check it out!!!\n\nAlright Here is how:\nFirst clone the repo onto your computer\n\n```bash\ngit clone https://github.com/yehorscode/RssTUI RssTUI\n```\n\n[Optional] If you have a pyenv enviroment i highly reccomend to install 3.11.4 with this command (takes 2-4 mins)\n\n```bash\npyenv install 3.11.4\n```\n\nThen cd into your folder\n\n```bash\ncd RssTUI\n```\n\nAnd if you have pyenv activate your 3.11.4 installation with\n\n```bash\npyenv shell 3.11.4\n```\n\nRemember how i mentioned `venv`? It is a virtual enviroment you need to activate it\n\nBash:\n\n```bash\nsource venv/bin/activate\n```\n\nFish:\n\n```fish\nsource venv/bin/activate.fish\n```\n\nCsh:\n\n```csh\nsource venv/bin/activate.csh\n```\n\nNow all that's left is install Textual\n\n```bash\npip install -r requirements.txt\n```\n\nWait some time for it to finish, then you can run the app with:\n\n```bash\npython3 rsstui/app.py\n```\n\n## Windows (not fully tested)\n\nJust use WSL, learn how to install and use it: [Microsoft docs link](https://learn.microsoft.com/en-us/windows/wsl/install)\nFor using it inside wsl PLEASE use Windows Terminal and not cmd or powershell consoles. Wundows Terminal is a standalone app but it works a lot better then the other ones + looks very cool see [microsoft windows terminal documentation](https://learn.microsoft.com/en-us/windows/terminal/install)\n\n## MacOS\n\nI have never owned ANY mac device, so i do not know how does it know, and how to activate enviroments, sadly i can't reccomend anything. BUT BUT BUT the Linux methods may work. Please try them! Use bash methods\nIn theory mac os and linux both use unix, so installing the app should work right out of the box and maybe even with the auto installer\n\n### Running\n\nIf installed via PyPi just run\n\n```bash\nrsstui\n```\n\nIf u did it with the manual masochist method do:\n\n```bash\npython3 rsstui/app.py\n```\n\nSimple and clean! \ud83d\ude80\n\n# Please vote for me!!\n\nI really want to get the flipper zero, i would develop apps for it and have lots of fun learning how pentesting works. Thanks! If u have issues just find me\n",
"bugtrack_url": null,
"license": null,
"summary": "RSS reader TUI application built with Textual",
"version": "1.0.0",
"project_urls": {
"Bug Reports": "https://github.com/yehorscode/RssTUI/issues",
"Homepage": "https://github.com/yehorscode/RssTUI",
"Source": "https://github.com/yehorscode/RssTUI"
},
"split_keywords": [
"rss",
" feed",
" reader",
" tui",
" terminal",
" textual",
" news"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "27faf31a7a603f0705f46f56dc01e97a66b6333ef4a5531fb5b475ea52193540",
"md5": "3de1dbd7fc47dc2ff404d2fbe3b9ef87",
"sha256": "ec0c5ef041ae4c8d20519c9d193286e6d47c009e6c73bceaa36ccc108ef0f4ea"
},
"downloads": -1,
"filename": "rsstui-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3de1dbd7fc47dc2ff404d2fbe3b9ef87",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 14671,
"upload_time": "2025-08-09T12:38:08",
"upload_time_iso_8601": "2025-08-09T12:38:08.252309Z",
"url": "https://files.pythonhosted.org/packages/27/fa/f31a7a603f0705f46f56dc01e97a66b6333ef4a5531fb5b475ea52193540/rsstui-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f3d14c0f622d592f173dd89ff3008a4c47c3329b619f3d4ee929497cfaf8018a",
"md5": "3e7e612948cebc5a1452727c19c1dabc",
"sha256": "fa9d75d16f99ba6b01fd7ba0542a497c13c97b57371c13fbf3979517838fb2b7"
},
"downloads": -1,
"filename": "rsstui-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "3e7e612948cebc5a1452727c19c1dabc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 17716,
"upload_time": "2025-08-09T12:38:09",
"upload_time_iso_8601": "2025-08-09T12:38:09.337046Z",
"url": "https://files.pythonhosted.org/packages/f3/d1/4c0f622d592f173dd89ff3008a4c47c3329b619f3d4ee929497cfaf8018a/rsstui-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-09 12:38:09",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yehorscode",
"github_project": "RssTUI",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "aiofiles",
"specs": [
[
"==",
"24.1.0"
]
]
},
{
"name": "aiohappyeyeballs",
"specs": [
[
"==",
"2.6.1"
]
]
},
{
"name": "aiohttp",
"specs": [
[
"==",
"3.12.15"
]
]
},
{
"name": "aiosignal",
"specs": [
[
"==",
"1.4.0"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "feedparser",
"specs": [
[
"==",
"6.0.11"
]
]
},
{
"name": "frozenlist",
"specs": [
[
"==",
"1.7.0"
]
]
},
{
"name": "html2text",
"specs": [
[
"==",
"2025.4.15"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "linkify-it-py",
"specs": [
[
"==",
"2.0.3"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "mdit-py-plugins",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "multidict",
"specs": [
[
"==",
"6.6.3"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.8"
]
]
},
{
"name": "propcache",
"specs": [
[
"==",
"0.3.2"
]
]
},
{
"name": "Pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.1.0"
]
]
},
{
"name": "rsstui",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "sgmllib3k",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "textual",
"specs": [
[
"==",
"5.3.0"
]
]
},
{
"name": "typing_extensions",
"specs": [
[
"==",
"4.14.1"
]
]
},
{
"name": "uc-micro-py",
"specs": [
[
"==",
"1.0.3"
]
]
},
{
"name": "yarl",
"specs": [
[
"==",
"1.20.1"
]
]
}
],
"lcname": "rsstui"
}