{"id":51130709,"url":"https://github.com/xtoshiro/rss-deck","last_synced_at":"2026-06-25T12:01:18.812Z","repository":{"id":365090449,"uuid":"1270253003","full_name":"xToshiro/rss-deck","owner":"xToshiro","description":"RSS Deck - Um dashboard interativo de feeds RSS em tempo real com categorização dinâmica, filtros avançados, viagem no tempo (histórico), destaque de tags customizadas e um instalador desktop completo para a System Tray.","archived":false,"fork":false,"pushed_at":"2026-06-15T20:46:01.000Z","size":1161,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T21:24:53.069Z","etag":null,"topics":["brasil","dashboard","desktop-app","feed","flask","global","installer","javascript","news","noticias","python","realtime","rss","rss-feed","sqlite","system-tray"],"latest_commit_sha":null,"homepage":"https://github.com/xToshiro/rss-deck/releases","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xToshiro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-15T14:30:22.000Z","updated_at":"2026-06-15T20:46:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/xToshiro/rss-deck","commit_stats":null,"previous_names":["xtoshiro/rss-deck"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/xToshiro/rss-deck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xToshiro%2Frss-deck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xToshiro%2Frss-deck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xToshiro%2Frss-deck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xToshiro%2Frss-deck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xToshiro","download_url":"https://codeload.github.com/xToshiro/rss-deck/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xToshiro%2Frss-deck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34773843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brasil","dashboard","desktop-app","feed","flask","global","installer","javascript","news","noticias","python","realtime","rss","rss-feed","sqlite","system-tray"],"created_at":"2026-06-25T12:01:17.628Z","updated_at":"2026-06-25T12:01:18.800Z","avatar_url":"https://github.com/xToshiro.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RSS Deck — Real-Time RSS/Atom Feed Dashboard\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Python-3.10%2B-blue?style=for-the-badge\u0026logo=python\u0026logoColor=white\" alt=\"Python Badge\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Flask-Framework-black?style=for-the-badge\u0026logo=flask\u0026logoColor=white\" alt=\"Flask Badge\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SQLite-Database-003B57?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white\" alt=\"SQLite Badge\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/CSS3-Vanilla-1572B6?style=for-the-badge\u0026logo=css3\u0026logoColor=white\" alt=\"CSS3 Badge\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"dashboard.png\" alt=\"RSS Deck Dashboard Preview\" width=\"100%\" style=\"border-radius: 12px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); margin: 20px 0;\"\u003e\n\u003c/p\u003e\n\n---\n\n## Language / Idioma\n- [English](#english)\n- [Português](#português)\n\n---\n\n# English\n\n**RSS Deck** is a professional real-time news dashboard inspired by the classic multi-column layout of *TweetDeck*. It allows users to aggregate and monitor multiple RSS/Atom feeds concurrently through vertical scrollable columns organized into dynamic category tabs. The application is built using a local persistent SQLite database in Write-Ahead Log (WAL) mode, supporting historical news searches, custom tag highlights, and native Windows System Tray background execution.\n\n## Key Features\n\n- **Dynamic Category Tabs**: Easily switch between standard categories (*e.g., Brazil, World, Economy, Technology, Conflict*) or create custom ones directly from the UI.\n- **Feed Manager (CRUD)**: Register, edit, or delete RSS feeds. Bounded dynamically to category tabs with instant automatic crawler processing.\n- **Custom Update Intervals**: Configure polling intervals individually per feed. The system automatically calculates a default baseline interval based on the historical publication frequency of each feed.\n- **Drag \u0026 Drop Reordering**: Reorganize feed columns visually using native drag-and-drop. The layout order is automatically saved and persistent in the database.\n- **Header Metadata \u0026 Tag Badges**: Shows average publication intervals and polling configurations. Display circular colored reference counters matching active tag keyword alerts.\n- **Tag Manager \u0026 Pulse Alerts**: Set keywords with custom colors. When a matched term appears in an article title, it displays a neon keyword badge and triggers a subtle glow warning in the card.\n- **Targeted Column Refresh**: Perform updates on a single feed column with a futuristic scanner animation overlay without triggering a global refresh.\n- **Update Detector**: Automatically queries the GitHub Releases API and displays a top notification banner if a newer desktop version is available.\n- **Time-Travel (Historical Archives)**: Filter articles by a specific publication date and perform instant text searches across archives.\n- **Clean Article Purging**: Sanitizes descriptions (stripping HTML tags) and filters placeholder empty cards (such as empty UOL placeholders) to ensure premium visual consistency.\n- **Optimized UI Animations**: Uses lightweight CSS opacity transformations for alerts and transitions to minimize browser CPU/GPU utilization.\n\n---\n\n# Português\n\nO **RSS Deck** é um dashboard profissional de notícias em tempo real inspirado no layout clássico de múltiplas colunas do *TweetDeck*. Ele permite agregar e monitorar múltiplos feeds RSS/Atom simultaneamente através de colunas verticais organizadas em abas de categorias dinâmicas. O aplicativo possui persistência local com banco SQLite rodando no modo Write-Ahead Log (WAL), suportando busca histórica de notícias, destaque de palavras-chave com tags coloridas e execução nativa em segundo plano na bandeja do sistema (System Tray) do Windows.\n\n## Principais Funcionalidades\n\n- **Abas de Categorias Dinâmicas**: Alterne facilmente entre abas organizadas (*ex: Brasil, Mundo, Economia, Tecnologia, Guerras*) ou crie novas categorias diretamente pela interface.\n- **Gerenciador de Feeds (CRUD)**: Cadastre, edite ou exclua canais RSS. Integrado com as abas de categorias e com varredura automática imediata após o cadastro.\n- **Intervalos de Atualização Customizados**: Configure intervalos de checagem individuais por feed. O sistema autocalcula um tempo padrão com base na média real de publicação de notícias do canal.\n- **Reordenação por Arrastar e Soltar (Drag \u0026 Drop)**: Reorganize as colunas arrastando-as lateralmente. A ordenação visual é persistida de forma automática no banco de dados.\n- **Metadados e Badges de Tags**: Visualize a média de publicação e tempo de polling no topo das colunas. Badges coloridos circulares informam quantas notícias daquela coluna contêm termos de suas tags ativas.\n- **Alertas de Tags Pulsantes**: Cadastre palavras-chave e atribua cores. Artigos correspondentes recebem destaque neon no título e um contorno brilhante sutil.\n- **Atualização Direcionada por Coluna**: Atualize feeds específicos de forma independente com uma animação futurista de varredura laser na coluna correspondente.\n- **Detector de Novas Releases**: Monitora lançamentos no repositório do GitHub e exibe um banner de aviso se houver atualizações disponíveis para download.\n- **Viagem no Tempo (Histórico)**: Filtre artigos por um dia específico e realize buscas por termos e palavras-chave.\n- **Sanitização Inteligente de Notícias**: Remove tags HTML de descrições e bloqueia placeholders vazios ou notícias de lixo (como links em branco comuns do UOL).\n- **Consumo de Recursos Otimizado**: Utiliza animações de opacidade leves para evitar repaints sucessivos no navegador, minimizando o uso de CPU/GPU.\n\n---\n\n## Tech Stack / Tecnologias\n- **Backend**: Python 3.10+, Flask, SQLite3 (WAL mode), `feedparser`, `requests`, `pystray`, `Pillow`\n- **Frontend**: Semantic HTML5, Vanilla CSS3 (Glassmorphism, CSS variables, keyframe animations), Vanilla JavaScript (Native Drag and Drop, Fetch API, DOM manipulation)\n\n---\n\n## Database Schema / Estrutura do Banco\nThe SQLite database (`rss_deck.db`) implements a relational model with foreign key constraints (`ON DELETE CASCADE`):\n\n```mermaid\nerDiagram\n    categories {\n        INTEGER id PK\n        TEXT name \"UNIQUE\"\n        INTEGER display_order\n    }\n    feeds {\n        INTEGER id PK\n        TEXT name\n        TEXT url \"UNIQUE\"\n        TEXT category\n        INTEGER column_index\n        INTEGER update_interval\n        TEXT last_fetched\n    }\n    articles {\n        INTEGER id PK\n        INTEGER feed_id FK\n        TEXT guid \"UNIQUE\"\n        TEXT title\n        TEXT description\n        TEXT link\n        TEXT pub_date\n        TEXT fetched_date\n    }\n    tags {\n        INTEGER id PK\n        TEXT word \"UNIQUE\"\n        TEXT color\n    }\n    \n    feeds }|--|| categories : \"organized under\"\n    articles }|--|| feeds : \"belongs to\"\n```\n\n---\n\n## Installation \u0026 Running / Instalação e Execução\n\n### Option 1: Desktop Graphical Installer (Windows - Recommended) / Opção 1: Instalador Gráfico (Recomendado)\nThe installer script packages all dependencies, sets up local directories, and configures the startup shortcut.\n\n1. Execute the installer:\n   ```bash\n   python installer.py\n   ```\n2. Read and accept the software license (**GPLv3**) and select the installation directory (Default: `AppData/Local/RSSDeck`).\n3. The installer will:\n   - Create local destination folders.\n   - Install required dependencies silently via `pip`.\n   - Setup a desktop shortcut linking to `pythonw.exe app.py` for silent background execution.\n4. Launch the application from the desktop shortcut. It runs in the **System Tray** and opens the browser interface.\n\n---\n\n### Option 2: Manual Run / Opção 2: Execução Manual\n1. Install dependencies from `requirements.txt`:\n   ```bash\n   pip install -r requirements.txt\n   ```\n2. Run the server and system tray icon:\n   ```bash\n   python app.py\n   ```\n   *Note: This starts the local server at `http://127.0.0.1:5000/` and launches the tray interface.*\n\n---\n\n## System Tray \u0026 Single Instance / Bandeja do Sistema e Instância Única\n\n- **Tray Control**: The backend runs in the background. Right-click the tray icon to access:\n  - **Open RSS Deck**: Launches the dashboard in the default browser.\n  - **Exit**: Terminates the Flask server and background pollers.\n- **Single Instance Guard**: Clicking the desktop shortcut while the backend is already running will not spawn duplicate processes. The program will detect the active port, open the dashboard in the browser, and terminate the redundant launcher immediately.\n\n---\n\n## Running Tests / Executando os Testes\n\nTo run the automated suite of unit and integration tests:\n```bash\npytest test_app.py\n```\nThe test suite validates:\n- SQLite schema structure and cascade deletions.\n- Publish date standardization (RFC 822/ISO 8601).\n- REST API CRUD and column reordering handlers.\n- Cleaning rules for article titles/descriptions and empty placeholder exclusion.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtoshiro%2Frss-deck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxtoshiro%2Frss-deck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtoshiro%2Frss-deck/lists"}