# RSSPipe Backlog Specification (`003_backlog.md`)
This document records planned features, UX enhancements, and architectural extensions identified during initial testing and validation.
---
## 1. Search Box Auto-Complete & Real-Time Suggestions
- **Goal**: Enable rich auto-complete and search suggestion dropdown as the user types in the global search bar.
- **Scope**:
- Auto-suggest matches across article titles, feed names, author tags, and category labels.
- Keyboard navigation within search dropdown (`ArrowDown`, `ArrowUp`, `Enter` to jump directly to article or feed).
- Search history / recent queries quick access.
---
## 2. Password Management in User Settings
- **Goal**: Allow the single-user administrator to update their login credentials directly from `Settings > Account & System`.
- **Scope**:
- Backend API: `PUT /api/auth/password` verifying `old_password` and updating bcrypt hash for `new_password`.
- Frontend Modal/Card with confirmation field and clear validation indicators.
---
## 3. Comprehensive Keyboard Shortcuts Test Suite
- **Goal**: Automated end-to-end and unit testing for all single-key power-user navigation bindings.
- **Scope**:
- `j` / `k`: Next / previous article navigation.
- `s`: Toggle star.
- `m`: Toggle read status.
- `e`: Archive / mark read and advance.
- `v`: Open original URL in new browser tab.
- `[`: Toggle sidebar collapse/expand.
- `r`: Trigger feed refresh.
- `a`: Open Add Feed modal.
- `1`, `2`, `3`: Switch views (3-Split, Waterfall, Settings).
- `?`: Open keyboard shortcuts cheatsheet modal.
- `Shift + A`: Mark all as read with confirmation.
- Ensure shortcuts are strictly inhibited when focus is inside text inputs, textareas, or modal forms.
---
## 4. Header Brand & Sidebar Toggle Alignment Consistency
- **Goal**: Standardize the top header layout across all view modes (3-Split, Waterfall, and Settings).
- **Scope**:
- In 3-Split view, ensure the RSSPipe logo and brand name occupy the consistent leftmost position matching Waterfall and Settings views.
- Ensure the sidebar toggle icon `[` integrates cleanly into the left group or toolbar without disrupting brand alignment.
---
## 5. Refresh Button Spinning Micro-Animation
- **Goal**: Provide instant visual feedback when a background refresh or manual pull is in progress.
- **Scope**:
- Add smooth CSS keyframe spin animation (`@keyframes spin { 100% { transform: rotate(360deg); } }`) to the refresh icon when `isRefreshing` is active.
---
## 6. Feed Favicon & Website Icon Scraping / Upload
- **Goal**: Enhance visual recognition by displaying brand icons next to each feed.
- **Scope**:
- **Auto-Scraper**: Automatically fetch and cache `favicon.ico`, ``, or `` from the feed's website root during initial subscription.
- **Manual Customization**: Allow uploading or specifying a custom icon URL in `Settings > Subscriptions > Edit Feed`.
---
## 7. Active Post Reading Persistence on Subscription Switch
- **Goal**: Prevent reader disruption when exploring other subscriptions.
- **Scope**:
- When actively reading an article in the right canvas of 3-Split view, clicking a different subscription or category in the left sidebar should update the middle article list *without* abruptly closing or reloading the active article in the right canvas until a new article is explicitly selected.
---
## 8. Unified Feed & Category Tree Hierarchy ("Feeds" Root)
- **Goal**: Simplify feed organization into a single clean hierarchy.
- **Scope**:
- Eliminate the artificial separation between "Categorized Feeds" and "Uncategorized Feeds".
- Present a single unified **"Feeds"** section where uncategorized feeds reside at the root level alongside collapsible category folders.
- Drag-and-drop or simple dropdown assignment to move feeds between root and folders.
---
## 9. Enhanced Xiaohongshu Masonry Waterfall Experience
- **Goal**: Further elevate the card aesthetics and mobile interaction to closely match Xiaohongshu.
- **Scope**:
- Staggered dynamic aspect ratios with prominent media cards.
- Smooth infinite scroll pagination.
- Interactive gesture swipe to dismiss the full-screen reader.
---
## 10. Beautiful 404 Error Page
- **Goal**: Provide a polished, modern, brand-consistent 404 Not Found experience.
- **Scope**:
- Frontend 404 route component with sleek modern aesthetics (glassmorphism/minimal illustration, clear error description, and a "Return to Gateway" action button).
- Server-side fallback handler returning a clean, branded HTML response for unmatched routes.
---
## 11. Multi-Variant Pipeline Enrichments (AI Summary, TTS, Keywords, Audio)
- **Goal**: Expand the event-driven rules engine and variant storage system with automated enrichment plugins.
- **Scope**:
- **AI Summary Hook**: Integrate LLM actions (e.g. OpenAI / Anthropic / Gemini / Ollama) to automatically generate and store concise summaries in `entry_variants(key='ai_summary')`.
- **Keyword & Tag Extraction**: Automated extractor storing structured YAML/JSON keyword lists in `entry_variants(key='keywords')` and `entry_variants(key='tags')` to enable rule-based chaining.
- **Text-to-Speech (TTS)**: Synthesize article text to voice audio blobs (`.mp3` stored under `./data/blobs/{entry_id}/tts.mp3`) with HTTP 206 partial streaming.
- **Podcast TTS & Summary TTS**: Convert articles into dual-host conversational podcasts or audio-narrated summaries streamed directly within the reader.
---
## 12. Aggregated Shared Posts Dashboard (`/shares`)
- **Goal**: Provide a dedicated gallery view aggregating all publicly shared articles.
- **Scope**:
- Centralized dashboard listing all articles with an active `share_uuid`.
- Copy public link, preview shared HTML canvas, revoke share link, and view access stats.
---
## 13. Data Retention & Cleanup Policies (Auto-Deletion)
- **Goal**: Provide configurable retention rules to prune older or noisy articles and keep SQLite storage compact.
- **Scope**:
- Retention triggers (e.g. delete unstarred articles older than 90 days, or limit feeds to latest 500 posts).
- Background garbage collection cleaning associated `entry_variants` and on-disk audio blobs (`./data/blobs/{entry_id}/`).