{"id":48739705,"url":"https://github.com/jgerton/ember-feed","last_synced_at":"2026-04-12T06:35:43.066Z","repository":{"id":325450225,"uuid":"1101210294","full_name":"jgerton/ember-feed","owner":"jgerton","description":"Personal news dashboard with ML-powered ranking algorithm. Learns your reading preferences and surfaces relevant content. Built with Next.js, Posgresql, redis, and Docker.","archived":false,"fork":false,"pushed_at":"2026-04-11T04:24:07.000Z","size":9111,"stargazers_count":1,"open_issues_count":15,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-12T06:35:31.411Z","etag":null,"topics":["docker","glassmorphism","machine-learning","ml","n8n","news-aggregator","nextjs","personal-dashboard","postgres","react","recommendation-algorithm","redis","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jgerton.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-11-21T10:54:34.000Z","updated_at":"2026-03-22T20:25:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jgerton/ember-feed","commit_stats":null,"previous_names":["jgerton/ember-feed"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jgerton/ember-feed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgerton%2Fember-feed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgerton%2Fember-feed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgerton%2Fember-feed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgerton%2Fember-feed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jgerton","download_url":"https://codeload.github.com/jgerton/ember-feed/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgerton%2Fember-feed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31706765,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["docker","glassmorphism","machine-learning","ml","n8n","news-aggregator","nextjs","personal-dashboard","postgres","react","recommendation-algorithm","redis","tailwindcss","typescript"],"created_at":"2026-04-12T06:35:42.438Z","updated_at":"2026-04-12T06:35:43.041Z","avatar_url":"https://github.com/jgerton.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ember Feed\n\nA modern, AI-powered personal news dashboard with ML-based article ranking, smart recommendations, and feed diversity controls. Built with Next.js 16, React 19, and Tailwind CSS 4.\n\n![Dashboard Preview](./docs/screenshot.png) \u003c!-- Add screenshot later --\u003e\nComing soon, screenshot for dashboard preview.\n\n## Features\n\n### Core Features\n- **ML-Powered Ranking**: Personalized article scoring based on reading behavior and preferences\n- **Smart Recommendations**: Content-based filtering with 5 scoring signals (similarity, topic affinity, source preferences, serendipity, recency)\n- **Feed Diversity Algorithm**: Prevents echo chambers with configurable diversity levels (low/medium/high)\n- **Daily Digest Card**: Curated highlights showing top articles, tasks, and trending topics\n- **Topic Classification**: Automatic topic extraction and filtering with relevance scoring\n- **RSS Feed Health Tracking**: Monitors feed reliability with automatic quarantine for broken sources\n- **Read-Later Queue**: Priority-based article bookmarking with dedicated reading view\n- **Full-Text Search**: Fast article search across titles and descriptions\n- **Developer Journal**: Log discoveries, accomplishments, blockers, and thoughts\n- **Analytics Dashboard**: Reading patterns, topic engagement, and activity tracking\n\n### UI/UX\n- **Glassmorphic Design**: Modern frosted-glass aesthetic with dark theme\n- **Collapsible Sections**: User-controlled visibility for all major components\n- **Real-Time Updates**: Live data refresh without page reloads\n- **Responsive Layout**: Optimized for desktop and mobile viewing\n- **Hot Reload**: Instant feedback during development\n- **Dockerized**: Containerized development environment\n\n## Tech Stack\n\n- **Frontend**: Next.js 16, React 19, Tailwind CSS 4\n- **Backend**: Next.js API Routes (App Router)\n- **Database**: Prisma ORM with SQLite (development) / PostgreSQL (production ready)\n- **Containerization**: Docker + Docker Compose\n- **News Sources**: RSS feeds (Hacker News, Reddit, Dev.to)\n- **Type Safety**: TypeScript with strict mode\n- **Testing**: Playwright for end-to-end tests\n\n## Quick Start\n\nChoose your preferred method:\n\n### Option 1: Run with Docker (Recommended)\n\n**Prerequisites**: Docker Desktop installed\n\n```bash\n# Clone the repository\ngit clone https://github.com/jgerton/ember-feed.git\ncd ember-feed\n\n# Start with Docker Compose\ndocker-compose up -d\n\n# View logs\ndocker-compose logs -f app\n\n# Open browser\nhttp://localhost:3002\n```\n\n**That's it!** Hot reload is enabled automatically.\n\n**Stop the application:**\n```bash\ndocker-compose down\n```\n\n---\n\n### Option 2: Run Locally (Without Docker)\n\n**Prerequisites**: Node.js 20+ installed\n\n```bash\n# Clone the repository\ngit clone https://github.com/jgerton/ember-feed.git\ncd ember-feed\n\n# Install dependencies\nnpm install\n\n# Set up Prisma database\nnpx prisma generate\nnpx prisma migrate dev\n\n# Run development server\nnpm run dev\n\n# Open browser\nhttp://localhost:3000  # or check console for actual port\n```\n\n## Development\n\n### Project Structure\n\n```\nember-feed/\n├── app/                    # Next.js 16 app directory (App Router)\n│   ├── api/               # API routes\n│   │   ├── analytics/     # User activity analytics\n│   │   ├── articles/      # Article CRUD and listing\n│   │   ├── digest/        # Daily digest aggregation\n│   │   ├── feeds/         # RSS feed management\n│   │   ├── log/           # Developer journal entries\n│   │   ├── recommendations/ # Smart article recommendations\n│   │   ├── saved-articles/ # Read-later queue\n│   │   ├── search/        # Full-text article search\n│   │   ├── settings/      # User preferences (diversity level)\n│   │   ├── sync/          # Manual RSS sync trigger\n│   │   ├── todos/         # Todo CRUD endpoints\n│   │   └── topics/        # Topic filtering and stats\n│   ├── read-later/        # Read-later page\n│   ├── layout.tsx         # Root layout\n│   └── page.tsx           # Home page\n├── components/            # React client components\n│   ├── AnalyticsDashboard.tsx  # Reading stats and charts\n│   ├── DailyDigest.tsx         # Daily highlights card\n│   ├── DailySummary.tsx        # Quick stats overview\n│   ├── DeveloperJournal.tsx    # Log entry interface\n│   ├── FeedAdmin.tsx           # RSS feed management UI\n│   ├── NewsWidget.tsx          # Main article feed\n│   ├── SearchBar.tsx           # Article search interface\n│   ├── ThemeToggle.tsx         # Theme switcher\n│   └── TodoList.tsx            # Task management\n├── lib/                   # Utilities and services\n│   ├── db.ts             # Prisma client initialization\n│   ├── cronService.ts    # RSS feed polling (every 30 min)\n│   ├── feedHealthService.ts  # RSS health monitoring\n│   ├── feedService.ts    # RSS parsing and ingestion\n│   ├── rankingService.ts # ML ranking, recommendations, diversity\n│   └── topicExtraction.ts # Automatic topic classification\n├── prisma/               # Database layer\n│   ├── schema.prisma     # Database schema (8 models)\n│   ├── migrations/       # Migration history\n│   └── dev.db           # SQLite database (development)\n├── scripts/              # Utility scripts\n│   ├── addBadFeed.ts     # Test feed health monitoring\n│   ├── benchmark-queries.ts  # Performance testing\n│   └── check-analytics.ts    # Verify analytics data\n├── tests/                # E2E tests\n│   └── homepage.spec.ts  # Playwright tests\n├── hooks/                # Custom React hooks\n│   └── useDebounce.ts    # Debounced input helper\n├── Dockerfile            # Development Docker image\n├── docker-compose.yml    # Docker orchestration\n├── next.config.ts        # Next.js configuration\n├── tailwind.config.ts    # Tailwind CSS 4 configuration\n└── instrumentation.ts    # Next.js instrumentation (cron init)\n```\n\n### Hot Reload Configuration\n\nHot reload works automatically in both Docker and local setups:\n\n**Docker (Windows/Mac):**\n- Uses file polling (checks every 1 second)\n- Configured in `next.config.js` with `watchOptions.poll`\n\n**Local:**\n- Uses native file watching (inotify)\n- Faster than Docker on Linux\n\n### Adding New Features\n\n1. Create component in `components/`\n2. Add API route in `app/api/[feature]/route.ts` if needed\n3. Update Prisma schema if database changes required\n4. Run `npx prisma migrate dev` to create migration\n5. Restart Docker container to pick up new routes\n6. Update home page in `app/page.tsx`\n\n## API Documentation\n\nAll API endpoints return JSON responses. Base URL: `http://localhost:3002/api`\n\n### Articles\n\n**GET /api/articles**\n- Returns paginated, ranked list of articles\n- Query params:\n  - `limit` (number): Max articles to return (default: 20)\n  - `personalized` (boolean): Enable ML ranking (default: false)\n  - `topic` (string): Filter by topic slug\n- Response: Array of articles with topics, score, and metadata\n\n**Example:**\n```bash\ncurl \"http://localhost:3002/api/articles?limit=10\u0026personalized=true\u0026topic=ai\"\n```\n\n### Recommendations\n\n**GET /api/recommendations**\n- Returns personalized article recommendations based on reading history\n- Filters out already-read articles automatically\n- Query params:\n  - `limit` (number): Max recommendations (default: 10, max: 50)\n- Response: Articles with recommendation metadata (score, reason, breakdown)\n\n**Example:**\n```bash\ncurl \"http://localhost:3002/api/recommendations?limit=5\"\n```\n\n**Response structure:**\n```json\n{\n  \"recommendations\": [\n    {\n      \"id\": \"...\",\n      \"title\": \"Article Title\",\n      \"url\": \"https://...\",\n      \"source\": \"Hacker News\",\n      \"score\": 90,\n      \"recommendation\": {\n        \"score\": 95,\n        \"reason\": \"Similar to articles you upvoted\",\n        \"breakdown\": {\n          \"similarityScore\": 70,\n          \"topicAffinityScore\": 8,\n          \"sourceAffinityScore\": 10,\n          \"serendipityBonus\": 0,\n          \"recencyBonus\": 15\n        }\n      }\n    }\n  ],\n  \"count\": 5\n}\n```\n\n### Daily Digest\n\n**GET /api/digest**\n- Aggregates daily highlights from last 24 hours\n- Response includes:\n  - `topArticles`: Top 5 personalized articles\n  - `unreadTodos`: Pending tasks\n  - `logs`: Discoveries, accomplishments, blockers, thoughts\n  - `trendingTopics`: Most common topics with article counts\n  - `stats`: New article count, todo count, log entry count\n\n**Example:**\n```bash\ncurl \"http://localhost:3002/api/digest\"\n```\n\n### Settings\n\n**GET /api/settings**\n- Get user settings (currently: diversity level)\n\n**PATCH /api/settings**\n- Update diversity level\n- Body: `{ \"diversityLevel\": \"low\" | \"medium\" | \"high\" }`\n\n**Example:**\n```bash\ncurl -X PATCH http://localhost:3002/api/settings \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"diversityLevel\":\"high\"}'\n```\n\n**Diversity Levels:**\n- **Low**: Allows up to 5 articles from same source (lenient)\n- **Medium**: Allows up to 3 articles from same source (balanced, default)\n- **High**: Allows up to 2 articles from same source (strict diversity)\n\n### Topics\n\n**GET /api/topics**\n- List all topics with article counts\n- Response: Array of topics with slug, name, article count\n\n### Search\n\n**GET /api/search**\n- Full-text search across article titles and descriptions\n- Query params:\n  - `q` (string, required): Search query\n  - `limit` (number): Max results (default: 20)\n\n**Example:**\n```bash\ncurl \"http://localhost:3002/api/search?q=machine+learning\u0026limit=10\"\n```\n\n### Analytics\n\n**GET /api/analytics**\n- Returns user activity statistics\n- Response includes:\n  - Total activities by type (read, upvote, downvote, save)\n  - Top topics by engagement\n  - Source distribution\n  - Reading timeline\n\n### Saved Articles (Read-Later)\n\n**GET /api/saved-articles**\n- List all saved articles ordered by priority and date\n\n**POST /api/saved-articles**\n- Save an article for later reading\n- Body: `{ \"articleId\": \"...\", \"priority\": 1-5, \"notes\": \"...\" }`\n\n**DELETE /api/saved-articles/:id**\n- Remove article from read-later queue\n\n### Todos\n\n**GET /api/todos**\n- List all todos\n\n**POST /api/todos**\n- Create new todo\n- Body: `{ \"text\": \"Task description\" }`\n\n**PATCH /api/todos/:id**\n- Update todo (mark complete/incomplete)\n- Body: `{ \"completed\": true/false }`\n\n**DELETE /api/todos/:id**\n- Delete todo\n\n### RSS Feeds\n\n**GET /api/feeds**\n- List all configured RSS feeds with health status\n\n**POST /api/sync**\n- Manually trigger RSS feed sync (normally runs every 30 minutes)\n\n### Database\n\n**Development**: SQLite (`./dev.db`)\n**Production**: PostgreSQL (configure in `.env.local`)\n\n```bash\n# View SQLite database\nsqlite3 dev.db\nsqlite\u003e .tables\nsqlite\u003e SELECT * FROM todos;\n```\n\n## Docker Commands\n\n### Development\n\n```bash\n# Start containers\ndocker-compose up -d\n\n# Rebuild after dependency changes\ndocker-compose up -d --build\n\n# View logs\ndocker-compose logs -f app\n\n# Execute command in container\ndocker-compose exec app sh\ndocker-compose exec app npm run lint\n\n# Restart containers\ndocker-compose restart\n```\n\n### Production Build\n\n```bash\n# Build production image\ndocker build -f Dockerfile.prod -t my-dashboard:prod .\n\n# Run production container\ndocker run -p 3000:3000 my-dashboard:prod\n```\n\n### Troubleshooting Docker\n\n**Hot reload not working?**\n1. Ensure files are saved on host (not inside container)\n2. Check `docker-compose.yml` has volume mount: `- .:/app`\n3. Verify `next.config.js` has `watchOptions.poll: 1000`\n\n**Slow performance?**\n1. Check Docker Desktop resource allocation (Settings → Resources)\n2. Ensure WSL 2 backend is enabled (Windows)\n3. Consider using local setup for development\n\n**Port already in use?**\n```bash\n# Find process using port 3000\nnetstat -ano | findstr :3000  # Windows\nlsof -ti:3000                 # Mac/Linux\n\n# Kill process or change port in docker-compose.yml\n```\n\n## Deployment\n\n### Deploy to Vercel (Easiest)\n\n```bash\nnpm install -g vercel\nvercel\n```\n\n### Deploy to Fly.io (Docker-based)\n\n```bash\n# Install flyctl\ncurl -L https://fly.io/install.sh | sh\n\n# Deploy\nflyctl launch\nflyctl deploy\n```\n\n### Self-Hosted (VPS)\n\n```bash\n# On server\ngit clone https://github.com/jgerton/ember-feed.git\ncd ember-feed\n\n# Build production image\ndocker build -f Dockerfile.prod -t my-dashboard:prod .\n\n# Run with docker-compose\ndocker-compose -f docker-compose.prod.yml up -d\n```\n\n## Configuration\n\n### Environment Variables\n\nCopy `.env.example` to `.env.local` and configure:\n\n```env\n# News API (optional - get free key at https://newsapi.org)\nNEWS_API_KEY=your_api_key_here\n\n# RSS Feeds (comma-separated)\nRSS_FEEDS=https://hnrss.org/frontpage,https://www.reddit.com/r/technology/.rss\n\n# Database (if using PostgreSQL)\nDATABASE_URL=postgresql://user:password@localhost:5432/dashboard\n```\n\n### Adding RSS Feeds\n\nEdit `.env.local`:\n```env\nRSS_FEEDS=https://hnrss.org/frontpage,https://www.reddit.com/r/technology/.rss,https://dev.to/feed\n```\n\n## Architecture\n\n### System Overview\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                   Next.js 16 App (React 19)                     │\n│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐    │\n│  │ Daily    │ │ News     │ │ Search   │ │ Developer      │    │\n│  │ Digest   │ │ Feed     │ │ Bar      │ │ Journal        │    │\n│  └──────────┘ └──────────┘ └──────────┘ └────────────────┘    │\n│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐    │\n│  │ Daily    │ │ Todo     │ │ Feed     │ │ Analytics      │    │\n│  │ Summary  │ │ List     │ │ Admin    │ │ Dashboard      │    │\n│  └──────────┘ └──────────┘ └──────────┘ └────────────────┘    │\n└───────────────────────────┬─────────────────────────────────────┘\n                            │ API Routes (Next.js App Router)\n┌───────────────────────────▼─────────────────────────────────────┐\n│                     Next.js API Routes                          │\n│  /articles  /recommendations  /digest  /settings  /search       │\n│  /topics    /saved-articles   /todos   /analytics /feeds        │\n└───────────────────────────┬─────────────────────────────────────┘\n                            │\n┌───────────────────────────▼─────────────────────────────────────┐\n│                    Business Logic Layer                         │\n│  ┌─────────────────┐ ┌──────────────┐ ┌─────────────────────┐ │\n│  │ rankingService  │ │ feedService  │ │ feedHealthService   │ │\n│  │                 │ │              │ │                     │ │\n│  │ • buildUserProfile()             │ │ • parseFeed()       │ │\n│  │ • calculatePersonalizedScores()  │ │ • extractArticles() │ │\n│  │ • applyDiversityReranking()      │ │ • checkHealth()     │ │\n│  │ • getRecommendations()           │ │ • quarantineFeed()  │ │\n│  │ • getPersonalizedFeed()          │ │                     │ │\n│  └─────────────────┘ └──────────────┘ └─────────────────────┘ │\n│  ┌──────────────────┐ ┌─────────────────────────────────────┐ │\n│  │ topicExtraction  │ │ cronService (runs every 30 min)     │ │\n│  │ • extractTopics()│ │ • syncAllFeeds()                    │ │\n│  └──────────────────┘ └─────────────────────────────────────┘ │\n└───────────────────────────┬─────────────────────────────────────┘\n                            │ Prisma ORM\n┌───────────────────────────▼─────────────────────────────────────┐\n│                    SQLite Database (8 Models)                   │\n│  ┌────────────┐ ┌─────────────┐ ┌──────────────┐              │\n│  │ Article    │ │ Topic       │ │ ArticleTopic │              │\n│  │            │ │             │ │ (relation)   │              │\n│  └────────────┘ └─────────────┘ └──────────────┘              │\n│  ┌────────────┐ ┌─────────────┐ ┌──────────────┐              │\n│  │ UserActivity│ │SavedArticle│ │ UserSettings │              │\n│  │ (tracking) │ │(read-later) │ │ (diversity)  │              │\n│  └────────────┘ └─────────────┘ └──────────────┘              │\n│  ┌────────────┐ ┌─────────────┐                               │\n│  │ RssFeed    │ │ LogEntry    │ │ Todo         │              │\n│  │ (health)   │ │ (journal)   │ │              │              │\n│  └────────────┘ └─────────────┘ └──────────────┘              │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n### ML Ranking Pipeline\n\n```\n1. RSS Feed Ingestion (cronService)\n   ↓\n2. Topic Classification (topicExtraction)\n   ↓\n3. User Profile Building (buildUserProfile)\n   • Analyzes read/upvote/save activities\n   • Builds source preferences map\n   • Identifies top keywords from engaged articles\n   ↓\n4. Personalized Scoring (calculatePersonalizedScores)\n   • Source preference score (0-50)\n   • Keyword relevance score (0-30)\n   • Base score from RSS (0-100)\n   • Final combined score (0-100)\n   ↓\n5. Diversity Re-ranking (applyDiversityReranking)\n   • Tracks source \u0026 topic usage\n   • Applies progressive penalties for over-representation\n   • Ensures balanced distribution\n   ↓\n6. Final Feed (getPersonalizedFeed)\n   • Articles ranked by diversity-optimized scores\n   • Ready for display\n```\n\n### Recommendation Engine Flow\n\n```\n1. Analyze User Behavior\n   • Last 20 upvoted/saved articles\n   • Top 5 topics by engagement\n   • Source preference distribution\n   ↓\n2. Score Candidate Articles (5 signals)\n   • Similarity: Keyword/topic overlap with liked articles (0-100)\n   • Topic Affinity: Matches user's favorite topics (0-40)\n   • Source Affinity: Prefers user's preferred sources (0-15)\n   • Serendipity: Bonus for new quality sources (0-20)\n   • Recency: Fresh content boost (0-15)\n   ↓\n3. Filter \u0026 Rank\n   • Remove already-read articles\n   • Apply minimum threshold (score \u003e 10)\n   • Sort by total score\n   ↓\n4. Return Recommendations\n   • Top N articles with scores \u0026 reasons\n```\n\n### RSS Feed Health Monitoring\n\n```\n1. Periodic Health Checks (every sync)\n   ↓\n2. Track Metrics\n   • Consecutive failures\n   • Last successful fetch\n   • Total article yield\n   ↓\n3. Quarantine Decision\n   • 3+ consecutive failures → Quarantine\n   • Stops polling quarantined feeds\n   ↓\n4. Manual Override\n   • Admin can restore via Feed Admin UI\n```\n\n## Contributing\n\nThis is a personal project, but feel free to fork and customize!\n\n## License\n\nMIT License - feel free to use this for your own dashboard!\n\n## Roadmap\n\n### Completed ✅\n- [x] Phase 1: Core dashboard layout\n- [x] Phase 2: RSS feed aggregation with health monitoring\n- [x] ML-powered personalized ranking algorithm\n- [x] Smart article recommendations engine\n- [x] Feed diversity algorithm to prevent echo chambers\n- [x] Topic classification and filtering\n- [x] Read-later queue with priorities\n- [x] Full-text article search\n- [x] Daily digest card (replaced email digest)\n- [x] Developer journal for logging\n- [x] Analytics dashboard\n- [x] Dark theme (glassmorphic UI)\n- [x] Collapsible UI sections\n\n### In Progress 🚧\n- [ ] Jon-OS Integration: Insight Mining (#24)\n  - Extract insights from articles for daily log\n  - Auto-tag discoveries and blockers\n  - Integration with existing log entry system\n\n### Planned 📋\n- [ ] Mobile responsive design improvements\n- [ ] Export data to CSV/JSON\n- [ ] Browser extension for quick article saving\n- [ ] Dedicated recommendations page UI\n- [ ] Performance optimizations (caching, indexes)\n- [ ] PostgreSQL migration for production\n- [ ] Email notifications (optional, for digest)\n- [ ] Multi-user support\n- [ ] API rate limiting\n- [ ] Integration tests for all endpoints\n\n## Acknowledgments\n\n- Design inspiration from Dribbble glassmorphism examples\n- News aggregation patterns from System Design Framework\n- Docker best practices from Docker Mastery course\n\n---\n\n**Built with ❤️ using Next.js and Docker**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgerton%2Fember-feed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjgerton%2Fember-feed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgerton%2Fember-feed/lists"}