feat(rss-reader): migrate and redesign RSS reader app#780
feat(rss-reader): migrate and redesign RSS reader app#780nicomiguelino wants to merge 12 commits intomasterfrom
Conversation
- Rename old app directory to rss-reader-old - Scaffold new app using edge-app-template with Bun/Vite/TypeScript - Replace vendored JS libs with @rowanmanning/feed-parser and @screenly/edge-apps utilities - Redesign UI with glassmorphism card layout from Figma (landscape 3-col, portrait 2-col) - Add CORS proxy server to dev workflow via run-p
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
PR Code Suggestions ✨Explore these optional code suggestions:
|
- Remove rss-reader-old/ directory - Move deployed-apps.yml and DEPLOYMENT.md to rss-reader/ - Rename static/images/ to static/img/ to match old structure - Sync screenly.yml and screenly_qc.yml from old app
- Reformat SVG attributes in index.html - Reformat long line in main.ts
- Move feed card template outside #feed-grid to prevent it being wiped by innerHTML reset - Add high-specificity [hidden] rules to prevent .feed-error display:flex from overriding hidden attribute - Fix background image path from static/images/ to static/img/ - Replace background with sunny image
- Redesign cards with glass-morphism style - Add locale/TZ-aware date above the feed grid - Fix portrait layout to position cards at the bottom - Fix hidden element CSS specificity conflict - Update e2e screenshots with mock RSS data - Remove unused rssTitle parameter
- Split error message onto two lines for better visual balance - Increase text-muted opacity to 0.8 - Add line-height, padding-bottom, and text-align to center error text
- Add display_errors setting for panic-overlay error handling - Remove unused theme setting and setupTheme call - Update README to reflect current settings
- Extract stripHtml, loadCache, and saveCache into utils.ts - Replace local formatDate with formatLocalizedDate from @screenly/edge-apps - Add unit tests for stripHtml, loadCache, and saveCache
- Pass locale and timezone into fetchFeed to avoid repeated async calls - Return early in catch block to eliminate duplicate renderCards/showGrid
- Add feed-card-source element to card template - Display rss_title as source label on each card - Style source label as small, muted, uppercase text - Group title, date, and source in feed-card-meta wrapper - Update docs to reflect rss_title usage
There was a problem hiding this comment.
Pull request overview
Migrates the RSS Reader edge app from the legacy static/Alpine implementation to a new Bun/Vite/TypeScript app using @screenly/edge-apps utilities and @rowanmanning/feed-parser, with a redesigned responsive “glassmorphism” card UI and updated deployment/testing workflow.
Changes:
- Replaced legacy Alpine-based runtime (vendored libs + static JS/CSS) with a TypeScript app that fetches/parses RSS, formats localized dates, and renders template-based cards.
- Added caching utilities + unit tests and Playwright screenshot coverage.
- Updated manifests, docs, and tooling for the new Bun dev/build workflow (including a dev CORS proxy).
Reviewed changes
Copilot reviewed 17 out of 40 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| edge-apps/rss-reader/src/main.ts | New TS app entry: fetch/parse/render, caching fallback, localization, ready signal |
| edge-apps/rss-reader/src/utils.ts | HTML stripping + localStorage cache read/write helpers |
| edge-apps/rss-reader/src/utils.test.ts | Unit tests for utils (stripHtml + cache load/save) |
| edge-apps/rss-reader/src/css/style.css | New responsive glassmorphism layout and typography |
| edge-apps/rss-reader/index.html | New template-driven shell using auto-scaler + @screenly/edge-apps/components |
| edge-apps/rss-reader/package.json | Bun/Vite/TS tooling, scripts, dependencies |
| edge-apps/rss-reader/tsconfig.json | TS config extending @screenly/edge-apps baseline |
| edge-apps/rss-reader/e2e/screenshots.spec.ts | Playwright screenshot test with mocked Screenly + RSS |
| edge-apps/rss-reader/screenly.yml | Updated manifest settings (adds display_errors, removes legacy theme) |
| edge-apps/rss-reader/screenly_qc.yml | QC manifest kept in sync with manifest settings |
| edge-apps/rss-reader/README.md | Updated dev/test/build/deploy instructions + settings table |
| edge-apps/rss-reader/DEPLOYMENT.md | Updated deployment notes (RSS Title meaning) |
| edge-apps/rss-reader/deployed-apps.yml | Registry of deployed RSS Reader instances/IDs |
| edge-apps/rss-reader/.ignore | Deployment ignore rules (now ignores node_modules) |
| edge-apps/rss-reader/.gitignore | Git ignore rules including build outputs and screenshot PNGs |
| edge-apps/rss-reader/screenshots/*.webp | New/updated reference screenshots for supported resolutions |
| edge-apps/rss-reader/static/js/* | Removes legacy vendored JS + Alpine app runtime |
| edge-apps/rss-reader/static/css/* | Removes legacy static CSS styling |
| edge-apps/rss-reader/static/img/Screenly.svg | Removes legacy logo asset (no longer referenced by new UI) |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| ): Promise<RssEntry[]> { | ||
| const bypassCors = | ||
| getSettingWithDefault<string>('bypass_cors', 'true') === 'true' | ||
| const url = bypassCors ? `${getCorsProxyUrl()}/${rssUrl}` : rssUrl |
| const cacheInterval = | ||
| parseInt(getSettingWithDefault<string>('cache_interval', '1800')) * 1000 |
| const data: AppCache = { entries, timestamp: Date.now() } | ||
| localStorage.setItem(CACHE_KEY, JSON.stringify(data)) |
| const parsed: AppCache = JSON.parse(raw) | ||
| return parsed.entries ?? [] |
- Only apply CORS proxy to absolute http/https URLs - Use number type for cache_interval to avoid parseInt edge cases - Wrap saveCache in try/catch to prevent storage errors from breaking renders - Document legacy cache format behaviour in loadCache
User description
Summary
rss-reader-oldand scaffold new app with Bun/Vite/TypeScriptrss-parser,moment, Alpine, offline geocode) with@rowanmanning/feed-parserand@screenly/edge-appsutilitiesPR Type
Enhancement, Tests, Documentation
Description
Scaffold Bun/Vite TypeScript RSS app
Render cached, localized RSS feed cards
Add responsive glassmorphism layout and header
Archive legacy app and add screenshots
Diagram Walkthrough
File Walkthrough
1 files
Capture app screenshots across supported resolutions3 files
Fetch, cache, and render RSS entriesAdd glassmorphism responsive feed card stylesReplace static layout with template-driven shell4 files
Archive legacy Alpine RSS reader logicArchive shared legacy RSS layout stylesArchive legacy responsive card stylingPreserve legacy Alpine-based RSS markup8 files
Add archived QC manifest ignore ruleAdd archived deployed RSS app definitionsPreserve legacy Screenly manifest settingsPreserve legacy QC manifest settingsIgnore `node_modules` in migrated appUpdate manifest categories and settingsSync QC manifest with new settingsAdd TypeScript config for new source3 files
Document multi-instance legacy deployment workflowPreserve legacy setup and configuration guideRewrite README for Bun development workflow1 files
Add Bun tooling and RSS dependencies1 files